Skip to content

Instantly share code, notes, and snippets.

@blopker
Last active December 2, 2018 18:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save blopker/9fff37e67f14143d2757f9f2172c8ea0 to your computer and use it in GitHub Desktop.
Save blopker/9fff37e67f14143d2757f9f2172c8ea0 to your computer and use it in GitHub Desktop.
Python PGO Benchmarks

Python PGO Benchmark

This is a test of the official Python Docker containers, with and without the --enable-optimizations flag. This flag turns on PGO.

Files

build.sh

This file us run inside the modified https://github.com/docker-library/python repo. It builds and tags all the optimized images.

test.sh

This file iterates through all the images, optimized and unoptimized, then runs _test.sh inside them.

_test.sh

This file runs the actual test, then outputs the results into a json file on the host.

results.txt

The results of running python -m perf compare_to $1.json $1-optimized.json --table on the results json.

Setup

The tests were run on AWS, on a m5.xlarge instance running AWS Linux 2. Docker version 18.06.1-ce, build e68fc7a215d7133c34aa18e3b72b4a21fd0c6136.

Methodology

  1. Add --enable-optimizations to each Dockerfile in the python repo via the Dockerfile templates and run the update.sh script. See diff here: docker-library/python#357
  2. Run build.sh. This will take a while depending on how large your machine is.
  3. Run test.sh. This will all take a while. No parallelism is built in so the tests don't interfere with each other.

Observations

  • Python 3.4 does not support the --enable-optimizations flag and therefore the results are not different. This is expected and shows that the performance with otherwise equivalent.
  • The test that gained the most performance was json_dumps. I suspect this was because json.dumps is used extensively in the Python tests used to train the PGO and would get the most optimizations. Json plays a large role in many real world applications, so this is a good thing.
  • The Alpine images seem to benefit the most from PGO. However, the Debian images were generally faster than Alpine so there may have been less for the Debian images to optimize.
