mirror of
https://github.com/Akkudoktor-EOS/EOS.git
synced 2025-04-19 00:45:22 +00:00
119 lines
4.2 KiB
Docker
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}"]
|