如何从更新的图像更新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
现在,假设我执行以下步骤:
- 在本地机器上用
Hello 2
更新file.txt
的内容。 - 构build我的应用程序的新形象(即复制
file.txt
的新版本) - 将其标记为
0.2.0
版,并将其推送到Docker Hub上。 - 更改我
docker-compose.yml
文件在服务器上,告诉我现在使用michaelperrin/app-test:0.2.0
为我的应用程序。 - 运行
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的问题在于,它将删除app
在app
容器内创build的所有其他文件,位于/var/www/app/uploads
目录中(尽pipe它在声明中声明为卷Dockerfile
)。
我认为(而且真的希望)这是不可能的。 您从图像中创build一个实例(容器),并使用它在创build时的状态。 当新图像的创build对容器有影响时,您会产生意想不到的副作用。
因此,您应该删除旧的容器,并用新的图像构build新的容器。