我如何自动将一个 docker php 版本标记为最新的图像标记为最新?

How I can automatically mark a docker php image that has its version as a tag as latest?

对于我的自定义 docker php 构建系统,我有以下 docker-compose

version: "3.7"
services:
  base72:
    build:
      context: .
      dockerfile: ./dockerfiles/7.2/Dockerfile
    image: myapp/php7.2:$VERSION_PHP_72
    stdin_open: true
    tty: true

  develop72:
    build:
      context: .
      dockerfile: ./dockerfiles/7.2/Dockerfile_develop
    links:
      - base72
    image: myapp/php7.2-dev:$VERSION_PHP_72
    volumes:
      - "./www:/var/www/html"
nginx:
    image: nginx:alpine
    ports:
      - 7880:7880
    links:
      - "develop72:develop72"
    volumes:
      - "./www:/var/www/html"
      - "./dist/nginx.conf:/etc/nginx/nginx.conf:ro"

然后我使用以下 buildspec.yml

构建它
version: 0.2

phases:
  install:
    runtime-versions:
      docker: 18
  pre_build:
   commands:
     - docker login -u $USER -p $TOKEN
  build:
    commands:
     - docker-compose build
  post_build:
    commands:
      - docker-compose up -d
      - docker push myapp/php7.2
      - docker push myapp/php7.2-dev

通过一个 .env 文件,我实现了一个版本控制系统方法 docker images:

VERSION_PHP_72=20191218212112

每个版本号都是格式为 YYYYMMDDHHMMSS 的当前日期。所以我希望我从我的 env 文件构建的版本也被认为是最新的。你知道我该怎么做吗?

对于解决方案,您需要以下 2 个组件:

  1. docker commit 允许您为容器指定标签
  2. docker-compose ps -q 这将允许您获取特定服务的容器。

上面的命令将合并到这个单行文件中:

docker commit $(docker-compose ps -q ^service^) ^image_name^:latest

其中: * ^service^:您在docker-compose.yml中定义的docker-compose服务 * ^image_name^: 你要推送到容器中的镜像是最新的。

所以为了推送 myapp/php7.2-dev 你需要 运行:

docker commit $(docker-compose ps -q develop72) myapp/php7.2-dev:latest

因此结束 codebuild.yml 将是:

version: 0.2

phases:
  install:
    runtime-versions:
      docker: 18
  pre_build:
   commands:
     - docker login -u $USER -p $TOKEN
  build:
    commands:
     - docker-compose build
  post_build:
    commands:
      - docker-compose up -d
      - docker commit $(docker-compose ps -q base72) myapp/php7.2:latest
      - docker commit $(docker-compose ps -q develop72) myapp/php7.2-dev:latest
      - docker push myapp/php7.2
      - docker push myapp/php7.2-dev

docker tag 可以为现有图像分配标签。我强烈建议还推送带有时间戳的图像版本,这样可以轻松部署已知良好的版本,并在出现问题时回滚。 (这在 Kubernetes 中也很重要。)

我会尝试这样的顺序:

build:
  commands:
   - docker-compose build
post_build:
  commands:
    - . ./.env && docker tag myapp/php7.2:$VERSION_PHP_72 myapp/php7.2:latest
    - . ./.env && docker push myapp/php7.2:$VERSION_PHP_72 myapp/php7.2:latest
    - . ./.env && docker tag myapp/php7.2-dev:$VERSION_PHP_72 myapp/php7.2-dev:latest
    - . ./.env && docker push myapp/php7.2-dev:$VERSION_PHP_72 myapp/php7.2-dev:latest