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

Jaaaaaaay:

我是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 run -p 9000:9000 -d me/app运行docker。

但是,如果要切换到生产模式,则需要将Dockerfile CMD更改为

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

我需要杀死监听9000端口的旧端口并重建映像。我希望我可以有类似的东西

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

创建映像并使用“ environment”和“ cluster”参数运行nodejs命令,因此我不需要更改Dockerfile并重新构建docker。我该怎么做?

VonC:

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

ENV environment default_env_value
ENV cluster default_cluster_value

ENV <key> <value>表格可以内联替换

然后您可以通过docker run传递环境变量

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}"]

原因是外壳负责扩展环境变量,而不是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。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用命令使用python入口点脚本将参数传递给docker容器?

将参数传递给Docker中的入口点

如何将命令行参数传递给在docker中运行的python脚本

如何通过docker run将参数传递给Shell脚本

使用“启动”命令,将参数传递给已启动的程序

使用Ansible将命令行参数传递给Docker

如何将参数传递给docker中的超级用户?

在docker中从CMD传递参数

Docker将参数传递给使用argparse的python脚本

将参数传递给在Docker容器中运行的python脚本

如何使用Laravel Task Scheduling将参数传递给命令

如何在运行时将命令行参数传递给Docker映像中的dotnet dll?

如何将命令行参数传递给docker-compose run?

如何使用Docker将参数传递给Spark-Submit

将$ SOURCE_COMMIT传递给Docker Hub上的Dockerfile命令

如何将参数传递给特定于少数脚本但不针对入口点的docker run命令

如何将参数传递给在CLI(命令行界面)中运行的docker?

使用管道将两个参数传递给命令

使用awk命令将参数传递给bash进行过滤

使用YIIC Shell将参数传递给命令行

使用Docker compose传递Dockerfile的参数

游民:使用游民将docker run参数传递给多个容器

如何动态地将参数传递给 docker run 命令

将 docker run cmd 中的 env var 从 jenkinsfile 传递给 dockerfie

如何使用按钮将多个参数传递给 WPF 命令?

如何使用气流的 DockerOperator 将参数传递给 docker 容器

使用 InvokeCommandAction 将额外的参数传递给命令

通过 Powershell 将多个参数传递给 cmd 行参数 - 使用什么引号以及何时使用

将参数传递给 docker-compose 命令