Repository navigation
Expand file tree
/
Copy pathDockerfile.dev
More file actions
173 lines (143 loc) · 6.31 KB
/
Copy pathDockerfile.dev
File metadata and controls
173 lines (143 loc) · 6.31 KB
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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
# --------------------------------------------------------------------------------------------------------------
# Img2Num Dockerfile.dev
#
# Be careful of how you update this file. Updating layer 2 forces the layers below it to rebuild, too!
# --------------------------------------------------------------------------------------------------------------
# Node 26 = Active LTS in Oct 2026 (>= 24.14 required by editorconfig-checker 7.x: see package.json).
FROM node:26-trixie
# --------------------------------------------------------------------------------------------------------------
# Build metadata
ARG BUILD_DATE
ARG GIT_SHA
LABEL org.opencontainers.image.title="Img2Num Dev"
LABEL org.opencontainers.image.description="Development environment for Img2Num"
LABEL org.opencontainers.image.source="https://github.com/Ryan-Millard/Img2Num"
LABEL org.opencontainers.image.created=$BUILD_DATE
LABEL org.opencontainers.image.revision=$GIT_SHA
# --------------------------------------------------------------------------------------------------------------
# OS setup & core tooling
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
--mount=type=cache,target=/var/lib/apt,sharing=locked \
apt-get update && apt-get install -y --no-install-recommends \
build-essential \
gcc-14 \
g++-14 \
clang \
cmake \
ninja-build \
python3 \
python3-setuptools \
python3-wheel \
python3-pybind11 \
git \
curl \
unzip \
pkg-config \
bash \
ca-certificates \
tzdata \
&& rm -rf /var/lib/apt/lists/*
ENV TZ=Africa/Johannesburg
ENV CC=gcc-14
ENV CXX=g++-14
ENV SHELL=/bin/bash
SHELL ["/bin/bash", "-c"]
WORKDIR /usr/src/app
# --------------------------------------------------------------------------------------------------------------
# Git safety
RUN git config --global --add safe.directory /usr/src/app
# --------------------------------------------------------------------------------------------------------------
# Emscripten setup (Slightly Expensive)
COPY .versions/.emscripten.json /tmp/.emscripten.json
COPY scripts/read-version.js /tmp/read-version.js
ENV EMSDK_DIR=/opt/emsdk
RUN EMSDK_VERSION=$(node /tmp/read-version.js /tmp/.emscripten.json) \
&& git clone --depth 1 https://github.com/emscripten-core/emsdk.git $EMSDK_DIR \
&& cd $EMSDK_DIR \
&& git fetch --tags \
&& git checkout $EMSDK_VERSION \
&& ./emsdk install $EMSDK_VERSION \
&& ./emsdk activate $EMSDK_VERSION
ENV PATH=$EMSDK_DIR:$EMSDK_DIR/upstream/emscripten:$PATH
ENV EMSDK=$EMSDK_DIR
# Auto-load emsdk in all shells
RUN echo "source /opt/emsdk/emsdk_env.sh" >> /etc/bash.bashrc
# --------------------------------------------------------------------------------------------------------------
# Dawn dependencies
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
--mount=type=cache,target=/var/lib/apt,sharing=locked \
apt-get update && apt-get install -y --no-install-recommends \
libvulkan1 \
mesa-vulkan-drivers \
libgl1-mesa-dev \
libglu1-mesa-dev \
vulkan-tools \
libvips-dev \
&& rm -rf /var/lib/apt/lists/*
# --------------------------------------------------------------------------------------------------------------
# Dawn build (expensive layer)
COPY third_party/dawn third_party/dawn
RUN cmake -S third_party/dawn -B build/dawn \
-DDAWN_SUPPORTS_GLFW_FOR_WINDOWING=OFF \
-DDAWN_USE_X11=OFF \
-DDAWN_FETCH_DEPENDENCIES=ON \
-DDAWN_ENABLE_INSTALL=ON \
-DDAWN_BUILD_TESTS=OFF \
-DCMAKE_BUILD_TYPE=Release \
&& cmake --build build/dawn --parallel $(nproc) \
&& cmake --install build/dawn
# --------------------------------------------------------------------------------------------------------------
# Doxygen
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
--mount=type=cache,target=/var/lib/apt,sharing=locked \
apt-get update && apt-get install -y --no-install-recommends \
doxygen \
graphviz \
&& rm -rf /var/lib/apt/lists/*
# --------------------------------------------------------------------------------------------------------------
# UV + Python environment
RUN curl -LsSf https://astral.sh/uv/0.12.13/install.sh | sh
ENV PATH="/root/.local/bin:${PATH}"
ENV UV_LINK_MODE=copy
ENV UV_PIP_CACHE_DIR=/root/.cache/uv/pip
RUN uv venv /usr/src/app/.venv
ENV VIRTUAL_ENV=/usr/src/app/.venv
ENV PATH="/usr/src/app/.venv/bin:$PATH"
COPY pyproject.toml uv.lock CMakeLists.txt ./
COPY packages/py/pyproject.toml packages/py/pyproject.toml
COPY scripts/py/pyproject.toml scripts/py/pyproject.toml
COPY example-apps/console-py/pyproject.toml example-apps/console-py/pyproject.toml
RUN --mount=type=cache,target=/root/.cache/uv \
uv sync --frozen --no-install-project --no-install-workspace \
--all-groups
# --------------------------------------------------------------------------------------------------------------
# Node / pnpm setup
RUN npm install -g pnpm@12.4.1
ENV PNPM_STORE_DIR=/pnpm/store
ENV PATH=/root/.local/share/pnpm:$PATH
COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./
COPY packages/js/package.json packages/js/package.json
COPY docs/package.json docs/package.json
COPY example-apps/react-js/package.json example-apps/react-js/package.json
COPY scripts/img2num-dev-scripts/package.json scripts/img2num-dev-scripts/package.json
RUN --mount=type=cache,target=/pnpm/store \
pnpm install --no-frozen-lockfile
# --------------------------------------------------------------------------------------------------------------
# Just package manager
RUN curl --proto '=https' --tlsv1.2 -sSf https://just.systems/install.sh -o setup_just.sh && \
bash setup_just.sh --to /usr/local/bin && \
rm setup_just.sh
# --------------------------------------------------------------------------------------------------------------
# Dev UX settings
ENV CHOKIDAR_USEPOLLING=true
ENV CHOKIDAR_INTERVAL=100
# See docker-compose.yml ports
EXPOSE 3000 5173 4173 5174 4174 5175 5176
# --------------------------------------------------------------------------------------------------------------
# Healthcheck (Basic if container works)
HEALTHCHECK --interval=30s --timeout=5s --start-period=40s --retries=3 \
CMD bash -lc '\
for tool in node pnpm emcc cmake uv; do \
command -v "$tool" >/dev/null && "$tool" --version >/dev/null || exit 1; \
done'
CMD ["bash"]