我有一个船坞式作曲。Yml文件包含4个容器:redis, postgres, API和worker。

在工作容器的开发过程中,我经常需要重新启动它以应用更改。有没有什么好方法可以在不重启其他容器的情况下重启单个容器(例如worker) ?


当前回答

要重新启动一个更改的服务,以下是我执行的步骤:

docker-compose stop -t 1 worker
docker-compose build worker
docker-compose up --no-start worker
docker-compose start worker

其他回答

下面的命令

docker-compose restart worker

将只是停止和启动容器。也就是说,无需从docker-compose.xml中加载任何更改

STOP类似于PC中的休眠。因此,停止/启动将不会查找配置文件中的任何更改。为了从容器的recipe (docker-compose.xml)中重新加载,我们需要删除并创建容器(类似于重新启动PC)

命令如下所示

docker-compose stop worker       // go to hibernate
docker-compose rm worker        // shutdown the PC 
docker-compose create worker     // create the container from image and put it in hibernate

docker-compose start worker //bring container to life from hibernation

这很简单:使用命令:

docker-compose restart worker

您可以设置在杀死容器之前等待停止的时间(以秒为单位)

docker-compose restart -t 30 worker

注意,这将重新启动容器,但不会重新构建它。如果您想应用更改,然后重新启动,请查看其他答案。

简单的“docker”命令对“worker”容器一无所知。 使用这样的命令

Docker-compose -f Docker-compose。Yml重启工作

重启容器

如果你想重新启动你的容器:

Docker-compose restart servicename

可以将此命令视为“按名称重新启动容器”,这相当于docker restart命令。

注意事项:

如果你改变了ENV变量,它们不会在容器中更新。你得停下来,重新开始。或者,使用单一命令docker-compose up将检测更改并重新创建容器。 正如许多人提到的,如果更改docker-compose。Yml文件本身,简单的重新启动不会应用这些更改。 如果你在构建阶段将代码复制到容器中(在Dockerfile中使用ADD或copy命令),每次代码更改时,你都必须重新构建容器(docker-compose build)。

与代码的相关性

如果你的代码在Docker-compose中通过volume指令映射到容器中,那么Docker-compose重启应该可以正常工作。你是这样的:

services:

  servicename:
    volumes:
      - .:/code

但是我建议使用实时代码重新加载,这可能是由您所选择的框架在DEBUG模式下提供的(或者,您可以搜索所选择语言的自动重新加载包)。添加这个可以消除每次代码更改后重新启动容器的需要,而不是在里面重新加载进程。

要重新启动一个更改的服务,以下是我执行的步骤:

docker-compose stop -t 1 worker
docker-compose build worker
docker-compose up --no-start worker
docker-compose start worker