使用 docker run 命令将参数传递给 Dockerfile 中的 CMD

新手上路,请多包涵

我是 Docker 新手,我很难根据需要设置 docker 容器。我有一个 nodejs 应用程序在启动时可以带两个参数。例如,我可以使用

node server.js 0 dev

或者

node server.js 1 prod

在生产模式和开发模式之间切换并确定是否应该打开集群。现在我想创建带有参数的 docker 图像来做类似的事情,到目前为止我唯一能做的就是调整 Dockerfile 有一条线

CMD [ "node", "server.js", "0", "dev"]

docker build -t me/app . 构建 docker。

然后 docker run -p 9000:9000 -d me/app 运行docker。

但是如果我想切换到 prod 模式,我需要将 Dockerfile CMD 更改为

CMD [ "node", "server.js", "1", "prod"] ,

我需要杀死在端口 9000 上监听的旧的并重建图像。我希望我能有类似的东西

docker run -p 9000:9000 environment=dev cluster=0 -d me/app

创建映像并使用“环境”和“集群”参数运行 nodejs 命令,因此我不需要更改 Dockerfile 并重新构建 docker。我怎样才能做到这一点?

原文由 Jaaaaaaay 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 995
2 个回答

确保您的 Dockerfile 使用 ENV 声明环境变量:

 ENV environment default_env_value
ENV cluster default_cluster_value

ENV <key> <value> 表格可以 替换为 inline

然后你可以 使用 docker run 传递一个环境变量。请注意,每个变量都需要一个特定的 -e 标志才能运行。

 docker run -p 9000:9000 -e environment=dev -e cluster=0 -d me/app

或者您可以 通过撰写文件设置它们

 node:
  environment:
    - environment=dev
    - cluster=0

您的 Dockerfile CMD 可以使用该环境变量,但是,如 问题 5509 中所述,您需要以 sh -c 形式这样做:

 CMD ["sh", "-c", "node server.js ${cluster} ${environment}"]

解释是shell负责扩展环境变量,而不是Docker。当您使用 JSON 语法 时,您明确要求您的命令绕过 shell 并直接执行。

Builder RUN 相同的想法(也适用于 CMD ):

与 shell 形式不同,exec 形式不调用命令 shell。

这意味着不会发生正常的外壳处理。

例如, RUN [ "echo", "$HOME" ] 不会对 $HOME 进行变量替换。如果要进行 shell 处理,则可以使用 shell 形式或直接执行 shell,例如: RUN [ "sh", "-c", "echo $HOME" ]

当使用 exec 形式并直接执行 shell 时,与 shell 形式一样,是 shell 进行环境变量扩展,而不是 docker。

原文由 VonC 发布,翻译遵循 CC BY-SA 4.0 许可协议

另一种选择是使用 ENTRYPOINT 指定 node 是要运行的可执行文件,并使用 CMD 来提供参数。该文档有一个 Exec 形式的示例 ENTRYPOINT example

使用这种方法,您的 Dockerfile 将类似于

FROM ...

ENTRYPOINT [ "node",  "server.js" ]
CMD [ "0", "dev" ]

在 dev 中运行它会使用相同的命令

docker run -p 9000:9000 -d me/app

并在产品中运行它,您会将参数传递给运行命令

docker run -p 9000:9000 -d me/app 1 prod


您可能希望完全省略 CMD 并始终传入 0 dev1 prod 作为运行命令的参数。这样你就不会不小心在开发中启动一个生产容器或在生产中启动一个开发容器。

原文由 Roman 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题