-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDockerfile
139 lines (113 loc) · 4.23 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
136
137
138
139
# syntax = docker/dockerfile:1.4
ARG UBUNTU_VERSION=22.04
ARG MAMBAFORGE_VERSION=22.9.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 conda-lock.yml* environment.yml* conda-linux-64.lock* requirements.txt* .
# Cache will be available for subsequent `docker buildx build` commands
RUN --mount=type=cache,target=/opt/conda/pkgs <<eot
echo "Checking for 'conda-lock.yml' 'conda-linux-64.lock' or 'environment.yml'..."
if test -f "conda-lock.yml" ; then
mamba install conda-lock=1.3
conda-lock install --name ${CONDA_ENV} conda-lock.yml
elif 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
# -----------------
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
COPY --from=conda --chown=1000:1000 --link ${CONDA_DIR} ${CONDA_DIR}
COPY --from=start --link /tmp/start /opt/start
# PostBuild needs to happen after conda environment setup
COPY --link postBuild* .
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
USER ${NB_USER}
WORKDIR ${HOME}
EXPOSE 8888
ENTRYPOINT ["/opt/start"]