我有一个带有CMD的Dockerfile。 我想通过docker run命令覆盖此命令 但是在我的命令中有参数。 该命令是这样的: MyAppName-数据库MyDataBase-端口myPort-另一个ARG参数 参数在任何容器启动中都是不同的,这意味着我不能在每次容器启动时都输入所有参数(有很多参数) 我怎样才能做到这一点? 谢谢
答案 0 :(得分:2)
那是什么问题?
如果每次启动时的命令行完全不同,则最好不要在else: new_doi_list.append("")
上声明CMD
或ENTRYPOINT
,而应在每次启动时都提供它:
Dockerfile
如果有共同的部分,可以说您总是需要一个shell,但是参数不同,那么您可以在docker run -it ubuntu /bin/sh -c "echo Hello World"
中声明ENTRYPOINT
,就像这样:
Dockerfile
Dockerfile
并在启动时提供其余参数:
FROM ubuntu
....
ENTRYPOINT ['/bin/sh']
您需要记住:
docker run -it mycontainer -c 'Hello World!
中提供的自变量串联到docker run
的{{1}}
Dockerfile
中提供的自变量会覆盖ENTRYPOINT
的{{1}}
您应该使用docker run
而不是Dockerfile
中的CMD
语法
答案 1 :(得分:0)
正如@grapes在回答中所说,
在
docker run
中提供的参数被串联到Dockerfile
的{{1}}
因此,您可以编写一个自定义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
的主进程很重要,这样应用程序才能成为主容器进程,并且它不会将入口点保持为父级(您希望exec
将其信号发送到您的进程而不是包装壳。
再次引用@grapes:
您应该使用
docker stop
而不是ENTRYPOINT ['blah', 'blah']
中的ENTRYPOINT blah blah
语法
因此您的Dockerfile
可能会像这样结束:
Dockerfile
(如果文件在插入...
COPY docker-entrypoint.sh /
RUN chmod +x docker-entrypoint.sh
ENTRYPOINT ["/docker-entrypoint.sh"]
CMD ["MyAppName"]
之前已经在本地系统上可执行,则chmod
步骤是不必要的。COPY
和{{1上的方括号和引号}}至关重要。)