在Docker运行时如何使更改生效

48次阅读
没有评论

问题描述

在使用Docker和Flask Web框架时遇到了一个问题。他的Docker上下文中包含一个Flask文件、一个mod_wsgi文件和一个Python脚本。由于对Flask不熟悉,他经常进行一些小的更改。为了使任何更改在Docker上下文中生效,他必须执行以下步骤:
1. 停止并清除容器。
2. 修改Dockerfile并重新构建容器。
3. 在某些情况下,如果保留缓存,更改可能不会生效,甚至需要删除镜像并重新构建。

他想知道是否有办法在运行时使Docker上下文中的更改生效。他尝试将Docker上下文共享为卷,因为这是在Docker容器和服务中持久化数据的首选方式,但这并没有起作用,任何更改仍然没有反映出来。

请告诉我有什么方法可以实现这一点。任何建议都将不胜感激。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

为了在运行时使Docker上下文中的更改生效,您可以使用挂载卷来保留运行状态。要在Docker容器内部使用本地目录,可以使用-v选项,例如:

docker run -v /path/to/local/dir/:/mountpath/inside/docker ...

但是,如果我正确理解您的问题,您是在询问如何在修改Dockerfile时获得更快的反馈循环。为此,我建议启动容器,并附加一个交互式shell以尝试您的更改。一旦取得一些进展,再更新Dockerfile。

以下是一个示例,可以在容器启动后附加一个交互式shell:

$ docker ps
CONTAINER ID  IMAGE        COMMAND  CREATED           STATUS        PORTS  NAMES
f1217635695d  ubuntu:18.04 "bash"   23 seconds ago   Up 21 seconds         stoic_austin
$ docker exec -it f1217635695d bash
root@f1217635695d:/# ...

另外,请注意,正确使用缓存可以显著加快对Docker容器进行更改后的重建速度。

(来自您的问题) 1. 停止并清除容器。
清除容器应该是不必要的,除非您的磁盘空间不足。只需更新标签即可,例如:
docker build -t test .
docker run --rm -it test

test:latest将指向最后创建的镜像ID。docker images将显示以前的镜像未被删除,但是如果您有足够的磁盘空间,这不是一个大问题。

方案2

如果您希望在修改Dockerfile后立即看到更改生效,您可以使用Docker的构建缓存。Docker会根据Dockerfile的内容和指令来判断是否使用缓存。如果您更改了Dockerfile中的某些指令,Docker将重新构建这些指令之后的所有层,但会使用缓存来加快构建过程。

以下是一些使用Docker构建缓存的技巧:
– 尽量将不经常更改的指令放在Dockerfile的前面,这样可以最大程度地利用缓存。
– 如果您只更改了Dockerfile中的某些指令,可以使用--target选项来指定从哪个阶段开始重新构建。例如,如果您只更改了最后一个阶段的指令,可以使用--target选项来跳过前面的阶段,从而加快构建速度。

请注意,使用构建缓存可能会导致某些更改不会立即生效。如果您需要确保更改立即生效,可以使用方案1中的方法。

以上是在Docker运行时使更改生效的两种解决方案。根据您的需求和情况选择适合您的方法。

希望对您有所帮助!如果您有任何其他问题,请随时提问。

正文完