From 111c7a57a5562995a965a5127b9c7cc22f643b81 Mon Sep 17 00:00:00 2001 From: jurgenhaas <juergen@paragon-es.de> Date: Tue, 11 Dec 2018 09:48:15 +0100 Subject: [PATCH] Build image from scratch based on alpine:3.7 to get PHP version 7.1 --- Dockerfile | 59 ++++++++++++++++++++++++++++++++++++++++---- docker-entrypoint.sh | 30 ++++++++++++++++++++++ modprobe.sh | 20 +++++++++++++++ 3 files changed, 104 insertions(+), 5 deletions(-) create mode 100755 docker-entrypoint.sh create mode 100755 modprobe.sh diff --git a/Dockerfile b/Dockerfile index d265230..65bad0c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,19 +1,68 @@ -FROM docker:18.06.1 +FROM alpine:3.7 -LABEL com.example.vendor="PARAGON Executive Service GmbH" \ - maintainer="juergen@paragon-es.de" \ - version="1.1.0" \ +LABEL com.example.vendor="LakeDrops" \ + maintainer="juergen.haas@lakedrops.com" \ + version="1.2.0" \ 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/ + +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 \ + 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 \ php7-tokenizer php7-simplexml php7-xmlwriter && \ diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh new file mode 100755 index 0000000..9c6fa05 --- /dev/null +++ b/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/modprobe.sh b/modprobe.sh new file mode 100755 index 0000000..b357d89 --- /dev/null +++ b/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 "$@" -- GitLab