#docker #dockerhub #auto-build
#docker #dockerhub #автоматическая сборка
Вопрос:
У меня есть требование создать один и тот же файл Dockerfile для (относительно большого) количества вариантов.
В частности, я работаю над настройкой Apache Tomcat. С тем же Dockerfile, применяя некоторые улучшения к базовому Tomcat, мне нужно создать несколько настраиваемых Tomcats на основе разных версий (в частности, по крайней мере, базовых 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 версий и запустить сборку вручную со своего ПК
Я не очень хорошо понял перехваты сборки. Может быть, там лежит решение?
Могу ли я получить несколько советов о том, как спроектировать сборку?
Ответ №1:
В дополнение к ответу BMitch я также нашел свой собственный путь, и я хотел бы поделиться своим опытом, возможно, объяснив.
Docker Hub позволяет автоматизировать перехваты. В частности, build
перехват, как описано в документации, переопределит весь процесс сборки. Можно выбрать, изменять ли переменные, передаваемые в Docker, или изобретать совершенно новые способы сборки!!
Мне просто нужно было перевести мой псевдокод для cycle в реальный bash для 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 push, и я использую последнее значение переменной
imageVersion
в своем коде -
Docker Hub отправит
repository:latest
изображение после сборки, поэтому оно требует его присутствия. Выберите, кого продвигать последним, но убедитесь, что Docker создалlatest
изображение, будь то с тегом или простой сборкой
Ответ №2:
Функциональность из сборок Docker Hub не имеет большого количества опций. Если вам нужна дополнительная конфигурируемость и вы размещаете свой проект на GitHub, вместо этого взгляните на действия GitHub.
В Docker есть действие build-push, которое имеет множество опций. А для поддержки нескольких опций синтаксис матрицы в GitHub actions позволяет запускать несколько сборок с разными настройками. То, что у вас осталось, выглядит как вызов файла .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 }}