Docker Commit创建的图像和ENTRYPOINT

时间:2015-03-12 16:19:45

标签: docker

当您通过docker run进行更改时,如何确保Dockerfile中指定的原始CMD仍设置为在docker commit上运行?

以下是事件的顺序,以使其更清晰:

  1. 使用Dockerfile创建图像
  2. 之后某点使用-ti --entrypoint /bin/bash从图像运行容器进行一些更改
  3. 在容器内进行更改并运行docker commit以使用新标记
  4. 创建新图像
  5. 运行新映像时,不再运行原始Dockerfile中的原始CMD条目
  6. 所以我问;如何在已提交的映像上再次从Dockerfile重置CMD?

2 个答案:

答案 0 :(得分:30)

当前的Docker版本(我在1.11.1上)提供了--change选项,允许在提交时对图像进行内联操作,如:

docker commit --change='ENTRYPOINT ["myEntryPoint.sh"]' $(docker ps -lq)
其他一些人也支持

CMD。有关详细信息和示例,请参阅manpage

答案 1 :(得分:5)

您将创建一个Dockerfile来设置CMDENTRYPOINT。只需将Dockerfile基于docker commit返回的图像ID即可。例如,鉴于此:

$ docker commit $(docker ps -lq)
69e9c08825508ec780efc86268a05ffdf4edae0999a2424dbe36cb04c2a15d6b

我可以创建一个看起来像这样的Dockerfile:

FROM 69e9c08825508ec780efc86268a05ffdf4edae0999a2424dbe36cb04c2a15d6b
CMD ["/bin/bash"]

然后使用它来构建新图像:

$ docker build .
Step 0 : FROM 69e9c08825508ec780efc86268a05ffdf4edae0999a2424dbe36cb04c2a15d6b
 ---> 69e9c0882550
Step 1 : CMD /bin/bash
 ---> Running in f886c783551d
 ---> 13a0f8ea5cc5
Removing intermediate container f886c783551d
Successfully built 13a0f8ea5cc5

那就是说,你最好的行动方案可能是在容器中进行更改然后使用Docker提交;如果您只是依靠Dockerfile来实现必要的更改,那么最终会得到更多可审核的更改。