Docker 提交创建的图像和 ENTRYPOINT

Docker Commit Created Images and ENTRYPOINT

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

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

  1. 使用 Dockerfile 创建镜像
  2. 运行 来自图像的容器 -ti --entrypoint /bin/bash 在之后的某个时候进行一些更改
  3. 在容器内进行更改,运行 docker commit 以使用新标签创建新图像
  4. 当新镜像为 运行 时,原始 Dockerfile 中的原始 CMD 条目不再是 运行

所以我在问;如何在已提交的映像上再次从 Dockerfile 重置 CMD?

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

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

我可以创建一个如下所示的 Docker 文件:

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 提交;如果您首先依赖 Docker 文件来实施必要的更改,您最终会得到一组更易于审核的更改。

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

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

CMD 和其他几个一样也受支持。有关详细信息和示例,请参阅 manpage