我是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 build -t me/app .
然后docker run -p 9000:9000 -d me/app运行docker。
docker run -p 9000:9000 -d me/app
但是,如果要切换到生产模式,则需要将Dockerfile CMD更改为
CMD [ "node", "server.js", "1", "prod"] ,
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
ENV environment default_env_value ENV cluster default_cluster_value
该ENV <key> <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
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。
与shell表单不同,exec表单不会调用命令shell。 这意味着正常的外壳处理不会发生。
例如,RUN [ "echo", "$HOME" ]将不会对进行变量替换$HOME。如果要进行shell处理,则可以使用shell形式或直接执行shell,例如:RUN [ "sh", "-c", "echo $HOME" ]。
RUN [ "echo", "$HOME" ]
$HOME
RUN [ "sh", "-c", "echo $HOME" ]
当使用exec表单并直接执行shell时(例如在shell表单中),是由shell进行环境变量扩展,而不是docker。