如何在不更改配置的情况下从容器创建Docker镜像

75次阅读
没有评论

问题描述

在使用Docker时,希望能够从容器创建Docker镜像,但又不想更改容器的配置。他已经了解了两种创建Docker镜像的方法:通过Dockerfile构建镜像以及使用docker commit命令来提交正在运行的容器的更改。然而,他发现每次需要更改镜像时,修改Dockerfile非常不便。他尝试通过运行临时容器、在容器内使用sudo安装所需的软件包,然后提交容器来解决这个问题。但他意识到这种方法存在潜在的问题,尤其是当他频繁使用和切换docker run命令时,会涉及到不同的挂载、环境变量和网络等配置,这些配置将与实际的文件系统更改一同提交到新的镜像中。他希望能够仅提交实际的文件系统更改,而不包括这些配置。

解决方案

在这种情况下,可以考虑以下两种解决方案,分别基于Docker的现有功能和第三方工具。

方案1:使用Docker Commit(存在潜在问题)

注意: 这个方法可能会导致一些混淆和潜在的问题,因为容器的配置也会被提交到新的镜像中。

  1. 首先,运行一个容器并进行所需的更改,例如安装软件包、调整配置等:
    bash
    docker run --env FOO=BAR --name container_name ubuntu:focal

  2. 提交容器的更改到一个新的镜像:
    bash
    docker commit container_name new_image

  3. 启动一个新容器并验证更改是否生效:
    bash
    docker run -it new_image
    echo $FOO

    注意:在这种方法中,环境变量 FOO 将会存在于新的镜像中,但是容器的其他配置也会一同提交到镜像中。

方案2:使用Dockerfile创建临时镜像

这种方法使用Dockerfile创建一个临时镜像,仅包含所需的更改,而不包括额外的配置。

  1. 创建一个临时目录,并在该目录中创建一个Dockerfile,例如 Dockerfile.temp
    “`Dockerfile
    # 基于原始镜像
    FROM ubuntu:focal

# 在容器中进行所需的更改
RUN apt-get update && apt-get install -y your_packages_here

# 指定启动时的默认命令
CMD [“bash”]
“`

  1. 在临时目录中构建临时镜像:
    bash
    docker build -t temp_image -f Dockerfile.temp .

  2. 运行一个临时容器并验证更改是否生效:
    bash
    docker run -it temp_image

    在这种方法中,只有在Dockerfile中明确列出的更改才会提交到临时镜像中,不会包含其他的容器配置。

提示

  • 使用Docker的 --change 选项可以在提交容器时修改镜像的配置。
  • 考虑将需要保持不变的配置放在环境变量或配置文件中,以便于容器创建后的自定义设置。

请注意: 这些解决方案可能因Docker版本和操作系统差异而有所不同,请确保在操作之前进行适当的测试。

总结

在不更改容器的配置的情况下从容器创建Docker镜像可以通过使用docker commit命令或创建临时Dockerfile来实现。但请注意,在使用docker commit时,容器的配置也会一同提交到镜像中,可能会导致混淆。使用Dockerfile可以更精确地控制镜像的构建过程,确保只包含实际的文件系统更改。无论选择哪种方法,都应根据实际需求和安全性考虑进行操作。

正文完