【问题标题】:Override Dockerfile CMD by docker run command with arguments通过带有参数的 docker run 命令覆盖 Dockerfile CMD
【发布时间】:2018-12-19 19:03:44
【问题描述】:

我有一个带有 CMD 的 Dockerfile。 我想通过 docker run 命令覆盖这个命令 但在我的命令中有论据。 命令是这样的: MyAppName -DataBase myDataBase -Port myPort -AnotherARG arg 任何容器启动中的参数都是不同的,这意味着我不能在每次容器启动时提供所有参数(有很多参数) 我怎样才能做到这一点? 谢谢

【问题讨论】:

    标签: docker


    【解决方案1】:

    那么问题是什么?

    如果每次启动时命令行完全不同,您最好不要在您的Dockerfile 中声明CMDENTRYPOINT,而是在每次启动时提供:

    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 中提供的参数连接到DockerfileENTRYPOINT

    • docker run 中提供的参数覆盖DockerfileCMD

    • 您应该在 Dockerfile 中使用 ENTRYPOINT ['blah', 'blah'] 语法而不是 ENTRYPOINT blah blah 以使其正常工作

    【讨论】:

      【解决方案2】:

      正如@grapes 在他们的回答中所说,

      docker run 中提供的参数连接到DockerfileENTRYPOINT

      因此,您可以编写一个自定义的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 步骤。ENTRYPOINTCMD 上的方括号和引号都很重要。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-13
        • 2020-08-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多