1
+ # syntax=docker/dockerfile:1.2
1
2
FROM ubuntu:20.04 as build-dep
2
3
3
4
# Use bash for the shell
4
5
SHELL ["/bin/bash" , "-c" ]
5
6
7
+ # Enable super fast apt caches for use with --mount=type=cache
8
+ RUN rm -f /etc/apt/apt.conf.d/docker-clean; \
9
+ echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' > /etc/apt/apt.conf.d/keep-cache
10
+
11
+ ENV PATH="/opt/ruby/bin:/opt/node/bin:/opt/mastodon/bin:${PATH}"
12
+
6
13
# Install Node v12 (LTS)
7
14
ENV NODE_VER="12.21.0"
8
- RUN ARCH= && \
9
- dpkgArch="$(dpkg --print-architecture)" && \
15
+ RUN --mount=type=cache,sharing=locked,target=/var/cache/apt \
16
+ --mount=type=cache,sharing=locked,target=/var/lib/apt \
17
+ ARCH= && \
18
+ dpkgArch="$(dpkg --print-architecture)" && \
10
19
case "${dpkgArch##*-}" in \
11
20
amd64) ARCH='x64' ;; \
12
21
ppc64el) ARCH='ppc64le' ;; \
@@ -16,102 +25,165 @@ RUN ARCH= && \
16
25
i386) ARCH='x86' ;; \
17
26
*) echo "unsupported architecture" ; exit 1 ;; \
18
27
esac && \
19
- echo "Etc/UTC" > /etc/localtime && \
20
- apt-get update && \
21
- apt-get install -y --no-install-recommends ca-certificates wget python && \
22
- cd ~ && \
23
- wget -q https://nodejs.org/download/release/v$NODE_VER/node-v$NODE_VER-linux-$ARCH.tar.gz && \
24
- tar xf node-v$NODE_VER-linux-$ARCH.tar.gz && \
25
- rm node-v$NODE_VER-linux-$ARCH.tar.gz && \
26
- mv node-v$NODE_VER-linux-$ARCH /opt/node
28
+ echo "Etc/UTC" > /etc/localtime && \
29
+ apt-get update && apt-get install -y --no-install-recommends \
30
+ ca-certificates \
31
+ python \
32
+ wget \
33
+ && \
34
+ cd ~ && \
35
+ wget -q https://nodejs.org/download/release/v$NODE_VER/node-v$NODE_VER-linux-$ARCH.tar.gz && \
36
+ tar xf node-v$NODE_VER-linux-$ARCH.tar.gz && \
37
+ rm node-v$NODE_VER-linux-$ARCH.tar.gz && \
38
+ mv node-v$NODE_VER-linux-$ARCH /opt/node
27
39
28
40
# Install Ruby
29
41
ENV RUBY_VER="2.7.2"
30
- RUN apt-get update && \
31
- apt-get install -y --no-install-recommends build-essential \
32
- bison libyaml-dev libgdbm-dev libreadline-dev libjemalloc-dev \
33
- libncurses5-dev libffi-dev zlib1g-dev libssl-dev && \
34
- cd ~ && \
35
- wget https://cache.ruby-lang.org/pub/ruby/${RUBY_VER%.*}/ruby-$RUBY_VER.tar.gz && \
36
- tar xf ruby-$RUBY_VER.tar.gz && \
37
- cd ruby-$RUBY_VER && \
38
- ./configure --prefix=/opt/ruby \
39
- --with-jemalloc \
40
- --with-shared \
41
- --disable-install-doc && \
42
- make -j"$(nproc)" > /dev/null && \
43
- make install && \
44
- rm -rf ../ruby-$RUBY_VER.tar.gz ../ruby-$RUBY_VER
45
-
46
- ENV PATH="${PATH}:/opt/ruby/bin:/opt/node/bin"
47
-
48
- RUN npm install -g yarn && \
49
- gem install bundler && \
50
- apt-get update && \
51
- apt-get install -y --no-install-recommends git libicu-dev libidn11-dev \
52
- libpq-dev libprotobuf-dev protobuf-compiler shared-mime-info
53
-
42
+ RUN --mount=type=cache,sharing=locked,target=/var/cache/apt \
43
+ --mount=type=cache,sharing=locked,target=/var/lib/apt \
44
+ apt-get update && apt-get install -y --no-install-recommends \
45
+ bison \
46
+ build-essential \
47
+ libffi-dev \
48
+ libgdbm-dev \
49
+ libjemalloc-dev \
50
+ libncurses5-dev \
51
+ libreadline-dev \
52
+ libssl-dev \
53
+ libyaml-dev \
54
+ zlib1g-dev \
55
+ && \
56
+ cd ~ && \
57
+ wget https://cache.ruby-lang.org/pub/ruby/${RUBY_VER%.*}/ruby-$RUBY_VER.tar.gz && \
58
+ tar xf ruby-$RUBY_VER.tar.gz && rm ruby-$RUBY_VER.tar.gz && \
59
+ cd ruby-$RUBY_VER && \
60
+ ./configure --prefix=/opt/ruby \
61
+ --with-jemalloc \
62
+ --with-shared \
63
+ --disable-install-doc && \
64
+ make -j"$(nproc)" > /dev/null && \
65
+ make install && \
66
+ rm -rf /root/ruby-$RUBY_VER
67
+
68
+ # Install packages needed for bundle install
69
+ RUN --mount=type=cache,sharing=locked,target=/var/cache/apt \
70
+ --mount=type=cache,sharing=locked,target=/var/lib/apt \
71
+ apt-get update && apt-get install -y --no-install-recommends \
72
+ git \
73
+ libicu-dev \
74
+ libidn11-dev \
75
+ libpq-dev \
76
+ libprotobuf-dev \
77
+ protobuf-compiler \
78
+ shared-mime-info
79
+ RUN npm install -g yarn
80
+ RUN gem install bundler:1.17.2 --verbose
81
+
82
+
83
+ FROM build-dep as prod-dep
84
+
85
+ # Install bundle and npm dependencies
54
86
COPY Gemfile* package.json yarn.lock /opt/mastodon/
55
-
56
87
RUN cd /opt/mastodon && \
57
88
bundle config set --local deployment 'true' && \
58
89
bundle config set --local without 'development test' && \
59
- bundle install -j"$(nproc)" && \
60
- yarn install --pure-lockfile
90
+ bundle install -j"$(nproc)" --deployment --without="development test" && \
91
+ yarn install --pure-lockfile && \
92
+ yarn cache clean && \
93
+ rm -rf tmp
61
94
62
- FROM ubuntu:20.04
95
+ # Copy over mastodon source and compile assets
96
+ COPY . /opt/mastodon/
97
+ RUN cd /opt/mastodon && \
98
+ RAILS_ENV=production OTP_SECRET=precompile_placeholder SECRET_KEY_BASE=precompile_placeholder \
99
+ rails assets:precompile && \
100
+ yarn cache clean && \
101
+ rm -rf tmp
63
102
64
- # Copy over all the langs needed for runtime
65
- COPY --from=build-dep /opt/node /opt/node
66
- COPY --from=build-dep /opt/ruby /opt/ruby
67
103
68
- # Add more PATHs to the PATH
69
- ENV PATH="${PATH}:/opt/ruby/bin:/opt/node/bin:/opt/mastodon/bin"
104
+ FROM ubuntu:20.04 as runtime-base
105
+
106
+ # Enable super fast apt caches for use with --mount=type=cache
107
+ RUN rm -f /etc/apt/apt.conf.d/docker-clean; \
108
+ echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' > /etc/apt/apt.conf.d/keep-cache
70
109
71
110
# Create the mastodon user
72
111
ARG UID=991
73
112
ARG GID=991
74
113
SHELL ["/bin/bash" , "-o" , "pipefail" , "-c" ]
75
- RUN apt-get update && \
76
- echo "Etc/UTC" > /etc/localtime && \
77
- apt-get install -y --no-install-recommends whois wget && \
78
- addgroup --gid $GID mastodon && \
79
- useradd -m -u $UID -g $GID -d /opt/mastodon mastodon && \
80
- echo "mastodon:$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 24 | mkpasswd -s -m sha-256)" | chpasswd && \
81
- rm -rf /var/lib/apt/lists/*
114
+ ENV PATH="/opt/ruby/bin:/opt/node/bin:/opt/mastodon/bin:${PATH}"
82
115
83
116
# Install mastodon runtime deps
84
- RUN apt-get update && \
85
- apt-get -y --no-install-recommends install \
86
- libssl1.1 libpq5 imagemagick ffmpeg libjemalloc2 \
87
- libicu66 libprotobuf17 libidn11 libyaml-0-2 \
88
- file ca-certificates tzdata libreadline8 gcc tini && \
89
- ln -s /opt/mastodon /mastodon && \
90
- gem install bundler && \
91
- rm -rf /var/cache && \
92
- rm -rf /var/lib/apt/lists/*
93
-
94
- # Copy over mastodon source, and dependencies from building, and set permissions
95
- COPY --chown=mastodon:mastodon . /opt/mastodon
96
- COPY --from=build-dep --chown=mastodon:mastodon /opt/mastodon /opt/mastodon
97
-
98
- # Run mastodon services in prod mode
99
- ENV RAILS_ENV="production"
100
- ENV NODE_ENV="production"
117
+ RUN --mount=type=cache,sharing=locked,target=/var/cache/apt \
118
+ --mount=type=cache,sharing=locked,target=/var/lib/apt \
119
+ echo "Etc/UTC" > /etc/localtime && \
120
+ apt-get update && apt-get -y --no-install-recommends install \
121
+ ca-certificates \
122
+ ffmpeg \
123
+ file \
124
+ imagemagick \
125
+ libicu66 \
126
+ libidn11 \
127
+ libjemalloc2 \
128
+ libpq5 \
129
+ libprotobuf17 \
130
+ libreadline8 \
131
+ libssl1.1 \
132
+ libyaml-0-2 \
133
+ tini \
134
+ tzdata \
135
+ wget \
136
+ whois \
137
+ && \
138
+ addgroup --gid $GID mastodon && \
139
+ useradd -m -u $UID -g $GID -d /opt/mastodon mastodon && \
140
+ echo "mastodon:$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 24 | mkpasswd -s -m sha-256)" | chpasswd && \
141
+ ln -s /opt/mastodon /mastodon
142
+
143
+ # Set the work dir and the container entry point
144
+ WORKDIR /opt/mastodon
145
+ ENTRYPOINT ["/usr/bin/tini" , "--" ]
146
+ EXPOSE 3000 4000
147
+ USER mastodon
101
148
102
149
# Tell rails to serve static files
103
150
ENV RAILS_SERVE_STATIC_FILES="true"
104
151
ENV BIND="0.0.0.0"
105
152
106
- # Set the run user
153
+
154
+ FROM runtime-base as development
155
+ COPY --from=build-dep /opt/node /opt/node
156
+ COPY --from=build-dep /opt/ruby /opt/ruby
157
+
158
+ # Install everything we need to run a full bundle install
159
+ USER root
160
+ RUN --mount=type=cache,sharing=locked,target=/var/cache/apt \
161
+ --mount=type=cache,sharing=locked,target=/var/lib/apt \
162
+ apt-get update && apt-get install -y --no-install-recommends \
163
+ build-essential \
164
+ git \
165
+ libicu-dev \
166
+ libidn11-dev \
167
+ libjemalloc-dev \
168
+ libpq-dev \
169
+ libprotobuf-dev \
170
+ libssl-dev \
171
+ protobuf-compiler \
172
+ shared-mime-info
107
173
USER mastodon
108
174
109
- # Precompile assets
110
- RUN cd ~ && \
111
- OTP_SECRET=precompile_placeholder SECRET_KEY_BASE=precompile_placeholder rails assets:precompile && \
112
- yarn cache clean
175
+ # Run mastodon services in development mode
176
+ ENV RAILS_ENV="development"
177
+ ENV NODE_ENV="development"
178
+
179
+
180
+ FROM runtime-base as production
181
+ COPY --from=prod-dep /opt/node /opt/node
182
+ COPY --from=prod-dep /opt/ruby /opt/ruby
183
+ COPY --from=prod-dep --chown=mastodon:mastodon /opt/mastodon /opt/mastodon
184
+
185
+ # Run mastodon services in production mode
186
+ ENV RAILS_ENV="production"
187
+ ENV NODE_ENV="production"
188
+
113
189
114
- # Set the work dir and the container entry point
115
- WORKDIR /opt/mastodon
116
- ENTRYPOINT ["/usr/bin/tini" , "--" ]
117
- EXPOSE 3000 4000
0 commit comments