diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 7046f3115839982e25e479347ef7bbf2f7ee9f19..4a8a764f616e5c688df253a32b8f468daf54cf60 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -4,7 +4,7 @@ before_script: build-master: stage: build script: - - docker build --pull -t $CI_REGISTRY_IMAGE . - - docker push $CI_REGISTRY_IMAGE + - docker build --pull -t $CI_REGISTRY_IMAGE:php-7.0 ./php-7.0 + - docker push $CI_REGISTRY_IMAGE:php-7.0 only: - master diff --git a/php-7.0/Dockerfile b/php-7.0/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..9b1b32331566d4a4a2a616c766764bdb19aca9fa --- /dev/null +++ b/php-7.0/Dockerfile @@ -0,0 +1,109 @@ +FROM alpine:3.5 + +LABEL com.example.vendor="LakeDrops" \ + maintainer="juergen.haas@lakedrops.com" \ + version="1.2.1" \ + description="An image for GitLab runner to build and test Drupal projects." + +ARG compose_version=1.21.2 +ARG glibc_version=2.28-r0 + +RUN apk add --no-cache \ + ca-certificates + +# set up nsswitch.conf for Go's "netgo" implementation (which Docker explicitly uses) +# - https://github.com/docker/docker-ce/blob/v17.09.0-ce/components/engine/hack/make.sh#L149 +# - https://github.com/golang/go/blob/go1.9.1/src/net/conf.go#L194-L275 +# - docker run --rm debian:stretch grep '^hosts:' /etc/nsswitch.conf +RUN [ ! -e /etc/nsswitch.conf ] && echo 'hosts: files dns' > /etc/nsswitch.conf + +ENV DOCKER_CHANNEL stable +ENV DOCKER_VERSION 18.06.1-ce +# TODO ENV DOCKER_SHA256 +# https://github.com/docker/docker-ce/blob/5b073ee2cf564edee5adca05eee574142f7627bb/components/packaging/static/hash_files !! +# (no SHA file artifacts on download.docker.com yet as of 2017-06-07 though) + +RUN set -eux; \ + \ +# this "case" statement is generated via "update.sh" + apkArch="$(apk --print-arch)"; \ + case "$apkArch" in \ + x86_64) dockerArch='x86_64' ;; \ + armhf) dockerArch='armel' ;; \ + aarch64) dockerArch='aarch64' ;; \ + ppc64le) dockerArch='ppc64le' ;; \ + s390x) dockerArch='s390x' ;; \ + *) echo >&2 "error: unsupported architecture ($apkArch)"; exit 1 ;;\ + esac; \ + \ + apk add --no-cache \ + ca-certificates \ + curl \ + openssl; \ + \ + if ! curl -fSL "https://download.docker.com/linux/static/${DOCKER_CHANNEL}/${dockerArch}/docker-${DOCKER_VERSION}.tgz" -o docker.tgz; then \ + echo >&2 "error: failed to download 'docker-${DOCKER_VERSION}' from '${DOCKER_CHANNEL}' for '${dockerArch}'"; \ + exit 1; \ + fi; \ + \ + tar --extract \ + --file docker.tgz \ + --strip-components 1 \ + --directory /usr/local/bin/ \ + ; \ + rm docker.tgz; \ + \ + dockerd --version; \ + docker --version + +COPY modprobe.sh /usr/local/bin/modprobe +COPY docker-entrypoint.sh /usr/local/bin/ +COPY drush.sh /usr/local/bin/drush + +ENTRYPOINT ["docker-entrypoint.sh"] +CMD ["sh"] + +RUN mkdir -p /root/.ssh && \ + echo "StrictHostKeyChecking no" >> /root/.ssh/config && \ + \ + apk update && \ + apk add --no-cache curl openssl openssh ca-certificates wget make patch \ + bash fish python nodejs git unzip \ + php7 php7-phar php7-json php7-dom php7-gd php7-mbstring php7-openssl \ + php7-pdo php7-curl php7-xml php7-zip php7-session php7-ctype && \ + echo "php7-tokenizer php7-simplexml php7-xmlwriter" && \ + \ + wget -q https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub -O /etc/apk/keys/sgerrand.rsa.pub && \ + wget -q https://github.com/sgerrand/alpine-pkg-glibc/releases/download/${glibc_version}/glibc-${glibc_version}.apk && \ + apk add --no-cache glibc-${glibc_version}.apk && \ + rm glibc-${glibc_version}.apk && \ + ln -s /lib/libz.so.1 /usr/glibc-compat/lib/ && \ + ln -s /lib/libc.musl-x86_64.so.1 /usr/glibc-compat/lib && \ + ln -s /usr/lib/libgcc_s.so.1 /lib/libgcc_s.so.1 && \ + ln -s /lib/libgcc_s.so.1 /usr/glibc-compat/lib/ && \ + \ + ln -s /usr/bin/php7 /usr/local/bin/php && \ + \ + wget -q https://github.com/ahoy-cli/ahoy/releases/download/2.0.0/ahoy-bin-`uname -s`-amd64 -O /usr/local/bin/ahoy && \ + chmod +x /usr/local/bin/ahoy && \ + \ + wget -q https://github.com/docker/compose/releases/download/${compose_version}/docker-compose-`uname -s`-`uname -m` -O /usr/local/bin/docker-compose && \ + chmod +x /usr/local/bin/docker-compose && \ + \ + wget -q https://getcomposer.org/composer.phar -O /usr/local/bin/composer && \ + chmod +x /usr/local/bin/composer && \ + composer selfupdate && \ + \ + git clone https://github.com/tj/git-extras.git && \ + cd git-extras && \ + git checkout $(git describe --tags $(git rev-list --tags --max-count=1)) && \ + make install && \ + cd .. && \ + rm -rf git-extras && \ + \ + composer global require "hirak/prestissimo:^0.3" && \ + \ + ln -s /usr/local/bin/ahoy /usr/local/bin/a && \ + ln -s /usr/local/bin/composer /usr/local/bin/c && \ + ln -s /usr/local/bin/docker-compose /usr/local/bin/d-c && \ + ln -s /usr/local/bin/drush /usr/local/bin/d diff --git a/docker-entrypoint.sh b/php-7.0/docker-entrypoint.sh similarity index 100% rename from docker-entrypoint.sh rename to php-7.0/docker-entrypoint.sh diff --git a/drush.sh b/php-7.0/drush.sh similarity index 100% rename from drush.sh rename to php-7.0/drush.sh diff --git a/modprobe.sh b/php-7.0/modprobe.sh similarity index 100% rename from modprobe.sh rename to php-7.0/modprobe.sh diff --git a/Dockerfile b/php-7.1/Dockerfile similarity index 100% rename from Dockerfile rename to php-7.1/Dockerfile diff --git a/php-7.1/docker-entrypoint.sh b/php-7.1/docker-entrypoint.sh new file mode 100755 index 0000000000000000000000000000000000000000..9c6fa052d82519ded4e230c689cf5cc8a99ab58a --- /dev/null +++ b/php-7.1/docker-entrypoint.sh @@ -0,0 +1,30 @@ +#!/bin/sh +set -e + +# first arg is `-f` or `--some-option` +if [ "${1#-}" != "$1" ]; then + set -- docker "$@" +fi + +# if our command is a valid Docker subcommand, let's invoke it through Docker instead +# (this allows for "docker run docker ps", etc) +if docker help "$1" > /dev/null 2>&1; then + set -- docker "$@" +fi + +# if we have "--link some-docker:docker" and not DOCKER_HOST, let's set DOCKER_HOST automatically +if [ -z "$DOCKER_HOST" -a "$DOCKER_PORT_2375_TCP" ]; then + export DOCKER_HOST='tcp://docker:2375' +fi + +if [ "$1" = 'dockerd' ]; then + cat >&2 <<-'EOW' + 📎 Hey there! It looks like you're trying to run a Docker daemon. + You probably should use the "dind" image variant instead, something like: + docker run --privileged --name some-overlay-docker -d docker:stable-dind --storage-driver=overlay + See https://hub.docker.com/_/docker/ for more documentation and usage examples. + EOW + sleep 3 +fi + +exec "$@" diff --git a/php-7.1/drush.sh b/php-7.1/drush.sh new file mode 100755 index 0000000000000000000000000000000000000000..33bc00ebc729b0668d5e1e31ddc83ecd739b67b8 --- /dev/null +++ b/php-7.1/drush.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +docker-compose exec --user root php drush $@ diff --git a/php-7.1/modprobe.sh b/php-7.1/modprobe.sh new file mode 100755 index 0000000000000000000000000000000000000000..b357d893fda288e5ca49d29c4c5646726bd0eab1 --- /dev/null +++ b/php-7.1/modprobe.sh @@ -0,0 +1,20 @@ +#!/bin/sh +set -eu + +# "modprobe" without modprobe +# https://twitter.com/lucabruno/status/902934379835662336 + +# this isn't 100% fool-proof, but it'll have a much higher success rate than simply using the "real" modprobe + +# Docker often uses "modprobe -va foo bar baz" +# so we ignore modules that start with "-" +for module; do + if [ "${module#-}" = "$module" ]; then + ip link show "$module" || true + lsmod | grep "$module" || true + fi +done + +# remove /usr/local/... from PATH so we can exec the real modprobe as a last resort +export PATH='/usr/sbin:/usr/bin:/sbin:/bin' +exec modprobe "$@" diff --git a/php-7.2/Dockerfile b/php-7.2/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..d264b8bdc654e391dd430d5d664204a90a86ad5b --- /dev/null +++ b/php-7.2/Dockerfile @@ -0,0 +1,104 @@ +FROM alpine:3.8 + +LABEL com.example.vendor="LakeDrops" \ + maintainer="juergen.haas@lakedrops.com" \ + version="1.2.1" \ + description="An image for GitLab runner to build and test Drupal projects." + +ARG compose_version=1.21.2 +ARG glibc_version=2.28-r0 + +RUN apk add --no-cache \ + ca-certificates + +# set up nsswitch.conf for Go's "netgo" implementation (which Docker explicitly uses) +# - https://github.com/docker/docker-ce/blob/v17.09.0-ce/components/engine/hack/make.sh#L149 +# - https://github.com/golang/go/blob/go1.9.1/src/net/conf.go#L194-L275 +# - docker run --rm debian:stretch grep '^hosts:' /etc/nsswitch.conf +RUN [ ! -e /etc/nsswitch.conf ] && echo 'hosts: files dns' > /etc/nsswitch.conf + +ENV DOCKER_CHANNEL stable +ENV DOCKER_VERSION 18.06.1-ce +# TODO ENV DOCKER_SHA256 +# https://github.com/docker/docker-ce/blob/5b073ee2cf564edee5adca05eee574142f7627bb/components/packaging/static/hash_files !! +# (no SHA file artifacts on download.docker.com yet as of 2017-06-07 though) + +RUN set -eux; \ + \ +# this "case" statement is generated via "update.sh" + apkArch="$(apk --print-arch)"; \ + case "$apkArch" in \ + x86_64) dockerArch='x86_64' ;; \ + armhf) dockerArch='armel' ;; \ + aarch64) dockerArch='aarch64' ;; \ + ppc64le) dockerArch='ppc64le' ;; \ + s390x) dockerArch='s390x' ;; \ + *) echo >&2 "error: unsupported architecture ($apkArch)"; exit 1 ;;\ + esac; \ + \ + if ! wget -O docker.tgz "https://download.docker.com/linux/static/${DOCKER_CHANNEL}/${dockerArch}/docker-${DOCKER_VERSION}.tgz"; then \ + echo >&2 "error: failed to download 'docker-${DOCKER_VERSION}' from '${DOCKER_CHANNEL}' for '${dockerArch}'"; \ + exit 1; \ + fi; \ + \ + tar --extract \ + --file docker.tgz \ + --strip-components 1 \ + --directory /usr/local/bin/ \ + ; \ + rm docker.tgz; \ + \ + dockerd --version; \ + docker --version + +COPY modprobe.sh /usr/local/bin/modprobe +COPY docker-entrypoint.sh /usr/local/bin/ +COPY drush.sh /usr/local/bin/drush + +ENTRYPOINT ["docker-entrypoint.sh"] +CMD ["sh"] + +RUN mkdir -p /root/.ssh && \ + echo "StrictHostKeyChecking no" >> /root/.ssh/config && \ + \ + apk update && \ + apk add --no-cache curl openssl openssh ca-certificates wget make patch \ + bash fish python nodejs npm git unzip \ + php7 php7-phar php7-json php7-dom php7-gd php7-mbstring php7-openssl \ + php7-pdo php7-curl php7-xml php7-zip php7-session php7-ctype \ + php7-tokenizer php7-simplexml php7-xmlwriter && \ + \ + wget -q https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub -O /etc/apk/keys/sgerrand.rsa.pub && \ + wget -q https://github.com/sgerrand/alpine-pkg-glibc/releases/download/${glibc_version}/glibc-${glibc_version}.apk && \ + apk add --no-cache glibc-${glibc_version}.apk && \ + rm glibc-${glibc_version}.apk && \ + ln -s /lib/libz.so.1 /usr/glibc-compat/lib/ && \ + ln -s /lib/libc.musl-x86_64.so.1 /usr/glibc-compat/lib && \ + ln -s /usr/lib/libgcc_s.so.1 /lib/libgcc_s.so.1 && \ + ln -s /lib/libgcc_s.so.1 /usr/glibc-compat/lib/ && \ + \ + ln -s /usr/bin/php7 /usr/local/bin/php && \ + \ + wget -q https://github.com/ahoy-cli/ahoy/releases/download/2.0.0/ahoy-bin-`uname -s`-amd64 -O /usr/local/bin/ahoy && \ + chmod +x /usr/local/bin/ahoy && \ + \ + wget -q https://github.com/docker/compose/releases/download/${compose_version}/docker-compose-`uname -s`-`uname -m` -O /usr/local/bin/docker-compose && \ + chmod +x /usr/local/bin/docker-compose && \ + \ + wget -q https://getcomposer.org/composer.phar -O /usr/local/bin/composer && \ + chmod +x /usr/local/bin/composer && \ + composer selfupdate && \ + \ + git clone https://github.com/tj/git-extras.git && \ + cd git-extras && \ + git checkout $(git describe --tags $(git rev-list --tags --max-count=1)) && \ + make install && \ + cd .. && \ + rm -rf git-extras && \ + \ + composer global require "hirak/prestissimo:^0.3" && \ + \ + ln -s /usr/local/bin/ahoy /usr/local/bin/a && \ + ln -s /usr/local/bin/composer /usr/local/bin/c && \ + ln -s /usr/local/bin/docker-compose /usr/local/bin/d-c && \ + ln -s /usr/local/bin/drush /usr/local/bin/d diff --git a/php-7.2/docker-entrypoint.sh b/php-7.2/docker-entrypoint.sh new file mode 100755 index 0000000000000000000000000000000000000000..9c6fa052d82519ded4e230c689cf5cc8a99ab58a --- /dev/null +++ b/php-7.2/docker-entrypoint.sh @@ -0,0 +1,30 @@ +#!/bin/sh +set -e + +# first arg is `-f` or `--some-option` +if [ "${1#-}" != "$1" ]; then + set -- docker "$@" +fi + +# if our command is a valid Docker subcommand, let's invoke it through Docker instead +# (this allows for "docker run docker ps", etc) +if docker help "$1" > /dev/null 2>&1; then + set -- docker "$@" +fi + +# if we have "--link some-docker:docker" and not DOCKER_HOST, let's set DOCKER_HOST automatically +if [ -z "$DOCKER_HOST" -a "$DOCKER_PORT_2375_TCP" ]; then + export DOCKER_HOST='tcp://docker:2375' +fi + +if [ "$1" = 'dockerd' ]; then + cat >&2 <<-'EOW' + 📎 Hey there! It looks like you're trying to run a Docker daemon. + You probably should use the "dind" image variant instead, something like: + docker run --privileged --name some-overlay-docker -d docker:stable-dind --storage-driver=overlay + See https://hub.docker.com/_/docker/ for more documentation and usage examples. + EOW + sleep 3 +fi + +exec "$@" diff --git a/php-7.2/drush.sh b/php-7.2/drush.sh new file mode 100755 index 0000000000000000000000000000000000000000..33bc00ebc729b0668d5e1e31ddc83ecd739b67b8 --- /dev/null +++ b/php-7.2/drush.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +docker-compose exec --user root php drush $@ diff --git a/php-7.2/modprobe.sh b/php-7.2/modprobe.sh new file mode 100755 index 0000000000000000000000000000000000000000..b357d893fda288e5ca49d29c4c5646726bd0eab1 --- /dev/null +++ b/php-7.2/modprobe.sh @@ -0,0 +1,20 @@ +#!/bin/sh +set -eu + +# "modprobe" without modprobe +# https://twitter.com/lucabruno/status/902934379835662336 + +# this isn't 100% fool-proof, but it'll have a much higher success rate than simply using the "real" modprobe + +# Docker often uses "modprobe -va foo bar baz" +# so we ignore modules that start with "-" +for module; do + if [ "${module#-}" = "$module" ]; then + ip link show "$module" || true + lsmod | grep "$module" || true + fi +done + +# remove /usr/local/... from PATH so we can exec the real modprobe as a last resort +export PATH='/usr/sbin:/usr/bin:/sbin:/bin' +exec modprobe "$@"