-
Notifications
You must be signed in to change notification settings - Fork 6
/
Dockerfile
102 lines (88 loc) · 4.46 KB
/
Dockerfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
FROM alpine:3.7
# VERSIONS
ENV ALPINE_VERSION=3.7 \
PYTHON_VERSION=3.6.5
# PATHS
ENV PYTHON_PATH=/usr/lib/python$PYTHON_VERSION \
PATH="/usr/lib/python$PYTHON_VERSION/bin/:${PATH}"
# PACKAGES
# * dumb-init: a proper init system for containers, to reap zombie children
# * musl: standard C library
# * lib6-compat: compatibility libraries for glibc
# * linux-headers: commonly needed, and an unusual package name from Alpine.
# * build-base: used so we include the basic development packages (gcc)
# * bash: so we can access /bin/bash
# * git: to ease up clones of repos
# * ca-certificates: for SSL verification during Pip and easy_install
ENV PACKAGES="\
dumb-init \
musl \
libc6-compat \
linux-headers \
build-base \
bash \
git \
ca-certificates \
"
# PACKAGES needed to built python
ENV PYTHON_BUILD_PACKAGES="\
readline-dev \
zlib-dev \
bzip2-dev \
sqlite-dev \
libressl-dev \
"
RUN set -ex ;\
# find MAJOR and MINOR python versions based on $PYTHON_VERSION
export PYTHON_MAJOR_VERSION=$(echo "${PYTHON_VERSION}" | rev | cut -d"." -f3- | rev) ;\
export PYTHON_MINOR_VERSION=$(echo "${PYTHON_VERSION}" | rev | cut -d"." -f2- | rev) ;\
# replacing default repositories with edge ones
echo "http://dl-cdn.alpinelinux.org/alpine/v$ALPINE_VERSION/community" >> /etc/apk/repositories ;\
echo "http://dl-cdn.alpinelinux.org/alpine/v$ALPINE_VERSION/main" >> /etc/apk/repositories ;\
# Add the packages, with a CDN-breakage fallback if needed
apk add --no-cache $PACKAGES || \
(sed -i -e 's/dl-cdn/dl-4/g' /etc/apk/repositories && apk add --no-cache $PACKAGES) ;\
# Add packages just for the python build process with a CDN-breakage fallback if needed
apk add --no-cache --virtual .build-deps $PYTHON_BUILD_PACKAGES || \
(sed -i -e 's/dl-cdn/dl-4/g' /etc/apk/repositories && apk add --no-cache --virtual .build-deps $PYTHON_BUILD_PACKAGES) ;\
# turn back the clock -- so hacky!
echo "http://dl-cdn.alpinelinux.org/alpine/v$ALPINE_VERSION/main/" > /etc/apk/repositories ;\
# echo "@community http://dl-cdn.alpinelinux.org/alpine/v$ALPINE_VERSION/community" >> /etc/apk/repositories ;\
# echo "@testing http://dl-cdn.alpinelinux.org/alpine/v$ALPINE_VERSION/testing" >> /etc/apk/repositories ;\
# echo "@edge-main http://dl-cdn.alpinelinux.org/alpine/edge/main" >> /etc/apk/repositories ;\
# use pyenv to download and compile specific python version
git clone --depth 1 https://github.com/pyenv/pyenv /usr/lib/pyenv ;\
PYENV_ROOT=/usr/lib/pyenv /usr/lib/pyenv/bin/pyenv install $PYTHON_VERSION ;\
# move specific version to correct path delete pyenv, no longer needed
mv /usr/lib/pyenv/versions/$PYTHON_VERSION/ $PYTHON_PATH ;\
rm -rfv /usr/lib/pyenv ;\
# change the path on the header of every file from PYENV_ROOT to PYTHON_PATH
cd $PYTHON_PATH/bin/ && sed -i "s+/usr/lib/pyenv/versions/$PYTHON_VERSION/+$PYTHON_PATH/+g" * ;\
# delete binary "duplicates" and replace them with symlinks
# this also optimizes space since they are actually the same binary
rm -f $PYTHON_PATH/bin/python$PYTHON_MAJOR_VERSION \
$PYTHON_PATH/bin/python$PYTHON_MINOR_VERSION \
$PYTHON_PATH/bin/python$PYTHON_MAJOR_VERSION-config \
$PYTHON_PATH/bin/python$PYTHON_MINOR_VERSION-config ;\
ln -sf $PYTHON_PATH/bin/python $PYTHON_PATH/bin/python$PYTHON_MAJOR_VERSION ;\
ln -sf $PYTHON_PATH/bin/python $PYTHON_PATH/bin/python$PYTHON_MINOR_VERSION ;\
ln -sf $PYTHON_PATH/bin/python-config $PYTHON_PATH/bin/python$PYTHON_MAJOR_VERSION-config ;\
ln -sf $PYTHON_PATH/bin/python-config $PYTHON_PATH/bin/python$PYTHON_MINOR_VERSION-config ;\
# delete files to to reduce container size
# tips taken from main python docker repo
find /usr/lib/python$PYTHON_VERSION -depth \( -name '*.pyo' -o -name '*.pyc' -o -name 'test' -o -name 'tests' \) -exec rm -rf '{}' + ;\
# remove build dependencies and any leftover apk cache
apk del --no-cache --purge .build-deps ;\
rm -rf /var/cache/apk/* ;\
# Need to re-get sqlite3?
apk add --no-cache sqlite-dev
# pip install package
RUN pip install --upgrade pip ; \
pip install numpy ; \
pip install aiobotocore ; \
pip install pytz ; \
pip install requests ; \
pip install psutil
# since we will be "always" mounting the volume, we can set this up
ENTRYPOINT ["/usr/bin/dumb-init"]
#CMD ["python"]