# syntax=docker/dockerfile:1 FROM ubuntu:22.04 ENV DEBIAN_FRONTEND=noninteractive # ----------------------------- # System dependencies # ----------------------------- RUN apt-get update \ && apt-get install -y --no-install-recommends \ build-essential \ git \ make \ curl \ ca-certificates \ pkg-config \ libudev-dev \ libsystemd-dev \ && rm -rf /var/lib/apt/lists/* # ----------------------------- # Node.js (v22.21.1) via nvm # - npx needed by `make -C robot-server dev` # ----------------------------- ENV NVM_DIR=/opt/nvm RUN mkdir -p ${NVM_DIR} \ && curl -fsSL https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash # Install & activate Node 22.21.1 (system-wide usable via PATH) ARG NODE_VERSION=22.21.1 RUN bash -lc ". ${NVM_DIR}/nvm.sh \ && nvm install ${NODE_VERSION} \ && nvm alias default ${NODE_VERSION} \ && nvm use default \ && node -v \ && npm -v \ && npx -v" # Make node/npm/npx available in non-interactive shells too ENV PATH=${NVM_DIR}/versions/node/v${NODE_VERSION}/bin:$PATH # ----------------------------- # uv (system-wide) # ----------------------------- RUN curl -LsSf https://astral.sh/uv/install.sh | sh \ && install -m 0755 /root/.local/bin/uv /usr/local/bin/uv # Put uv-managed python somewhere world-readable ENV UV_PYTHON_INSTALL_DIR=/opt/uv/python RUN mkdir -p /opt/uv/python \ && chmod -R 755 /opt/uv # ----------------------------- # Python via uv # ----------------------------- ARG PYTHON_VERSION=3.12.12 RUN uv python install ${PYTHON_VERSION} # ----------------------------- # Clone Opentrons monorepo (default branch is edge) # ----------------------------- ARG OPENTRONS_REF=edge RUN git clone --depth 1 --branch ${OPENTRONS_REF} https://github.com/Opentrons/opentrons.git /root/opentrons WORKDIR /root/opentrons # robot-server setup using uv-managed python RUN uv run --python ${PYTHON_VERSION} make -C robot-server setup # ----------------------------- # App user # ----------------------------- RUN useradd -m -u 1000 user USER user ENV HOME=/home/user # Put uv cache in a writable location for non-root user ENV UV_CACHE_DIR=/home/user/.cache/uv WORKDIR $HOME/app RUN mkdir -p $UV_CACHE_DIR # Cache-friendly install of Python deps for your app COPY --chown=user requirements.txt $HOME/app/requirements.txt RUN uv venv --python ${PYTHON_VERSION} .venv \ && uv pip install --python .venv/bin/python -r requirements.txt # Copy the rest of your app COPY --chown=user . $HOME/app # ----------------------------- # Entrypoint # ----------------------------- USER root COPY entrypoint.sh /entrypoint.sh RUN chmod +x /entrypoint.sh WORKDIR /root/opentrons ENTRYPOINT ["/bin/bash", "-lc", "/entrypoint.sh"] CMD ["bash"]