File size: 2,753 Bytes
14a7de5
a6561fb
8f22300
a20ad5f
6751543
14a7de5
 
 
a20ad5f
 
a6561fb
 
 
a20ad5f
 
51a9c73
a6561fb
 
a20ad5f
bee3f8a
14a7de5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
df7d9dd
 
 
 
 
8b3e169
df7d9dd
bee3f8a
14a7de5
 
 
98ecc08
a20ad5f
2efee4c
14a7de5
 
 
e8eeb0f
df7d9dd
51a9c73
 
14a7de5
 
a20ad5f
16a9021
14a7de5
 
 
4afed9d
30ea8d8
8b3e169
df7d9dd
14a7de5
8b3e169
30ea8d8
 
8b3e169
 
14a7de5
a20ad5f
df7d9dd
a20ad5f
 
 
14a7de5
30ea8d8
ac3964b
14a7de5
 
 
a20ad5f
5231d74
a20ad5f
 
2694bf1
14a7de5
a20ad5f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# 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"]