【问题标题】:Docker commit : Saving as new image by editing docker containerDocker 提交:通过编辑 docker 容器保存为新图像
【发布时间】:2022-06-16 04:22:14
【问题描述】:

我有一个 docker 镜像,它启动了一个容器,用于在很短的时间内执行某些任务。任务完成后立即退出容器。

下面是docker ps -a 命令的输出

CONTAINER ID   IMAGE               COMMAND                  CREATED          STATUS                      PORTS                                         NAMES
40be32cb4299   88841cd3d4a7        "/home/test/testing-…"   40 seconds ago   Exited (0) 22 seconds ago                                                 beautiful_agnesi

由于容器在很短的时间内自动退出,我无法执行docker exec -it -u root 40be32cb4299 bash exec 命令的输出给出以下错误,因为容器已退出。

Error response from daemon: Container 40be32cb4299 is not running 

我有没有办法在这个容器上执行 exec 来编辑同一个容器内的一些文件,以便执行 docker commit 并保存为新图像?

【问题讨论】:

  • 我不知道您为什么要这样做,但 Docker 的优势之一是您可以在 Dockerfile 中编写镜像构建脚本,这样您就可以轻松更改它并构建一个新图片。当您手动更改容器并将更改的容器提交到新映像时,您会丢失所做操作的记录,并且进行更改变得更加困难。我会考虑这是否是正确的方法,或者我是否可以在 Dockerfile 中编写脚本。
  • 您可以使用交互式 shell 基于已有的镜像运行一个新容器; docker run --rm -it 88841cd3d4a7 sh。根据您的发现,重申@HansKilian 的评论,编辑您的 Dockerfile 并构建一个新映像docker commit 几乎从来都不是最佳实践。

标签: docker docker-compose dockerfile docker-container docker-image


【解决方案1】:

没有办法执行到停止容器中。但是,您确实有解决方法来实现您的目标,例如下一个:

  1. docker commit 40be32cb4299 old_image,这会将旧停止的容器提交为旧的 docker 映像。
  2. docker run -it --entrypoint=/bin/bash --name=new_container old_image,这个使用旧镜像启动一个新容器。由于entrypoint 已被覆盖,因此new_container 将不会运行您的默认entrypointcommand,然后new_container 将不会退出,并且使用-it,您现在位于新容器中。
  3. 在新容器中,进行文件更改。
  4. 退出该新容器,现在您可以使用 docker commit new_container new_image 将您的新更改提交到新的 docker 映像。

【讨论】:

  • 在执行 docker commit 的第四步中,我们可以提供 --change 标志以覆盖初始入口点 (--entrypoint=/bin/bash)。因此,如果您希望您的图像从 /bin/bash 以外的另一个入口点开始执行,您可以使用以下命令 docker commit --change='ENTRYPOINT ["myEntryPoint.sh"]'
【解决方案2】:

您可以启动已停止的容器。让这个简单的名字成为你的容器

docker run --name container_name image_name

使用容器名称启动容器

docker start container_name

现在执行剩下的命令

docker exec $(docker start container_name) //bin/bash -c " your command"

只要记住在没有 --rm 的情况下运行容器

【讨论】:

    猜你喜欢
    • 2023-03-23
    • 2017-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-04
    • 2019-04-24
    • 2015-02-18
    • 1970-01-01
    相关资源
    最近更新 更多