docker - 通过参数化构建多个 Docker Hub

标签 docker dockerhub auto-build

我需要在(相对较大的)数量上构建相同的 Dockerfile。
特别是,我正在定制 Apache Tomcat。使用相同的 Dockerfile,对基础 Tomcat 进行一些增强,我需要构建几个基于不同版本的自定义 Tomcat(尤其是基线 8.59 结合 JDK 811 )。
仅作为练习 ,只要在 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 Build Settings
但我不喜欢这样,因为单个 Dockerfile 就足够了。我可以结合 6 个版本并从我的电脑手动运行构建
我还不太了解构建 Hook 。也许有解决方案?
我可以就如何设计构建获得一些建议吗?

最佳答案

除了 BMitch 的回答,我同时也找到了自己的方法,我想分享一下我的经验,可能会解释一下。
Docker Hub 允许 hooks 自动化。特别是 build Hook ,如 the docs 中所述, 将覆盖整个构建过程。可以选择是更改传递给 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
只有两个警告:
  • Docker Hub 不会自己推送任何东西。无论你建立什么习惯,你都必须插入它。这就是为什么我有 docker push 行并使用变量 imageVersion 的最后一个值的原因。在我的代码中
  • Docker Hub 将推送 repository:latest构建后的图像,因此它需要它的存在。选择最新的推广对象,但要确保 Docker 已经构建了 latest图像,无论是带有标签还是普通版本
  • 关于docker - 通过参数化构建多个 Docker Hub,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64178442/

    相关文章:

    amazon-web-services - 如何在 ECS 上自动启动我的 docker 容器?

    docker - Dockerfile:如何在CP中运行子命令?

    docker - 如何告诉 mac 上的 docker 出于所有目的使用主机网络?

    docker - 为什么 "docker push"会推送几张图片,在哪里?

    android - eclipse android 关闭 ndk 自动构建

    c++ - 如何启用 Eclipse 以在运行前自动构建/自动保存更改 (CDT)

    php - 将此curl命令翻译为php curl

    proxy - 在代理后面拉取 docker 镜像

    docker - 推送到 Docker 私有(private)组织存储库

    msbuild - 无论如何要在 WIX wxs 文件中创建自定义 MSBuild 属性吗?