Как включить левый треугольник (<) в состав команды alias? - PullRequest
0 голосов
/ 10 апреля 2019

Я занимаюсь контейнерированием существующих продуктов моей компании и выделил базу данных MySQL в другой контейнер.Чтобы получить доступ к серверу MySQL в главном контейнере, я создал псевдоним в ./bashrc, чтобы при наличии команды:

mysql ...

На самом деле выполнялось следующее:

docker exec -it ${MYSQL_CONTAINER} mysql ...

Однако есликоманда включила левый треугольник для добавления файла, например:

mysql < test.sql

У меня есть псевдоним, скопируйте файл и запустите его, но bash, где находится основной контейнер, читает левый треугольник как отдельный компонентв отличие от части списка аргументов.

Как я могу заставить свой псевдоним принимать левый треугольник как часть аргументов?Я не могу заключить часть «

function mysql() {

  $1
  $2
  $3
  $4

  if [[ $1 == "--defaults-file=my.cnf" ]] && [[ ! $2 ]]; then
     docker exec -it ${MYSQL_CONTAINER} mysql $1
  elif [[ $1 == "--defaults-file=my.cnf" ]] && [[ $2 = "<" ]]; then
     #docker cp $3 $(docker inspect -f '{{.Id}}' ${MYSQL_CONTAINER}):/docker-entrypoint-initdb.d/
     #docker exec ${MYSQL_CONTAINER} sh -c "mysql $1 $2 docker-entrypoint-initdb.d/$3"
  elif [[ $1 == "-uroot" ]] && [[ ! $3 ]]; then
     docker exec -it ${MYSQL_CONTAINER} mysql $1 $2
  elif [[ $1 == "-uroot" ]] && [[ $3 = "<" ]]; then
     docker cp $4 $(docker inspect -f '{{.Id}}' ${MYSQL_CONTAINER}):/docker-entrypoint-initdb.d/
     docker exec ${MYSQL_CONTAINER} sh -c "mysql $1 $2 $3 docker-entrypoint-initdb.d/$4"
  else
     docker exec -it ${MYSQL_CONTAINER} mysql $1
  fi

}

Ответы [ 2 ]

0 голосов
/ 11 апреля 2019

В случае, если кто-нибудь придет сюда в поисках ответа, я нашел способ обойти свой вопрос.Я искал способ, чтобы моя командная строка игнорировала стандартный ввод при использовании моего псевдонима, но поскольку это кажется невозможным, я вместо этого изучил, как его использовать.

Я пытаюсь коснуться контейнера MySQLиз другого контейнера, который подключен к моему демону Docker на моем хосте и может запускать команды docker.Ради проекта я не могу редактировать существующие команды, поэтому мне нужно заставить мой главный контейнер использовать команды mysql, хотя сервер MySQL находится в другом контейнере, поэтому мне пришлось поиграться.

function mysql() {

  $1
  $2

  if [[ $1 == "--defaults-file=my.cnf" ]]; then
    if [ -t 0 ]; then
       docker exec -it ${MYSQL_CONTAINER} mysql $1
    else
       cat > new_adapter.sql
       cat new_adapter.sql

       docker cp new_adapter.sql $(docker inspect -f '{{.Id}}' ${MYSQL_CONTAINER}):/docker-entrypoint-initdb.d/
       docker exec ${MYSQL_CONTAINER} sh -c "mysql $1 < docker-entrypoint-initdb.d/new_adapter.sql"

       rm -rf new_adapter.sql
    fi
  fi
}

С файлом .sql в главном контейнере я не могу просто "

0 голосов
/ 10 апреля 2019

Вам необходимо заключить в кавычки или экранировать символ <, в противном случае он обрабатывается исходной оболочкой как оператор перенаправления ввода:

mysql '<' test.sql

Тогда < будет передан буквально вашей функции и передаст ее docker.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...