【发布时间】:2018-12-19 19:03:44
【问题描述】:
我有一个带有 CMD 的 Dockerfile。 我想通过 docker run 命令覆盖这个命令 但在我的命令中有论据。 命令是这样的: MyAppName -DataBase myDataBase -Port myPort -AnotherARG arg 任何容器启动中的参数都是不同的,这意味着我不能在每次容器启动时提供所有参数(有很多参数) 我怎样才能做到这一点? 谢谢
【问题讨论】:
标签: docker
我有一个带有 CMD 的 Dockerfile。 我想通过 docker run 命令覆盖这个命令 但在我的命令中有论据。 命令是这样的: MyAppName -DataBase myDataBase -Port myPort -AnotherARG arg 任何容器启动中的参数都是不同的,这意味着我不能在每次容器启动时提供所有参数(有很多参数) 我怎样才能做到这一点? 谢谢
【问题讨论】:
标签: docker
那么问题是什么?
如果每次启动时命令行完全不同,您最好不要在您的Dockerfile 中声明CMD 或ENTRYPOINT,而是在每次启动时提供:
docker run -it ubuntu /bin/sh -c "echo Hello World"
如果有共同的部分,假设你总是需要一个 shell,但参数不同,那么你在 Dockerfile 中声明 ENTRYPOINT 就像:
Dockerfile
FROM ubuntu
....
ENTRYPOINT ['/bin/sh']
并在启动时提供剩余的参数:
docker run -it mycontainer -c 'Hello World!
你需要记住:
docker run 中提供的参数连接到Dockerfile 的ENTRYPOINT
docker run 中提供的参数覆盖Dockerfile 的CMD
您应该在 Dockerfile 中使用 ENTRYPOINT ['blah', 'blah'] 语法而不是 ENTRYPOINT blah blah 以使其正常工作
【讨论】:
正如@grapes 在他们的回答中所说,
docker run中提供的参数连接到Dockerfile的ENTRYPOINT
因此,您可以编写一个自定义的ENTRYPOINT 脚本来查看传入的命令,并在需要时重写它。
#!/bin/sh
#
# docker-entrypoint.sh
#
# The Dockerfile CMD, or any "docker run" command option, gets
# passed as command-line arguments to this script.
# Abort on any error (good shell hygiene)
set -e
# If we're running "myAppName", provide default options
if [ "$1" = "MyAppName" ]; then
# Remove the command from the option list (we know it)
shift
# Then run it with default options plus whatever else
# was given in the command
exec MyAppName -OptionOne default -OtherOption foo "$@"
fi
# Otherwise just run what was given in the command
exec "$@"
那里的条件块确保,例如,如果你想要一个带有 docker run --rm -it ... sh 的调试 shell,它不会添加你的应用程序特定选项。你可以在这里变得任意复杂,设置默认环境变量,尝试进一步解析命令行,依此类推。重要的是 exec 入口点脚本中的主进程,以便应用程序成为主容器进程并且它不会将入口点作为父进程(您希望 docker stop 将其信号发送到您的进程而不是包装器壳)。
再次引用@grapes:
您应该在
Dockerfile中使用ENTRYPOINT ['blah', 'blah']语法而不是ENTRYPOINT blah blah以使其工作
所以你的Dockerfile 可能会像这样结束:
...
COPY docker-entrypoint.sh /
RUN chmod +x docker-entrypoint.sh
ENTRYPOINT ["/docker-entrypoint.sh"]
CMD ["MyAppName"]
(如果文件在进入COPYd 之前已经在本地系统上可执行,则不需要chmod 步骤。ENTRYPOINT 和CMD 上的方括号和引号都很重要。)
【讨论】: