通过带有参数的docker run命令覆盖Dockerfile CMD

时间:2018-12-19 08:30:05

标签: docker

我有一个带有CMD的Dockerfile。 我想通过docker run命令覆盖此命令 但是在我的命令中有参数。 该命令是这样的: MyAppName-数据库MyDataBase-端口myPort-另一个ARG参数 参数在任何容器启动中都是不同的,这意味着我不能在每次容器启动时都输入所有参数(有很多参数) 我怎样才能做到这一点? 谢谢

2 个答案:

答案 0 :(得分:2)

那是什么问题?

如果每次启动时的命令行完全不同,则最好不要在else: new_doi_list.append("")上声明CMDENTRYPOINT,而应在每次启动时都提供它:

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上的方括号和引号}}至关重要。)