docker commit采坑记录
最近使用docker commit碰到了一个小坑,记录分享一下。
问题现象记录:
使用官方docker镜像 nginx 1.19.2,想要修改镜像中nginx.conf中配置值,方法如下:(注:可以直接通过文件修改,此处为了给docker commit举例用)
- 使用某个镜像运行了一个容器(docker run image:tag /bin/bash)
- 在容器内修改了程序的启动参数
- 使用这个容器生成它需要的image(docker commit containerID)
理论上这个操作是没有任何问题的,实际上新的image一运行立刻就退出了 ,容器的状态为Exit(0)
查看日志,发现没有打印任何日志,推测很大的可能性是执行命令不是阻塞程序,执行完就直接退出了。
验证一下:通过docker ps对比新旧image容器的CMD指令,老image的CMD='nginx -g daemon off;’,新image的CMD=‘/bin/bash’,确认问题了,修改后的CMD覆盖掉了修改前的。
问题根源分析
1.为什么CMD会被修改
CMD
then only the last CMD
will take effect。如果有多条CMD命令,仅最后一条CMD命令生效。CMD ["nginx" "-g" "daemon off;"]
执行docker run命令时,最后一条cmd由原来的 nginx -g daemon off; 变为/bin/bash
docker run -it image:tag /bin/bash #容器主进程变为/bin/bash
执行docker commit时,当前容器的cmd保存最后一条/bin/bash
CMD
指令就是用于指定默认的容器主进程的启动命令的。CMD
is to provide defaults for an executing container。CMD主要目的是为可执行容器提供默认命令。问题解决方案
1. docker run启动容器时,不指定CMD (docker run -dit image:tag,无 /bin/bash)。
启动容器时,不指定CMD,则使用默认cmd运行容器。commit时自动保留原镜像的默认CMD。
若需要进入容器bash环境编辑容器,再使用docker exec -it containerID /bin/bash即可。
2. docker commit时使用--change参数替换image中的cmd.
比如:--change=‘CMD ["nginx", "-g", "daemon off;"]'
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步