已知
docker CMD
有三种形式
CMD ["executable","param1","param2"] 使用 exec 执行,推荐方式; CMD command param1 param2 在 /bin/sh 中执行,提供给需要交互的应用; CMD ["param1","param2"] 提供给 ENTRYPOINT 的默认参数; 指定启动容器时执行的命令,每个 Dockerfile 只能有一条 CMD 命令。如果指定了多条命令,只有最后一条会被执行。 如果用户启动容器时候指定了运行的命令,则会覆盖掉 CMD 指定的命令。
三种形式的区别和联系,详情可以查看链接里对cmd
的介绍
https://www.jianshu.com/p/78f4591b7ff0
question
我现在想要在cmd
执行的时候,使用参数
but how?
try
1. 准备脚本 startup.sh
就是一个打印参数并立即退出的脚本
[root]# cat startup.sh #!/bin/bashecho "in startup, args: $@"
2. section 1:参数写死
Dockerfile
如下:
[root@fangjike temp]# cat Dockerfile FROM python:2.7-slim MAINTAINER yellowtail COPY startup.sh /opt RUN chmod +x /opt/startup.sh ARG envType=xxx ENV envType ${envType} CMD ["/opt/startup.sh","aa"]
build
[root@fangjike temp]# docker build -t yellow:1.0 --build-arg envType=dev .Sending build context to Docker daemon 3.072 kB Step 1 : FROM python:2.7-slim ---> c9cde4658340Step 2 : MAINTAINER yellowtail ---> Using cache ---> ec9055841b3e Step 3 : COPY startup.sh /opt ---> Using cache ---> efe6e9eaac34 Step 4 : RUN chmod +x /opt/startup.sh ---> Using cache ---> ef08b08b8a57 Step 5 : ARG envType=xxx ---> Using cache ---> aef78f5dfcf3 Step 6 : ENV envType ${envType} ---> Using cache ---> 302f6a18954c Step 7 : CMD /opt/startup.sh aa ---> Running in 34300c36fc9b ---> 61f41a3f9f27 Removing intermediate container 34300c36fc9b Successfully built 61f41a3f9f27
run
[root@fangjike temp]# docker run -ti --rm=true yellow:1.0in startup, args: aa
3. section 2:动态参数
Dockerfile
最后一行如下:
CMD ["/opt/startup.sh","${envType}"]
build
docker build -t yellow:2.0 --build-arg envType=dev .
输出忽略の,大家也不想看吧
run
[root@fangjike temp]# docker run -ti --rm=true yellow:2.0in startup, args: ${envType}
4. section 3:动态参数
Dockerfile
最后一行如下:
CMD ["/opt/startup.sh", ${envType}]
build
docker build -t yellow:3.0 --build-arg envType=dev .
run
[root@fangjike temp]# docker run -ti --rm=true yellow:3.0/bin/sh: 1: [/opt/startup.sh,: not found
可以看到报错了,找不到
原因是什么呢?
看了下官网文档 https://docs.docker.com/engine/reference/builder/#cmd
数组形式的cmd
,是docker
来运行命令,是不支持参数替换的shell
形式的cmd
,是docker
来运行sh
,sh
再运行我们写的命令,而sh
是支持参数替换的
so,try again
5. section 4:动态参数
Dockerfile
最后一行如下:
CMD /opt/startup.sh ${envType}
build
docker build -t yellow:4.0 --build-arg envType=dev .
run
[root@fangjike temp]# docker run -ti --rm=true yellow:4.0in startup, args: dev
可以看到符合我们的预期哦
solution
使用
cmd
的shell
形式,也就是
CMD command param1 param2
build
的时候传参docker build -t yellow:4.0 --build-arg envType=dev .
作者:Yellowtail
链接:https://www.jianshu.com/p/7886055680a8
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