问题描述
在使用Docker时,希望能够从容器创建Docker镜像,但又不想更改容器的配置。他已经了解了两种创建Docker镜像的方法:通过Dockerfile构建镜像以及使用docker commit
命令来提交正在运行的容器的更改。然而,他发现每次需要更改镜像时,修改Dockerfile非常不便。他尝试通过运行临时容器、在容器内使用sudo安装所需的软件包,然后提交容器来解决这个问题。但他意识到这种方法存在潜在的问题,尤其是当他频繁使用和切换docker run
命令时,会涉及到不同的挂载、环境变量和网络等配置,这些配置将与实际的文件系统更改一同提交到新的镜像中。他希望能够仅提交实际的文件系统更改,而不包括这些配置。
解决方案
在这种情况下,可以考虑以下两种解决方案,分别基于Docker的现有功能和第三方工具。
方案1:使用Docker Commit(存在潜在问题)
注意: 这个方法可能会导致一些混淆和潜在的问题,因为容器的配置也会被提交到新的镜像中。
首先,运行一个容器并进行所需的更改,例如安装软件包、调整配置等:
bash
docker run --env FOO=BAR --name container_name ubuntu:focal提交容器的更改到一个新的镜像:
bash
docker commit container_name new_image启动一个新容器并验证更改是否生效:
bash
docker run -it new_image
echo $FOO
注意:在这种方法中,环境变量FOO
将会存在于新的镜像中,但是容器的其他配置也会一同提交到镜像中。
方案2:使用Dockerfile创建临时镜像
这种方法使用Dockerfile创建一个临时镜像,仅包含所需的更改,而不包括额外的配置。
- 创建一个临时目录,并在该目录中创建一个Dockerfile,例如
Dockerfile.temp
:
“`Dockerfile
# 基于原始镜像
FROM ubuntu:focal
# 在容器中进行所需的更改
RUN apt-get update && apt-get install -y your_packages_here
# 指定启动时的默认命令
CMD [“bash”]
“`
在临时目录中构建临时镜像:
bash
docker build -t temp_image -f Dockerfile.temp .运行一个临时容器并验证更改是否生效:
bash
docker run -it temp_image
在这种方法中,只有在Dockerfile中明确列出的更改才会提交到临时镜像中,不会包含其他的容器配置。
提示
- 使用Docker的
--change
选项可以在提交容器时修改镜像的配置。 - 考虑将需要保持不变的配置放在环境变量或配置文件中,以便于容器创建后的自定义设置。
请注意: 这些解决方案可能因Docker版本和操作系统差异而有所不同,请确保在操作之前进行适当的测试。
总结
在不更改容器的配置的情况下从容器创建Docker镜像可以通过使用docker commit
命令或创建临时Dockerfile来实现。但请注意,在使用docker commit
时,容器的配置也会一同提交到镜像中,可能会导致混淆。使用Dockerfile可以更精确地控制镜像的构建过程,确保只包含实际的文件系统更改。无论选择哪种方法,都应根据实际需求和安全性考虑进行操作。