我有一些使用docker compose运行的容器,但我无法找到一种方法来正确更新我的容器而不必删除它并再次创建它。我有一个Python应用程序,我可以成功部署代码更改和那些应用程序,但如果我添加像css,js或图像的文件,那些不会到达容器。
我已尝试使用此命令,即使在控制台中它按预期记录消息(重建它没有缓存)我没有成功:
docker-compose build --no-cache web && docker-compose up -d
对我有用的唯一命令是将其删除:
docker stop $(docker ps -a -q) && docker rm $(docker ps -a -q) && docker rmi $(docker images -a -q)
然后构建和部署:
docker-compose build && docker-compose up -d
这是我的docker-compose.yml:
web:
restart: always
build: ./web
expose:
- "8000"
links:
- postgres:postgres
- redis
volumes:
- /usr/src/app/donare/static
env_file: .env
command: /usr/local/bin/gunicorn -w 2 -b :8000 --limit-request-line 16384 donare.app:app
nginx:
restart: always
build: ./nginx/
ports:
- "80:80"
volumes:
- /www/static
volumes_from:
- web
links:
- web:web
data:
restart: always
image: postgres:latest
volumes:
- /var/lib/postgresql
command: "true"
postgres:
restart: always
build: .
dockerfile: dockerfile-postgres
volumes_from:
- data
ports:
- "5432:5432"
redis:
image: redis
celery:
build: ./web
command: celery worker --app=donare.tasks.tasks
volumes:
- .:/code
links:
- postgres
- redis
答案 0 :(得分:0)
您的Docker Compose文件显示您在web
容器中有一个命名卷。 /usr/src/app/donare/static
您的css,js和图像应该来自Docker主机吗?如果是这样,也许您打算将/usr/src/app/donare/static
挂载到容器中,而不是创建具有该名称的卷?或者,如果css,js和images已内置到您的图像中,那么您应该只删除该命名卷。
假设您的css,js和images位于容器中的路径/usr/src/app/donare/static
,那么正在发生的是因为您有一个命名卷,第一次运行web
服务时,正在使用该路径中的内容创建和初始化卷。每次执行build
和up
时,都会在旧文件的路径中装入相同的初始卷。当您stop
和rm
时,该卷也会被隐式删除,从而导致重新创建并使用新文件进行初始化。