通过参数化构建多个 Docker Hub
Multiple Docker Hub builds by parameterization
我需要在(相对较多的)口味上构建相同的 Docker 文件。
特别是,我正在对 Apache Tomcat 进行定制。使用相同的 Docker 文件,对基础 Tomcat 应用一些增强功能,我需要构建几个基于不同版本的自定义 Tomcat(特别是至少基线 8.5
和9
结合 JDK 8
和 11
).
仅作为练习,只要在 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.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 }}
除了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
只有两个注意事项:
Docker Hub 永远不会自己推送任何东西。无论你建立什么习惯,你都必须推动它。这就是为什么我有 docker 推线并且我在我的代码
中使用变量 imageVersion
的最后一个值
Docker Hub 将在构建后推送一个 repository:latest
图像,因此它需要它的存在。选择最新推广对象,但要确保 Docker 已构建 latest
图像,无论是带有标签还是普通构建
我需要在(相对较多的)口味上构建相同的 Docker 文件。
特别是,我正在对 Apache Tomcat 进行定制。使用相同的 Docker 文件,对基础 Tomcat 应用一些增强功能,我需要构建几个基于不同版本的自定义 Tomcat(特别是至少基线 8.5
和9
结合 JDK 8
和 11
).
仅作为练习,只要在 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.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 }}
除了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
只有两个注意事项:
Docker Hub 永远不会自己推送任何东西。无论你建立什么习惯,你都必须推动它。这就是为什么我有 docker 推线并且我在我的代码
中使用变量imageVersion
的最后一个值Docker Hub 将在构建后推送一个
repository:latest
图像,因此它需要它的存在。选择最新推广对象,但要确保 Docker 已构建latest
图像,无论是带有标签还是普通构建