-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDockerfile
More file actions
237 lines (167 loc) · 7.03 KB
/
Dockerfile
File metadata and controls
237 lines (167 loc) · 7.03 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
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
# syntax=docker/dockerfile:1.7-labs
FROM python:3.12-alpine AS python-base
# bleeding edge repo for eccodes, udunits
RUN echo "http://dl-cdn.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories && \
apk add --no-cache build-base python3-dev git gdal-dev udunits udunits-dev eccodes
ENV UDUNITS2_XML_PATH=/usr/share/udunits/udunits2.xml
WORKDIR /workspace
# Stage 1: Base with uv and all workspace code
FROM python-base AS uv-base
# Copy UV from official image
COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
ENV UV_LINK_MODE=copy \
UV_COMPILE_BYTECODE=1
# Copy entire workspace (dockerignore filters out .venv, cache dirs, etc.)
COPY . /workspace
# ============================================================================
# IONBEAM - Main service
# ============================================================================
FROM uv-base AS ionbeam-deps
RUN --mount=type=cache,target=/root/.cache/uv \
UV_PROJECT_ENVIRONMENT=/venvs/ionbeam \
uv sync --frozen --no-install-project --no-dev --package ionbeam
FROM ionbeam-deps AS ionbeam-build
RUN --mount=type=cache,target=/root/.cache/uv \
UV_PROJECT_ENVIRONMENT=/venvs/ionbeam \
uv sync --frozen --no-dev --no-editable --package ionbeam
FROM python-base AS ionbeam
WORKDIR /app
ENV PATH="/venvs/ionbeam/bin:${PATH}"
COPY --from=ionbeam-build /venvs/ionbeam /venvs/ionbeam
# # USER app
CMD ["ionbeam", "start", "--with-builder"]
# ============================================================================
# DATA SOURCES
# ============================================================================
# ACRONET
FROM uv-base AS acronet-deps
RUN --mount=type=cache,target=/root/.cache/uv \
UV_PROJECT_ENVIRONMENT=/venvs/acronet \
uv sync --frozen --no-install-project --no-dev --package acronet
FROM acronet-deps AS acronet-build
RUN --mount=type=cache,target=/root/.cache/uv \
UV_PROJECT_ENVIRONMENT=/venvs/acronet \
uv sync --frozen --no-dev --no-editable --package acronet
FROM python-base AS acronet
WORKDIR /app
ENV PATH="/venvs/acronet/bin:${PATH}"
COPY --from=acronet-build /venvs/acronet /venvs/acronet
CMD ["acronet"]
# EUMETNET
FROM uv-base AS eumetnet-deps
RUN --mount=type=cache,target=/root/.cache/uv \
UV_PROJECT_ENVIRONMENT=/venvs/eumetnet \
uv sync --frozen --no-install-project --no-dev --package eumetnet
FROM eumetnet-deps AS eumetnet-build
RUN --mount=type=cache,target=/root/.cache/uv \
UV_PROJECT_ENVIRONMENT=/venvs/eumetnet \
uv sync --frozen --no-dev --no-editable --package eumetnet
FROM python-base AS eumetnet
WORKDIR /app
ENV PATH="/venvs/eumetnet/bin:${PATH}"
COPY --from=eumetnet-build /venvs/eumetnet /venvs/eumetnet
CMD ["eumetnet"]
# IONCANNON
FROM uv-base AS ioncannon-deps
RUN --mount=type=cache,target=/root/.cache/uv \
UV_PROJECT_ENVIRONMENT=/venvs/ioncannon \
uv sync --frozen --no-install-project --no-dev --package ioncannon
FROM ioncannon-deps AS ioncannon-build
RUN --mount=type=cache,target=/root/.cache/uv \
UV_PROJECT_ENVIRONMENT=/venvs/ioncannon \
uv sync --frozen --no-dev --no-editable --package ioncannon
FROM python-base AS ioncannon
WORKDIR /app
ENV PATH="/venvs/ioncannon/bin:${PATH}"
COPY --from=ioncannon-build /venvs/ioncannon /venvs/ioncannon
CMD ["ioncannon"]
# METEOGATE
FROM uv-base AS meteogate-deps
RUN --mount=type=cache,target=/root/.cache/uv \
UV_PROJECT_ENVIRONMENT=/venvs/meteogate \
uv sync --frozen --no-install-project --no-dev --package meteogate
FROM meteogate-deps AS meteogate-build
RUN --mount=type=cache,target=/root/.cache/uv \
UV_PROJECT_ENVIRONMENT=/venvs/meteogate \
uv sync --frozen --no-dev --no-editable --package meteogate
FROM python-base AS meteogate
WORKDIR /app
ENV PATH="/venvs/meteogate/bin:${PATH}"
COPY --from=meteogate-build /venvs/meteogate /venvs/meteogate
CMD ["meteogate"]
# METEOTRACKER
FROM uv-base AS meteotracker-deps
RUN --mount=type=cache,target=/root/.cache/uv \
UV_PROJECT_ENVIRONMENT=/venvs/meteotracker \
uv sync --frozen --no-install-project --no-dev --package meteotracker
FROM meteotracker-deps AS meteotracker-build
RUN --mount=type=cache,target=/root/.cache/uv \
UV_PROJECT_ENVIRONMENT=/venvs/meteotracker \
uv sync --frozen --no-dev --no-editable --package meteotracker
FROM python-base AS meteotracker
WORKDIR /app
ENV PATH="/venvs/meteotracker/bin:${PATH}"
COPY --from=meteotracker-build /venvs/meteotracker /venvs/meteotracker
CMD ["meteotracker"]
# SENSOR COMMUNITY
FROM uv-base AS sensor-community-deps
RUN --mount=type=cache,target=/root/.cache/uv \
UV_PROJECT_ENVIRONMENT=/venvs/sensor-community \
uv sync --frozen --no-install-project --no-dev --package sensor-community
FROM sensor-community-deps AS sensor-community-build
RUN --mount=type=cache,target=/root/.cache/uv \
UV_PROJECT_ENVIRONMENT=/venvs/sensor-community \
uv sync --frozen --no-dev --no-editable --package sensor-community
FROM python-base AS sensor-community
WORKDIR /app
ENV PATH="/venvs/sensor-community/bin:${PATH}"
COPY --from=sensor-community-build /venvs/sensor-community /venvs/sensor-community
CMD ["sensor-community"]
# ============================================================================
# EXPORTERS
# ============================================================================
# ECMWF
FROM uv-base AS ecmwf-deps
RUN --mount=type=cache,target=/root/.cache/uv \
UV_PROJECT_ENVIRONMENT=/venvs/ecmwf \
uv sync --frozen --no-install-project --no-dev --package ecmwf
FROM ecmwf-deps AS ecmwf-build
RUN --mount=type=cache,target=/root/.cache/uv \
UV_PROJECT_ENVIRONMENT=/venvs/ecmwf \
uv sync --frozen --no-dev --no-editable --package ecmwf
FROM python-base AS ecmwf
WORKDIR /app
ENV PATH="/venvs/ecmwf/bin:${PATH}"
COPY --from=ecmwf-build /venvs/ecmwf /venvs/ecmwf
CMD ["ecmwf-exporter"]
# PYGEOAPI
FROM uv-base AS pygeoapi-deps
RUN --mount=type=cache,target=/root/.cache/uv \
UV_PROJECT_ENVIRONMENT=/venvs/pygeoapi \
uv sync --frozen --no-install-project --no-dev --package pygeoapi
FROM pygeoapi-deps AS pygeoapi-build
RUN --mount=type=cache,target=/root/.cache/uv \
UV_PROJECT_ENVIRONMENT=/venvs/pygeoapi \
uv sync --frozen --no-dev --no-editable --package pygeoapi
FROM python-base AS pygeoapi
WORKDIR /app
ENV PATH="/venvs/pygeoapi/bin:${PATH}"
COPY --from=pygeoapi-build /venvs/pygeoapi /venvs/pygeoapi
CMD ["pygeoapi-exporter"]
# ============================================================================
# LEGACY API
# ============================================================================
FROM uv-base AS legacy-api-deps
RUN --mount=type=cache,target=/root/.cache/uv \
UV_PROJECT_ENVIRONMENT=/venvs/legacy-api \
uv sync --frozen --no-install-project --no-dev --package ionbeam-legacy-api
FROM legacy-api-deps AS legacy-api-build
RUN --mount=type=cache,target=/root/.cache/uv \
UV_PROJECT_ENVIRONMENT=/venvs/legacy-api \
uv sync --frozen --no-dev --no-editable --package ionbeam-legacy-api
FROM python-base AS legacy-api
WORKDIR /app
ENV PATH="/venvs/legacy-api/bin:${PATH}"
COPY --from=legacy-api-build /venvs/legacy-api /venvs/legacy-api
EXPOSE 8080
CMD ["ionbeam-legacy-api"]