diff --git a/.travis.yml b/.travis.yml index ca70b59c2..74f6705cb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,42 +2,51 @@ language: bash services: docker env: - - VERSION=3.6 VARIANT= - - VERSION=3.6 VARIANT=slim - - VERSION=3.6 VARIANT=alpine - - VERSION=3.6 VARIANT=alpine3.6 - VERSION=3.6 VARIANT=stretch - - VERSION=3.5 VARIANT= - - VERSION=3.5 VARIANT=slim - - VERSION=3.5 VARIANT=alpine - - VERSION=3.4 VARIANT= - - VERSION=3.4 VARIANT=slim - - VERSION=3.4 VARIANT=alpine + - VERSION=3.6 VARIANT=jessie + - VERSION=3.6 VARIANT=jessie/slim + - VERSION=3.6 VARIANT=alpine3.6 + - VERSION=3.6 VARIANT=alpine3.4 + - VERSION=3.5 VARIANT=jessie + - VERSION=3.5 VARIANT=jessie/slim + - VERSION=3.5 VARIANT=alpine3.4 + - VERSION=3.4 VARIANT=jessie + - VERSION=3.4 VARIANT=jessie/slim - VERSION=3.4 VARIANT=wheezy - - VERSION=3.3 VARIANT= - - VERSION=3.3 VARIANT=slim - - VERSION=3.3 VARIANT=alpine + - VERSION=3.4 VARIANT=alpine3.4 + - VERSION=3.3 VARIANT=jessie + - VERSION=3.3 VARIANT=jessie/slim - VERSION=3.3 VARIANT=wheezy - - VERSION=2.7 VARIANT= - - VERSION=2.7 VARIANT=slim - - VERSION=2.7 VARIANT=alpine - - VERSION=2.7 VARIANT=alpine3.6 + - VERSION=3.3 VARIANT=alpine3.4 - VERSION=2.7 VARIANT=stretch + - VERSION=2.7 VARIANT=jessie + - VERSION=2.7 VARIANT=jessie/slim - VERSION=2.7 VARIANT=wheezy + - VERSION=2.7 VARIANT=alpine3.6 + - VERSION=2.7 VARIANT=alpine3.4 install: - git clone https://github.com/docker-library/official-images.git ~/official-images before_script: - env | sort - - cd "$VERSION" - - image="$(awk '$1 == "FROM" { print $2; exit }' onbuild/Dockerfile)${VARIANT:+-$VARIANT}" + - cd "$VERSION/$VARIANT" + - slash='/'; image="python:${VERSION}-${VARIANT//$slash/-}" script: - - travis_retry docker build -t "$image" "${VARIANT:-.}" - - ~/official-images/test/run.sh "$image" -# the "onbuild" variant has to happen with the base variant because it's FROM it - - true && [ "$VARIANT" ] || travis_retry docker build -t "${image}-onbuild" onbuild + - | + ( + set -Eeuo pipefail + set -x + travis_retry docker build -t "$image" . + ~/official-images/test/run.sh "$image" + if [ -d onbuild ]; then + onbuildFrom="$(awk 'toupper($1) == "FROM" { print $2; exit }' onbuild/Dockerfile)" + docker tag "$image" "$onbuildFrom" + docker build -t "$image-onbuild" onbuild + ~/official-images/test/run.sh "$image-onbuild" + fi + ) after_script: - docker images diff --git a/2.7/alpine/Dockerfile b/2.7/alpine3.4/Dockerfile similarity index 100% rename from 2.7/alpine/Dockerfile rename to 2.7/alpine3.4/Dockerfile diff --git a/2.7/Dockerfile b/2.7/jessie/Dockerfile similarity index 100% rename from 2.7/Dockerfile rename to 2.7/jessie/Dockerfile diff --git a/2.7/onbuild/Dockerfile b/2.7/jessie/onbuild/Dockerfile similarity index 100% rename from 2.7/onbuild/Dockerfile rename to 2.7/jessie/onbuild/Dockerfile diff --git a/2.7/slim/Dockerfile b/2.7/jessie/slim/Dockerfile similarity index 100% rename from 2.7/slim/Dockerfile rename to 2.7/jessie/slim/Dockerfile diff --git a/3.3/alpine/Dockerfile b/3.3/alpine3.4/Dockerfile similarity index 100% rename from 3.3/alpine/Dockerfile rename to 3.3/alpine3.4/Dockerfile diff --git a/3.3/Dockerfile b/3.3/jessie/Dockerfile similarity index 100% rename from 3.3/Dockerfile rename to 3.3/jessie/Dockerfile diff --git a/3.3/onbuild/Dockerfile b/3.3/jessie/onbuild/Dockerfile similarity index 100% rename from 3.3/onbuild/Dockerfile rename to 3.3/jessie/onbuild/Dockerfile diff --git a/3.3/slim/Dockerfile b/3.3/jessie/slim/Dockerfile similarity index 100% rename from 3.3/slim/Dockerfile rename to 3.3/jessie/slim/Dockerfile diff --git a/3.4/alpine/Dockerfile b/3.4/alpine3.4/Dockerfile similarity index 100% rename from 3.4/alpine/Dockerfile rename to 3.4/alpine3.4/Dockerfile diff --git a/3.4/Dockerfile b/3.4/jessie/Dockerfile similarity index 100% rename from 3.4/Dockerfile rename to 3.4/jessie/Dockerfile diff --git a/3.4/onbuild/Dockerfile b/3.4/jessie/onbuild/Dockerfile similarity index 100% rename from 3.4/onbuild/Dockerfile rename to 3.4/jessie/onbuild/Dockerfile diff --git a/3.4/slim/Dockerfile b/3.4/jessie/slim/Dockerfile similarity index 100% rename from 3.4/slim/Dockerfile rename to 3.4/jessie/slim/Dockerfile diff --git a/3.5/alpine/Dockerfile b/3.5/alpine3.4/Dockerfile similarity index 100% rename from 3.5/alpine/Dockerfile rename to 3.5/alpine3.4/Dockerfile diff --git a/3.5/Dockerfile b/3.5/jessie/Dockerfile similarity index 100% rename from 3.5/Dockerfile rename to 3.5/jessie/Dockerfile diff --git a/3.5/onbuild/Dockerfile b/3.5/jessie/onbuild/Dockerfile similarity index 100% rename from 3.5/onbuild/Dockerfile rename to 3.5/jessie/onbuild/Dockerfile diff --git a/3.5/slim/Dockerfile b/3.5/jessie/slim/Dockerfile similarity index 100% rename from 3.5/slim/Dockerfile rename to 3.5/jessie/slim/Dockerfile diff --git a/3.6/alpine/Dockerfile b/3.6/alpine3.4/Dockerfile similarity index 100% rename from 3.6/alpine/Dockerfile rename to 3.6/alpine3.4/Dockerfile diff --git a/3.6/Dockerfile b/3.6/jessie/Dockerfile similarity index 100% rename from 3.6/Dockerfile rename to 3.6/jessie/Dockerfile diff --git a/3.6/onbuild/Dockerfile b/3.6/jessie/onbuild/Dockerfile similarity index 100% rename from 3.6/onbuild/Dockerfile rename to 3.6/jessie/onbuild/Dockerfile diff --git a/3.6/slim/Dockerfile b/3.6/jessie/slim/Dockerfile similarity index 100% rename from 3.6/slim/Dockerfile rename to 3.6/jessie/slim/Dockerfile diff --git a/Dockerfile-alpine.template b/Dockerfile-alpine.template index 091049c95..4c8d7e2c9 100644 --- a/Dockerfile-alpine.template +++ b/Dockerfile-alpine.template @@ -1,4 +1,4 @@ -FROM alpine:3.4 +FROM alpine:%%PLACEHOLDER%% # ensure local python is preferred over distribution python ENV PATH /usr/local/bin:$PATH @@ -17,7 +17,7 @@ ENV PYTHON_VERSION %%PLACEHOLDER%% RUN set -ex \ && apk add --no-cache --virtual .fetch-deps \ gnupg \ - openssl \ + libressl \ tar \ xz \ \ @@ -43,8 +43,8 @@ RUN set -ex \ linux-headers \ make \ ncurses-dev \ - openssl \ - openssl-dev \ + libressl \ + libressl-dev \ pax-utils \ readline-dev \ sqlite-dev \ @@ -98,7 +98,7 @@ ENV PYTHON_PIP_VERSION %%PLACEHOLDER%% RUN set -ex; \ \ - apk add --no-cache --virtual .fetch-deps openssl; \ + apk add --no-cache --virtual .fetch-deps libressl; \ \ wget -O get-pip.py 'https://bootstrap.pypa.io/get-pip.py'; \ \ diff --git a/Dockerfile-debian.template b/Dockerfile-debian.template index 4fe2f6bd0..6799174e5 100644 --- a/Dockerfile-debian.template +++ b/Dockerfile-debian.template @@ -1,4 +1,4 @@ -FROM buildpack-deps:jessie +FROM buildpack-deps:%%PLACEHOLDER%% # ensure local python is preferred over distribution python ENV PATH /usr/local/bin:$PATH diff --git a/Dockerfile-slim.template b/Dockerfile-slim.template index 643300733..638baeaad 100644 --- a/Dockerfile-slim.template +++ b/Dockerfile-slim.template @@ -1,4 +1,4 @@ -FROM debian:jessie +FROM debian:%%PLACEHOLDER%% # ensure local python is preferred over distribution python ENV PATH /usr/local/bin:$PATH diff --git a/generate-stackbrew-library.sh b/generate-stackbrew-library.sh index bc3d5e111..4e8f2c532 100755 --- a/generate-stackbrew-library.sh +++ b/generate-stackbrew-library.sh @@ -1,5 +1,5 @@ -#!/bin/bash -set -eu +#!/usr/bin/env bash +set -Eeuo pipefail declare -A aliases=( [3.6-rc]='rc' @@ -7,12 +7,32 @@ declare -A aliases=( [2.7]='2' ) +defaultDebianSuite='stretch' +declare -A debianSuites=( + [2.7]='jessie' + [3.3]='jessie' + [3.4]='jessie' + [3.5]='jessie' + [3.6]='jessie' +) +defaultAlpineVersion='3.6' +declare -A alpineVersions=( + [2.7]='3.4' + [3.3]='3.4' + [3.4]='3.4' + [3.5]='3.4' + [3.6]='3.4' +) + self="$(basename "$BASH_SOURCE")" cd "$(dirname "$(readlink -f "$BASH_SOURCE")")" versions=( */ ) versions=( "${versions[@]%/}" ) +# sort version numbers with highest first +IFS=$'\n'; versions=( $(echo "${versions[*]}" | sort -rV) ); unset IFS + # get the most recent commit which modified any of "$@" fileCommit() { git log -1 --format='format:%H' HEAD -- "$@" @@ -39,7 +59,7 @@ getArches() { local repo="$1"; shift local officialImagesUrl='https://github.com/docker-library/official-images/raw/master/library/' - eval "declare -A -g parentRepoToArches=( $( + eval "declare -g -A parentRepoToArches=( $( find -name 'Dockerfile' -exec awk ' toupper($1) == "FROM" && $2 !~ /^('"$repo"'|scratch|microsoft\/[^:]+)(:|$)/ { print "'"$officialImagesUrl"'" $2 @@ -67,29 +87,12 @@ join() { } for version in "${versions[@]}"; do - commit="$(dirCommit "$version")" - - parent="$(awk 'toupper($1) == "FROM" { print $2 }' "$version/Dockerfile")" - arches="${parentRepoToArches[$parent]}" - - fullVersion="$(git show "$commit":"$version/Dockerfile" | awk '$1 == "ENV" && $2 == "PYTHON_VERSION" { print $3; exit }')" - - versionAliases=( - $fullVersion - $version - ${aliases[$version]:-} - ) - - echo - cat <<-EOE - Tags: $(join ', ' "${versionAliases[@]}") - Architectures: $(join ', ' $arches) - GitCommit: $commit - Directory: $version - EOE + debianSuite="${debianSuites[$version]:-$defaultDebianSuite}" + alpineVersion="${alpineVersions[$version]:-$defaultAlpineVersion}" for v in \ - slim alpine alpine3.6 wheezy onbuild \ + {stretch,jessie,wheezy}{,/slim,/onbuild} \ + alpine{3.6,3.4} \ windows/windowsservercore windows/nanoserver \ ; do dir="$version/$v" @@ -99,14 +102,34 @@ for version in "${versions[@]}"; do commit="$(dirCommit "$dir")" + versionDockerfile="$dir/Dockerfile" + if [ "$variant" = 'onbuild' ]; then + versionDockerfile="$(dirname "$dir")/Dockerfile" + fi + fullVersion="$(git show "$commit":"$versionDockerfile" | awk '$1 == "ENV" && $2 == "PYTHON_VERSION" { print $3; exit }')" + + versionAliases=( + $fullVersion + $version + ${aliases[$version]:-} + ) + variantAliases=( "${versionAliases[@]/%/-$variant}" ) + if [ "$variant" = "$debianSuite" ]; then + variantAliases+=( "${versionAliases[@]}" ) + elif [ "$variant" = "alpine${alpineVersion}" ]; then + variantAliases+=( "${versionAliases[@]/%/-alpine}" ) + fi variantAliases=( "${variantAliases[@]//latest-/}" ) case "$v" in windows/*) variantArches='windows-amd64' ;; - onbuild) variantArches="$arches" ;; + */onbuild) + variantParent="$(awk 'toupper($1) == "FROM" { print $2 }' "$(dirname "$dir")/Dockerfile")" + variantArches="${parentRepoToArches[$variantParent]}" + ;; *) - variantParent="$(awk 'toupper($1) == "FROM" { print $2 }' "$version/$v/Dockerfile")" + variantParent="$(awk 'toupper($1) == "FROM" { print $2 }' "$dir/Dockerfile")" variantArches="${parentRepoToArches[$variantParent]}" ;; esac @@ -118,6 +141,6 @@ for version in "${versions[@]}"; do GitCommit: $commit Directory: $dir EOE - [ "$variant" = "$v" ] || echo "Constraints: $variant" + [[ "$v" == windows/* ]] && echo "Constraints: $variant" done done diff --git a/update.sh b/update.sh index d7ffeac3a..21363f324 100755 --- a/update.sh +++ b/update.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash set -Eeuo pipefail shopt -s nullglob @@ -80,64 +80,56 @@ for version in "${versions[@]}"; do echo } >&2 exit 1 - else - if [[ "$version" != 2.* ]]; then - for variant in \ - debian \ - alpine \ - slim \ - onbuild \ - windows/windowsservercore \ - ; do - if [ "$variant" = 'debian' ]; then - dir="$version" - else - dir="$version/$variant" - variant="$(basename "$variant")" - fi - [ -d "$dir" ] || continue - template="Dockerfile-$variant.template" - { generated_warning; cat "$template"; } > "$dir/Dockerfile" - done - fi - ( - set -x - sed -ri \ - -e 's/^(ENV GPG_KEY) .*/\1 '"${gpgKeys[$rcVersion]}"'/' \ - -e 's/^(ENV PYTHON_VERSION) .*/\1 '"$fullVersion"'/' \ - -e 's/^(ENV PYTHON_RELEASE) .*/\1 '"${fullVersion%%[a-z]*}"'/' \ - -e 's/^(ENV PYTHON_PIP_VERSION) .*/\1 '"$pipVersion"'/' \ - -e 's/^(FROM python):.*/\1:'"$version"'/' \ - "$version"/{,*/,*/*/}Dockerfile - ) fi - for variant in wheezy stretch alpine3.6 alpine slim ''; do - [ -d "$version/$variant" ] || continue - case "$variant" in - alpine3.6) - sed -r \ - -e 's!(alpine):3.4!\1:3.6!g' \ - -e 's!openssl!libressl!g' \ - "$version/alpine/Dockerfile" > "$version/$variant/Dockerfile" - ;; + echo "$version: $fullVersion" - wheezy|stretch) - sed -r \ - -e "s!(buildpack-deps|debian):jessie!\1:${variant}!g" \ - "$version/Dockerfile" > "$version/$variant/Dockerfile" - if [ "$variant" = 'wheezy' ]; then - sed -ri -e 's/dpkg-architecture --query /dpkg-architecture -q/g' "$version/$variant/Dockerfile" - fi - ;; + for v in \ + alpine{3.4,3.6} \ + {wheezy,jessie,stretch}{/slim,/onbuild,} \ + windows/{windowsservercore,nanoserver} \ + ; do + dir="$version/$v" + variant="$(basename "$v")" + + [ -d "$dir" ] || continue + + case "$variant" in + slim|onbuild|windowsservercore) template="$variant"; tag="$(basename "$(dirname "$dir")")" ;; + alpine*) template='alpine'; tag="${variant#alpine}" ;; + *) template='debian'; tag="$variant" ;; esac + template="Dockerfile-${template}.template" - travisEnv='\n - VERSION='"$version VARIANT=$variant$travisEnv" - done - for winVariant in windowsservercore nanoserver; do - if [ -d "$version/windows/$winVariant" ]; then - appveyorEnv='\n - version: '"$version"'\n variant: '"$winVariant$appveyorEnv" + if [[ "$version" == 2.* ]]; then + echo " TODO: vimdiff ${versions[-1]}/$v/Dockerfile $version/$v/Dockerfile" + else + { generated_warning; cat "$template"; } > "$dir/Dockerfile" fi + + sed -ri \ + -e 's/^(ENV GPG_KEY) .*/\1 '"${gpgKeys[$rcVersion]}"'/' \ + -e 's/^(ENV PYTHON_VERSION) .*/\1 '"$fullVersion"'/' \ + -e 's/^(ENV PYTHON_RELEASE) .*/\1 '"${fullVersion%%[a-z]*}"'/' \ + -e 's/^(ENV PYTHON_PIP_VERSION) .*/\1 '"$pipVersion"'/' \ + -e 's/^(FROM python):.*/\1:'"$version"'/' \ + -e 's/^(FROM (debian|buildpack-deps|alpine)):.*/\1:'"$tag"'/' \ + "$dir/Dockerfile" + + case "$variant" in + alpine3.4) sed -ri -e 's/libressl/openssl/g' "$dir/Dockerfile" ;; + wheezy) sed -ri -e 's/dpkg-architecture --query /dpkg-architecture -q/g' "$dir/Dockerfile" ;; + esac + + case "$v" in + */onbuild) ;; + windows/*) + appveyorEnv='\n - version: '"$version"'\n variant: '"$variant$appveyorEnv" + ;; + *) + travisEnv='\n - VERSION='"$version VARIANT=$v$travisEnv" + ;; + esac done done