#!/usr/bin/env bash
set -x
# The actual test
IMAGE_NAME="${1}"
apk --update add --virtual build-dependencies libffi-dev openssl-dev python-dev py-pip build-base || true
apt-get update || true
apt-get install -y build-essential python-dev || true
pip install performance
pip install virtualenv
python -m perf system tune
pyperformance run -b json_loads,json_dumps,python_startup,pickle,regex_dna,django_template,html5lib -o "/app/${IMAGE_NAME}.json"
#!/usr/bin/env bash
set -x
# Used to build all the images
docker build -t 2.7-alpine36 -f 2.7/alpine3.6/Dockerfile . &
docker build -t 2.7-alpine37 -f 2.7/alpine3.7/Dockerfile . &
docker build -t 2.7-alpine38 -f 2.7/alpine3.8/Dockerfile . &
docker build -t 2.7-jessie -f 2.7/jessie/Dockerfile . &
docker build -t 2.7-stretch -f 2.7/stretch/Dockerfile . &
docker build -t 2.7-wheezy -f 2.7/wheezy/Dockerfile . &
docker build -t 3.4-alpine37 -f 3.4/alpine3.7/Dockerfile . &
docker build -t 3.4-alpine38 -f 3.4/alpine3.8/Dockerfile .
docker build -t 3.4-jessie -f 3.4/jessie/Dockerfile . &
docker build -t 3.4-stretch -f 3.4/stretch/Dockerfile . &
docker build -t 3.4-wheezy -f 3.4/wheezy/Dockerfile . &
docker build -t 3.5-alpine37 -f 3.5/alpine3.7/Dockerfile . &
docker build -t 3.5-alpine38 -f 3.5/alpine3.8/Dockerfile . &
docker build -t 3.5-jessie -f 3.5/jessie/Dockerfile . &
docker build -t 3.5-stretch -f 3.5/stretch/Dockerfile . &
docker build -t 3.6-alpine36 -f 3.6/alpine3.6/Dockerfile .
docker build -t 3.6-alpine37 -f 3.6/alpine3.7/Dockerfile . &
docker build -t 3.6-alpine38 -f 3.6/alpine3.8/Dockerfile . &
docker build -t 3.6-jessie -f 3.6/jessie/Dockerfile . &
docker build -t 3.6-stretch -f 3.6/stretch/Dockerfile . &
docker build -t 3.7-alpine37 -f 3.7/alpine3.7/Dockerfile . &
docker build -t 3.7-alpine38 -f 3.7/alpine3.8/Dockerfile . &
docker build -t 3.7-stretch -f 3.7/stretch/Dockerfile .
+-----------------+--------------+------------------------------+
| Benchmark | 2.7-alpine36 | 2.7-alpine36-optimized |
+=================+==============+==============================+
| django_template | 234 ms | 207 ms: 1.13x faster (-11%) |
+-----------------+--------------+------------------------------+
| html5lib | 197 ms | 182 ms: 1.09x faster (-8%) |
+-----------------+--------------+------------------------------+
| json_dumps | 27.2 ms | 17.4 ms: 1.56x faster (-36%) |
+-----------------+--------------+------------------------------+
| json_loads | 95.1 us | 83.2 us: 1.14x faster (-13%) |
+-----------------+--------------+------------------------------+
| pickle | 43.3 us | 41.9 us: 1.03x faster (-3%) |
+-----------------+--------------+------------------------------+
| python_startup | 6.72 ms | 6.26 ms: 1.07x faster (-7%) |
+-----------------+--------------+------------------------------+
| regex_dna | 239 ms | 212 ms: 1.13x faster (-11%) |
+-----------------+--------------+------------------------------+
+-----------------+--------------+------------------------------+
| Benchmark | 2.7-alpine37 | 2.7-alpine37-optimized |
+=================+==============+==============================+
| django_template | 238 ms | 207 ms: 1.15x faster (-13%) |
+-----------------+--------------+------------------------------+
| html5lib | 199 ms | 182 ms: 1.09x faster (-8%) |
+-----------------+--------------+------------------------------+
| json_dumps | 27.7 ms | 17.3 ms: 1.60x faster (-37%) |
+-----------------+--------------+------------------------------+
| json_loads | 96.6 us | 83.2 us: 1.16x faster (-14%) |
+-----------------+--------------+------------------------------+
| pickle | 44.6 us | 41.7 us: 1.07x faster (-7%) |
+-----------------+--------------+------------------------------+
| python_startup | 6.77 ms | 6.31 ms: 1.07x faster (-7%) |
+-----------------+--------------+------------------------------+
| regex_dna | 243 ms | 214 ms: 1.14x faster (-12%) |
+-----------------+--------------+------------------------------+
+-----------------+--------------+------------------------------+
| Benchmark | 2.7-alpine38 | 2.7-alpine38-optimized |
+=================+==============+==============================+
| django_template | 236 ms | 206 ms: 1.15x faster (-13%) |
+-----------------+--------------+------------------------------+
| html5lib | 198 ms | 182 ms: 1.09x faster (-8%) |
+-----------------+--------------+------------------------------+
| json_dumps | 27.9 ms | 17.5 ms: 1.60x faster (-37%) |
+-----------------+--------------+------------------------------+
| json_loads | 96.8 us | 83.6 us: 1.16x faster (-14%) |
+-----------------+--------------+------------------------------+
| pickle | 44.8 us | 42.3 us: 1.06x faster (-5%) |
+-----------------+--------------+------------------------------+
| python_startup | 6.81 ms | 6.29 ms: 1.08x faster (-8%) |
+-----------------+--------------+------------------------------+
| regex_dna | 244 ms | 212 ms: 1.15x faster (-13%) |
+-----------------+--------------+------------------------------+
+-----------------+------------+------------------------------+
| Benchmark | 2.7-jessie | 2.7-jessie-optimized |
+=================+============+==============================+
| django_template | 214 ms | 198 ms: 1.08x faster (-8%) |
+-----------------+------------+------------------------------+
| html5lib | 189 ms | 175 ms: 1.08x faster (-7%) |
+-----------------+------------+------------------------------+
| json_dumps | 17.3 ms | 14.6 ms: 1.18x faster (-15%) |
+-----------------+------------+------------------------------+
| json_loads | 72.5 us | 70.7 us: 1.03x faster (-3%) |
+-----------------+------------+------------------------------+
| pickle | 27.9 us | 26.8 us: 1.04x faster (-4%) |
+-----------------+------------+------------------------------+
| python_startup | 6.73 ms | 6.64 ms: 1.01x faster (-1%) |
+-----------------+------------+------------------------------+
| regex_dna | 223 ms | 226 ms: 1.02x slower (+2%) |
+-----------------+------------+------------------------------+
+-----------------+-------------+------------------------------+
| Benchmark | 2.7-stretch | 2.7-stretch-optimized |
+=================+=============+==============================+
| django_template | 215 ms | 204 ms: 1.05x faster (-5%) |
+-----------------+-------------+------------------------------+
| html5lib | 193 ms | 183 ms: 1.05x faster (-5%) |
+-----------------+-------------+------------------------------+
| json_dumps | 17.5 ms | 15.3 ms: 1.15x faster (-13%) |
+-----------------+-------------+------------------------------+
| json_loads | 72.8 us | 71.6 us: 1.02x faster (-2%) |
+-----------------+-------------+------------------------------+
| pickle | 28.2 us | 27.5 us: 1.03x faster (-2%) |
+-----------------+-------------+------------------------------+
| python_startup | 6.67 ms | 6.54 ms: 1.02x faster (-2%) |
+-----------------+-------------+------------------------------+
| regex_dna | 225 ms | 205 ms: 1.10x faster (-9%) |
+-----------------+-------------+------------------------------+
+-----------------+------------+------------------------------+
| Benchmark | 2.7-wheezy | 2.7-wheezy-optimized |
+=================+============+==============================+
| django_template | 218 ms | 202 ms: 1.08x faster (-8%) |
+-----------------+------------+------------------------------+
| html5lib | 193 ms | 177 ms: 1.09x faster (-9%) |
+-----------------+------------+------------------------------+
| json_dumps | 17.3 ms | 14.7 ms: 1.18x faster (-15%) |
+-----------------+------------+------------------------------+
| json_loads | 75.1 us | 67.8 us: 1.11x faster (-10%) |
+-----------------+------------+------------------------------+
| pickle | 29.0 us | 28.5 us: 1.02x faster (-2%) |
+-----------------+------------+------------------------------+
| python_startup | 6.77 ms | 6.65 ms: 1.02x faster (-2%) |
+-----------------+------------+------------------------------+
| regex_dna | 239 ms | 215 ms: 1.11x faster (-10%) |
+-----------------+------------+------------------------------+
+----------------+------------+-----------------------------+
| Benchmark | 3.4-jessie | 3.4-jessie-optimized |
+================+============+=============================+
| json_dumps | 19.6 ms | 19.5 ms: 1.01x faster (-1%) |
+----------------+------------+-----------------------------+
| pickle | 14.6 us | 14.7 us: 1.01x slower (+1%) |
+----------------+------------+-----------------------------+
| python_startup | 15.0 ms | 15.2 ms: 1.01x slower (+1%) |
+----------------+------------+-----------------------------+
Not significant (4): django_template; html5lib; json_loads; regex_dna
+----------------+-------------+-----------------------------+
| Benchmark | 3.4-stretch | 3.4-stretch-optimized |
+================+=============+=============================+
| python_startup | 15.1 ms | 15.2 ms: 1.00x slower (+0%) |
+----------------+-------------+-----------------------------+
Not significant (6): django_template; html5lib; json_dumps; json_loads; pickle; regex_dna
+----------------+------------+-----------------------------+
| Benchmark | 3.4-wheezy | 3.4-wheezy-optimized |
+================+============+=============================+
| pickle | 14.8 us | 14.7 us: 1.01x faster (-1%) |
+----------------+------------+-----------------------------+
| python_startup | 15.4 ms | 15.5 ms: 1.00x slower (+0%) |
+----------------+------------+-----------------------------+
Not significant (5): django_template; html5lib; json_dumps; json_loads; regex_dna
+-----------------+--------------+------------------------------+
| Benchmark | 3.5-alpine37 | 3.5-alpine37-optimized |
+=================+==============+==============================+
| django_template | 256 ms | 214 ms: 1.20x faster (-17%) |
+-----------------+--------------+------------------------------+
| html5lib | 165 ms | 147 ms: 1.12x faster (-11%) |
+-----------------+--------------+------------------------------+
| json_dumps | 25.1 ms | 18.6 ms: 1.35x faster (-26%) |
+-----------------+--------------+------------------------------+
| json_loads | 46.1 us | 38.1 us: 1.21x faster (-17%) |
+-----------------+--------------+------------------------------+
| pickle | 19.4 us | 14.5 us: 1.34x faster (-25%) |
+-----------------+--------------+------------------------------+
| python_startup | 16.1 ms | 15.1 ms: 1.07x faster (-6%) |
+-----------------+--------------+------------------------------+
| regex_dna | 245 ms | 219 ms: 1.12x faster (-11%) |
+-----------------+--------------+------------------------------+
+-----------------+--------------+------------------------------+
| Benchmark | 3.5-alpine38 | 3.5-alpine38-optimized |
+=================+==============+==============================+
| django_template | 255 ms | 215 ms: 1.19x faster (-16%) |
+-----------------+--------------+------------------------------+
| html5lib | 165 ms | 143 ms: 1.16x faster (-14%) |
+-----------------+--------------+------------------------------+
| json_dumps | 25.1 ms | 18.7 ms: 1.34x faster (-25%) |
+-----------------+--------------+------------------------------+
| json_loads | 45.8 us | 37.8 us: 1.21x faster (-17%) |
+-----------------+--------------+------------------------------+
| pickle | 19.1 us | 14.7 us: 1.30x faster (-23%) |
+-----------------+--------------+------------------------------+
| python_startup | 16.0 ms | 15.1 ms: 1.06x faster (-6%) |
+-----------------+--------------+------------------------------+
| regex_dna | 244 ms | 215 ms: 1.14x faster (-12%) |
+-----------------+--------------+------------------------------+
+-----------------+------------+------------------------------+
| Benchmark | 3.5-jessie | 3.5-jessie-optimized |
+=================+============+==============================+
| django_template | 247 ms | 208 ms: 1.19x faster (-16%) |
+-----------------+------------+------------------------------+
| html5lib | 167 ms | 144 ms: 1.16x faster (-14%) |
+-----------------+------------+------------------------------+
| json_dumps | 20.0 ms | 18.0 ms: 1.11x faster (-10%) |
+-----------------+------------+------------------------------+
| json_loads | 50.9 us | 44.0 us: 1.16x faster (-14%) |
+-----------------+------------+------------------------------+
| pickle | 16.7 us | 15.4 us: 1.08x faster (-8%) |
+-----------------+------------+------------------------------+
| python_startup | 16.1 ms | 15.3 ms: 1.05x faster (-5%) |
+-----------------+------------+------------------------------+
| regex_dna | 235 ms | 206 ms: 1.14x faster (-12%) |
+-----------------+------------+------------------------------+
+-----------------+-------------+------------------------------+
| Benchmark | 3.5-stretch | 3.5-stretch-optimized |
+=================+=============+==============================+
| django_template | 237 ms | 209 ms: 1.13x faster (-12%) |
+-----------------+-------------+------------------------------+
| html5lib | 161 ms | 145 ms: 1.11x faster (-10%) |
+-----------------+-------------+------------------------------+
| json_dumps | 20.1 ms | 17.7 ms: 1.14x faster (-12%) |
+-----------------+-------------+------------------------------+
| json_loads | 43.1 us | 39.4 us: 1.09x faster (-8%) |
+-----------------+-------------+------------------------------+
| pickle | 16.1 us | 14.5 us: 1.11x faster (-10%) |
+-----------------+-------------+------------------------------+
| python_startup | 16.0 ms | 15.4 ms: 1.04x faster (-4%) |
+-----------------+-------------+------------------------------+
| regex_dna | 229 ms | 206 ms: 1.12x faster (-10%) |
+-----------------+-------------+------------------------------+
+-----------------+--------------+------------------------------+
| Benchmark | 3.6-alpine36 | 3.6-alpine36-optimized |
+=================+==============+==============================+
| django_template | 266 ms | 218 ms: 1.22x faster (-18%) |
+-----------------+--------------+------------------------------+
| html5lib | 160 ms | 141 ms: 1.14x faster (-12%) |
+-----------------+--------------+------------------------------+
| json_dumps | 24.7 ms | 18.2 ms: 1.36x faster (-26%) |
+-----------------+--------------+------------------------------+
| json_loads | 48.0 us | 39.1 us: 1.23x faster (-19%) |
+-----------------+--------------+------------------------------+
| pickle | 18.9 us | 15.1 us: 1.25x faster (-20%) |
+-----------------+--------------+------------------------------+
| python_startup | 13.7 ms | 12.7 ms: 1.09x faster (-8%) |
+-----------------+--------------+------------------------------+
| regex_dna | 244 ms | 223 ms: 1.09x faster (-9%) |
+-----------------+--------------+------------------------------+
+-----------------+--------------+------------------------------+
| Benchmark | 3.6-alpine37 | 3.6-alpine37-optimized |
+=================+==============+==============================+
| django_template | 265 ms | 215 ms: 1.23x faster (-19%) |
+-----------------+--------------+------------------------------+
| html5lib | 160 ms | 143 ms: 1.12x faster (-11%) |
+-----------------+--------------+------------------------------+
| json_dumps | 24.8 ms | 18.1 ms: 1.37x faster (-27%) |
+-----------------+--------------+------------------------------+
| json_loads | 47.3 us | 34.0 us: 1.39x faster (-28%) |
+-----------------+--------------+------------------------------+
| pickle | 18.9 us | 15.7 us: 1.20x faster (-17%) |
+-----------------+--------------+------------------------------+
| python_startup | 13.8 ms | 12.6 ms: 1.09x faster (-8%) |
+-----------------+--------------+------------------------------+
| regex_dna | 240 ms | 227 ms: 1.06x faster (-5%) |
+-----------------+--------------+------------------------------+
+-----------------+--------------+------------------------------+
| Benchmark | 3.6-alpine38 | 3.6-alpine38-optimized |
+=================+==============+==============================+
| django_template | 265 ms | 214 ms: 1.24x faster (-19%) |
+-----------------+--------------+------------------------------+
| html5lib | 160 ms | 143 ms: 1.12x faster (-11%) |
+-----------------+--------------+------------------------------+
| json_dumps | 25.0 ms | 18.3 ms: 1.36x faster (-27%) |
+-----------------+--------------+------------------------------+
| json_loads | 47.2 us | 34.6 us: 1.36x faster (-27%) |
+-----------------+--------------+------------------------------+
| pickle | 18.9 us | 15.9 us: 1.19x faster (-16%) |
+-----------------+--------------+------------------------------+
| python_startup | 13.8 ms | 12.6 ms: 1.10x faster (-9%) |
+-----------------+--------------+------------------------------+
| regex_dna | 240 ms | 226 ms: 1.06x faster (-6%) |
+-----------------+--------------+------------------------------+
+-----------------+------------+------------------------------+
| Benchmark | 3.6-jessie | 3.6-jessie-optimized |
+=================+============+==============================+
| django_template | 248 ms | 216 ms: 1.15x faster (-13%) |
+-----------------+------------+------------------------------+
| html5lib | 156 ms | 140 ms: 1.11x faster (-10%) |
+-----------------+------------+------------------------------+
| json_dumps | 19.8 ms | 17.7 ms: 1.12x faster (-11%) |
+-----------------+------------+------------------------------+
| json_loads | 42.4 us | 32.7 us: 1.30x faster (-23%) |
+-----------------+------------+------------------------------+
| pickle | 15.9 us | 15.2 us: 1.05x faster (-4%) |
+-----------------+------------+------------------------------+
| python_startup | 13.6 ms | 12.9 ms: 1.06x faster (-5%) |
+-----------------+------------+------------------------------+
| regex_dna | 234 ms | 219 ms: 1.07x faster (-7%) |
+-----------------+------------+------------------------------+
+-----------------+-------------+------------------------------+
| Benchmark | 3.6-stretch | 3.6-stretch-optimized |
+=================+=============+==============================+
| django_template | 245 ms | 213 ms: 1.15x faster (-13%) |
+-----------------+-------------+------------------------------+
| html5lib | 154 ms | 140 ms: 1.10x faster (-9%) |
+-----------------+-------------+------------------------------+
| json_dumps | 19.9 ms | 17.7 ms: 1.13x faster (-11%) |
+-----------------+-------------+------------------------------+
| json_loads | 43.9 us | 34.3 us: 1.28x faster (-22%) |
+-----------------+-------------+------------------------------+
| pickle | 15.6 us | 15.8 us: 1.02x slower (+2%) |
+-----------------+-------------+------------------------------+
| python_startup | 13.6 ms | 13.2 ms: 1.03x faster (-3%) |
+-----------------+-------------+------------------------------+
| regex_dna | 226 ms | 216 ms: 1.05x faster (-5%) |
+-----------------+-------------+------------------------------+
+-----------------+--------------+------------------------------+
| Benchmark | 3.7-alpine38 | 3.7-alpine38-optimized |
+=================+==============+==============================+
| django_template | 210 ms | 175 ms: 1.20x faster (-17%) |
+-----------------+--------------+------------------------------+
| html5lib | 148 ms | 135 ms: 1.09x faster (-8%) |
+-----------------+--------------+------------------------------+
| json_dumps | 24.5 ms | 17.4 ms: 1.41x faster (-29%) |
+-----------------+--------------+------------------------------+
| json_loads | 47.6 us | 34.3 us: 1.39x faster (-28%) |
+-----------------+--------------+------------------------------+
| pickle | 20.0 us | 15.4 us: 1.30x faster (-23%) |
+-----------------+--------------+------------------------------+
| python_startup | 11.2 ms | 10.3 ms: 1.08x faster (-7%) |
+-----------------+--------------+------------------------------+
| regex_dna | 238 ms | 229 ms: 1.04x faster (-4%) |
+-----------------+--------------+------------------------------+
#!/usr/bin/env bash
set -x
# Test optimized
docker run -it --rm -v `pwd`:/app 3.5-alpine37 sh /app/_test.sh 3.5-alpine37-optimized
docker run -it --rm -v `pwd`:/app 3.7-alpine38 sh /app/_test.sh 3.7-alpine38-optimized
docker run -it --rm -v `pwd`:/app 3.6-alpine37 sh /app/_test.sh 3.6-alpine37-optimized
docker run -it --rm -v `pwd`:/app 3.6-alpine38 sh /app/_test.sh 3.6-alpine38-optimized
docker run -it --rm -v `pwd`:/app 3.5-alpine38 sh /app/_test.sh 3.5-alpine38-optimized
docker run -it --rm -v `pwd`:/app 3.5-stretch sh /app/_test.sh 3.5-stretch-optimized
docker run -it --rm -v `pwd`:/app 3.6-stretch sh /app/_test.sh 3.6-stretch-optimized
docker run -it --rm -v `pwd`:/app 3.6-jessie sh /app/_test.sh 3.6-jessie-optimized
docker run -it --rm -v `pwd`:/app 3.4-jessie sh /app/_test.sh 3.4-jessie-optimized
docker run -it --rm -v `pwd`:/app 3.6-alpine36 sh /app/_test.sh 3.6-alpine36-optimized
docker run -it --rm -v `pwd`:/app 3.5-jessie sh /app/_test.sh 3.5-jessie-optimized
docker run -it --rm -v `pwd`:/app 2.7-wheezy sh /app/_test.sh 2.7-wheezy-optimized
docker run -it --rm -v `pwd`:/app 3.4-stretch sh /app/_test.sh 3.4-stretch-optimized
docker run -it --rm -v `pwd`:/app 3.4-wheezy sh /app/_test.sh 3.4-wheezy-optimized
docker run -it --rm -v `pwd`:/app 3.4-alpine38 sh /app/_test.sh 3.4-alpine38-optimized
docker run -it --rm -v `pwd`:/app 3.4-alpine37 sh /app/_test.sh 3.4-alpine37-optimized
docker run -it --rm -v `pwd`:/app 2.7-alpine38 sh /app/_test.sh 2.7-alpine38-optimized
docker run -it --rm -v `pwd`:/app 2.7-alpine37 sh /app/_test.sh 2.7-alpine37-optimized
docker run -it --rm -v `pwd`:/app 2.7-jessie sh /app/_test.sh 2.7-jessie-optimized
docker run -it --rm -v `pwd`:/app 2.7-alpine36 sh /app/_test.sh 2.7-alpine36-optimized
docker run -it --rm -v `pwd`:/app 2.7-stretch sh /app/_test.sh 2.7-stretch-optimized
# Test original
docker run -it --rm -v `pwd`:/app python:3.5-alpine3.7 sh /app/_test.sh 3.5-alpine37
docker run -it --rm -v `pwd`:/app python:3.7-alpine3.8 sh /app/_test.sh 3.7-alpine38
docker run -it --rm -v `pwd`:/app python:3.6-alpine3.7 sh /app/_test.sh 3.6-alpine37
docker run -it --rm -v `pwd`:/app python:3.6-alpine3.8 sh /app/_test.sh 3.6-alpine38
docker run -it --rm -v `pwd`:/app python:3.5-alpine3.8 sh /app/_test.sh 3.5-alpine38
docker run -it --rm -v `pwd`:/app python:3.5-stretch sh /app/_test.sh 3.5-stretch
docker run -it --rm -v `pwd`:/app python:3.6-stretch sh /app/_test.sh 3.6-stretch
docker run -it --rm -v `pwd`:/app python:3.6-jessie sh /app/_test.sh 3.6-jessie
docker run -it --rm -v `pwd`:/app python:3.4-jessie sh /app/_test.sh 3.4-jessie
docker run -it --rm -v `pwd`:/app python:3.6-alpine3.6 sh /app/_test.sh 3.6-alpine36
docker run -it --rm -v `pwd`:/app python:3.5-jessie sh /app/_test.sh 3.5-jessie
docker run -it --rm -v `pwd`:/app python:2.7-wheezy sh /app/_test.sh 2.7-wheezy
docker run -it --rm -v `pwd`:/app python:3.4-stretch sh /app/_test.sh 3.4-stretch
docker run -it --rm -v `pwd`:/app python:3.4-wheezy sh /app/_test.sh 3.4-wheezy
docker run -it --rm -v `pwd`:/app python:3.4-alpine3.8 sh /app/_test.sh 3.4-alpine38
docker run -it --rm -v `pwd`:/app python:3.4-alpine3.7 sh /app/_test.sh 3.4-alpine37
docker run -it --rm -v `pwd`:/app python:2.7-alpine3.8 sh /app/_test.sh 2.7-alpine38
docker run -it --rm -v `pwd`:/app python:2.7-alpine3.7 sh /app/_test.sh 2.7-alpine37
docker run -it --rm -v `pwd`:/app python:2.7-jessie sh /app/_test.sh 2.7-jessie
docker run -it --rm -v `pwd`:/app python:2.7-alpine3.6 sh /app/_test.sh 2.7-alpine36
docker run -it --rm -v `pwd`:/app python:2.7-stretch sh /app/_test.sh 2.7-stretch
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment