Множественные сборки Docker Hub с помощью параметризации

#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

Настройки сборки Docker Hub

Но мне это не нравится, так как достаточно одного файла 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
  

Есть только два предостережения:

  1. Docker Hub никогда ничего не будет запускать сам по себе. Какой бы пользовательский интерфейс вы ни создали, вы должны его нажать. Вот почему у меня есть строка docker push, и я использую последнее значение переменной imageVersion в своем коде

  2. 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 }}