当前位置: 首页 > 面试题库 >

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

羊越
2023-03-14
问题内容

我是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。我该怎么做?


问题答案:

确保您的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。



 类似资料:
  • 问题内容: 我正在A中使用RUN指令安装rpm 但是,我想将值“ 2.3”作为参数传递。我的RUN指令应类似于: 哪里 问题答案: 您正在寻找和指导。这些是Docker 1.9中的新功能。查看https://docs.docker.com/engine/reference/builder/#arg。这将允许您添加到,然后使用构建。

  • 要启动Java程序,我可以传递如下参数: 在gradle命令行中有哪些好的方法可以做到这一点: 这是正在建造的。格雷德尔:

  • 如果你需要在命令行下插入一个值,通常需要使用引号将其括起来,尤其是当其包含空格时更是如此。 shellquote 函数可以携带任意数量的参数(包括数组), 它会使用引号将每个参数都括起来并返回一个可以传递到 Shell 命令行上的以空格间隔的字符串。 在下面的例子中,我们想要创建一个用于文件改名的 exec 资源, 然而源文件名和目标文件名都包含空格,因此在命令行上需要正确地使用引号将它们括起来。

  • public static void main(String[]args){ 公共类CustomConfiguration{ public static void readConfig(String filename){//从config.properties文件读取 } 我的问题是如何将“a”传递给CustomConfiguration类?

  • 问题内容: 我需要稍后再运行一个mail.php文件,而不是让用户在提交register.php时等待发送验证电子邮件。 因此,我选择在1分钟后使用 at 命令在命令行中运行mail.php( 在register.php 中 调用 ): 但是,当我处于at命令的交互模式时,我只能将参数发送到该php文件。 由于我希望这是自动的,因此我需要在运行时使用shell脚本: 但是我找不到传递 {email

  • 问题内容: 如何接收文件作为命令行参数? 问题答案: 仅传递文件的路径,在程序内部使用Java File类处理它 这将第一个参数作为文件路径: