Docker compose映像升级

Docker compose映像升级,docker,docker-compose,dockerfile,Docker,Docker Compose,Dockerfile,我有一个docker compose映像正在运行: version: '2' services: db: image: postgres:commit1 service: image: service:commit1 ports: - "3000:3000" depends_on: - db 该映像有一个git的commit id标记。如果代码中有任何更改,CI/CD管道将运行并使用最新的提交id更新映像 现在

我有一个docker compose映像正在运行:

version: '2'
services:
  db:
    image: postgres:commit1
  service:
    image: service:commit1
    ports:
      - "3000:3000"
    depends_on:
      - db
该映像有一个git的commit id标记。如果代码中有任何更改,CI/CD管道将运行并使用最新的提交id更新映像

现在让我们假设我有如下图像:
postgres:commit2
服务:commit2

如果容器正在使用compose文件中的commit1运行,那么更新图像的最佳过程是什么

我是否需要在compose中手动更新图像,然后:

docker-compose restart
然后手动移除其他容器


这是最好的方法吗?

一种方法是模板化您的compose文件,并使用单独的CI/CD步骤在每个构建上生成一个带有新图像标记的新文件

例如-

// docker-compose.yml.template

version: '2'
services:
  db:
    image: postgres:{{ COMMIT_ID }}
  service:
    image: service:{{ COMMIT_ID }}
    ports:
      - "3000:3000"
    depends_on:
      - db
使用
sed
awk
脚本,您可以用最新的提交ID替换
{{COMMIT\u ID}
,并生成新文件

// docker-compose.yml

version: '2'
services:
  db:
    image: postgres:commit2
  service:
    image: service:commit2
    ports:
      - "3000:3000"
    depends_on:
      - db

然后,您最终可以使用docker compose pull和docker compose up-d来提取和使用最新的图像

一种方法是模板化您的合成文件,并使用单独的CI/CD步骤在每个构建上生成一个新文件,其中包含新的图像标记

例如-

// docker-compose.yml.template

version: '2'
services:
  db:
    image: postgres:{{ COMMIT_ID }}
  service:
    image: service:{{ COMMIT_ID }}
    ports:
      - "3000:3000"
    depends_on:
      - db
使用
sed
awk
脚本,您可以用最新的提交ID替换
{{COMMIT\u ID}
,并生成新文件

// docker-compose.yml

version: '2'
services:
  db:
    image: postgres:commit2
  service:
    image: service:commit2
    ports:
      - "3000:3000"
    depends_on:
      - db

然后,您最终可以使用docker compose pull和docker compose up-d来提取和使用最新的图像

我假设您正在寻找一些选项来使用docker compose进行滚动更新,并且您的服务支持多个实例。这可以通过以下方式实现:首先更改docker compose文件中的图像id,您可以使用CI/CD工具使用更新的提交哈希创建新的docker compose文件

然后,您可以使用下面的命令在服务后面添加新容器(带有新图像)

docker-compose up --scale db=1 --scale service=1 --no-recreate
然后下一步是删除旧容器

   docker rm old-container # service
最后一步是将服务扩展到所需的实例数


这是我能想到的最适合docker创作的作品。如果您使用的是docker swarm或任何其他系统,它将是开箱即用的功能:)

我假设您正在寻找一些选项来使用docker compose进行滚动更新,并且您的服务支持多个实例。这可以通过以下方式实现:首先更改docker compose文件中的图像id,您可以使用CI/CD工具使用更新的提交哈希创建新的docker compose文件

然后,您可以使用下面的命令在服务后面添加新容器(带有新图像)

docker-compose up --scale db=1 --scale service=1 --no-recreate
然后下一步是删除旧容器

   docker rm old-container # service
最后一步是将服务扩展到所需的实例数

这是我能想到的最适合docker创作的作品。如果您使用的是docker swarm或任何其他系统,它将是开箱即用的功能:)