-
Notifications
You must be signed in to change notification settings - Fork 0
/
Dockerfile
135 lines (108 loc) · 3.98 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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
# syntax = docker/dockerfile:1.4
ARG UBUNTU_VERSION=20.04
ARG MAMBAFORGE_VERSION=4.12.0-2
# NOTE: all stages can run in parallel as root user,
# jovyan user created at end for run-time
# -----------------
FROM ubuntu:${UBUNTU_VERSION} as base
WORKDIR /tmp
LABEL org.opencontainers.image.source=https://github.com/pangeo-data/pangeo-docker-images
ENV CONDA_ENV=notebook \
DEBIAN_FRONTEND=noninteractive \
NB_USER=jovyan \
NB_UID=1000 \
SHELL=/bin/bash \
LANG=C.UTF-8 \
LC_ALL=C.UTF-8 \
CONDA_DIR=/opt/conda
ENV NB_PYTHON_PREFIX=${CONDA_DIR}/envs/${CONDA_ENV} \
DASK_ROOT_CONFIG=${CONDA_DIR}/etc \
HOME=/home/${NB_USER}
ENV PATH=${NB_PYTHON_PREFIX}/bin:${CONDA_DIR}/bin:${PATH}
RUN echo ". ${CONDA_DIR}/etc/profile.d/conda.sh ; conda activate ${CONDA_ENV}" > /etc/profile.d/init_conda.sh
RUN <<eot
echo "Installing Apt-get packages..."
apt-get update --fix-missing > /dev/null
apt-get install -y apt-utils wget zip tzdata > /dev/null
apt-get clean
rm -rf /var/lib/apt/lists/*
eot
COPY --link apt* .
RUN <<eot
echo "Checking for 'apt.txt'..."
if test -f "apt.txt" ; then
apt-get update --fix-missing > /dev/null
xargs -a apt.txt apt-get install -y
apt-get clean
rm -rf /var/lib/apt/lists/*
fi
eot
FROM condaforge/mambaforge:${MAMBAFORGE_VERSION} as mambaforge
# -----------------
FROM base as conda
#Install environment from conda-linux-64.lock or environment.yml if they exist
COPY --link --from=mambaforge /opt/conda ${CONDA_DIR}
COPY --link environment.yml* conda-linux-64.lock* requirements.txt* postBuild* .
# NOTE: w/o from=: uses local cache pangeo-mambacache:latest
RUN --mount=type=cache,target=/opt/conda/pkgs <<eot
echo "Checking for 'conda-linux-64.lock' or 'environment.yml'..."
if test -f "conda-linux-64.lock" ; then
mamba create --name ${CONDA_ENV} --file conda-linux-64.lock
elif test -f "environment.yml" ; then
mamba env create --name ${CONDA_ENV} -f environment.yml
else
echo "No conda-linux-64.lock or environment.yml! *creating default env*"
mamba create --name ${CONDA_ENV} pangeo-notebook
fi
mamba clean -yt
find ${CONDA_DIR} -not -path "${CONDA_DIR}/pkgs/*" -follow -type f -name '*.a' -delete
find ${CONDA_DIR} -not -path "${CONDA_DIR}/pkgs/*" -follow -type f -name '*.pyc' -delete
find ${CONDA_DIR} -not -path "${CONDA_DIR}/pkgs/*" -follow -type f -name '*.js.map' -delete
if [ -d ${NB_PYTHON_PREFIX}/lib/python*/site-packages/bokeh/server/static ]; then
find ${NB_PYTHON_PREFIX}/lib/python*/site-packages/bokeh/server/static -follow -type f -name '*.js' ! -name '*.min.js' -delete
fi
eot
RUN <<eot
echo "Checking for pip 'requirements.txt'..."
if test -f "requirements.txt" ; then
${NB_PYTHON_PREFIX}/bin/pip install --no-cache -r requirements.txt
fi
eot
RUN <<eot
echo "Checking for 'postBuild'..."
if test -f "postBuild" ; then
chmod +x postBuild
./postBuild
rm -rf /tmp/*
rm -rf ${NB_PYTHON_PREFIX}/share/jupyter/lab/staging
find ${CONDA_DIR} -follow -type f -name '*.a' -delete
find ${CONDA_DIR} -follow -type f -name '*.pyc' -delete
find ${CONDA_DIR} -follow -type f -name '*.js.map' -delete
fi
eot
# -----------------
FROM base as start
# Create executable entrypoint start script if it doesn't exist
COPY --link start* .
RUN <<eot
echo "Checking for 'start'..."
if ! test -f "start" ; then
printf '#!/bin/bash -l\nexec "$@"\n' > start
fi
chmod +x start
eot
# -----------------
FROM base as merge
# jovyan user has full permissions to $HOME, $CONDA_DIR
RUN <<eot
echo "Creating ${NB_USER} user..."
groupadd --gid ${NB_UID} ${NB_USER}
useradd --create-home --gid ${NB_UID} --no-log-init --uid ${NB_UID} ${NB_USER}
chown ${NB_USER}:${NB_USER} ${HOME}
eot
USER ${NB_USER}
WORKDIR ${HOME}
COPY --from=conda --chown=1000:1000 --link ${CONDA_DIR} ${CONDA_DIR}
COPY --from=start --link /tmp/start /opt/start
EXPOSE 8888
ENTRYPOINT ["/opt/start"]