В исходном формате 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