1

我需要在(相对较大的)数量上构建相同的 Dockerfile。

特别是,我正在定制 Apache Tomcat。使用相同的 Dockerfile,对基础 Tomcat 进行一些增强,我需要构建几个基于不同版本的自定义 Tomcat(尤其是至少基线8.59结合 JDK811)。

作为一个练习,只要在 Docker 上获得更多练习,我什至可以决定构建所有 Tomcat 镜像,这些镜像有很多风格,作为定制构建。

鉴于我已经有一个 Dockerfile ......

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 Hub 构建设置

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

我还不太了解构建挂钩。也许有解决方案?

我可以就如何设计构建获得一些建议吗?

4

2 回答 2

1

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

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

我只需要将循环的伪代码翻译成真正的循环 bash

#!/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 不会自己推送任何东西。无论你建立什么习惯,你都必须推动它。imageVersion这就是为什么我有 docker push 行并在我的代码中使用变量的最后一个值

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

于 2020-10-02T22:01:22.847 回答
1

Docker Hub 构建的功能没有太多选择。如果您需要更多可配置性并将项目托管在 GitHub 中,请查看 GitHub Actions。

Docker 有一个构建推送操作,它有很多选项。为了支持多个选项,GitHub 操作中的矩阵语法允许您使用不同的设置运行多个构建。你剩下的看起来像.github/workflows/docker.yml你的项目中的一个文件调用(docker可以重命名):

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 }}
于 2020-10-02T21:51:35.980 回答