4fr
/
Dockerfile
113 строк · 3.5 Кб
1FROM --platform=$BUILDPLATFORM node:16.20-alpine AS frontend-deps
2
3ARG SKIP_FRONTEND_TEST
4ARG SKIP_FRONTEND_BUILD
5
6WORKDIR /srv/frontend/
7
8COPY ./frontend/package.json ./frontend/pnpm-lock.yaml ./frontend/pnpm-workspace.yaml /srv/frontend/
9COPY ./frontend/apps/remark42/package.json /srv/frontend/apps/remark42/
10
11RUN \
12if [[ -z "$SKIP_FRONTEND_BUILD" || -z "$SKIP_FRONTEND_TEST" ]]; then \
13apk add --no-cache --update git && \
14npm i -g pnpm@7; \
15fi
16
17RUN --mount=type=cache,id=pnpm,target=/root/.pnpm-store/v3 \
18if [[ -z "$SKIP_FRONTEND_BUILD" || -z "$SKIP_FRONTEND_TEST" ]]; then \
19pnpm i; \
20fi
21
22
23FROM --platform=$BUILDPLATFORM frontend-deps AS build-frontend
24
25ARG SKIP_FRONTEND_TEST
26ARG SKIP_FRONTEND_BUILD
27ENV CI=true
28
29WORKDIR /srv/frontend/apps/remark42/
30
31COPY ./frontend/apps/remark42/ /srv/frontend/apps/remark42/
32
33RUN \
34if [ -z "$SKIP_FRONTEND_TEST" ]; then \
35pnpm lint type-check translation-check test; \
36else \
37echo 'Skip frontend test'; \
38fi
39
40RUN \
41if [ -z "$SKIP_FRONTEND_BUILD" ]; then \
42pnpm build; \
43else \
44mkdir /srv/frontend/apps/remark42/public; \
45echo 'Skip frontend build'; \
46fi
47
48FROM umputun/baseimage:buildgo-v1.13.0 as build-backend
49
50ARG CI
51ARG GITHUB_REF
52ARG GITHUB_SHA
53ARG GIT_BRANCH
54ARG SKIP_BACKEND_TEST
55ARG BACKEND_TEST_TIMEOUT
56
57ADD backend /build/backend
58# to embed the frontend files statically into Remark42 binary
59COPY --from=build-frontend /srv/frontend/apps/remark42/public/ /build/backend/app/cmd/web/
60RUN find /build/backend/app/cmd/web/ -regex '.*\.\(html\|js\|mjs\)$' -print -exec sed -i "s|{% REMARK_URL %}|http://127.0.0.1:8080|g" {} \;
61WORKDIR /build/backend
62
63# install gcc in order to be able to go test package with -race
64RUN apk --no-cache add gcc libc-dev
65
66RUN echo go version: `go version`
67
68# run tests
69RUN \
70cd app && \
71if [ -z "$SKIP_BACKEND_TEST" ] ; then \
72CGO_ENABLED=1 go test -race -p 1 -timeout="${BACKEND_TEST_TIMEOUT:-300s}" -covermode=atomic -coverprofile=/profile.cov_tmp ./... && \
73cat /profile.cov_tmp | grep -v "_mock.go" > /profile.cov && \
74golangci-lint run --config ../.golangci.yml ./... ; \
75else \
76echo "skip backend tests and linter" \
77; fi
78
79RUN \
80version="$(/script/version.sh)" && \
81echo "version=$version" && \
82go build -o remark42 -ldflags "-X main.revision=${version} -s -w" ./app
83
84FROM umputun/baseimage:app-v1.13.0
85
86ARG GITHUB_SHA
87
88LABEL org.opencontainers.image.authors="Umputun <umputun@gmail.com>" \
89org.opencontainers.image.description="Remark42 comment engine" \
90org.opencontainers.image.documentation="https://remark42.com/docs/getting-started/" \
91org.opencontainers.image.licenses="MIT" \
92org.opencontainers.image.source="https://github.com/umputun/remark42" \
93org.opencontainers.image.title="Remark42" \
94org.opencontainers.image.url="https://remark42.com/" \
95org.opencontainers.image.revision="${GITHUB_SHA}"
96
97WORKDIR /srv
98
99COPY docker-init.sh /srv/init.sh
100ADD backend/scripts/backup.sh /usr/local/bin/backup
101ADD backend/scripts/restore.sh /usr/local/bin/restore
102ADD backend/scripts/import.sh /usr/local/bin/import
103RUN chmod +x /srv/init.sh /usr/local/bin/backup /usr/local/bin/restore /usr/local/bin/import
104
105COPY --from=build-backend /build/backend/remark42 /srv/remark42
106COPY --from=build-frontend /srv/frontend/apps/remark42/public/ /srv/web/
107RUN chown -R app:app /srv
108RUN ln -s /srv/remark42 /usr/bin/remark42
109
110EXPOSE 8080
111HEALTHCHECK --interval=30s --timeout=3s CMD curl --fail http://localhost:8080/ping || exit 1
112
113CMD ["/srv/remark42", "server"]
114