热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用dockerrun命令将参数传递给Dockerfile中的CMD-UsedockerruncommandtopassargumentstoCMDinDockerfile

ImnewtoDockerandImhavingahardtimetosetupthedockercontainerasIwant.Ihaveanodej

I'm new to Docker and I'm having a hard time to setup the docker container as I want. I have a nodejs app can take two parameters when start. For example, I can use

我是Docker的新手,我很难按自己的意愿设置Docker容器。我有一个nodejs应用,启动时可以取两个参数。例如,我可以使用。

node server.js 0 dev

节点服务器。js 0开发

or

node server.js 1 prod

节点服务器。js - 1刺激

to switch between production mode and dev mode and determine if it should turn the cluster on. Now I want to create docker image with arguments to do the similar thing, the only thing I can do so far is to adjust the Dockerfile to have a line

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

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

CMD[“节点”、“服务器。js”、“0”、“开发”)

and

docker build -t me/app . to build the docker.

docker构建-t me/app。构建码头工人。

Then docker run -p 9000:9000 -d me/app to run the docker.

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

But If I want to switch to prod mode, I need to change the Dockerfile CMD to be

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

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

CMD[“节点”、“服务器。js”、“1”、“刺激”),

and I need to kill the old one listening on port 9000 and rebuild the image. I wish I can have something like

我需要杀死那个听9000端口的老家伙,重建这个图像。我希望我能有类似的东西

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

docker运行-p 9000:9000环境=dev cluster=0 -d me/app

to create an image and run the nodejs command with "environment" and "cluster" arguments, so I don't need to change the Dockerfile and rebuild the docker any more. How can I accomplish this?

要创建一个映像并使用“environment”和“cluster”参数运行nodejs命令,所以我不再需要更改Dockerfile并重新构建docker。我怎样才能做到这一点呢?

3 个解决方案

#1


19  

Make sure your Dockerfile declares an environment variable with ENV:

确保Dockerfile使用ENV声明了一个环境变量:

ENV environment default_env_value
ENV cluster default_cluster_value

The ENV form can be replaced inline.

ENV 表单可以内联替换。

Then you can pass an environment variable with docker run

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

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

Or you can set them through your compose file:

或者你可以通过你的撰写文件来设置它们:

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

Your Dockerfile CMD can use that environment variable, but, as mentioned in issue 5509, you need to do so in a sh -c form:

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

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

The explanation is that the shell is responsible for expanding environment variables, not Docker. When you use the JSON syntax, you're explicitly requesting that your command bypass the shell and be executed directly.

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

Same idea with Builder RUN (applies to CMD as well):

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

Unlike the shell form, the exec form does not invoke a command shell.
This means that normal shell processing does not happen.

与shell表单不同,exec表单不调用命令shell。这意味着正常的shell处理不会发生。

For example, RUN [ "echo", "$HOME" ] will not do variable substitution on $HOME. If you want shell processing then either use the shell form or execute a shell directly, for example: RUN [ "sh", "-c", "echo $HOME" ].

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

When using the exec form and executing a shell directly, as in the case for the shell form, it is the shell that is doing the environment variable expansion, not docker.

当使用exec形式并直接执行shell时,就像在shell表单中一样,它是环境变量扩展的shell,而不是docker。

#2


12  

Another option is to use ENTRYPOINT to specify that node is the executable to run and CMD to provide the arguments. The docs have an example in Exec form ENTRYPOINT example.

另一种选择是使用ENTRYPOINT指定该节点是运行的可执行文件和CMD来提供参数。文档在Exec表单入口点示例中有一个示例。

Using this approach, your Dockerfile will look something like

使用这种方法,您的Dockerfile将看起来像这样

FROM ...

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

Running it in dev would use the same command

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

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

and running it in prod you would pass the parameters to the run command

在prod中运行时,将参数传递给run命令

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

You may want to omit CMD entirely and always pass in 0 dev or 1 prod as arguments to the run command. That way you don't accidentally start a prod container in dev or a dev container in prod.

您可能希望完全省略CMD,并始终将0 dev或1 prod作为run命令的参数传递给它。这样,您就不会意外地在dev中启动一个prod容器,或者在prod中启动一个dev容器。

#3


4  

The typical way to do this in Docker containers is to pass in environment variables:

在Docker容器中这样做的典型方法是传入环境变量:

docker run -p 9000:9000 -e NODE_ENV=dev -e CLUSTER=0 -d me/app

推荐阅读
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 本文介绍了JavaScript进化到TypeScript的历史和背景,解释了TypeScript相对于JavaScript的优势和特点。作者分享了自己对TypeScript的观察和认识,并提到了在项目开发中使用TypeScript的好处。最后,作者表示对TypeScript进行尝试和探索的态度。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • 本文讨论了如何使用Web.Config进行自定义配置节的配置转换。作者提到,他将msbuild设置为详细模式,但转换却忽略了带有替换转换的自定义部分的存在。 ... [详细]
  • Java 11相对于Java 8,OptaPlanner性能提升有多大?
    本文通过基准测试比较了Java 11和Java 8对OptaPlanner的性能提升。测试结果表明,在相同的硬件环境下,Java 11相对于Java 8在垃圾回收方面表现更好,从而提升了OptaPlanner的性能。 ... [详细]
  • nodejs npm被自动删除?
    WordPress数据库错误:[Toomanyconnections]SEL ... [详细]
author-avatar
你给的未来丶我不要
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有