Docker撰写覆盖

时间:2017-02-01 18:23:02

标签: 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

和部署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文件覆盖来拉?

1 个答案:

答案 0 :(得分:1)

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

  1. 更改图像名称以构建不同的图像。也许你可以试试" deploy-version"例如。
  2. 如果您不想更改图片名称,因为您更喜欢(我不知道为什么)构建它两次,您可以尝试以下命令,在撰写文件中设置不同的container_name:
  3.   

    此外,请注意,在您的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
    
    1. 考虑使用不同的图像定义多个docker-compose构建。也许您正在尝试从同一图像部署不同的容器。我发现两个docker-compose文件中的应用程序服务定义之间的区别仅在于端口声明,因为build: .与放置任何内容的内容相同。 使用docker-compose build命令时,它会忽略ports:部分。使用docker-compose up命令时,它会忽略build:部分。
    2. 明确地说,如果你想在没有重建避免图像重写的情况下启动具体服务,你也可以这样做:

      docker-compose -f docker-compose.yml build
      docker-compose -f docker-deploy.yml run -d nginx /bin/bash -c "nginx -g 'daemon off;'"