Docker Compose覆盖

7

我有两个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

为了部署和运行从本地注册表中拉取的应用程序,而不是重新构建它。

不幸的是,当我覆盖应用程序时,它会重新构建,因为build仍然存在于 docker-compose.yml 文件中。如何删除它?有没有一种方法可以使用一个docker-compose文件构建和推送图像,然后只使用docker compose文件覆盖来拉取?


为什么不从部署步骤中删除 docker-compose ... build 命令? - BMitch
它将如何拉取更新的图像? - EvgeniySharapov
使用pull命令从注册表中拉取镜像,如果在Dockerfile中列出的基础镜像已经被拉取,则build命令不会再次拉取。 - BMitch
谢谢您的建议,用“pull”替换“build”达到了我想要的效果。 - EvgeniySharapov
1个回答

2
首先,如果你允许我,我发现有几件事情需要考虑。我不知道为什么你想要相同的两个构建目标镜像,但无论如何,我会尝试提供更好的解决方案,而不是问你为什么要这样做。
  1. 通过更改镜像名称,您可以构建不同的镜像。例如,您可以尝试使用“deploy-version”。
  2. 如果您不想更改镜像名称,因为您喜欢(我不知道为什么)构建两次,您可以尝试以下命令,在compose文件中设置不同的container_name:

此外,请注意,在您的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

考虑到多个docker-compose构建应该使用不同的镜像进行定义。也许您正在尝试从同一镜像中部署不同的容器。我发现两个docker-compose文件中应用程序服务定义之间唯一的区别是端口声明,因为“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;'"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接