如何从更新的图像更新Docker容器?

我有一个具有以下文件结构的项目:

- Dockerfile - app/ - file.txt - uploads/ 

file.txt文件包含Hello 1

Dockerfile生成应用程序图像,非常简单:

 FROM busybox COPY ./app /var/www/app VOLUME /var/www/app/uploads 

生成的图像被推送到michaelperrin/app-test存储库中的Docker Hub。

在部署应用程序的服务器上,我有以下docker-compose.yml文件:

 version: '2' services: app: image: michaelperrin/app-test:0.1.0 working_dir: /var/www/app volumes: - /var/www/app nginx: image: nginx:1.11 volumes_from: - app working_dir: /var/www/app 

它定义了两个容器:

  • 应用程序图像。
  • 一个能够访问应用程序文件的Nginx服务器。

该应用程序与docker-compose up -d命令一起运行。

运行docker-compose exec nginx cat test-file.txt将会显示:

你好1

现在,假设我执行以下步骤:

  1. 在本地机器上用Hello 2更新file.txt的内容。
  2. 构build我的应用程序的新形象(即复制file.txt的新版本)
  3. 将其标记为0.2.0版,并将其推送到Docker Hub上。
  4. 更改我docker-compose.yml文件在服务器上,告诉我现在使用michaelperrin/app-test:0.2.0为我的应用程序。
  5. 运行docker-compose up -d (和docker-compose restart确定)。

然后terminal输出:

 Status: Downloaded newer image for michaelperrin/app-test:0.2.0 Recreating apptest_app_1 Recreating apptest_nginx_1 

这是我的问题:

如果我运行docker-compose exec nginx cat test-file.txt它仍然会显示Hello 1而不是 Hello 2

我find的唯一的解决办法是做到以下几点:

 docker-compose stop app docker-compose rm app docker-compose up -d 

有没有更好的解决scheme?

rm解决scheme的问题在于,它将删除appapp容器内创build的所有其他文件,位于/var/www/app/uploads目录中(尽pipe它在声明中声明为卷Dockerfile )。

我认为(而且真的希望)这是不可能的。 您从图像中创build一个实例(容器),并使用它在创build时的状态。 当新图像的创build对容器有影响时,您会产生意想不到的副作用。

因此,您应该删除旧的容器,并用新的图像构build新的容器。