Docker exec цитирует переменные - PullRequest
0 голосов
/ 31 января 2019

Я хотел бы знать, есть ли способ сделать это

Допустим, dockerfile содержит эту строку, которая указывает путь к исполняемому файлу

ENV CLI /usr/local/bin/myprogram

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

Например docker exec -it <my container> 'echo something-${CLI} Ожидается something-/usr/local/bin/myprogram

Однако это возвращает:

OCI runtime exec failed: exec failed: container_linux.go:348: starting container process caused "exec: \"${CLI} do something\": executable file not found in $PATH": unknown

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Хорошо, я нашел способ сделать это, все, что вам нужно сделать, это оценить команду с помощью bash

docker exec -it <container id> bash -c 'echo something-${CLI}'

возвращает something-/usr/local/bin/myprogram

0 голосов
/ 31 января 2019

В исходном формате docker exec -it <my container> '${CLI} do something' с ожиданием, что ${CLI} будет заменен /usr/local/bin/myprogram (как exec COMMAND), и все, что передано от ARG до /usr/local/bin/myprogram, не будет работать, эточетко задокументировано: https://docs.docker.com/engine/reference/commandline/exec/

COMMAND должен быть исполняемым, команда в цепочке или в кавычках работать не будет.Пример:

docker exec -ti my_container "echo a && echo b" не будет работать, но

docker exec -ti my_container sh -c "echo a && echo b" будет работать.

Следуя документации, это будет работать, как и ожидалось: docker exec -ti my_container sh -c "${CLI} foo",${CLI} будет выполнено после раскрытия переменной, и аргумент (ы), переданный сценарию оболочки, будет установлен в ${CLI} (например, sh -c /usr/local/bin/myprogram foo).

В качестве альтернативы вы можете установить ENTRYPOINT для своего сценарияи передайте аргументы с CMD или в командной строке с docker run, например:

С учетом приведенной ниже структуры каталогов:

.
├── Dockerfile
└── example.sh

Содержимое Dockerfile:

FROM ubuntu:18.04
COPY example.sh /bin
RUN chmod u+x /bin/example.sh
ENTRYPOINT ["/bin/example.sh"]
CMD ["bla"]

И содержимое скрипта example.sh:

#!/bin/bash
echo $1

CMD, указанное в Dockerfile после ENTRYPOINT, будет аргументом по умолчанию для вашего скрипта, и вы можете переопределитьаргумент по умолчанию в командной строке (при условии, что изображение построено и помечено как example:0.1):

user@host> docker run --rm example:0.1
bla
user@host> docker run --rm example:0.1 "arbitrary text"
arbitrary text

Примечание : это моя статья о различиях между ENTRYPOINT и CMD в Dockerfile s: https://medium.freecodecamp.org/docker-entrypoint-cmd-dockerfile-best-practices-abc591c30e21

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