11# [Node Stage to get node_modolues and node dependencies]
2- FROM node:8.16.0-buster-slim as node_stage
2+ FROM node:8.16.0-buster-slim as node_base
3+ # [Python Stage for Django web server]
4+ FROM python:3.10.14-slim-bullseye as python_base
35
6+ FROM node_base as node_deps
47COPY ./yarn.lock yarn.lock
58COPY ./package.json package.json
69
710RUN apt-get update
811RUN apt-get install python-pip -y
912
1013RUN npm install -g yarn
11- RUN yarn install --dev --frozen-lockfile \
12- && rm -rf $HOME/.cache/yarn/*
13-
14-
15- # [Python Stage for Django web server]
16- FROM python:3.10.14-slim-bullseye as python_stage
17-
18- ENV PYTHONUNBUFFERED=1 \
19- PYTHONDONTWRITEBYTECODE=1 \
20- PIP_DISABLE_PIP_VERSION_CHECK=on \
21- PIP_DEFAULT_TIMEOUT=100 \
22- POETRY_HOME="/opt/poetry" \
23- POETRY_VIRTUALENVS_IN_PROJECT=true \
24- POETRY_NO_INTERACTION=1
25-
26- ENV BASE_DIR /usr/local
27- ENV APP_DIR $BASE_DIR/app
28-
29- COPY --from=node_stage /node_modules $APP_DIR/node_modules
30- COPY --from=node_stage /usr/local/bin/node /usr/local/bin/node
31-
32- # make nodejs accessible and executable globally
33- ENV NODE_PATH $APP_DIR/node_modules/
34- ENV PATH /usr/local/bin:$PATH
14+ RUN yarn install --dev --frozen-lockfile && yarn cache clean
3515
36- # Add bin directory used by `pip install --user`
37- ENV PATH /home/docker/. local/bin:$PATH
16+ FROM python_base as python_deps
17+ ENV APP_DIR /usr/ local/app
3818
3919# Infrastructure tools
4020# gettext is used for django to compile .po to .mo files.
4121RUN apt-get update
22+ RUN apt-get upgrade -y
4223RUN apt-get install -y \
4324 libpq-dev \
4425 gcc \
@@ -49,24 +30,43 @@ RUN apt-get install -y \
4930 libxml2-dev \
5031 libxslt-dev
5132
52- # APP directory setup
53- RUN adduser --system --disabled-login docker \
54- && mkdir -p "$BASE_DIR" "$APP_DIR" "$APP_DIR/src/assets" "$APP_DIR/src/media" \
55- && chown -R docker:nogroup "$BASE_DIR" "$APP_DIR"
33+ ENV PYTHONUNBUFFERED=1 \
34+ PIP_DISABLE_PIP_VERSION_CHECK=on \
35+ PIP_DEFAULT_TIMEOUT=100 \
36+ POETRY_VIRTUALENVS_IN_PROJECT=true
5637
5738# Install Poetry
5839RUN pip install --no-cache-dir pip==23.3.2 && \
5940 pip install --no-cache-dir poetry==1.8.2
6041
61- # Install Python dependencies (only main dependencies)
62- COPY --chown=docker:nogroup pyproject.toml poetry.lock ./
63- RUN poetry install --no-root && \
42+ # Install Python dependencies
43+ COPY pyproject.toml poetry.lock ./
44+ RUN poetry install --no-root --only main && \
6445 yes | poetry cache clear --all pypi
6546
6647# Add poetry bin directory to PATH
6748ENV PATH="${WORKDIR}/.venv/bin:$PATH"
6849
69- # Finally, copy all the project files along with source files
50+ # Make nodejs accessible and executable globally
51+ ENV NODE_PATH $APP_DIR/node_modules/
52+
53+ FROM python_deps as dev
54+ RUN poetry install --no-root --only dev
55+
56+ COPY --from=node_deps /node_modules $APP_DIR/node_modules
57+ COPY --from=node_deps /usr/local/bin/node /usr/local/bin/node
58+
59+ FROM python_deps as build
60+ RUN mkdir -p "$APP_DIR" "$APP_DIR/src/assets" "$APP_DIR/src/media"
61+
62+ FROM python_deps as prod
63+ # APP directory setup
64+ RUN adduser --system --disabled-login docker
65+ # Use COPY --chown instead of RUN chown -R directly to avoid increasing image size
66+ # https://github.com/pycontw/pycon.tw/pull/1194#discussion_r1593319742
67+ COPY --chown=docker:nogroup --from=build $APP_DIR $APP_DIR
68+ COPY --chown=docker:nogroup --from=node_deps /node_modules $APP_DIR/node_modules
69+ COPY --chown=docker:nogroup --from=node_deps /usr/local/bin/node /usr/local/bin/node
7070COPY --chown=docker:nogroup ./ $APP_DIR
7171
7272USER docker
0 commit comments