-
Notifications
You must be signed in to change notification settings - Fork 796
/
Copy pathDockerfile
74 lines (56 loc) · 2.38 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
# Copyright 2018 The Outline Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
ARG NODE_IMAGE
# Multi-stage build: use a build image to prevent bloating the shadowbox image with dependencies.
# Run `npm ci` and build inside the container to package the right dependencies for the image.
FROM ${NODE_IMAGE} AS build
# make for building third_party/prometheus and perl-utils for shasum.
RUN apk add --no-cache --upgrade bash make perl-utils
WORKDIR /
# Don't copy node_modules and other things not needed for install.
COPY package.json package-lock.json ./
COPY src/shadowbox/package.json src/shadowbox/
RUN --mount=type=cache,target=/root/.npm npm ci
# We copy the source code only after npm ci, so that source code changes don't trigger re-installs.
COPY scripts scripts/
COPY src src/
COPY tsconfig.json ./
COPY third_party third_party
ARG ARCH
RUN ARCH=${ARCH} ROOT_DIR=/ npm run action shadowbox/server/build
# shadowbox image
FROM ${NODE_IMAGE}
# Save metadata on the software versions we are using.
LABEL shadowbox.node_version=16.18.0
ARG GITHUB_RELEASE
LABEL shadowbox.github.release="${GITHUB_RELEASE}"
# The user management service doesn't quit with SIGTERM.
STOPSIGNAL SIGKILL
# We use curl to detect the server's public IP. We need to use the --date option in `date` to
# safely grab the ip-to-country database.
RUN apk add --no-cache --upgrade coreutils curl
COPY src/shadowbox/scripts scripts/
COPY src/shadowbox/scripts/update_mmdb.sh /etc/periodic/weekly/update_mmdb
RUN /etc/periodic/weekly/update_mmdb
# Create default state directory.
RUN mkdir -p /root/shadowbox/persisted-state
# Install shadowbox.
WORKDIR /opt/outline-server
# The shadowbox build directory has the following structure:
# - app/ (bundled node app)
# - bin/ (binary dependencies)
# - package.json (shadowbox package.json)
COPY --from=build /build/shadowbox/ .
COPY src/shadowbox/docker/cmd.sh /
CMD /cmd.sh