ΠΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ° Π½Π° ΡΠ΅Π΄Π½ΠΎΡ ΡΡΡΠ°Π½ΠΈΡΠΈ (Π‘ΠΠ) ΡΠ΅ ΡΠΊΡΠΏ ΡΡΠ°ΡΠΈΡΠΊΠΈΡ ΠΠ°Π²Π°Π‘ΡΡΠΈΠΏΡ ΠΈ Π₯Π’ΠΠ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°, ΠΊΠ°ΠΎ ΠΈ ΡΠ»ΠΈΠΊΠ° ΠΈ Π΄ΡΡΠ³ΠΈΡ ΡΠ΅ΡΡΡΡΠ°. ΠΠΎΡΡΠΎ ΡΠ΅ Π½Π΅ ΠΌΠ΅ΡΠ°ΡΡ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠΊΠΈ, ΡΠΈΡ ΠΎΠ²ΠΎ ΠΎΠ±ΡΠ°Π²ΡΠΈΠ²Π°ΡΠ΅ Π½Π° ΠΌΡΠ΅ΠΆΠΈ ΡΠ΅ Π²Π΅ΠΎΠΌΠ° Π»Π°ΠΊΠΎ. ΠΠΎΡΡΠΎΡΠΈ Π²Π΅Π»ΠΈΠΊΠΈ Π±ΡΠΎΡ ΡΠ΅ΡΡΠΈΠ½ΠΈΡ , ΠΏΠ° ΡΠ°ΠΊ ΠΈ Π±Π΅ΡΠΏΠ»Π°ΡΠ½ΠΈΡ ΡΠ΅ΡΠ²ΠΈΡΠ° Π·Π° ΠΎΠ²ΠΎ, ΠΏΠΎΡΠ΅Π²ΡΠΈ ΠΎΠ΄ ΡΠ΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΈΡ ΠΠΈΡΠ₯ΡΠ± ΡΡΡΠ°Π½ΠΈΡΠ° (Π° Π·Π° Π½Π΅ΠΊΠ΅ ΡΠ°ΠΊ ΠΈ ΡΠ° Π½Π°ΡΠΎΠ΄.ΡΡ) ΠΈ Π·Π°Π²ΡΡΠ°Π²Π°ΡΡΡΠΈ ΡΠ° Π¦ΠΠ-ΠΎΠΌ ΠΊΠ°ΠΎ ΡΡΠΎ ΡΠ΅ ΠΠΌΠ°Π·ΠΎΠ½ Π‘3. ΠΠ΅ΡΡΡΠΈΠΌ, ΡΡΠ΅Π±Π°Π»ΠΎ ΠΌΠΈ ΡΠ΅ Π½Π΅ΡΡΠΎ Π΄ΡΡΠ³ΠΎ.
Π’ΡΠ΅Π±Π°ΠΎ ΠΌΠΈ ΡΠ΅ ΠΠΎΡΠΊΠ΅Ρ ΠΈΠΌΠΈΡ ΡΠ° Π‘ΠΠ-ΠΎΠΌ Π΄Π° Π±ΠΈ ΡΠ΅ Π»Π°ΠΊΠΎ ΠΌΠΎΠ³Π°ΠΎ ΠΏΠΎΠΊΡΠ΅Π½ΡΡΠΈ ΠΈΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΠΈ ΠΊΠ°ΠΎ Π΄Π΅ΠΎ ΠΡΠ±Π΅ΡΠ½Π΅ΡΠ΅Ρ ΠΊΠ»Π°ΡΡΠ΅ΡΠ° ΠΈ Π½Π° ΠΌΠ°ΡΠΈΠ½ΠΈ Π±Π°ΡΠΊ-Π΅Π½Π΄ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ΅ΡΠ° ΠΊΠΎΡΠΈ Π½Π΅ΠΌΠ° ΠΏΠΎΡΠΌΠ° ΡΡΠ° ΡΠ΅ Π‘ΠΠ.
ΠΠ° ΡΠ΅Π±Π΅ ΡΠ°ΠΌ ΠΎΠ΄ΡΠ΅Π΄ΠΈΠΎ ΡΠ»Π΅Π΄Π΅ΡΠ΅ Π·Π°Ρ ΡΠ΅Π²Π΅ Π·Π° ΡΠ»ΠΈΠΊΡ:
- ΡΠ΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΎΡΡ ΡΠΏΠΎΡΡΠ΅Π±Π΅ (Π°Π»ΠΈ Π½Π΅ ΠΌΠΎΠ½ΡΠ°ΠΆΠ΅);
- ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π½Π° Π²Π΅Π»ΠΈΡΠΈΠ½Π° ΠΈ Ρ ΠΏΠΎΠ³Π»Π΅Π΄Ρ Π΄ΠΈΡΠΊΠ° ΠΈ Π ΠΠ-Π°;
- ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°ΡΠ΅ ΠΊΡΠΎΠ· ΠΏΡΠΎΠΌΠ΅Π½ΡΠΈΠ²Π΅ ΠΎΠΊΡΡΠΆΠ΅ΡΠ° ΡΠ°ΠΊΠΎ Π΄Π° ΡΠ΅ ΡΠ»ΠΈΠΊΠ° ΠΌΠΎΠΆΠ΅ ΠΊΠΎΡΠΈΡΡΠΈΡΠΈ Ρ ΡΠ°Π·Π»ΠΈΡΠΈΡΠΈΠΌ ΠΎΠΊΡΡΠΆΠ΅ΡΠΈΠΌΠ°;
- Π½Π°ΡΠ΅ΡΠΈΠΊΠ°ΡΠ½ΠΈΡΠ° Π΄ΠΈΡΡΡΠΈΠ±ΡΡΠΈΡΠ° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°.
ΠΠ°Π½Π°Ρ ΡΡ Π²Π°ΠΌ ΡΠ΅ΡΠΈ ΠΊΠ°ΠΊΠΎ:
- Π³ΡΡ Π½Π³ΠΈΠ½ΠΊ;
- ΠΈΠ·Π³ΡΠ°Π΄ΠΈ Π±ΡΠΎΡΠ»ΠΈ ΠΈΠ· ΠΈΠ·Π²ΠΎΡΠ°;
- Π½Π°ΡΡΠΈΡΠΈ ΡΡΠ°ΡΠΈΡΠΊΠ΅ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ΅ Π΄Π° ΡΠ°Π·ΡΠΌΠ΅ΡΡ ΠΏΡΠΎΠΌΠ΅Π½ΡΠΈΠ²Π΅ ΠΎΠΊΡΡΠΆΠ΅ΡΠ°;
- ΠΈ Π½Π°ΡΠ°Π²Π½ΠΎ ΠΊΠ°ΠΊΠΎ ΡΠ°ΡΡΠ°Π²ΠΈΡΠΈ ΠΠΎΡΠΊΠ΅Ρ ΡΠ»ΠΈΠΊΡ ΠΎΠ΄ ΡΠ²Π΅Π³Π° ΠΎΠ²ΠΎΠ³Π°.
Π‘Π²ΡΡ Π° ΠΎΠ²ΠΎΠ³ ΡΠ»Π°Π½ΠΊΠ° ΡΠ΅ Π΄Π° ΠΏΠΎΠ΄Π΅Π»ΠΈΠΌ ΡΠ²ΠΎΡΠ΅ ΠΈΡΠΊΡΡΡΠ²ΠΎ ΠΈ ΠΈΡΠΏΡΠΎΠ²ΠΎΡΠΈΡΠ°ΠΌ ΠΈΡΠΊΡΡΠ½Π΅ ΡΠ»Π°Π½ΠΎΠ²Π΅ Π·Π°ΡΠ΅Π΄Π½ΠΈΡΠ΅ Π½Π° ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠ²Π½Ρ ΠΊΡΠΈΡΠΈΠΊΡ.
ΠΠ·Π³ΡΠ°Π΄ΡΠ° ΡΠ»ΠΈΠΊΠ΅ Π·Π° ΡΠΊΠ»Π°ΠΏΠ°ΡΠ΅
ΠΠ° Π±ΠΈ ΠΊΠΎΠ½Π°ΡΠ½Π° ΠΠΎΡΠΊΠ΅Ρ ΡΠ»ΠΈΠΊΠ° Π±ΠΈΠ»Π° ΠΌΠ°Π»Π°, ΠΏΠΎΡΡΠ΅Π±Π½ΠΎ ΡΠ΅ Π΄Π° ΡΠ΅ ΠΏΡΠΈΠ΄ΡΠΆΠ°Π²Π°ΡΠ΅ Π΄Π²Π° ΠΏΡΠ°Π²ΠΈΠ»Π°: ΠΌΠΈΠ½ΠΈΠΌΡΠΌ ΡΠ»ΠΎΡΠ΅Π²Π° ΠΈ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΠΈΡΡΠΈΡΠΊΡ ΠΎΡΠ½ΠΎΠ²Π½Ρ ΡΠ»ΠΈΠΊΡ. ΠΠ΅Π΄Π½Π° ΠΎΠ΄ Π½Π°ΡΠΌΠ°ΡΠΈΡ ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡ ΡΠ»ΠΈΠΊΠ° ΡΠ΅ ΡΠ»ΠΈΠΊΠ° ΠΠ»ΠΏΠΈΠ½Π΅ ΠΠΈΠ½ΡΠΊ-Π°, ΡΠ°ΠΊΠΎ Π΄Π° ΡΡ ΡΠΎ ΠΈΠ·Π°Π±ΡΠ°ΡΠΈ. ΠΠ΅ΠΊΠΈ Π±ΠΈ ΠΌΠΎΠ³Π»ΠΈ ΡΠ²ΡΠ΄ΠΈΡΠΈ Π΄Π° ΠΠ»ΠΏΠΈΠ½Π΅ Π½ΠΈΡΠ΅ ΠΏΠΎΠ³ΠΎΠ΄Π°Π½ Π·Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡ, ΠΈ ΠΌΠΎΠΆΠ΄Π° ΡΡ Ρ ΠΏΡΠ°Π²Ρ. ΠΠ»ΠΈ Π»ΠΈΡΠ½ΠΎ, Π½ΠΈΠΊΠ°Π΄Π° Π½ΠΈΡΠ°ΠΌ ΠΈΠΌΠ°ΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΡΠ° ΡΠΈΠΌ ΠΈ Π½Π΅ΠΌΠ° Π½ΠΈΠΊΠ°ΠΊΠ²ΠΈΡ Π°ΡΠ³ΡΠΌΠ΅Π½Π°ΡΠ° ΠΏΡΠΎΡΠΈΠ² ΡΠ΅Π³Π°.
ΠΠ° ΠΈΠΌΠ°ΠΌ ΠΌΠ°ΡΠ΅ ΡΠ»ΠΎΡΠ΅Π²Π°, ΡΠ°ΡΡΠ°Π²ΠΈΡΡ ΡΠ»ΠΈΠΊΡ Ρ 2 ΡΠ°Π·Π΅. ΠΡΠ²ΠΈ ΡΠ΅ Π½Π°ΡΡΡ, Ρ ΡΠ΅ΠΌΡ ΡΠ΅ ΠΎΡΡΠ°ΡΠΈ ΡΠ²ΠΈ ΠΏΠΎΠΌΠΎΡΠ½ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ ΠΈ ΠΏΡΠΈΠ²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΡΠ°ΡΠ»ΠΎΠ²ΠΈ. Π Ρ Π·Π°Π²ΡΡΠ½ΠΎΡ ΡΠ°Π·ΠΈ ΡΡ ΡΠ°ΠΌΠΎ Π½Π°ΠΏΠΈΡΠ°ΡΠΈ ΠΊΠΎΠ½Π°ΡΠ½Ρ Π²Π΅ΡΠ·ΠΈΡΡ Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ΅.
ΠΠΎΡΠ½ΠΈΠΌΠΎ ΡΠ° ΠΏΠΎΠΌΠΎΡΠ½ΠΎΠΌ ΡΠ»ΠΈΠΊΠΎΠΌ.
ΠΠ° Π±ΠΈΡΡΠ΅ ΡΠ°ΡΡΠ°Π²ΠΈΠ»ΠΈ Π‘ΠΠ Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΡ, ΠΎΠ±ΠΈΡΠ½ΠΎ Π²Π°ΠΌ ΡΠ΅ ΠΏΠΎΡΡΠ΅Π±Π°Π½ Π½ΠΎΠ΄Π΅.ΡΡ. Π£Π·Π΅ΡΡ Π·Π²Π°Π½ΠΈΡΠ½Ρ ΡΠ»ΠΈΠΊΡ, ΠΊΠΎΡΠ° ΡΠ°ΠΊΠΎΡΠ΅ Π΄ΠΎΠ»Π°Π·ΠΈ ΡΠ° Π½ΠΏΠΌ ΠΈ ΠΈΠ°ΡΠ½ ΠΏΠ°ΠΊΠ΅Ρ ΠΌΠ΅Π½Π°ΡΠ΅ΡΠΈΠΌΠ°. Π£ ΡΠ²ΠΎΡΠ΅ Π»ΠΈΡΠ½ΠΎ ΠΈΠΌΠ΅ Π΄ΠΎΠ΄Π°ΡΡ Π½ΠΎΠ΄Π΅-Π³ΠΈΠΏ, ΠΊΠΎΡΠΈ ΡΠ΅ ΠΏΠΎΡΡΠ΅Π±Π°Π½ Π·Π° ΠΏΡΠ°Π²ΡΠ΅ΡΠ΅ Π½Π΅ΠΊΠΈΡ Π½ΠΏΠΌ ΠΏΠ°ΠΊΠ΅ΡΠ°, ΠΈ ΠΡΠΎΡΠ»ΠΈ ΠΊΠΎΠΌΠΏΡΠ΅ΡΠΎΡ ΠΈΠ· ΠΡΠ³Π»Π°, ΠΊΠΎΡΠΈ ΡΠ΅ Π½Π°ΠΌ ΠΊΠ°ΡΠ½ΠΈΡΠ΅ Π±ΠΈΡΠΈ ΠΎΠ΄ ΠΊΠΎΡΠΈΡΡΠΈ.
ΠΠΎΡΠΊΠ΅ΡΡΠΈΠ»Π΅ ΡΠ° ΠΊΠΎΠΌΠ΅Π½ΡΠ°ΡΠΈΠΌΠ°.
# ΠΠ°Π·ΠΎΠ²ΡΠΉ ΠΎΠ±ΡΠ°Π·
FROM node:12-alpine
LABEL maintainer="Aleksey Maydokin <[email protected]>"
ENV BROTLI_VERSION 1.0.7
# ΠΠ°ΠΊΠ΅ΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½ΡΠΆΠ½Ρ, ΡΡΠΎΠ±Ρ ΡΠΎΠ±ΡΠ°ΡΡ ΠΈΠ· ΠΈΡΡ
ΠΎΠ΄Π½ΠΈΠΊΠΎΠ² Brotli
RUN apk add --no-cache --virtual .build-deps
bash
gcc
libc-dev
make
linux-headers
cmake
curl
&& mkdir -p /usr/src
# ΠΡΡ
ΠΎΠ΄Π½ΠΈΠΊΠΈ Brotli ΡΠΊΠ°ΡΠΈΠ²Π°Π΅ΠΌ ΠΈΠ· ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ
&& curl -LSs https://github.com/google/brotli/archive/v$BROTLI_VERSION.tar.gz | tar xzf - -C /usr/src
&& cd /usr/src/brotli-$BROTLI_VERSION
# ΠΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΠΌ Brotli
&& ./configure-cmake --disable-debug && make -j$(getconf _NPROCESSORS_ONLN) && make install
# ΠΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ node-gyp
&& yarn global add node-gyp
# Π£Π±ΠΈΡΠ°Π΅ΠΌ Π·Π° ΡΠΎΠ±ΠΎΠΉ ΠΌΡΡΠΎΡ
&& apk del .build-deps && yarn cache clean && rm -rf /usr/src
ΠΠ΅Ρ ΠΎΠ²Π΄Π΅ ΡΠ΅ Π±ΠΎΡΠΈΠΌ Π·Π° ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΠΈΠ·Π°ΠΌ, ΡΠ°ΠΊΠΎ Π΄Π° ΠΈΠΌΠΈΡ ΡΠΊΠ»Π°ΠΏΠ° ΡΠ΅Π΄Π°Π½ Π²Π΅Π»ΠΈΠΊΠΈ ΡΠΈΠΌ.
ΠΠΎΡΠΎΠ²Ρ ΡΠ»ΠΈΠΊΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΡΠΎΠ½Π°ΡΠΈ ΠΎΠ²Π΄Π΅:
ΠΠΏΠ°ΡΡ Π΅
ΠΠΎΠΆΠ΅ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈΡΠΈ Π±ΠΈΠ»ΠΎ ΠΊΠΎΡΠΈ Π²Π΅Π± ΡΠ΅ΡΠ²Π΅Ρ Π·Π° Π΄ΠΈΡΡΡΠΈΠ±ΡΡΠΈΡΡ ΡΡΠ°ΡΠΈΡΠΊΠΎΠ³ ΡΠ°Π΄ΡΠΆΠ°ΡΠ°. ΠΠ°Π²ΠΈΠΊΠ°ΠΎ ΡΠ°ΠΌ Π΄Π° ΡΠ°Π΄ΠΈΠΌ ΡΠ° Π½Π³ΠΈΠ½ΠΊ-ΠΎΠΌ, ΠΏΠ° ΡΡ Π³Π° ΡΠ°Π΄Π° ΠΊΠΎΡΠΈΡΡΠΈΡΠΈ.
ΠΠ³ΠΈΠ½ΠΊ ΠΈΠΌΠ° Π·Π²Π°Π½ΠΈΡΠ½Ρ ΠΠΎΡΠΊΠ΅Ρ ΡΠ»ΠΈΠΊΡ, Π°Π»ΠΈ ΠΈΠΌΠ° ΠΏΡΠ΅Π²ΠΈΡΠ΅ ΠΌΠΎΠ΄ΡΠ»Π° Π·Π° ΡΠ΅Π΄Π½ΠΎΡΡΠ°Π²Π½Ρ ΡΡΠ°ΡΠΈΡΠΊΡ Π΄ΠΈΡΡΡΠΈΠ±ΡΡΠΈΡΡ. ΠΠΎΡΠΈ ΡΡ ΡΠΊΡΡΡΠ΅Π½ΠΈ Ρ ΠΈΡΠΏΠΎΡΡΠΊΡ ΠΌΠΎΠΆΠ΅ ΡΠ΅ Π²ΠΈΠ΄Π΅ΡΠΈ Ρ ΡΠΏΠ΅ΡΠΈΡΠ°Π»Π½ΠΎΠΌ ΡΠΈΠΌΡ ΠΈΠ»ΠΈ Ρ Π·Π²Π°Π½ΠΈΡΠ½ΠΎΠΌ ΠΠΎΡΠΊΠ΅ΡΡΠΈΠ»Π΅-Ρ.
$ Π΄ΠΎΡΠΊΠ΅Ρ ΡΡΠ½ --ΡΠΌ Π½Π³ΠΈΠ½ΠΊ:1-Π°Π»ΠΏΠΈΠ½Π΅ Π½Π³ΠΈΠ½ΠΊ -Π
nginx version: nginx/1.17.9
built by gcc 8.3.0 (Alpine 8.3.0)
built with OpenSSL 1.1.1d 10 Sep 2019
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --with-perl_modules_path=/usr/lib/perl5/vendor_perl --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-Os -fomit-frame-pointer' --with-ld-opt=-Wl,--as-needed
ΠΠΎΡΠΈΡΡΠΈΡΡ ΠΠΎΡΠΊΠ΅ΡΡΠΈΠ»Π΅ ΠΊΠ°ΠΎ ΠΎΡΠ½ΠΎΠ²Ρ, Π°Π»ΠΈ ΡΡ Ρ ΡΠ΅ΠΌΡ ΠΎΡΡΠ°Π²ΠΈΡΠΈ ΡΠ°ΠΌΠΎ ΠΎΠ½ΠΎ ΡΡΠΎ ΡΠ΅ ΠΏΠΎΡΡΠ΅Π±Π½ΠΎ Π·Π° Π΄ΠΈΡΡΡΠΈΠ±ΡΡΠΈΡΡ ΡΡΠ°ΡΠΈΡΠΊΠΎΠ³ ΡΠ°Π΄ΡΠΆΠ°ΡΠ°. ΠΠΎΡΠ° Π²Π΅ΡΠ·ΠΈΡΠ° Π½Π΅ΡΠ΅ ΠΌΠΎΡΠΈ Π΄Π° ΡΠ°Π΄ΠΈ ΠΏΡΠ΅ΠΊΠΎ Π₯Π’Π’ΠΠ‘-Π°, Π½Π΅ΡΠ΅ ΠΏΠΎΠ΄ΡΠΆΠ°Π²Π°ΡΠΈ Π°ΡΡΠΎΡΠΈΠ·Π°ΡΠΈΡΡ ΠΈ ΡΠΎΡ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠΎΠ³Π°. ΠΠ»ΠΈ ΠΌΠΎΡΠ° Π²Π΅ΡΠ·ΠΈΡΠ° ΡΠ΅ ΠΌΠΎΡΠΈ Π΄Π° Π΄ΠΈΡΡΡΠΈΠ±ΡΠΈΡΠ° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ΅ ΠΊΠΎΠΌΠΏΡΠΈΠΌΠΎΠ²Π°Π½Π΅ ΠΏΠΎΠΌΠΎΡΡ ΠΡΠΎΡΠ»ΠΈ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ°, ΠΊΠΎΡΠΈ ΡΠ΅ ΠΌΠ°Π»ΠΎ Π΅ΡΠΈΠΊΠ°ΡΠ½ΠΈΡΠΈ ΠΎΠ΄ Π³Π·ΠΈΠΏ-Π°. ΠΠΎΠΌΠΏΡΠΈΠΌΠΎΠ²Π°ΡΠ΅ΠΌΠΎ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ΅ ΡΠ΅Π΄Π½ΠΎΠΌ; Π½Π΅ΠΌΠ° ΠΏΠΎΡΡΠ΅Π±Π΅ Π΄Π° ΡΠΎ ΡΠ°Π΄ΠΈΠΌΠΎ Ρ Ρ ΠΎΠ΄Ρ.
ΠΠ²ΠΎ ΡΠ΅ ΠΠΎΡΠΊΠ΅ΡΡΠΈΠ»Π΅ ΡΠ° ΠΊΠΎΡΠΈΠΌ ΡΠ°ΠΌ Π·Π°Π²ΡΡΠΈΠΎ. ΠΠΎΠΌΠ΅Π½ΡΠ°ΡΠΈ Π½Π° ΡΡΡΠΊΠΎΠΌ ΡΡ ΠΌΠΎΡΠΈ, Π½Π° Π΅Π½Π³Π»Π΅ΡΠΊΠΎΠΌ - ΠΈΠ· ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»Π°.
ΠΠΎΡΠΊΠ΅ΡΡΠΈΠ»Π΅
# ΠΠ°Π·ΠΎΠ²ΡΠΉ ΠΎΠ±ΡΠ°Π· ΡΠ½ΠΎΠ²Π° Alpine
FROM alpine:3.9
LABEL maintainer="Aleksey Maydokin <[email protected]>"
ENV NGINX_VERSION 1.16.0
ENV NGX_BROTLI_VERSION 0.1.2
ENV BROTLI_VERSION 1.0.7
RUN set -x
&& addgroup -S nginx
&& adduser -D -S -h /var/cache/nginx -s /sbin/nologin -G nginx nginx
# Π£ΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ ΠΏΠ°ΠΊΠ΅ΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½ΡΠΆΠ½Ρ ΡΡΠΎΠ±Ρ ΡΠΎΠ±ΡΠ°ΡΡ nginx ΠΈ ΠΌΠΎΠ΄ΡΠ»Ρ ngx_brotli ΠΊ Π½Π΅ΠΌΡ
&& apk add --no-cache --virtual .build-deps
gcc
libc-dev
make
linux-headers
curl
&& mkdir -p /usr/src
# Π‘ΠΊΠ°ΡΠΈΠ²Π°Π΅ΠΌ ΠΈΡΡ
ΠΎΠ΄Π½ΠΈΠΊΠΈ
&& curl -LSs https://nginx.org/download/nginx-$NGINX_VERSION.tar.gz | tar xzf - -C /usr/src
&& curl -LSs https://github.com/eustas/ngx_brotli/archive/v$NGX_BROTLI_VERSION.tar.gz | tar xzf - -C /usr/src
&& curl -LSs https://github.com/google/brotli/archive/v$BROTLI_VERSION.tar.gz | tar xzf - -C /usr/src
&& rm -rf /usr/src/ngx_brotli-$NGX_BROTLI_VERSION/deps/brotli/
&& ln -s /usr/src/brotli-$BROTLI_VERSION /usr/src/ngx_brotli-$NGX_BROTLI_VERSION/deps/brotli
&& cd /usr/src/nginx-$NGINX_VERSION
&& CNF="
--prefix=/etc/nginx
--sbin-path=/usr/sbin/nginx
--modules-path=/usr/lib/nginx/modules
--conf-path=/etc/nginx/nginx.conf
--error-log-path=/var/log/nginx/error.log
--http-log-path=/var/log/nginx/access.log
--pid-path=/var/run/nginx.pid
--lock-path=/var/run/nginx.lock
--http-client-body-temp-path=/var/cache/nginx/client_temp
--http-proxy-temp-path=/var/cache/nginx/proxy_temp
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp
--http-scgi-temp-path=/var/cache/nginx/scgi_temp
--user=nginx
--group=nginx
--without-http_ssi_module
--without-http_userid_module
--without-http_access_module
--without-http_auth_basic_module
--without-http_mirror_module
--without-http_autoindex_module
--without-http_geo_module
--without-http_split_clients_module
--without-http_referer_module
--without-http_rewrite_module
--without-http_proxy_module
--without-http_fastcgi_module
--without-http_uwsgi_module
--without-http_scgi_module
--without-http_grpc_module
--without-http_memcached_module
--without-http_limit_conn_module
--without-http_limit_req_module
--without-http_empty_gif_module
--without-http_browser_module
--without-http_upstream_hash_module
--without-http_upstream_ip_hash_module
--without-http_upstream_least_conn_module
--without-http_upstream_keepalive_module
--without-http_upstream_zone_module
--without-http_gzip_module
--with-http_gzip_static_module
--with-threads
--with-compat
--with-file-aio
--add-dynamic-module=/usr/src/ngx_brotli-$NGX_BROTLI_VERSION
"
# Π‘ΠΎΠ±ΠΈΡΠ°Π΅ΠΌ
&& ./configure $CNF
&& make -j$(getconf _NPROCESSORS_ONLN)
&& make install
&& rm -rf /usr/src/
# Π£Π΄Π°Π»ΡΠ΅ΠΌ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΠΉ brotli ΠΌΠΎΠ΄ΡΠ»Ρ, ΠΎΡΡΠ°Π²Π»ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ
&& rm /usr/lib/nginx/modules/ngx_http_brotli_filter_module.so
&& sed -i '$ d' /etc/apk/repositories
# Bring in gettext so we can get `envsubst`, then throw
# the rest away. To do this, we need to install `gettext`
# then move `envsubst` out of the way so `gettext` can
# be deleted completely, then move `envsubst` back.
&& apk add --no-cache --virtual .gettext gettext
&& mv /usr/bin/envsubst /tmp/
&& runDeps="$(
scanelf --needed --nobanner /usr/sbin/nginx /usr/lib/nginx/modules/*.so /tmp/envsubst
| awk '{ gsub(/,/, "nso:", $2); print "so:" $2 }'
| sort -u
| xargs -r apk info --installed
| sort -u
)"
&& apk add --no-cache $runDeps
&& apk del .build-deps
&& apk del .gettext
&& mv /tmp/envsubst /usr/local/bin/
# Bring in tzdata so users could set the timezones through the environment
# variables
&& apk add --no-cache tzdata
# forward request and error logs to docker log collector
&& ln -sf /dev/stdout /var/log/nginx/access.log
&& ln -sf /dev/stderr /var/log/nginx/error.log
COPY nginx.conf /etc/nginx/nginx.conf
EXPOSE 80
STOPSIGNAL SIGTERM
CMD ["nginx", "-g", "daemon off;"]
ΠΠ΄ΠΌΠ°Ρ ΡΡ ΠΏΠΎΠΏΡΠ°Π²ΠΈΡΠΈ Π½Π³ΠΈΠ½ΠΊ.ΡΠΎΠ½Ρ ΡΠ°ΠΊΠΎ Π΄Π° ΡΡ Π³Π·ΠΈΠΏ ΠΈ Π±ΡΠΎΡΠ»ΠΈ ΠΏΠΎΠ΄ΡΠ°Π·ΡΠΌΠ΅Π²Π°Π½ΠΎ ΠΎΠΌΠΎΠ³ΡΡΠ΅Π½ΠΈ. Π£ΠΊΡΡΡΠΈΡΡ ΠΈ Π·Π°Π³Π»Π°Π²ΡΠ° Π·Π° ΠΊΠ΅ΡΠΈΡΠ°ΡΠ΅, ΡΠ΅Ρ Π½ΠΈΠΊΠ°Π΄Π° Π½Π΅ΡΠ΅ΠΌΠΎ ΠΌΠ΅ΡΠ°ΡΠΈ ΡΡΠ°ΡΠΈΡΠΊΠ΅. Π ΠΏΠΎΡΠ»Π΅Π΄ΡΠΈ Π΄ΠΎΠ΄ΠΈΡ ΡΠ΅ Π±ΠΈΡΠΈ ΠΏΡΠ΅ΡΡΠΌΠ΅ΡΠ°Π²Π°ΡΠ΅ ΡΠ²ΠΈΡ 404 Π·Π°Ρ ΡΠ΅Π²Π° Π½Π° ΠΈΠ½Π΄Π΅ΠΊ.Ρ ΡΠΌΠ», ΠΎΠ²ΠΎ ΡΠ΅ Π½Π΅ΠΎΠΏΡ ΠΎΠ΄Π½ΠΎ Π·Π° Π½Π°Π²ΠΈΠ³Π°ΡΠΈΡΡ Ρ Π‘ΠΠ.
Π½Π³ΠΈΠ½ΠΊ.ΡΠΎΠ½Ρ
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
load_module /usr/lib/nginx/modules/ngx_http_brotli_static_module.so;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
keepalive_timeout 65;
gzip_static on;
brotli_static on;
server {
listen 80;
server_name localhost;
charset utf-8;
location / {
root html;
try_files $uri /index.html;
etag on;
expires max;
add_header Cache-Control public;
location = /index.html {
expires 0;
add_header Cache-Control "no-cache, public, must-revalidate, proxy-revalidate";
}
}
}
}
ΠΠΎΡΠΎΠ²Ρ ΡΠ»ΠΈΠΊΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΡΠ΅ΡΠ·Π΅ΡΠΈ ΠΎΠ²Π΄Π΅:
ΠΠΎΠ΄ΡΡΠ°Π²Π°ΡΠ΅ ΡΡΠ°ΡΠΈΠΊΠ΅ Π·Π° ΡΠ°Π·ΡΠΌΠ΅Π²Π°ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΡΠΈΠ²ΠΈΡ ΠΎΠΊΡΡΠΆΠ΅ΡΠ°
ΠΠ°ΡΡΠΎ ΠΌΠΎΠ³Ρ Π±ΠΈΡΠΈ ΠΏΠΎΡΡΠ΅Π±Π½Π° ΠΏΠΎΠ΄Π΅ΡΠ°Π²Π°ΡΠ° Ρ Π‘ΠΠ? ΠΠ° ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π° Π±ΠΈΡΡΠ΅ ΠΎΠ΄ΡΠ΅Π΄ΠΈΠ»ΠΈ ΠΊΠΎΡΠΈ Π ΠΠ‘Π’ΡΡΠ» ΠΠΠ Π΄Π° ΠΊΠΎΡΠΈΡΡΠΈΡΠ΅. ΠΠ±ΠΈΡΠ½ΠΎ ΡΠ΅ ΠΏΠΎΠ΄Π΅ΡΠ°Π²Π°ΡΠ° Π·Π° ΠΆΠ΅ΡΠ΅Π½ΠΎ ΠΎΠΊΡΡΠΆΠ΅ΡΠ΅ ΠΏΡΠ΅Π½ΠΎΡΠ΅ Ρ Π‘ΠΠ Ρ ΡΠ°Π·ΠΈ ΠΈΠ·Π³ΡΠ°Π΄ΡΠ΅. ΠΠΊΠΎ ΡΡΠ΅Π±Π° Π½Π΅ΡΡΠΎ Π΄Π° ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅, ΠΌΠΎΡΠ°ΡΠ΅ΡΠ΅ ΠΏΠΎΠ½ΠΎΠ²ΠΎ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΡ. ΠΠ΅ ΠΆΠ΅Π»ΠΈΠΌ. ΠΠ΅Π»ΠΈΠΌ Π΄Π° ΡΠ΅ Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ° ΡΠ΅Π΄Π½ΠΎΠΌ Π½Π°ΠΏΡΠ°Π²ΠΈ Ρ Π¦Π ΡΠ°Π·ΠΈ ΠΈ Π΄Π° ΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ΅ ΠΎΠ½ΠΎΠ»ΠΈΠΊΠΎ ΠΊΠΎΠ»ΠΈΠΊΠΎ ΡΠ΅ ΠΏΠΎΡΡΠ΅Π±Π½ΠΎ Ρ Π¦Π ΡΠ°Π·ΠΈ ΠΊΠΎΡΠΈΡΡΠ΅ΡΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΡΠΈΠ²Π΅ ΠΎΠΊΡΡΠΆΠ΅ΡΠ°.
ΠΠ°ΡΠ°Π²Π½ΠΎ, ΡΠ°ΠΌΠ΅ ΡΡΠ°ΡΠΈΡΠΊΠ΅ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ΅ Π½Π΅ ΡΠ°Π·ΡΠΌΠ΅ΡΡ Π½ΠΈΡΠ΅Π΄Π½Ρ ΠΏΡΠΎΠΌΠ΅Π½ΡΠΈΠ²Ρ ΠΎΠΊΡΡΠΆΠ΅ΡΠ°. ΠΠ±ΠΎΠ³ ΡΠΎΠ³Π° ΡΠ΅ΡΠ΅ ΠΌΠΎΡΠ°ΡΠΈ Π΄Π° ΠΊΠΎΡΠΈΡΡΠΈΡΠ΅ ΡΡΠΈΠΊ. Π£ ΠΊΠΎΠ½Π°ΡΠ½ΠΎΡ ΡΠ»ΠΈΡΠΈ, Π½Π΅ΡΡ ΠΏΠΎΠΊΡΠ΅Π½ΡΡΠΈ Π½Π³ΠΈΠ½ΠΊ, Π²Π΅Ρ ΡΠΏΠ΅ΡΠΈΡΠ°Π»Π½Ρ ΡΡ Π΅Π»Π» ΡΠΊΡΠΈΠΏΡΡ ΠΊΠΎΡΠ° ΡΠ΅ ΡΠΈΡΠ°ΡΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΡΠΈΠ²Π΅ ΠΎΠΊΡΡΠΆΠ΅ΡΠ°, ΡΠΏΠΈΡΠΈΠ²Π°ΡΠΈ ΠΈΡ Ρ ΡΡΠ°ΡΠΈΡΠΊΠ΅ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ΅, ΠΊΠΎΠΌΠΏΡΠ΅ΡΠΎΠ²Π°ΡΠΈ ΠΈΡ ΠΈ ΡΠ΅ΠΊ ΠΎΠ½Π΄Π° ΠΏΡΠ΅Π½Π΅ΡΠΈ ΠΊΠΎΠ½ΡΡΠΎΠ»Ρ Π½Π° Π½Π³ΠΈΠ½ΠΊ.
Π£ ΡΡ ΡΠ²ΡΡ Ρ, ΠΠΎΡΠΊΠ΅ΡΡΠΈΠ»Π΅ ΠΎΠ±Π΅Π·Π±Π΅ΡΡΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΠ°Ρ ΠΠΠ’Π ΠΠΠΠΠΠ’. Π₯Π°ΡΠ΄Π΅ Π΄Π° ΠΌΡ Π΄Π°ΠΌΠΎ ΡΠ»Π΅Π΄Π΅ΡΡ ΡΠΊΡΠΈΠΏΡΡ (ΠΊΠΎΡΠΈΡΡΠ΅ΡΠΈ ΠΠ½Π³ΡΠ»Π°Ρ ΠΊΠ°ΠΎ ΠΏΡΠΈΠΌΠ΅Ρ):
Π΄ΠΎΡΠΊΠ΅Ρ-Π΅Π½ΡΡΠΈΠΏΠΎΠΈΠ½Ρ.ΡΡ
#!/bin/sh set -e FLAG_FILE="/configured" TARGET_DIR="/etc/nginx/html" replace_vars () { ENV_VARS='$(awk 'BEGIN{for(v in ENVIRON) print "
quot;v}')'
# Π Angular ΠΈΡΠ΅ΠΌ ΠΏΠ»Π΅ΠΉΡΡ ΠΎΠ»Π΄Π΅ΡΡ Π² main-ΡΠ°ΠΉΠ»Π°Ρ
for f in "$TARGET_DIR"/main*.js; do
# envsubst Π·Π°ΠΌΠ΅Π½ΡΠ΅Ρ Π² ΡΠ°ΠΉΠ»Π°Ρ ΠΏΠ»Π΅ΠΉΡΡ ΠΎΠ»Π΄Π΅ΡΡ Π½Π° Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΈΠ· ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ
echo "$(envsubst "$ENV_VARS" < "$f")" > "$f"
done
}
compress () {
for i in $(find "$TARGET_DIR" | grep -E ".css$|.html$|.js$|.svg$|.txt$|.ttf
quot;); do
# ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΡΡ ΡΡΠ΅ΠΏΠ΅Π½Ρ ΡΠΆΠ°ΡΠΈΡ
gzip -9kf "$i" && brotli -fZ "$i"
done
}
if [ "$1" = 'nginx' ]; then
# Π€Π»Π°Π³ Π½ΡΠΆΠ΅Π½, ΡΡΠΎΠ±Ρ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΡΠΊΡΠΈΠΏΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΈ ΡΠ°ΠΌΠΎΠΌ ΠΏΠ΅ΡΠ²ΠΎΠΌ Π·Π°ΠΏΡΡΠΊΠ΅
if [ ! -e "$FLAG_FILE" ]; then
echo "Running init script"
echo "Replacing env vars"
replace_vars
echo "Compressing files"
compress
touch $FLAG_FILE
echo "Done"
fi
fi
exec "$@"
ΠΠ° Π±ΠΈ ΡΠΊΡΠΈΠΏΡΠ° ΡΠ°Π΄ΠΈΠ»Π° ΡΠ²ΠΎΡ ΠΏΠΎΡΠ°ΠΎ, ΠΏΠΎΠ΄Π΅ΡΠ°Π²Π°ΡΠ° ΠΌΠΎΡΠ°ΡΡ Π±ΠΈΡΠΈ Π·Π°ΠΏΠΈΡΠ°Π½Π° Ρ ΡΡ ΡΠ°ΡΠ»ΠΎΠ²ΠΈΠΌΠ° Ρ ΠΎΠ²ΠΎΠΌ ΠΎΠ±Π»ΠΈΠΊΡ:${API_URL}
.ΠΡΠ΅Π΄ΠΈ Π½Π°ΠΏΠΎΠΌΠ΅Π½ΡΡΠΈ Π΄Π° Π²Π΅ΡΠΈΠ½Π° ΠΌΠΎΠ΄Π΅ΡΠ½ΠΈΡ Π‘ΠΠ Π΄ΠΎΠ΄Π°ΡΠ΅ Ρ Π΅ΡΠΎΠ²Π΅ Ρ ΡΠ²ΠΎΡΠ΅ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ΅ ΠΏΡΠΈΠ»ΠΈΠΊΠΎΠΌ ΠΈΠ·Π³ΡΠ°Π΄ΡΠ΅. ΠΠ²ΠΎ ΡΠ΅ Π½Π΅ΠΎΠΏΡ ΠΎΠ΄Π½ΠΎ ΠΊΠ°ΠΊΠΎ Π±ΠΈ ΠΏΡΠ΅ΡΡΠ°ΠΆΠΈΠ²Π°Ρ ΠΌΠΎΠ³Π°ΠΎ Π±Π΅Π·Π±Π΅Π΄Π½ΠΎ Π΄Π° ΠΊΠ΅ΡΠΈΡΠ° Π΄Π°ΡΠΎΡΠ΅ΠΊΡ Π΄ΡΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½Π°. ΠΠΊΠΎ ΡΠ΅ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ° ΠΏΡΠΎΠΌΠ΅Π½ΠΈ, ΡΠ΅Π½ Ρ Π΅Ρ ΡΠ΅ ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠΈ, ΡΡΠΎ ΡΠ΅ Π·Π°ΡΠ·Π²ΡΠ°Ρ ΠΏΡΠΈΠΌΠΎΡΠ°ΡΠΈ ΠΏΡΠ΅Π³Π»Π΅Π΄Π°Ρ Π΄Π° ΠΏΠΎΠ½ΠΎΠ²ΠΎ ΠΏΡΠ΅ΡΠ·ΠΌΠ΅ Π΄Π°ΡΠΎΡΠ΅ΠΊΡ.
ΠΠ°ΠΆΠ°Π»ΠΎΡΡ, Ρ ΠΌΠΎΠΌ ΠΌΠ΅ΡΠΎΠ΄Ρ, ΠΏΡΠΎΠΌΠ΅Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ΅ ΠΏΡΠ΅ΠΊΠΎ ΠΏΡΠΎΠΌΠ΅Π½ΡΠΈΠ²ΠΈΡ ΠΎΠΊΡΡΠΆΠ΅ΡΠ° Π½Π΅ Π΄ΠΎΠ²ΠΎΠ΄ΠΈ Π΄ΠΎ ΠΏΡΠΎΠΌΠ΅Π½Π΅ Ρ Π΅ΡΠ° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ΅, ΡΡΠΎ Π·Π½Π°ΡΠΈ Π΄Π° ΠΊΠ΅Ρ ΠΏΡΠ΅ΡΡΠ°ΠΆΠΈΠ²Π°ΡΠ° ΠΌΠΎΡΠ° Π±ΠΈΡΠΈ ΠΏΠΎΠ½ΠΈΡΡΠ΅Π½ Π½Π° Π½Π΅ΠΊΠΈ Π΄ΡΡΠ³ΠΈ Π½Π°ΡΠΈΠ½. ΠΠ΅ΠΌΠ°ΠΌ ΠΎΠ²Π°Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌ ΡΠ΅Ρ ΡΡ ΡΠ°Π·Π»ΠΈΡΠΈΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ΅ ΡΠ°ΡΠΏΠΎΡΠ΅ΡΠ΅Π½Π΅ Ρ ΡΠ°Π·Π»ΠΈΡΠΈΡΠΈΠΌ ΠΎΠΊΡΡΠΆΠ΅ΡΠΈΠΌΠ°.
Π‘Π°ΡΡΠ°Π²ΡΠ°ΡΠ΅ ΠΊΠΎΠ½Π°ΡΠ½Π΅ ΡΠ»ΠΈΠΊΠ΅
ΠΠΎΠ½Π°ΡΠ½ΠΎ.
ΠΠΎΡΠΊΠ΅ΡΡΠΈΠ»Π΅
# ΠΠ΅ΡΠ²ΡΠΉ Π±Π°Π·ΠΎΠ²ΡΠΉ ΠΎΠ±ΡΠ°Π· Π΄Π»Ρ ΡΠ±ΠΎΡΠΊΠΈ FROM alexxxnf/spa-builder as builder # Π§ΡΠΎΠ±Ρ ΡΡΡΠΊΡΠΈΠ²Π½Π΅Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΡΡ Docker-Π°, ΡΠ½Π°ΡΠ°Π»Π° ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ ΡΠΎΠ»ΡΠΊΠΎ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ COPY ./package.json ./package-lock.json /app/ RUN cd /app && npm ci --no-audit # ΠΠΎΡΠΎΠΌ ΡΠΎΠ±ΠΈΡΠ°Π΅ΠΌ ΡΠ°ΠΌΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ COPY . /app RUN cd /app && npm run build -- --prod --configuration=docker # ΠΡΠΎΡΠΎΠΉ Π±Π°Π·ΠΎΠ²ΡΠΉ ΠΎΠ±ΡΠ°Π· Π΄Π»Ρ ΡΠ°Π·Π΄Π°ΡΠΈ FROM alexxxnf/nginx-spa # ΠΠ°Π±ΠΈΡΠ°Π΅ΠΌ ΠΈΠ· ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ°Π·Π° ΡΠ½Π°ΡΠ°Π»Π° ΠΊΠΎΠΌΠΏΡΠ΅ΡΡΠΎΡ COPY --from=builder /usr/local/bin/brotli /usr/local/bin # ΠΠΎΡΠΎΠΌ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ ΡΡΠ΄ΠΎ-ΡΠΊΡΠΈΠΏΡ COPY ./docker/docker-entrypoint.sh /docker-entrypoint.sh # Π Π² ΠΊΠΎΠ½ΡΠ΅ Π·Π°Π±ΠΈΡΠ°Π΅ΠΌ ΡΠ°ΠΌΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ COPY --from=builder /app/dist/app /etc/nginx/html/ ENTRYPOINT ["/docker-entrypoint.sh"] CMD ["nginx", "-g", "daemon off;"]
Π‘Π°Π΄Π° ΡΠ΅ Π΄ΠΎΠ±ΠΈΡΠ΅Π½Π° ΡΠ»ΠΈΠΊΠ° ΠΌΠΎΠΆΠ΅ ΡΠ°ΡΡΠ°Π²ΠΈΡΠΈ ΠΈ ΠΊΠΎΡΠΈΡΡΠΈΡΠΈ Π±ΠΈΠ»ΠΎ Π³Π΄Π΅.
ΠΠ·Π²ΠΎΡ: Π²Π²Π².Ρ Π°Π±Ρ.ΡΠΎΠΌ