Docker提交创build的图像和入口点

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

下面是事件的顺序,使之更清楚:

  1. 使用Dockerfile创build图像
  2. 之后的某些时候用-ti --entrypoint /bin/bash从映像运行容器进行一些更改
  3. 在容器内进行更改并运行docker commit以使用新标记创build新映像
  4. 新图像运行时,原始Dockerfile中的原始CMD条目不再运行

所以我在问。 你如何重新从一个提交的图像Dockerfile的CMD?

您将创build一个Dockerfile来设置CMDENTRYPOINT 。 只需将Dockerfile基于Docker docker commit返回的图像ID。 例如,给定这个:

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

我可以创build一个如下所示的Dockerfile:

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

然后用它来build立一个新的图像:

 $ 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来实现必要的更改,那么最终会得到更多可审核的更改。

当前的Docker版本(我在1.11.1)提供了一个--change选项,允许在提交时对图像进行在线操作,如下所示:

 docker commit --change='ENTRYPOINT ["myEntryPoint.sh"]' $(docker ps -lq) 

CMD也受到其他几个人的支持。 有关更多详细信息和示例,请参见manpage 。