Docker撰写覆盖

Evg*_*pov 5 docker docker-compose

我有两个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
Run Code Online (Sandbox Code Playgroud)

部署时使用的另一个文件 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
Run Code Online (Sandbox Code Playgroud)

因此,使用这些文件的想法如下。当我跑步

docker-compose build
Run Code Online (Sandbox Code Playgroud)

它会生成图像并将其推送到我们的本地Docker注册表。

docker-compose -f docker-compose.yml -f docker-deploy.yml build &&
docker-compose -f docker-compose.yml -f docker-deploy.yml up -d
Run Code Online (Sandbox Code Playgroud)

部署和运行是application从本地注册表中提取的,而不是被重建。

不幸的是,它重建了它,因为当我覆盖时applicationbuild它仍然存在,因为它取自docker-compose.yml文件。如何删除它?有没有一种方法-使用一个docker-compose文件构建并推送和映像,然后仅使用docker compose文件覆盖进行拉取?

mul*_*g0r 2

首先,如果你允许的话,我发现有几件事需要考虑。我不知道你为什么想要拥有相同的两个构建目标图像,但无论如何,我会尝试更好地回答解决方案,而不是问你为什么要这样做。

  1. 更改图像名称可以构建不同的图像。例如,也许您可​​以尝试使用“部署版本”。
  2. 如果您不想更改图像名称,因为您喜欢(我不知道为什么)构建它两次,您可以尝试以下命令,在撰写文件中设置不同的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
Run Code Online (Sandbox Code Playgroud)
services:
  application:
    image: localregistry:5000/mz_application:latest
    links:
      - mongo:mongo
      - redis:redis
    restart: always
    container_name: app_deploy
Run Code Online (Sandbox Code Playgroud)
  1. 考虑到应该使用不同的镜像来定义多个 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;'"
Run Code Online (Sandbox Code Playgroud)