-
Notifications
You must be signed in to change notification settings - Fork 170
/
Dockerfile
98 lines (73 loc) · 3.59 KB
/
Dockerfile
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
# syntax=docker/dockerfile:1
# Final container image
ARG IMAGE_BASE=alpine:3.20.3@sha256:beefdbd8a1da6d2915566fde36db9db0b524eb737fc57cd1367effd16dc0d06d
FROM ${IMAGE_BASE} as image-base
FROM --platform=${BUILDPLATFORM} golang:1.22@sha256:0ca97f4ab335f4b284a5b8190980c7cdc21d320d529f2b643e8a8733a69bfb6b as backend-build
WORKDIR /headlamp
ARG TARGETOS
ARG TARGETARCH
ENV GOPATH=/go \
GOPROXY=https://proxy.golang.org \
GO111MODULE=on\
CGO_ENABLED=0\
GOOS=${TARGETOS}\
GOARCH=${TARGETARCH}
# Keep go mod download separated so source changes don't trigger install
COPY ./backend/go.* /headlamp/backend/
RUN --mount=type=cache,target=/go/pkg/mod \
cd ./backend && go mod download
COPY ./backend /headlamp/backend
RUN --mount=type=cache,target=/root/.cache/go-build \
--mount=type=cache,target=/go/pkg/mod \
cd ./backend && go build -o ./headlamp-server ./cmd/
FROM --platform=${BUILDPLATFORM} node:18@sha256:d0bbfdbad0bff8253e6159dcbee42141db4fc309365d5b8bcfce46ed71569078 as frontend-build
# We need .git and app/ in order to get the version and git version for the frontend/.env file
# that's generated when building the frontend.
COPY .git/ ./headlamp/.git/
COPY app/package.json /headlamp/app/package.json
# Keep npm install separated so source changes don't trigger install
COPY frontend/package*.json /headlamp/frontend/
WORKDIR /headlamp
RUN cd ./frontend && npm ci --only=prod
FROM frontend-build as frontend
COPY ./frontend /headlamp/frontend
WORKDIR /headlamp
RUN cd ./frontend && npm run build
RUN echo "*** Built Headlamp with version: ***"
RUN cat ./frontend/.env
# Backwards compatibility, move plugin folder to only copy matching plugins.
RUN mv plugins plugins-old || true
# Copy a .plugins folder if it is there to ./plugins, otherwise create an empty one.
# This is a Dockerfile quirky way to copy a folder if it exists, but also not fail if it is empty.
COPY ./.plugi*s ./plugins
RUN mkdir -p ./plugins
# Backwards compatibility, copy any matching plugins found inside "./plugins-old" into "./plugins".
# They should match plugins-old/MyFolder/main.js, otherwise they are not copied.
RUN for i in $(find ./plugins-old/*/main.js); do plugin_name=$(echo $i|cut -d'/' -f3); mkdir -p plugins/$plugin_name; cp $i plugins/$plugin_name; done
RUN for i in $(find ./plugins-old/*/package.json); do plugin_name=$(echo $i|cut -d'/' -f3); mkdir -p plugins/$plugin_name; cp $i plugins/$plugin_name; done
# Static (officially shipped) plugins
FROM --platform=${BUILDPLATFORM} frontend-build as static-plugins
RUN apt-get update && apt-get install -y jq
COPY ./container/build-manifest.json ./container/fetch-plugins.sh /tools/
WORKDIR /tools
RUN mkdir -p /plugins
RUN ./fetch-plugins.sh /plugins/
FROM image-base as final
RUN if command -v apt-get > /dev/null; then \
apt-get update && apt-get install -y --no-install-recommends \
ca-certificates \
&& addgroup --system headlamp \
&& adduser --system --ingroup headlamp headlamp \
&& rm -rf /var/lib/apt/lists/*; \
else \
addgroup -S headlamp && adduser -S headlamp -G headlamp; \
fi
COPY --from=backend-build --link /headlamp/backend/headlamp-server /headlamp/headlamp-server
COPY --from=frontend --link /headlamp/frontend/build /headlamp/frontend
COPY --from=frontend --link /headlamp/plugins /headlamp/plugins
COPY --from=static-plugins --link /plugins /headlamp/static-plugins
RUN chown -R headlamp:headlamp /headlamp
USER headlamp
EXPOSE 4466
ENV HEADLAMP_STATIC_PLUGINS_DIR=/headlamp/static-plugins
ENTRYPOINT ["/headlamp/headlamp-server", "-html-static-dir", "/headlamp/frontend", "-plugins-dir", "/headlamp/plugins"]