我有两个Docker Compose文件,docker-compose.yml
看起来像这样
version: '2'
services:
mongo:
image: mongo:3.2
restart: always
volumes:
- /mnt/data/mongodb/data/db:/data/db
redis:
image: redis:3
restart: always
application:
build: .
image: localregistry:5000/mz_application:latest
ports:
- "3000:3000"
links:
- mongo:mongo
- redis:redis
restart: always
和部署docker-deploy.yml
version: '2'
services:
application:
image: localregistry5000/mz_application:latest
links:
- mongo:mongo
- redis:redis
restart: always
nginx:
restart: always
build: ./nginx/
ports:
- "80:80"
volumes_from:
- application
restart: always
links:
- application:application
command: /bin/bash -c "nginx -g 'daemon off;'"
tty: false
因此,使用这些文件背后的想法如下。我跑的时候
docker-compose build
它构建并将图像推送到我们的本地docker注册表。
docker-compose -f docker-compose.yml -f docker-deploy.yml build &&
docker-compose -f docker-compose.yml -f docker-deploy.yml up -d
部署并运行从本地注册表中提取的application
而不是重建。
不幸的是,它会重建它,因为当我覆盖application
时,build
仍然存在,因为它来自docker-compose.yml
文件。
如何删除它?有没有办法做到这一点 - 使用一个docker-compose文件构建,推送和映像,然后只使用docker compose文件覆盖来拉?
答案 0 :(得分:1)
首先,如果你让我,我发现了几件需要考虑的事情。我不知道你为什么要拥有相同的两个构建目标图像,但无论如何我会尝试更好地回答解决方案,而不是问为什么要尝试这样做。
此外,请注意,在您的docker-deploy.yml文件中,对于应用程序服务,您没有定义构建部分,因此,
docker-compose -f docker-deploy.yml build
将构建具有默认Dockerfile
和路径的图像:.
services:
application:
build: .
image: localregistry:5000/mz_application:latest
ports:
- "3000:3000"
links:
- mongo:mongo
- redis:redis
restart: always
container_name: app_compose
services:
application:
image: localregistry:5000/mz_application:latest
links:
- mongo:mongo
- redis:redis
restart: always
container_name: app_deploy
build: .
与放置任何内容的内容相同。
使用docker-compose build
命令时,它会忽略ports:
部分。使用docker-compose up
命令时,它会忽略build:
部分。明确地说,如果你想在没有重建避免图像重写的情况下启动具体服务,你也可以这样做:
docker-compose -f docker-compose.yml build
docker-compose -f docker-deploy.yml run -d nginx /bin/bash -c "nginx -g 'daemon off;'"