我需要在(相对较大的)数量上构建相同的 Dockerfile。
特别是,我正在定制 Apache Tomcat。使用相同的 Dockerfile,对基础 Tomcat 进行一些增强,我需要构建几个基于不同版本的自定义 Tomcat(尤其是基线 8.5
和 9
结合 JDK 8
和 11
)。
仅作为练习 ,只要在 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 分支但我不喜欢这样,因为单个 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
只有两个警告:imageVersion
的最后一个值的原因。在我的代码中repository:latest
构建后的图像,因此它需要它的存在。选择最新的推广对象,但要确保 Docker 已经构建了 latest
图像,无论是带有标签还是普通版本关于docker - 通过参数化构建多个 Docker Hub,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64178442/