我有一个具有以下文件结构的项目:
- 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
它定义了两个容器:
该应用程序使用docker-compose up -d
命令运行。
因此显示运行docker-compose exec nginx cat test-file.txt
:
你好1
现在,假设我执行以下步骤:
file.txt
更新Hello 2
的内容。file.txt
)0.2.0
推送到Docker Hub。docker-compose.yml
文件,告诉我现在使用michaelperrin/app-test:0.2.0
作为我的应用。docker-compose up -d
(和docker-compose restart
以确定)。然后终端输出:
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 。
我找到的唯一解决方案是执行以下操作:
docker-compose stop app
docker-compose rm app
docker-compose up -d
有没有更好的解决方案?
rm
解决方案的问题在于它将删除我的应用程序在app
目录中可能在/var/www/app/uploads
容器中创建的所有其他文件(尽管事实如此)它被声明为Dockerfile
)中的一个卷。
答案 0 :(得分:2)
我认为(并且真的希望)这是不可能的。您可以使用映像创建一个实例(容器),该实例具有构建时的状态。当创建新图像对容器产生影响时,您会产生意想不到的副作用。
因此,您应该删除旧容器并使用新映像构建新容器。