diff --git a/Dockerfile.template b/Dockerfile similarity index 62% rename from Dockerfile.template rename to Dockerfile index cce6af4..9fff81c 100644 --- a/Dockerfile.template +++ b/Dockerfile @@ -1,7 +1,11 @@ -FROM {{ pihole.base }} +ARG PIHOLE_BASE +FROM $PIHOLE_BASE -ENV ARCH {{ pihole.arch }} -ENV S6OVERLAY_RELEASE https://github.com/just-containers/s6-overlay/releases/download/{{ pihole.s6_version }}/s6-overlay-{{ pihole.s6arch }}.tar.gz +ARG PIHOLE_ARCH +ENV PIHOLE_ARCH "${PIHOLE_ARCH}" +ARG S6_ARCH +ARG S6_VERSION +ENV S6OVERLAY_RELEASE "https://github.com/just-containers/s6-overlay/releases/download/${S6_VERSION}/s6-overlay-${S6_ARCH}.tar.gz" COPY install.sh /usr/local/bin/install.sh COPY VERSION /etc/docker-pi-hole-version @@ -16,8 +20,10 @@ ADD s6/debian-root / COPY s6/service /usr/local/bin/service # php config start passes special ENVs into -ENV PHP_ENV_CONFIG '{{ pihole.php_env_config }}' -ENV PHP_ERROR_LOG '{{ pihole.php_error_log }}' +ARG PHP_ENV_CONFIG +ENV PHP_ENV_CONFIG "${PHP_ENV_CONFIG}" +ARG PHP_ERROR_LOG +ENV PHP_ERROR_LOG "${PHP_ERROR_LOG}" COPY ./start.sh / COPY ./bash_functions.sh / @@ -37,11 +43,14 @@ ENV ServerIP 0.0.0.0 ENV FTL_CMD no-daemon ENV DNSMASQ_USER root -ENV VERSION {{ pihole.version }} +ARG PIHOLE_VERSION +ENV VERSION "${PIHOLE_VERSION}" ENV PATH /opt/pihole:${PATH} -LABEL image="{{ pihole.name }}:{{ pihole.version }}_{{ pihole.arch }}" -LABEL maintainer="{{ pihole.maintainer }}" +ARG NAME +LABEL image="${NAME}:${PIHOLE_VERSION}_${PIHOLE_ARCH}" +ARG MAINTAINER +LABEL maintainer="${MAINTAINER}" LABEL url="https://www.github.com/pi-hole/docker-pi-hole" HEALTHCHECK CMD dig +norecurse +retry=0 @127.0.0.1 pi.hole || exit 1 diff --git a/Dockerfile.py b/Dockerfile.py index 0aa1e1b..7fc1363 100755 --- a/Dockerfile.py +++ b/Dockerfile.py @@ -2,12 +2,11 @@ """ Dockerfile.py - generates and build dockerfiles Usage: - Dockerfile.py [--hub_tag=] [--arch= ...] [-v] [-t] [--no-build | --no-generate] [--no-cache] + Dockerfile.py [--hub_tag=] [--arch= ...] [-v] [-t] [--no-build] [--no-cache] Options: --no-build Skip building the docker images --no-cache Build without using any cache data - --no-generate Skip generating Dockerfiles from template --hub_tag= What the Docker Hub Image should be tagged as [default: None] --arch= What Architecture(s) to build [default: amd64 armel armhf arm64] -v Print docker's command output [default: False] @@ -17,81 +16,18 @@ Examples: """ -from jinja2 import Environment, FileSystemLoader from docopt import docopt import os import subprocess -import sys THIS_DIR = os.path.dirname(os.path.abspath(__file__)) -base_vars = { - 'name': 'pihole/pihole', - 'maintainer' : 'adam@diginc.us', - 's6_version' : 'v1.22.1.0', -} - -os_base_vars = { - 'php_env_config': '/etc/lighttpd/conf-enabled/15-fastcgi-php.conf', - 'php_error_log': '/var/log/lighttpd/error.log' -} - __version__ = None dot = os.path.abspath('.') with open('{}/VERSION'.format(dot), 'r') as v: raw_version = v.read().strip() __version__ = raw_version.replace('release/', 'release-') -images = { - __version__: [ - { - 'base': 'pihole/debian-base:latest', - 'arch': 'amd64', - 's6arch': 'amd64', - }, - { - 'base': 'multiarch/debian-debootstrap:armel-stretch-slim', - 'arch': 'armel', - 's6arch': 'arm', - }, - { - 'base': 'multiarch/debian-debootstrap:armhf-stretch-slim', - 'arch': 'armhf', - 's6arch' : 'arm', - }, - { - 'base': 'multiarch/debian-debootstrap:arm64-stretch-slim', - 'arch': 'arm64', - 's6arch' : 'aarch64', - } - ] -} - -def generate_dockerfiles(args): - if args['--no-generate']: - print(" ::: Skipping Dockerfile generation") - return - - for version, archs in images.items(): - for image in archs: - if image['arch'] not in args['--arch']: - continue - s6arch = image['s6arch'] if image['s6arch'] else image['arch'] - merged_data = dict( - list({ 'version': version }.items()) + - list(base_vars.items()) + - list(os_base_vars.items()) + - list(image.items()) + - list({ 's6arch': s6arch }.items()) - ) - j2_env = Environment(loader=FileSystemLoader(THIS_DIR), - trim_blocks=True) - template = j2_env.get_template('Dockerfile.template') - - dockerfile = 'Dockerfile_{}'.format(image['arch']) - with open(dockerfile, 'w') as f: - f.write(template.render(pihole=merged_data)) - def build_dockerfiles(args): if args['--no-build']: @@ -104,7 +40,9 @@ def build_dockerfiles(args): def run_and_stream_command_output(command, args): print("Running", command) - build_result = subprocess.Popen(command.split(), stdout=subprocess.PIPE, stderr=subprocess.STDOUT, + build_env = os.environ.copy() + build_env['PIHOLE_VERSION'] = __version__ + build_result = subprocess.Popen(command.split(), env=build_env, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, bufsize=1, universal_newlines=True) if args['-v']: while build_result.poll() is None: @@ -117,19 +55,17 @@ def run_and_stream_command_output(command, args): def build(docker_repo, arch, args): - dockerfile = 'Dockerfile_{}'.format(arch) - repo_tag = '{}:{}_{}'.format(docker_repo, __version__, arch) - cached_image = '{}/{}'.format('pihole', repo_tag) + repo_tag = '{}:{}-{}'.format(docker_repo, __version__, arch) print(" ::: Building {}".format(repo_tag)) - time='' + time = '' if args['-t']: - time='time ' + time = 'time ' no_cache = '' if args['--no-cache']: no_cache = '--no-cache' - build_command = '{time}docker build {no_cache} --pull --cache-from="{cache},{create_tag}" -f {dockerfile} -t {create_tag} .'\ - .format(time=time, no_cache=no_cache, cache=cached_image, dockerfile=dockerfile, create_tag=repo_tag) - print(" ::: Building {} into {}".format(dockerfile, repo_tag)) + build_command = '{time}docker-compose -f build.yml build {no_cache} --pull {arch}'\ + .format(time=time, no_cache=no_cache, arch=arch) + print(" ::: Building {} into {}".format(arch, repo_tag)) run_and_stream_command_output(build_command, args) if args['-v']: print(build_command, '\n') @@ -145,5 +81,4 @@ if __name__ == '__main__': if args['-v']: print(args) - generate_dockerfiles(args) build_dockerfiles(args) diff --git a/Dockerfile_amd64 b/Dockerfile_amd64 deleted file mode 100644 index 121adde..0000000 --- a/Dockerfile_amd64 +++ /dev/null @@ -1,49 +0,0 @@ -FROM pihole/debian-base:latest - -ENV ARCH amd64 -ENV S6OVERLAY_RELEASE https://github.com/just-containers/s6-overlay/releases/download/v1.22.1.0/s6-overlay-amd64.tar.gz - -COPY install.sh /usr/local/bin/install.sh -COPY VERSION /etc/docker-pi-hole-version -ENV PIHOLE_INSTALL /root/ph_install.sh - -RUN bash -ex install.sh 2>&1 && \ - rm -rf /var/cache/apt/archives /var/lib/apt/lists/* - -ENTRYPOINT [ "/s6-init" ] - -ADD s6/debian-root / -COPY s6/service /usr/local/bin/service - -# php config start passes special ENVs into -ENV PHP_ENV_CONFIG '/etc/lighttpd/conf-enabled/15-fastcgi-php.conf' -ENV PHP_ERROR_LOG '/var/log/lighttpd/error.log' -COPY ./start.sh / -COPY ./bash_functions.sh / - -# IPv6 disable flag for networks/devices that do not support it -ENV IPv6 True - -EXPOSE 53 53/udp -EXPOSE 67/udp -EXPOSE 80 -EXPOSE 443 - -ENV S6_LOGGING 0 -ENV S6_KEEP_ENV 1 -ENV S6_BEHAVIOUR_IF_STAGE2_FAILS 2 - -ENV ServerIP 0.0.0.0 -ENV FTL_CMD no-daemon -ENV DNSMASQ_USER root - -ENV VERSION v5.0 -ENV PATH /opt/pihole:${PATH} - -LABEL image="pihole/pihole:v5.0_amd64" -LABEL maintainer="adam@diginc.us" -LABEL url="https://www.github.com/pi-hole/docker-pi-hole" - -HEALTHCHECK CMD dig +norecurse +retry=0 @127.0.0.1 pi.hole || exit 1 - -SHELL ["/bin/bash", "-c"] \ No newline at end of file diff --git a/Dockerfile_arm64 b/Dockerfile_arm64 deleted file mode 100644 index c3f6ad4..0000000 --- a/Dockerfile_arm64 +++ /dev/null @@ -1,49 +0,0 @@ -FROM multiarch/debian-debootstrap:arm64-stretch-slim - -ENV ARCH arm64 -ENV S6OVERLAY_RELEASE https://github.com/just-containers/s6-overlay/releases/download/v1.22.1.0/s6-overlay-aarch64.tar.gz - -COPY install.sh /usr/local/bin/install.sh -COPY VERSION /etc/docker-pi-hole-version -ENV PIHOLE_INSTALL /root/ph_install.sh - -RUN bash -ex install.sh 2>&1 && \ - rm -rf /var/cache/apt/archives /var/lib/apt/lists/* - -ENTRYPOINT [ "/s6-init" ] - -ADD s6/debian-root / -COPY s6/service /usr/local/bin/service - -# php config start passes special ENVs into -ENV PHP_ENV_CONFIG '/etc/lighttpd/conf-enabled/15-fastcgi-php.conf' -ENV PHP_ERROR_LOG '/var/log/lighttpd/error.log' -COPY ./start.sh / -COPY ./bash_functions.sh / - -# IPv6 disable flag for networks/devices that do not support it -ENV IPv6 True - -EXPOSE 53 53/udp -EXPOSE 67/udp -EXPOSE 80 -EXPOSE 443 - -ENV S6_LOGGING 0 -ENV S6_KEEP_ENV 1 -ENV S6_BEHAVIOUR_IF_STAGE2_FAILS 2 - -ENV ServerIP 0.0.0.0 -ENV FTL_CMD no-daemon -ENV DNSMASQ_USER root - -ENV VERSION v5.0 -ENV PATH /opt/pihole:${PATH} - -LABEL image="pihole/pihole:v5.0_arm64" -LABEL maintainer="adam@diginc.us" -LABEL url="https://www.github.com/pi-hole/docker-pi-hole" - -HEALTHCHECK CMD dig +norecurse +retry=0 @127.0.0.1 pi.hole || exit 1 - -SHELL ["/bin/bash", "-c"] \ No newline at end of file diff --git a/Dockerfile_armel b/Dockerfile_armel deleted file mode 100644 index dc35b3a..0000000 --- a/Dockerfile_armel +++ /dev/null @@ -1,49 +0,0 @@ -FROM multiarch/debian-debootstrap:armel-stretch-slim - -ENV ARCH armel -ENV S6OVERLAY_RELEASE https://github.com/just-containers/s6-overlay/releases/download/v1.22.1.0/s6-overlay-arm.tar.gz - -COPY install.sh /usr/local/bin/install.sh -COPY VERSION /etc/docker-pi-hole-version -ENV PIHOLE_INSTALL /root/ph_install.sh - -RUN bash -ex install.sh 2>&1 && \ - rm -rf /var/cache/apt/archives /var/lib/apt/lists/* - -ENTRYPOINT [ "/s6-init" ] - -ADD s6/debian-root / -COPY s6/service /usr/local/bin/service - -# php config start passes special ENVs into -ENV PHP_ENV_CONFIG '/etc/lighttpd/conf-enabled/15-fastcgi-php.conf' -ENV PHP_ERROR_LOG '/var/log/lighttpd/error.log' -COPY ./start.sh / -COPY ./bash_functions.sh / - -# IPv6 disable flag for networks/devices that do not support it -ENV IPv6 True - -EXPOSE 53 53/udp -EXPOSE 67/udp -EXPOSE 80 -EXPOSE 443 - -ENV S6_LOGGING 0 -ENV S6_KEEP_ENV 1 -ENV S6_BEHAVIOUR_IF_STAGE2_FAILS 2 - -ENV ServerIP 0.0.0.0 -ENV FTL_CMD no-daemon -ENV DNSMASQ_USER root - -ENV VERSION v5.0 -ENV PATH /opt/pihole:${PATH} - -LABEL image="pihole/pihole:v5.0_armel" -LABEL maintainer="adam@diginc.us" -LABEL url="https://www.github.com/pi-hole/docker-pi-hole" - -HEALTHCHECK CMD dig +norecurse +retry=0 @127.0.0.1 pi.hole || exit 1 - -SHELL ["/bin/bash", "-c"] \ No newline at end of file diff --git a/Dockerfile_armhf b/Dockerfile_armhf deleted file mode 100644 index 1862462..0000000 --- a/Dockerfile_armhf +++ /dev/null @@ -1,49 +0,0 @@ -FROM multiarch/debian-debootstrap:armhf-stretch-slim - -ENV ARCH armhf -ENV S6OVERLAY_RELEASE https://github.com/just-containers/s6-overlay/releases/download/v1.22.1.0/s6-overlay-arm.tar.gz - -COPY install.sh /usr/local/bin/install.sh -COPY VERSION /etc/docker-pi-hole-version -ENV PIHOLE_INSTALL /root/ph_install.sh - -RUN bash -ex install.sh 2>&1 && \ - rm -rf /var/cache/apt/archives /var/lib/apt/lists/* - -ENTRYPOINT [ "/s6-init" ] - -ADD s6/debian-root / -COPY s6/service /usr/local/bin/service - -# php config start passes special ENVs into -ENV PHP_ENV_CONFIG '/etc/lighttpd/conf-enabled/15-fastcgi-php.conf' -ENV PHP_ERROR_LOG '/var/log/lighttpd/error.log' -COPY ./start.sh / -COPY ./bash_functions.sh / - -# IPv6 disable flag for networks/devices that do not support it -ENV IPv6 True - -EXPOSE 53 53/udp -EXPOSE 67/udp -EXPOSE 80 -EXPOSE 443 - -ENV S6_LOGGING 0 -ENV S6_KEEP_ENV 1 -ENV S6_BEHAVIOUR_IF_STAGE2_FAILS 2 - -ENV ServerIP 0.0.0.0 -ENV FTL_CMD no-daemon -ENV DNSMASQ_USER root - -ENV VERSION v5.0 -ENV PATH /opt/pihole:${PATH} - -LABEL image="pihole/pihole:v5.0_armhf" -LABEL maintainer="adam@diginc.us" -LABEL url="https://www.github.com/pi-hole/docker-pi-hole" - -HEALTHCHECK CMD dig +norecurse +retry=0 @127.0.0.1 pi.hole || exit 1 - -SHELL ["/bin/bash", "-c"] \ No newline at end of file diff --git a/README.md b/README.md index cd86e54..31183ce 100644 --- a/README.md +++ b/README.md @@ -180,7 +180,7 @@ The primary docker tags / versions are explained in the following table. [Click | tag | architecture | description | Dockerfile | | --- | ------------ | ----------- | ---------- | -| `latest` | auto detect | x86, arm, or arm64 container, docker auto detects your architecture. | [Dockerfile](https://github.com/pi-hole/docker-pi-hole/blob/master/Dockerfile_amd64) | +| `latest` | auto detect | x86, arm, or arm64 container, docker auto detects your architecture. | [Dockerfile](https://github.com/pi-hole/docker-pi-hole/blob/master/Dockerfile) | | `v4.0.0-1` | auto detect | Versioned tags, if you want to pin against a specific version, use one of these | | | `v4.0.0-1_` | based on tag | Specific architectures tags | | | `dev` | auto detect | like latest tag, but for the development branch (pushed occasionally) | | diff --git a/build.yml b/build.yml new file mode 100644 index 0000000..ab78653 --- /dev/null +++ b/build.yml @@ -0,0 +1,57 @@ +# Docker Compose build file: docker-compose -f build.yml build +version: "3.7" + +x-common-args: &common-args + PIHOLE_VERSION: ${PIHOLE_VERSION} + NAME: pihole/pihole + MAINTAINER: adam@diginc.us + S6_VERSION: v1.22.1.0 + PHP_ENV_CONFIG: /etc/lighttpd/conf-enabled/15-fastcgi-php.conf + PHP_ERROR_LOG: /var/log/lighttpd/error.log + + +services: + amd64: + image: pihole:${PIHOLE_VERSION}-amd64 + build: + context: . + cache_from: + - pihole/pihole:${PIHOLE_VERSION}-amd64 + args: + <<: *common-args + PIHOLE_BASE: pihole/debian-base:latest + PIHOLE_ARCH: amd64 + S6_ARCH: amd64 + armel: + image: pihole:${PIHOLE_VERSION}-armel + build: + context: . + cache_from: + - pihole/pihole:${PIHOLE_VERSION}-armel + args: + <<: *common-args + PIHOLE_BASE: multiarch/debian-debootstrap:armel-stretch-slim + PIHOLE_ARCH: armel + S6_ARCH: arm + armhf: + image: pihole:${PIHOLE_VERSION}-armhf + build: + context: . + cache_from: + - pihole/pihole:${PIHOLE_VERSION}-armhf + args: + <<: *common-args + PIHOLE_BASE: multiarch/debian-debootstrap:armhf-stretch-slim + PIHOLE_ARCH: arm + S6_ARCH: arm + arm64: + image: pihole:${PIHOLE_VERSION}-arm64 + build: + context: . + cache_from: + - pihole/pihole:${PIHOLE_VERSION}-arm64 + args: + <<: *common-args + PIHOLE_BASE: multiarch/debian-debootstrap:arm64-stretch-slim + PIHOLE_ARCH: arm64 + S6_ARCH: aarch64 \ No newline at end of file