使用docker-compose在停止时重新创建容器

我正在尝试使用docker-compose设置多容器服务.

一些容器在重新启动时需要从新容器中重新启动(例如,文件系统应与映像中的一样).
我该如何实现?

我已经找到了restart:always选项,可以将服务放在docker-compose.yml文件中,但这并不能给我一个新鲜的文件系统,因为它使用了相同的容器.

我也看到了docker-compose up的–force-recreate选项,但这并不适用,因为它仅在运行命令时重新创建容器.

编辑:

这可能不是docker-compose问题,而是更多的一般docker问题:什么是确保容器重新启动时处于全新状态的最佳方法?所谓“新鲜状态”,是指一种状态与来自同一图像的全新容器相同的状态.重新启动的是docker命令docker restart或docker stop和docker start.

最佳答案
在docker中,不变性通常是指图像层.它们是不可变的,任何更改都将推送到文件系统的特定于容器的写时复制层.该容器特定的层将在容器的整个生命周期中持续存在.因此,要使这些文件不持久,您有两种选择:

>重新创建容器,而不只是重新启动它
>不要将更改写入容器文件系统,也不要将其写入任何持久卷.

从定义上讲,您无法使用重启策略来执行#1.重新启动策略为您提供了相同的容器文件系统,并重新启动了应用程序.但是,如果使用docker的swarm模式,它将在退出容器时重新创建容器,因此,如果可以迁移到swarm模式,则可以实现此结果.

选项2看起来比实际要困难.如果您不写容器文件系统或卷,那么在哪里? The answer is a tmpfs volume that is only stored in memory and is lost as soon as the container exits.在撰写中,这是tmpfs:/ data / dir / to / not / persist行.这是docker命令行上的示例.

首先,让我们创建一个容器,该容器的tmpfs安装在/ data上,添加一些内容,然后退出该容器:

$docker run -it --tmpfs /data --name no-persist busybox /bin/sh         
/ # ls -al /data
total 4
drwxrwxrwt    2 root     root            40 Apr  7 21:50 .
drwxr-xr-x    1 root     root          4096 Apr  7 21:50 ..
/ # echo 'do not save' >>/data/tmp-data.txt
/ # cat /data/tmp-data.txt
do not save
/ # ls -al /data
total 8
drwxrwxrwt    2 root     root            60 Apr  7 21:51 .
drwxr-xr-x    1 root     root          4096 Apr  7 21:50 ..
-rw-r--r--    1 root     root            12 Apr  7 21:51 tmp-data.txt
/ # exit

足够简单,它就像一个普通容器一样,让我们​​重新启动它并检查目录内容:

$docker restart no-persist
no-persist

$docker attach no-persist
/ # ls -al /data
total 4
drwxr-xr-x    2 root     root            40 Apr  7 21:51 .
drwxr-xr-x    1 root     root          4096 Apr  7 21:50 ..
/ # echo 'still do not save' >>/data/do-not-save.txt
/ # ls -al /data
total 8
drwxr-xr-x    2 root     root            60 Apr  7 21:52 .
drwxr-xr-x    1 root     root          4096 Apr  7 21:50 ..
-rw-r--r--    1 root     root            18 Apr  7 21:52 do-not-save.txt
/ # exit

如您所见,该目录返回为空,我们可以根据需要将数据添加回该目录.唯一的缺点是,即使图像中的内容位于该位置,该目录也将为空.我尝试了命名卷的组合,或者使用了mount语法,并将volume-nocopy选项传递给0,但是没有运气.因此,如果您需要初始化目录,则需要从另一个位置进行复制,以此作为容器入口点/ cmd的一部分.

转载注明原文:使用docker-compose在停止时重新创建容器 - 代码日志