# syntax=docker/dockerfile:1 FROM ubuntu:22.04 ENV DEBIAN_FRONTEND=noninteractive # ----------------------------- # System deps # ----------------------------- 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 # ----------------------------- 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 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" 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 ENV UV_PYTHON_INSTALL_DIR=/opt/uv/python RUN mkdir -p /opt/uv/python \ && chmod -R 755 /opt/uv ARG PYTHON_VERSION=3.12.12 RUN uv python install ${PYTHON_VERSION} # ----------------------------- # Clone Opentrons monorepo # ----------------------------- ARG OPENTRONS_REF=edge RUN git clone --depth 1 --branch ${OPENTRONS_REF} https://github.com/Opentrons/opentrons.git /root/opentrons WORKDIR /root/opentrons RUN uv run --python ${PYTHON_VERSION} make -C robot-server setup # ----------------------------- # App user + deps # ----------------------------- RUN useradd -m -u 1000 user USER user ENV HOME=/home/user ENV UV_CACHE_DIR=/home/user/.cache/uv WORKDIR $HOME/app RUN mkdir -p $UV_CACHE_DIR # install python deps (fastapi/uvicorn含む) 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 app code (api.py / entrypoint.sh など) COPY --chown=user . $HOME/app # ----------------------------- # Entrypoint # ----------------------------- USER root COPY entrypoint.sh /entrypoint.sh RUN chmod +x /entrypoint.sh WORKDIR /root/opentrons ENV PORT=7860 EXPOSE 7860 ENTRYPOINT ["/bin/bash", "-lc", "/entrypoint.sh"]