templated dockerfiles building used by tests

* test images are built without diginc/ namespace
* no tests for other archs yet, unsure if they'll even build on travis
* Removed old dockerfiles
* New files names require Docker Cloud reconfiguration when merged upstream
* Probably some stuff I missed, just ask me
This commit is contained in:
diginc 2017-10-02 22:52:02 -05:00
parent db443aa0dc
commit 18997fe9f6
13 changed files with 50 additions and 307 deletions

View File

@ -4,36 +4,36 @@ import os
THIS_DIR = os.path.dirname(os.path.abspath(__file__)) THIS_DIR = os.path.dirname(os.path.abspath(__file__))
base_vars = { base_vars = {
'name': 'diginc/pi-hole', 'name': 'pi-hole',
'maintainer' : 'adam@diginc.us', 'maintainer' : 'adam@diginc.us',
's6_version' : 'v1.20.0.0', 's6_version' : 'v1.20.0.0',
} }
images = { images = {
'debian': [ 'debian': [
dict(base_vars.items() + { dict(base_vars.items() + {
'base': 'debian:jessie', 'base': 'debian:jessie',
'arch': 'amd64' 'arch': 'amd64'
}.items()), }.items()),
dict(base_vars.items() + { dict(base_vars.items() + {
'base': 'multiarch/debian-debootstrap:armhf-jessie-slim', 'base': 'multiarch/debian-debootstrap:armhf-jessie-slim',
'arch': 'armhf' 'arch': 'armhf'
}.items()), }.items()),
dict(base_vars.items() + { dict(base_vars.items() + {
'base': 'multiarch/debian-debootstrap:arm64-jessie-slim', 'base': 'multiarch/debian-debootstrap:arm64-jessie-slim',
'arch': 'aarch64' 'arch': 'aarch64'
}.items()), }.items()),
], ],
'alpine': [ 'alpine': [
dict(base_vars.items() + { dict(base_vars.items() + {
'base': 'alpine:edge', 'base': 'alpine:edge',
'arch': 'amd64' 'arch': 'amd64'
}.items()), }.items()),
dict(base_vars.items() + { dict(base_vars.items() + {
'base': 'multiarch/alpine:armhf-edge', 'base': 'multiarch/alpine:armhf-edge',
'arch': 'armhf' 'arch': 'armhf'
}.items()), }.items()),
dict(base_vars.items() + { dict(base_vars.items() + {
'base': 'multiarch/alpine:aarch64-edge', 'base': 'multiarch/alpine:aarch64-edge',
'arch': 'aarch64' 'arch': 'aarch64'
}.items()) }.items())
@ -46,9 +46,9 @@ def generate_dockerfiles():
j2_env = Environment(loader=FileSystemLoader(THIS_DIR), j2_env = Environment(loader=FileSystemLoader(THIS_DIR),
trim_blocks=True) trim_blocks=True)
template = j2_env.get_template('Dockerfile_{}.template'.format(os)) template = j2_env.get_template('Dockerfile_{}.template'.format(os))
Dockerfile = 'Dockerfile_{}_{}'.format(os, image['arch']) dockerfile = 'Dockerfile_{}_{}'.format(os, image['arch'])
with open(Dockerfile, 'w') as f: with open(dockerfile, 'w') as f:
f.write(template.render(os=os, image=image)) f.write(template.render(os=os, image=image))
if __name__ == '__main__': if __name__ == '__main__':

View File

@ -1,5 +1,5 @@
FROM {{ image.base }} FROM {{ image.base }}
LABEL {{ image.maintainer }} LABEL maintainer="{{ image.maintainer }}"
ENV IMAGE {{ os }} ENV IMAGE {{ os }}
ENV ARCH {{ image.arch }} ENV ARCH {{ image.arch }}
@ -8,7 +8,7 @@ ENV PATH /opt/pihole:${PATH}
COPY install.sh /usr/local/bin/docker-install.sh COPY install.sh /usr/local/bin/docker-install.sh
ENV setupVars /etc/pihole/setupVars.conf ENV setupVars /etc/pihole/setupVars.conf
ENV PIHOLE_INSTALL /tmp/ph_install.sh ENV PIHOLE_INSTALL /tmp/ph_install.sh
ENV S6OVERLAY_RELEASE https://github.com/just-containers/s6-overlay/releases/download/v1.20.0.0/s6-overlay-amd64.tar.gz ENV S6OVERLAY_RELEASE https://github.com/just-containers/s6-overlay/releases/download/{{ image.s6_version }}/s6-overlay-{{ image.arch }}.tar.gz
RUN apk upgrade --update && \ RUN apk upgrade --update && \
apk add bind-tools wget curl bash libcap && \ apk add bind-tools wget curl bash libcap && \

View File

@ -1,5 +1,5 @@
FROM multiarch/alpine:aarch64-edge FROM multiarch/alpine:aarch64-edge
LABEL adam@diginc.us LABEL maintainer="adam@diginc.us"
ENV IMAGE alpine ENV IMAGE alpine
ENV ARCH aarch64 ENV ARCH aarch64
@ -8,7 +8,7 @@ ENV PATH /opt/pihole:${PATH}
COPY install.sh /usr/local/bin/docker-install.sh COPY install.sh /usr/local/bin/docker-install.sh
ENV setupVars /etc/pihole/setupVars.conf ENV setupVars /etc/pihole/setupVars.conf
ENV PIHOLE_INSTALL /tmp/ph_install.sh ENV PIHOLE_INSTALL /tmp/ph_install.sh
ENV S6OVERLAY_RELEASE https://github.com/just-containers/s6-overlay/releases/download/v1.20.0.0/s6-overlay-amd64.tar.gz ENV S6OVERLAY_RELEASE https://github.com/just-containers/s6-overlay/releases/download/v1.20.0.0/s6-overlay-aarch64.tar.gz
RUN apk upgrade --update && \ RUN apk upgrade --update && \
apk add bind-tools wget curl bash libcap && \ apk add bind-tools wget curl bash libcap && \

View File

@ -1,5 +1,5 @@
FROM alpine:edge FROM alpine:edge
LABEL adam@diginc.us LABEL maintainer="adam@diginc.us"
ENV IMAGE alpine ENV IMAGE alpine
ENV ARCH amd64 ENV ARCH amd64

View File

@ -1,5 +1,5 @@
FROM multiarch/alpine:armhf-edge FROM multiarch/alpine:armhf-edge
LABEL adam@diginc.us LABEL maintainer="adam@diginc.us"
ENV IMAGE alpine ENV IMAGE alpine
ENV ARCH armhf ENV ARCH armhf
@ -8,7 +8,7 @@ ENV PATH /opt/pihole:${PATH}
COPY install.sh /usr/local/bin/docker-install.sh COPY install.sh /usr/local/bin/docker-install.sh
ENV setupVars /etc/pihole/setupVars.conf ENV setupVars /etc/pihole/setupVars.conf
ENV PIHOLE_INSTALL /tmp/ph_install.sh ENV PIHOLE_INSTALL /tmp/ph_install.sh
ENV S6OVERLAY_RELEASE https://github.com/just-containers/s6-overlay/releases/download/v1.20.0.0/s6-overlay-amd64.tar.gz ENV S6OVERLAY_RELEASE https://github.com/just-containers/s6-overlay/releases/download/v1.20.0.0/s6-overlay-armhf.tar.gz
RUN apk upgrade --update && \ RUN apk upgrade --update && \
apk add bind-tools wget curl bash libcap && \ apk add bind-tools wget curl bash libcap && \

View File

@ -1,61 +0,0 @@
FROM multiarch/alpine:armhf-edge
MAINTAINER adam@diginc.us <adam@diginc.us>
ENV IMAGE alpine
ENV ARCH armhf
ENV PATH /opt/pihole:${PATH}
COPY install.sh /usr/local/bin/docker-install.sh
ENV setupVars /etc/pihole/setupVars.conf
ENV PIHOLE_INSTALL /tmp/ph_install.sh
ENV S6OVERLAY_RELEASE https://github.com/just-containers/s6-overlay/releases/download/v1.20.0.0/s6-overlay-armhf.tar.gz
RUN apk upgrade --update && \
apk add bind-tools wget curl bash libcap && \
curl -L -s $S6OVERLAY_RELEASE \
| tar xvzf - -C / && \
docker-install.sh && \
rm -rf /var/cache/apk/*
ENTRYPOINT [ "/init" ]
ADD s6/alpine-root /
COPY s6/service /usr/local/bin/service
# Things installer did and fix alpine+nginx differences
ENV WEBLOGDIR /var/log/nginx
ENV PHP_CONFIG '/etc/php5/php-fpm.conf'
RUN mkdir -p /etc/pihole/ && \
mkdir -p /var/www/html/pihole && \
mkdir -p /var/www/html/admin/ && \
chown nginx:nginx /var/www/html && \
touch ${WEBLOGDIR}/access.log ${WEBLOGDIR}/error.log && \
chown -R nginx:nginx ${WEBLOGDIR} && \
sed -i 's|^user\s*=.*$|user = nginx|' $PHP_CONFIG && \
sed -i '/^;pid/ s|^;||' $PHP_CONFIG && \
chmod 775 /var/www/html && \
touch /var/log/pihole.log && \
chmod 644 /var/log/pihole.log && \
chown dnsmasq:root /var/log/pihole.log && \
sed -i "s/@INT@/eth0/" /etc/dnsmasq.d/01-pihole.conf && \
setcap CAP_NET_BIND_SERVICE=+eip `which dnsmasq` && \
cp -f /usr/bin/list.sh /opt/pihole/list.sh && \
echo 'Done!'
# php config start passes special ENVs into
ENV PHP_ENV_CONFIG '/etc/php5/fpm.d/envs.conf'
ENV PHP_ERROR_LOG '/var/log/nginx/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 80
ENV S6_LOGGING 0
ENV S6_KEEP_ENV 1
ENV S6_BEHAVIOUR_IF_STAGE2_FAILS 2
SHELL ["/bin/bash", "-c"]

View File

@ -1,61 +0,0 @@
FROM multiarch/alpine:aarch64-edge
MAINTAINER adam@diginc.us <adam@diginc.us>
ENV IMAGE alpine
ENV ARCH aarch64
ENV PATH /opt/pihole:${PATH}
COPY install.sh /usr/local/bin/docker-install.sh
ENV setupVars /etc/pihole/setupVars.conf
ENV PIHOLE_INSTALL /tmp/ph_install.sh
ENV S6OVERLAY_RELEASE https://github.com/just-containers/s6-overlay/releases/download/v1.20.0.0/s6-overlay-aarch64.tar.gz
RUN apk upgrade --update && \
apk add bind-tools wget curl bash libcap && \
curl -L -s $S6OVERLAY_RELEASE \
| tar xvzf - -C / && \
docker-install.sh && \
rm -rf /var/cache/apk/*
ENTRYPOINT [ "/init" ]
ADD s6/alpine-root /
COPY s6/service /usr/local/bin/service
# Things installer did and fix alpine+nginx differences
ENV WEBLOGDIR /var/log/nginx
ENV PHP_CONFIG '/etc/php5/php-fpm.conf'
RUN mkdir -p /etc/pihole/ && \
mkdir -p /var/www/html/pihole && \
mkdir -p /var/www/html/admin/ && \
chown nginx:nginx /var/www/html && \
touch ${WEBLOGDIR}/access.log ${WEBLOGDIR}/error.log && \
chown -R nginx:nginx ${WEBLOGDIR} && \
sed -i 's|^user\s*=.*$|user = nginx|' $PHP_CONFIG && \
sed -i '/^;pid/ s|^;||' $PHP_CONFIG && \
chmod 775 /var/www/html && \
touch /var/log/pihole.log && \
chmod 644 /var/log/pihole.log && \
chown dnsmasq:root /var/log/pihole.log && \
sed -i "s/@INT@/eth0/" /etc/dnsmasq.d/01-pihole.conf && \
setcap CAP_NET_BIND_SERVICE=+eip `which dnsmasq` && \
cp -f /usr/bin/list.sh /opt/pihole/list.sh && \
echo 'Done!'
# php config start passes special ENVs into
ENV PHP_ENV_CONFIG '/etc/php5/fpm.d/envs.conf'
ENV PHP_ERROR_LOG '/var/log/nginx/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 80
ENV S6_LOGGING 0
ENV S6_KEEP_ENV 1
ENV S6_BEHAVIOUR_IF_STAGE2_FAILS 2
SHELL ["/bin/bash", "-c"]

View File

@ -1,61 +0,0 @@
FROM alpine:edge
MAINTAINER adam@diginc.us <adam@diginc.us>
ENV IMAGE alpine
ENV ARCH amd64
ENV PATH /opt/pihole:${PATH}
COPY install.sh /usr/local/bin/docker-install.sh
ENV setupVars /etc/pihole/setupVars.conf
ENV PIHOLE_INSTALL /tmp/ph_install.sh
ENV S6OVERLAY_RELEASE https://github.com/just-containers/s6-overlay/releases/download/v1.20.0.0/s6-overlay-amd64.tar.gz
RUN apk upgrade --update && \
apk add bind-tools wget curl bash libcap && \
curl -L -s $S6OVERLAY_RELEASE \
| tar xvzf - -C / && \
docker-install.sh && \
rm -rf /var/cache/apk/*
ENTRYPOINT [ "/init" ]
ADD s6/alpine-root /
COPY s6/service /usr/local/bin/service
# Things installer did and fix alpine+nginx differences
ENV WEBLOGDIR /var/log/nginx
ENV PHP_CONFIG '/etc/php5/php-fpm.conf'
RUN mkdir -p /etc/pihole/ && \
mkdir -p /var/www/html/pihole && \
mkdir -p /var/www/html/admin/ && \
chown nginx:nginx /var/www/html && \
touch ${WEBLOGDIR}/access.log ${WEBLOGDIR}/error.log && \
chown -R nginx:nginx ${WEBLOGDIR} && \
sed -i 's|^user\s*=.*$|user = nginx|' $PHP_CONFIG && \
sed -i '/^;pid/ s|^;||' $PHP_CONFIG && \
chmod 775 /var/www/html && \
touch /var/log/pihole.log && \
chmod 644 /var/log/pihole.log && \
chown dnsmasq:root /var/log/pihole.log && \
sed -i "s/@INT@/eth0/" /etc/dnsmasq.d/01-pihole.conf && \
setcap CAP_NET_BIND_SERVICE=+eip `which dnsmasq` && \
cp -f /usr/bin/list.sh /opt/pihole/list.sh && \
echo 'Done!'
# php config start passes special ENVs into
ENV PHP_ENV_CONFIG '/etc/php5/fpm.d/envs.conf'
ENV PHP_ERROR_LOG '/var/log/nginx/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 80
ENV S6_LOGGING 0
ENV S6_KEEP_ENV 1
ENV S6_BEHAVIOUR_IF_STAGE2_FAILS 2
SHELL ["/bin/bash", "-c"]

View File

@ -1,42 +0,0 @@
FROM {{ image.base }}
LABEL maintainer="{{ image.maintainer }}"
ENV IMAGE {{ os }}
ENV ARCH {{ image.arch }}
ENV PATH /opt/pihole:${PATH}
COPY install.sh /usr/local/bin/docker-install.sh
ENV setupVars /etc/pihole/setupVars.conf
ENV PIHOLE_INSTALL /tmp/ph_install.sh
ENV S6OVERLAY_RELEASE https://github.com/just-containers/s6-overlay/releases/download/v1.20.0.0/s6-overlay-armhf.tar.gz
RUN apt-get update && \
apt-get install -y wget curl net-tools cron && \
curl -L -s $S6OVERLAY_RELEASE \
| tar xvzf - -C / && \
docker-install.sh && \
rm -rf /var/cache/apt/archives /var/lib/apt/lists/*
ENTRYPOINT [ "/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
# not fully supported in debian yet
ENV IPv6 True
EXPOSE 53 53/udp
EXPOSE 80
ENV S6_LOGGING 0
ENV S6_KEEP_ENV 1
ENV S6_BEHAVIOUR_IF_STAGE2_FAILS 2
SHELL ["/bin/bash", "-c"]

View File

@ -1,42 +0,0 @@
FROM debian:jessie
MAINTAINER adam@diginc.us <adam@diginc.us>
ENV IMAGE debian
ENV ARCH amd64
ENV PATH /opt/pihole:${PATH}
COPY install.sh /usr/local/bin/docker-install.sh
ENV setupVars /etc/pihole/setupVars.conf
ENV PIHOLE_INSTALL /tmp/ph_install.sh
ENV S6OVERLAY_RELEASE https://github.com/just-containers/s6-overlay/releases/download/v1.20.0.0/s6-overlay-amd64.tar.gz
RUN apt-get update && \
apt-get install -y wget curl net-tools cron && \
curl -L -s $S6OVERLAY_RELEASE \
| tar xvzf - -C / && \
docker-install.sh && \
rm -rf /var/cache/apt/archives /var/lib/apt/lists/*
ENTRYPOINT [ "/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
# not fully supported in debian yet
ENV IPv6 True
EXPOSE 53 53/udp
EXPOSE 80
ENV S6_LOGGING 0
ENV S6_KEEP_ENV 1
ENV S6_BEHAVIOUR_IF_STAGE2_FAILS 2
SHELL ["/bin/bash", "-c"]

View File

@ -1,7 +1,7 @@
import pytest import pytest
import testinfra import testinfra
WEB_SERVER = { 'alpine': 'nginx', 'debian': 'lighttpd' } WEB_SERVER = { 'alpine_amd64': 'nginx', 'debian_amd64': 'lighttpd' }
check_output = testinfra.get_backend( check_output = testinfra.get_backend(
"local://" "local://"
@ -9,7 +9,7 @@ check_output = testinfra.get_backend(
def DockerGeneric(request, args, image, cmd): def DockerGeneric(request, args, image, cmd):
assert 'docker' in check_output('id'), "Are you in the docker group?" assert 'docker' in check_output('id'), "Are you in the docker group?"
if 'diginc/pi-hole' in image: if 'pi-hole' in image:
args += " --dns 127.0.0.1 -v /dev/null:/etc/.pihole/adlists.default -e PYTEST=\"True\"" args += " --dns 127.0.0.1 -v /dev/null:/etc/.pihole/adlists.default -e PYTEST=\"True\""
docker_run = "docker run -d {} {} {}".format(args, image, cmd) docker_run = "docker run -d {} {} {}".format(args, image, cmd)
print docker_run print docker_run
@ -56,7 +56,7 @@ def DockerPersist(request, persist_args, persist_image, persist_cmd, Dig):
def args(request): def args(request):
return '-e ServerIP="127.0.0.1" -e ServerIPv6="::1"' return '-e ServerIP="127.0.0.1" -e ServerIPv6="::1"'
@pytest.fixture(params=['alpine', 'debian']) @pytest.fixture(params=['alpine_amd64', 'debian_amd64'])
def tag(request): def tag(request):
return request.param return request.param
@ -66,7 +66,7 @@ def webserver(request, tag):
@pytest.fixture() @pytest.fixture()
def image(request, tag): def image(request, tag):
return 'diginc/pi-hole:{}'.format(tag) return 'pi-hole:{}'.format(tag)
@pytest.fixture() @pytest.fixture()
def cmd(request): def cmd(request):
@ -76,7 +76,7 @@ def cmd(request):
def persist_args(request): def persist_args(request):
return '-e ServerIP="127.0.0.1" -e ServerIPv6="::1"' return '-e ServerIP="127.0.0.1" -e ServerIPv6="::1"'
@pytest.fixture(scope='module', params=['alpine', 'debian']) @pytest.fixture(scope='module', params=['alpine_amd64', 'debian_amd64'])
def persist_tag(request): def persist_tag(request):
return request.param return request.param
@ -86,7 +86,7 @@ def persist_webserver(request, persist_tag):
@pytest.fixture(scope='module') @pytest.fixture(scope='module')
def persist_image(request, persist_tag): def persist_image(request, persist_tag):
return 'diginc/pi-hole:{}'.format(persist_tag) return 'pi-hole:{}'.format(persist_tag)
@pytest.fixture(scope='module') @pytest.fixture(scope='module')
def persist_cmd(request): def persist_cmd(request):

View File

@ -1,20 +1,30 @@
''' This file starts with 000 to make it run first ''' ''' This file starts with 000 to make it run first '''
import pytest import pytest
import testinfra import testinfra
import DockerfileGeneration
run_local = testinfra.get_backend( run_local = testinfra.get_backend(
"local://" "local://"
).get_module("Command").run ).get_module("Command").run
@pytest.mark.parametrize("upstream,image,tag", [
( 'alpine:edge', 'alpine.docker', 'diginc/pi-hole:alpine' ), def test_generate_dockerfiles():
( 'debian:jessie', 'debian.docker', 'diginc/pi-hole:debian' ), DockerfileGeneration.generate_dockerfiles()
#( 'jsurf/rpi-raspbian', 'debian-armhf.docker', 'diginc/pi-hole:arm' ),
@pytest.mark.parametrize("os, archs", [
( 'debian' , DockerfileGeneration.images['debian'] ),
( 'alpine' , DockerfileGeneration.images['alpine'] ),
]) ])
def test_build_pihole_image(upstream, image, tag): def test_build_pihole_image(os, archs):
run_local('docker pull {}'.format(upstream)) ''' Build the entire matrix of OS+Architecture '''
build_cmd = run_local('docker build -f {} -t {} .'.format(image, tag)) for image in archs:
if build_cmd.rc != 0: dockerfile = 'Dockerfile_{}_{}'.format(os, image['arch'])
print build_cmd.stdout image_tag = '{}:{}_{}'.format(image['name'], os, image['arch'])
print build_cmd.stderr
assert build_cmd.rc == 0 run_local('docker pull {}'.format(image['base']))
build_cmd = run_local('docker build -f {} -t {} .'.format(dockerfile, image_tag))
if build_cmd.rc != 0:
print build_cmd.stdout
print build_cmd.stderr
assert build_cmd.rc == 0

View File

@ -11,10 +11,10 @@ DEFAULTARGS = '-e ServerIP="127.0.0.1" '
]) ])
def test_IPv6_not_True_removes_ipv6(Docker, tag, args, expected_ipv6, expected_stdout): def test_IPv6_not_True_removes_ipv6(Docker, tag, args, expected_ipv6, expected_stdout):
''' When a user overrides IPv6=True they only get IPv4 listening webservers ''' ''' When a user overrides IPv6=True they only get IPv4 listening webservers '''
IPV6_LINE = { 'alpine': 'listen [::]:80 default_server', IPV6_LINE = { 'alpine_amd64': 'listen [::]:80 default_server',
'debian': 'use-ipv6.pl' } 'debian_amd64': 'use-ipv6.pl' }
WEB_CONFIG = { 'alpine': '/etc/nginx/nginx.conf', WEB_CONFIG = { 'alpine_amd64': '/etc/nginx/nginx.conf',
'debian': '/etc/lighttpd/lighttpd.conf' } 'debian_amd64': '/etc/lighttpd/lighttpd.conf' }
function = Docker.run('. /bash_functions.sh ; setup_ipv4_ipv6') function = Docker.run('. /bash_functions.sh ; setup_ipv4_ipv6')
assert "Using {}".format(expected_stdout) in function.stdout assert "Using {}".format(expected_stdout) in function.stdout
@ -55,8 +55,8 @@ expected_debian_lines = [
'"PHP_ERROR_LOG" => "/var/log/lighttpd/error.log"' '"PHP_ERROR_LOG" => "/var/log/lighttpd/error.log"'
] ]
@pytest.mark.parametrize('tag,expected_lines,repeat_function', [ @pytest.mark.parametrize('tag,expected_lines,repeat_function', [
('debian', expected_debian_lines, 1), ('debian_amd64', expected_debian_lines, 1),
('debian', expected_debian_lines, 2) ('debian_amd64', expected_debian_lines, 2)
]) ])
def test_debian_setup_php_env(Docker, tag, expected_lines, repeat_function): def test_debian_setup_php_env(Docker, tag, expected_lines, repeat_function):
''' confirm all expected output is there and nothing else ''' ''' confirm all expected output is there and nothing else '''