通过参数化构建多个 Docker Hub

Multiple Docker Hub builds by parameterization

我需要在(相对较多的)口味上构建相同的 Docker 文件。

特别是,我正在对 Apache Tomcat 进行定制。使用相同的 Docker 文件,对基础 Tomcat 应用一些增强功能,我需要构建几个基于不同版本的自定义 Tomcat(特别是至少基线 8.59 结合 JDK 811).

仅作为练习,只要在 Docker 上进行更多练习,我什至可以决定构建所有 Tomcat 图像,这些图像来自大量口味,作为定制版本。

鉴于我已经有一个Docker文件...

ARG TOMCAT_VERSION
FROM tomcat:${TOMCAT_VERSION}
MAINTAINER Some One (someone@example.biz)
ARG POSTGRES_JDBC_VERSION="42.2.16"
ARG ORACLE_JDBC_VERSION="19.7.0.0"
ARG LIFECYCLE_LISTENER_VERSION="1.0.1"
ENV MAX_MEMORY_SIZE 4096
ARG CONTEXT_NAME

ADD https://repo1.maven.org/maven2/net/aschemann/tomcat/tomcat-lifecyclelistener/${LIFECYCLE_LISTENER_VERSION}/tomcat-lifecyclelistener-${LIFECYCLE_LISTENER_VERSION}.jar /usr/local/tomcat/lib
ADD https://repo1.maven.org/maven2/org/postgresql/postgresql/${POSTGRES_JDBC_VERSION}/postgresql-${POSTGRES_JDBC_VERSION}.jar /usr/local/tomcat/lib
ADD https://repo1.maven.org/maven2/com/oracle/database/jdbc/ojdbc8/${ORACLE_JDBC_VERSION}/ojdbc8-${ORACLE_JDBC_VERSION}.jar /usr/local/tomcat/lib
COPY tomcat-${TOMCAT_MAJOR}/server.xml /usr/local/tomcat/conf/ #This enables AJP

EXPOSE 8009
EXPOSE 8080

VOLUME #some volume
# etc etc

我需要实现的是,可能使用 Docker Hub 的自动构建是

for (tomcatVersion in "8.5", "9")
    for (javaVersion in "jd8-slim", "jdk11-slim", "jdk14")
        docker build --build-arg TOMCAT_VERSION=$tomcatVersion+"-"+$javaVersion -t examplebiz/tomcat:$tomcatVersion+"-"+$javaVersion .

目前 Docker Hub 向我提供使用多个 Github 分支

但我不喜欢这样,因为一个 Docker 文件就足够了。我可以结合 6 个版本和 运行 从我的电脑手动构建

我不太了解构建挂钩。也许有解决办法?

我能得到一些关于如何设计构建的建议吗?

来自 Docker Hub 构建的功能没有很多选项。如果您需要更多可配置性并在 GitHub 中托管您的项目,请改为查看 GitHub 操作。

Docker 在 GitHub 操作中有一个 build-push action that has lots of options. And to support the multiple options, the matrix 语法,允许您 运行 使用不同设置的多个构建。您剩下的看起来像是项目中的文件调用 .github/workflows/docker.ymldocker 可以重命名):

name: docker

on:
  push:
    branches: master

jobs:
  docker:
    strategy:
      matrix:
        tomcatVer: ["8.5", "9"]
        javaVer: ["jd8-slim", "jdk11-slim", "jdk14"]
    runs-on: ubuntu-latest
    steps:
      - name: Check out code
        uses: actions/checkout@v2
      - name: Login to DockerHub
        uses: docker/login-action@v1 
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}
      - name: Build and push
        id: docker_build
        uses: docker/build-push-action@v2
        with:
          push: true
          tags: examplebiz/tomcat:${{ matrix.tomcatVer }}-${{ matrix.javaVer }}
          build-args: |
            TOMCAT_VERSION=${{ matrix.tomcatVer }}-${{ matrix.javaVer }}

除了BMitch的回答,同时我也找到了自己的方法,我想分享一下我的经验,可能会解释一下。

Docker Hub 允许挂钩自动化。特别是 build 挂钩,如 the docs 中所述,将覆盖整个构建过程。可以选择是更改传递给 Docker 的变量,还是重新发明全新的构建方式!!

我只需要将我的 pseudo-code for cycle 翻译成真正的 bash for cycle

#!/bin/bash

for tomcatVersion in "8.5" "9" ; do
    for javaVersion in "jdk8-slim" "jdk11-slim" "jdk14" ; do
        imageVersion="$tomcatVersion-$javaVersion"
        echo "Building Tomcat $imageVersion"
        docker build --build-arg TOMCAT_VERSION=$imageVersion -t examplebiz/tomcat:$imageVersion .;
        docker push examplebiz/tomcat:$imageVersion
    done
done

docker tag examplebiz/tomcat:$imageVersion examplebiz/tomcat:latest

只有两个注意事项:

  1. Docker Hub 永远不会自己推送任何东西。无论你建立什么习惯,你都必须推动它。这就是为什么我有 docker 推线并且我在我的代码

    中使用变量 imageVersion 的最后一个值
  2. Docker Hub 将在构建后推送一个 repository:latest 图像,因此它需要它的存在。选择最新推广对象,但要确保 Docker 已构建 latest 图像,无论是带有标签还是普通构建