EOS/Dockerfile
Dominique Lasserre 87ac127817 Workflow: Docker: Add more archs: armv6/v7, i386
* Build amd64 on any PR.
2025-02-10 23:37:48 +01:00

119 lines
4.2 KiB
Docker

ARG PYTHON_VERSION=3.12.8
ARG BASE_IMAGE=python
ARG IMAGE_SUFFIX=-slim
FROM ${BASE_IMAGE}:${PYTHON_VERSION}${IMAGE_SUFFIX} AS base
LABEL source="https://github.com/Akkudoktor-EOS/EOS"
ENV MPLCONFIGDIR="/tmp/mplconfigdir"
ENV EOS_DIR="/opt/eos"
ENV EOS_CACHE_DIR="${EOS_DIR}/cache"
ENV EOS_OUTPUT_DIR="${EOS_DIR}/output"
ENV EOS_CONFIG_DIR="${EOS_DIR}/config"
WORKDIR ${EOS_DIR}
# Use useradd over adduser to support both debian:x-slim and python:x-slim base images
RUN useradd --system --no-create-home --shell /usr/sbin/nologin eos \
&& mkdir -p "${MPLCONFIGDIR}" \
&& chown eos "${MPLCONFIGDIR}" \
&& mkdir -p "${EOS_CACHE_DIR}" \
&& chown eos "${EOS_CACHE_DIR}" \
&& mkdir -p "${EOS_OUTPUT_DIR}" \
&& chown eos "${EOS_OUTPUT_DIR}" \
&& mkdir -p "${EOS_CONFIG_DIR}" \
&& chown eos "${EOS_CONFIG_DIR}"
ARG APT_PACKAGES
ENV APT_PACKAGES="${APT_PACKAGES}"
RUN --mount=type=cache,sharing=locked,target=/var/lib/apt/lists \
--mount=type=cache,sharing=locked,target=/var/cache/apt \
rm /etc/apt/apt.conf.d/docker-clean; \
if [ -n "${APT_PACKAGES}" ]; then \
apt-get update \
&& apt-get install -y --no-install-recommends ${APT_PACKAGES}; \
fi
FROM base AS build
ARG APT_BUILD_PACKAGES
ENV APT_BUILD_PACKAGES="${APT_BUILD_PACKAGES}"
RUN --mount=type=cache,sharing=locked,target=/var/lib/apt/lists \
--mount=type=cache,sharing=locked,target=/var/cache/apt \
rm /etc/apt/apt.conf.d/docker-clean; \
if [ -n "${APT_BUILD_PACKAGES}" ]; then \
apt-get update \
&& apt-get install -y --no-install-recommends ${APT_BUILD_PACKAGES}; \
fi
ARG RUSTUP_INSTALL
ENV RUSTUP_INSTALL="${RUSTUP_INSTALL}"
ENV RUSTUP_HOME=/opt/rust
ENV CARGO_HOME=/opt/rust
ENV PATH="$RUSTUP_HOME/bin:$PATH"
ARG PIP_EXTRA_INDEX_URL
ENV PIP_EXTRA_INDEX_URL="${PIP_EXTRA_INDEX_URL}"
RUN --mount=type=cache,target=/root/.cache/pip \
--mount=type=tmpfs,target=/root/.cargo \
dpkgArch=$(dpkg --print-architecture) \
&& if [ -n "${RUSTUP_INSTALL}" ]; then \
case "$dpkgArch" in \
# armv6
armel) \
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --profile minimal --target arm-unknown-linux-gnueabi --no-modify-path \
;; \
*) \
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --profile minimal --no-modify-path \
;; \
esac \
&& rustc --version \
&& cargo --version; \
fi \
# Install 32bit fix for pendulum, can be removed after next pendulum release (> 3.0.0)
&& case "$dpkgArch" in \
# armv7/armv6
armhf|armel) \
git clone https://github.com/python-pendulum/pendulum.git \
&& git -C pendulum checkout -b 3.0.0 3.0.0 \
# Apply 32bit patch
&& git -C pendulum -c user.name=ci -c user.email=ci@github.com cherry-pick b84b97625cdea00f8ab150b8b35aa5ccaaf36948 \
&& cd pendulum \
# Use pip3 over pip to support both debian:x and python:x base images
&& pip3 install maturin \
&& maturin build --release --out dist \
&& pip3 install dist/*.whl --break-system-packages \
&& cd - \
;; \
esac
COPY requirements.txt .
# Use tmpfs for cargo due to qemu (multiarch) limitations
RUN --mount=type=cache,target=/root/.cache/pip \
--mount=type=tmpfs,target=/root/.cargo \
# Use pip3 over pip to support both debian:x and python:x base images
pip3 install -r requirements.txt --break-system-packages
FROM base AS final
# Copy all python dependencies previously installed or built to the final stage.
COPY --from=build /usr/local/ /usr/local/
COPY --from=build /opt/eos/requirements.txt .
COPY pyproject.toml .
RUN --mount=type=cache,target=/root/.cache/pip \
# Use pip3 over pip to support both debian:x and python:x base images
mkdir -p src && pip3 install -e . --break-system-packages
COPY src src
USER eos
ENTRYPOINT []
EXPOSE 8503
EXPOSE 8504
# Use python3 over python to support both debian:x and python:x base images
CMD ["python3", "src/akkudoktoreos/server/eos.py", "--host", "0.0.0.0"]
VOLUME ["${MPLCONFIGDIR}", "${EOS_CACHE_DIR}", "${EOS_OUTPUT_DIR}", "${EOS_CONFIG_DIR}"]