Dockerfile中的RUN、CMD 和 ENTRYPOINT指令的两种格式(shell与exec)
shell格式与exec格式RUN:执行命令并创建新的镜像层,RUN经常用于安装软件包。CMD:设置容器启动后默认执行的命令及其参数,但CMD能够被docker run后面跟的命令行参数替换。dockerfile中可以有多个cmd指令,但只有最后一个生效。CMD可以被docker run之后的参数代替ENTRYPOINT:配置容器启动时运行的命令,Dockerfile中可以有多个ENTRYP...
·
shell格式与exec格式
RUN:设置构件容器时就运行的命令以及提交运行结果,RUN经常用于安装软件包。dockerfile中可以写多条RUN指令
CMD:设置容器启动时执行的命令,在构件时并不运行,CMD能够被docker run后面跟的命令行参数替换。dockerfile中只能写一条CMD指令,如果写了多条,那么只有最后一条生效。
ENTRYPOINT:设置容器启动时执行的命令,ENTRYPOINT不能被docker run后面跟的命令行参数替换。dockerfile中只能写一条ENTRYPOINT指令,如果写了多条,那么只有最后一条生效。
我们可用两种方式指定 RUN、CMD 和 ENTRYPOINT 要运行的命令
shell格式: <instruction> <command>
exec格式 : <instruction> ["executable", "param1", "param2", ...]
1.下载并导入镜像
镜像:
busybox.tar
#1.busybox.tar:是一个自定义的镜像
[root@foundation66 Desktop]# ls
busybox.tar
#2.导入镜像
[root@foundation66 Desktop]# docker load -i busybox.tar
8a788232037e: Loading layer 1.37MB/1.37MB
Loaded image: busybox:latest
#3.查看镜像
[root@foundation66 Desktop]# docker images
2.编写Dockerfile
[root@foundation66 ~]# cd /opt/docker/
[root@foundation66 docker]# ls
Dockerfile dvd.repo webdata
#1.创建目录
[root@foundation66 docker]# mkdir test
[root@foundation66 docker]# cd test/
#2.编写文件
[root@foundation66 test]# vim Dockerfile
#########################
FROM busybox #指定基础镜像
ENV name world #设置环境变量
CMD echo "hello,$name" #输出hello world;CMD表示容器启动时执行的命令;当指令执行时,shell格式底层会调用/bin/sh -c <command> 。
3.构建镜像
[root@foundation66 test]# docker build -t busybox:v1 .
4.创建并运行容器
#--rm表示退出后自动删除
[root@foundation66 test]# docker run --rm busybox:v1
hello,world
5.改进
#1.标准写法为 CMD [ ]
[root@foundation66 test]# vim Dockerfile
#########################
FROM busybox
ENV name world
CMD ["/bin/echo","hello,$name"] #当指令执行时,exec格式会直接调用<command>,不会被 shell解析。
#构建镜像
[root@foundation66 test]# docker build -t busybox:v2 .
#创建并运行容器;发现无法识别变量
[root@foundation66 test]# docker run --rm busybox:v2
hello,$name
#2.-c表示自动解析变量
[root@foundation66 test]# vim Dockerfile
#########################
FROM busybox
ENV name world
CMD ["/bin/sh","-c","echo hello,$name"] #-c表示解析变量
#构建镜像
[root@foundation66 test]# docker build -t busybox:v3 .
#创建并运行容器
[root@foundation66 test]# docker run --rm busybox:v3
hello,world
ENTRYPOINT与CMD指令:
#1.编写Dockerfile
[root@foundation66 test]# vim Dockerfile
########################
FROM busybox
ENTRYPOINT ["/bin/echo","hello"] #ENTRYPOINT表示设置容器启动时执行的命令,可以自动解析变量
CMD ["world"] #CMD表示设置容器启动时执行的命令,它能够被docker run后面跟的命令行参数替换
#2.构建镜像
[root@foundation66 test]# docker build -t busybox:v4 .
#3.创建并运行容器;CMD可被覆盖(可传值)
[root@foundation66 test]# docker run --rm busybox:v4
hello world
[root@foundation66 test]# docker run --rm busybox:v4 westos
hello westos
注意:如果镜像创建错误,执行以下命令即可删除镜像
[root@foundation66 test]# docker rmi busybox:v4
Untagged: busybox:v4
Deleted: sha256:47bb4f0aee1cc1c78e7f21fe3e3105e1e4dd8d01e2f8005c135999ee136b6576
Deleted: sha256:ecea84c1280d6278e431138f865fe53ad78aefd50b94797c7b732d725622156f
更多推荐
已为社区贡献3条内容
所有评论(0)