āĻāĻāĻ-āĻĒā§āĻˇā§āĻ āĻž āĻ ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻā§āĻļāĻ¨ (āĻāĻ¸āĻĒāĻŋāĻ) āĻšāĻ˛ āĻ¸ā§āĻā§āĻ¯āĻžāĻāĻŋāĻ āĻāĻžāĻāĻžāĻ¸ā§āĻā§āĻ°āĻŋāĻĒā§āĻ āĻāĻŦāĻ āĻāĻāĻāĻāĻŋāĻāĻŽāĻāĻ˛ āĻĢāĻžāĻāĻ˛, āĻ¸ā§āĻāĻ¸āĻžāĻĨā§ āĻāĻŦāĻŋ āĻāĻŦāĻ āĻ āĻ¨ā§āĻ¯āĻžāĻ¨ā§āĻ¯ āĻ¸āĻāĻ¸ā§āĻĨāĻžāĻ¨āĻā§āĻ˛āĻŋāĻ° āĻāĻāĻāĻŋ āĻ¸ā§āĻāĨ¤ āĻ¯ā§āĻšā§āĻ¤ā§ āĻ¤āĻžāĻ°āĻž āĻāĻ¤āĻŋāĻļā§āĻ˛āĻāĻžāĻŦā§ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻŋāĻ¤ āĻšāĻ¯āĻŧ āĻ¨āĻž, āĻ¤āĻžāĻĻā§āĻ° āĻ āĻ¨āĻ˛āĻžāĻāĻ¨ā§ āĻĒā§āĻ°āĻāĻžāĻļ āĻāĻ°āĻž āĻā§āĻŦ āĻ¸āĻšāĻāĨ¤ āĻāĻāĻŋāĻ° āĻāĻ¨ā§āĻ¯ āĻĒā§āĻ°āĻā§āĻ° āĻ¸āĻāĻā§āĻ¯āĻ āĻ¸āĻ¸ā§āĻ¤āĻž āĻāĻŦāĻ āĻāĻŽāĻ¨āĻāĻŋ āĻŦāĻŋāĻ¨āĻžāĻŽā§āĻ˛ā§āĻ¯ā§āĻ° āĻĒāĻ°āĻŋāĻˇā§āĻŦāĻž āĻ°āĻ¯āĻŧā§āĻā§, āĻāĻāĻāĻŋ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ GitHub āĻĒā§āĻ (āĻāĻŦāĻ āĻāĻŋāĻā§āĻ° āĻāĻ¨ā§āĻ¯ āĻāĻŽāĻ¨āĻāĻŋ narod.ru āĻĻāĻŋāĻ¯āĻŧā§) āĻĻāĻŋāĻ¯āĻŧā§ āĻļā§āĻ°ā§ āĻšāĻ¯āĻŧ āĻāĻŦāĻ Amazon S3 āĻāĻ° āĻŽāĻ¤ā§ āĻāĻāĻāĻŋ CDN āĻĻāĻŋāĻ¯āĻŧā§ āĻļā§āĻˇ āĻšāĻ¯āĻŧāĨ¤ āĻ¯āĻžāĻāĻšā§āĻ, āĻāĻŽāĻžāĻ° āĻ āĻ¨ā§āĻ¯ āĻāĻŋāĻā§ āĻĻāĻ°āĻāĻžāĻ° āĻāĻŋāĻ˛āĨ¤
āĻāĻŽāĻžāĻ° āĻāĻ¸āĻĒāĻŋāĻāĻ° āĻ¸āĻžāĻĨā§ āĻāĻāĻāĻŋ āĻĄāĻāĻžāĻ° āĻāĻŽā§āĻ āĻĻāĻ°āĻāĻžāĻ° āĻ¯āĻžāĻ¤ā§ āĻāĻāĻŋ āĻāĻāĻāĻŋ āĻā§āĻŦāĻžāĻ°āĻ¨ā§āĻāĻ¸ āĻā§āĻ˛āĻžāĻ¸ā§āĻāĻžāĻ°ā§āĻ° āĻ āĻāĻļ āĻšāĻŋāĻ¸āĻžāĻŦā§ āĻāĻŦāĻ āĻāĻāĻāĻŋ āĻŦā§āĻ¯āĻžāĻ-āĻāĻ¨ā§āĻĄ āĻĄā§āĻā§āĻ˛āĻĒāĻžāĻ°ā§āĻ° āĻŽā§āĻļāĻŋāĻ¨ā§ āĻāĻāĻ¯āĻŧāĻ āĻ¸āĻšāĻā§ āĻāĻžāĻ˛ā§ āĻāĻ°āĻž āĻ¯āĻžāĻ¯āĻŧ āĻ¯āĻžāĻ° āĻā§āĻ¨ āĻ§āĻžāĻ°āĻŖāĻž āĻ¨ā§āĻ āĻ¯ā§ SPA āĻāĻŋāĨ¤
āĻāĻŽāĻŋ āĻ¨āĻŋāĻā§āĻ° āĻāĻ¨ā§āĻ¯ āĻ¨āĻŋāĻŽā§āĻ¨āĻ˛āĻŋāĻāĻŋāĻ¤ āĻāĻŋāĻ¤ā§āĻ°ā§āĻ° āĻĒā§āĻ°āĻ¯āĻŧā§āĻāĻ¨ā§āĻ¯āĻŧāĻ¤āĻžāĻā§āĻ˛āĻŋ āĻ¨āĻŋāĻ°ā§āĻ§āĻžāĻ°āĻŖ āĻāĻ°ā§āĻāĻŋ:
- āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°ā§āĻ° āĻ¸āĻšāĻāĻ¤āĻž (āĻāĻŋāĻ¨ā§āĻ¤ā§ āĻ¸āĻŽāĻžāĻŦā§āĻļ āĻ¨āĻ¯āĻŧ);
- āĻĄāĻŋāĻ¸ā§āĻ āĻāĻŦāĻ RAM āĻāĻāĻ¯āĻŧ āĻā§āĻˇā§āĻ¤ā§āĻ°ā§āĻ āĻ¸āĻ°ā§āĻŦāĻ¨āĻŋāĻŽā§āĻ¨ āĻāĻāĻžāĻ°;
- āĻĒāĻ°āĻŋāĻŦā§āĻļ āĻā§āĻ°āĻŋāĻ¯āĻŧā§āĻŦāĻ˛ā§āĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§ āĻāĻ¨āĻĢāĻŋāĻāĻžāĻ°ā§āĻļāĻ¨ āĻ¯āĻžāĻ¤ā§ āĻāĻŋāĻ¤ā§āĻ°āĻāĻŋ āĻŦāĻŋāĻāĻŋāĻ¨ā§āĻ¨ āĻĒāĻ°āĻŋāĻŦā§āĻļā§ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻž āĻ¯āĻžāĻ¯āĻŧ;
- āĻĢāĻžāĻāĻ˛ā§āĻ° āĻ¸āĻŦāĻā§āĻ¯āĻŧā§ āĻĻāĻā§āĻˇ āĻŦāĻŋāĻ¤āĻ°āĻŖāĨ¤
āĻāĻ āĻāĻŽāĻŋ āĻāĻĒāĻ¨āĻžāĻā§ āĻŦāĻ˛āĻŦ āĻāĻŋāĻāĻžāĻŦā§:
- āĻ āĻ¨ā§āĻ¤ā§āĻ° nginx;
- āĻāĻ¤ā§āĻ¸ āĻĨā§āĻā§ āĻŦā§āĻ°āĻāĻ˛āĻŋ āĻ¤ā§āĻ°āĻŋ āĻāĻ°ā§āĻ¨;
- āĻ¸ā§āĻĨāĻŋāĻ¤āĻŋāĻļā§āĻ˛ āĻĢāĻžāĻāĻ˛āĻā§āĻ˛āĻŋāĻā§ āĻĒāĻ°āĻŋāĻŦā§āĻļā§āĻ° āĻā§āĻ°āĻŋāĻ¯āĻŧā§āĻŦāĻ˛ āĻŦā§āĻāĻ¤ā§ āĻļā§āĻāĻžāĻ¨;
- āĻāĻŦāĻ āĻ āĻŦāĻļā§āĻ¯āĻ āĻāĻ āĻ¸āĻŦ āĻĨā§āĻā§ āĻāĻāĻāĻŋ āĻĄāĻāĻžāĻ° āĻāĻŽā§āĻ āĻāĻŋāĻāĻžāĻŦā§ āĻāĻāĻ¤ā§āĻ°āĻŋāĻ¤ āĻāĻ°āĻž āĻ¯āĻžāĻ¯āĻŧāĨ¤
āĻāĻ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻāĻŋāĻ° āĻāĻĻā§āĻĻā§āĻļā§āĻ¯ āĻšāĻ˛ āĻāĻŽāĻžāĻ° āĻ āĻāĻŋāĻā§āĻāĻ¤āĻž āĻļā§āĻ¯āĻŧāĻžāĻ° āĻāĻ°āĻž āĻāĻŦāĻ āĻ āĻāĻŋāĻā§āĻ āĻ¸āĻŽā§āĻĒā§āĻ°āĻĻāĻžāĻ¯āĻŧā§āĻ° āĻ¸āĻĻāĻ¸ā§āĻ¯āĻĻā§āĻ° āĻāĻ āĻ¨āĻŽā§āĻ˛āĻ āĻ¸āĻŽāĻžāĻ˛ā§āĻāĻ¨āĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻāĻ¸ā§āĻā§ āĻĻā§āĻāĻ¯āĻŧāĻžāĨ¤
āĻ¸āĻŽāĻžāĻŦā§āĻļā§āĻ° āĻāĻ¨ā§āĻ¯ āĻāĻāĻāĻŋ āĻāĻŽā§āĻ āĻ¨āĻŋāĻ°ā§āĻŽāĻžāĻŖ
āĻā§āĻĄāĻŧāĻžāĻ¨ā§āĻ¤ āĻĄāĻāĻžāĻ° āĻāĻŋāĻ¤ā§āĻ°āĻāĻŋāĻā§ āĻāĻāĻžāĻ°ā§ āĻā§āĻ āĻāĻ°āĻ¤ā§, āĻāĻĒāĻ¨āĻžāĻā§ āĻĻā§āĻāĻŋ āĻ¨āĻŋāĻ¯āĻŧāĻŽ āĻŽā§āĻ¨ā§ āĻāĻ˛āĻ¤ā§ āĻšāĻŦā§: āĻāĻāĻāĻŋ āĻ¨ā§āĻ¯ā§āĻ¨āĻ¤āĻŽ āĻ¸ā§āĻ¤āĻ° āĻāĻŦāĻ āĻāĻāĻāĻŋ āĻ¨ā§āĻ¯ā§āĻ¨āĻ¤āĻŽ āĻāĻŋāĻ¤ā§āĻ¤āĻŋ āĻāĻŋāĻ¤ā§āĻ°āĨ¤ āĻ¸āĻŦāĻā§āĻ¯āĻŧā§ āĻā§āĻ āĻŦā§āĻ¸ āĻāĻŽā§āĻāĻā§āĻ˛āĻŋāĻ° āĻŽāĻ§ā§āĻ¯ā§ āĻāĻāĻāĻŋ āĻšāĻ˛ āĻāĻ˛āĻĒāĻžāĻāĻ¨ āĻ˛āĻŋāĻ¨āĻžāĻā§āĻ¸ āĻāĻŽā§āĻ, āĻ¤āĻžāĻ āĻāĻŽāĻŋ āĻāĻāĻŋāĻ āĻŦā§āĻā§ āĻ¨ā§āĻŦāĨ¤ āĻā§āĻ āĻā§āĻ āĻ¯ā§āĻā§āĻ¤āĻŋ āĻĻāĻŋāĻ¤ā§ āĻĒāĻžāĻ°ā§ āĻ¯ā§ āĻāĻ˛ā§āĻĒāĻžāĻāĻ¨ āĻā§āĻĒāĻžāĻĻāĻ¨ā§āĻ° āĻāĻ¨ā§āĻ¯ āĻāĻĒāĻ¯ā§āĻā§āĻ¤ āĻ¨āĻ¯āĻŧ āĻāĻŦāĻ āĻ¤āĻžāĻ°āĻž āĻ¸āĻ āĻŋāĻ āĻšāĻ¤ā§ āĻĒāĻžāĻ°ā§āĨ¤ āĻ¤āĻŦā§ āĻŦā§āĻ¯āĻā§āĻ¤āĻŋāĻāĻ¤āĻāĻžāĻŦā§, āĻāĻŽāĻžāĻ° āĻāĻāĻ¨ā§āĻ āĻ¤āĻžāĻ° āĻ¸āĻžāĻĨā§ āĻā§āĻ¨ā§ āĻ¸āĻŽāĻ¸ā§āĻ¯āĻž āĻšāĻ¯āĻŧāĻ¨āĻŋ āĻāĻŦāĻ āĻ¤āĻžāĻ° āĻŦāĻŋāĻ°ā§āĻĻā§āĻ§ā§ āĻā§āĻ¨ā§ āĻ¯ā§āĻā§āĻ¤āĻŋāĻ āĻ¨ā§āĻāĨ¤
āĻāĻŽ āĻ¸ā§āĻ¤āĻ° āĻāĻā§, āĻāĻŽāĻŋ 2 āĻĒāĻ°ā§āĻ¯āĻžāĻ¯āĻŧā§ āĻāĻŽā§āĻ āĻāĻāĻ¤ā§āĻ°āĻŋāĻ¤ āĻšāĻŦā§. āĻĒā§āĻ°āĻĨāĻŽāĻāĻŋ āĻāĻāĻāĻŋ āĻāĻ¸āĻĄāĻŧāĻž; āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻ¸āĻšāĻžāĻ¯āĻŧāĻ āĻāĻāĻāĻŋāĻ˛āĻŋāĻāĻŋ āĻāĻŦāĻ āĻ āĻ¸ā§āĻĨāĻžāĻ¯āĻŧā§ āĻĢāĻžāĻāĻ˛ āĻāĻ¤ā§ āĻĨāĻžāĻāĻŦā§āĨ¤ āĻāĻŦāĻ āĻā§āĻĄāĻŧāĻžāĻ¨ā§āĻ¤ āĻĒāĻ°ā§āĻ¯āĻžāĻ¯āĻŧā§ āĻāĻŽāĻŋ āĻā§āĻŦāĻ˛ āĻ ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻā§āĻļāĻ¨āĻāĻŋāĻ° āĻā§āĻĄāĻŧāĻžāĻ¨ā§āĻ¤ āĻ¸āĻāĻ¸ā§āĻāĻ°āĻŖāĻāĻŋ āĻ˛āĻŋāĻāĻŦāĨ¤
āĻāĻ˛ā§āĻ¨ āĻ¸āĻšāĻžāĻ¯āĻŧāĻ āĻāĻŋāĻ¤ā§āĻ° āĻĻāĻŋāĻ¯āĻŧā§ āĻļā§āĻ°ā§ āĻāĻ°āĻž āĻ¯āĻžāĻāĨ¤
āĻāĻāĻāĻŋ SPA āĻ ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻā§āĻļāĻ¨ āĻāĻŽā§āĻĒāĻžāĻāĻ˛ āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯, āĻāĻĒāĻ¨āĻžāĻ° āĻ¸āĻžāĻ§āĻžāĻ°āĻŖāĻ¤ node.js āĻĒā§āĻ°āĻ¯āĻŧā§āĻāĻ¨āĨ¤ āĻāĻŽāĻŋ āĻ āĻĢāĻŋāĻ¸āĻŋāĻ¯āĻŧāĻžāĻ˛ āĻāĻŽā§āĻ āĻ¨ā§āĻŦ, āĻ¯āĻž āĻāĻ¨āĻĒāĻŋāĻāĻŽ āĻāĻŦāĻ āĻāĻ¯āĻŧāĻžāĻ°ā§āĻ¨ āĻĒā§āĻ¯āĻžāĻā§āĻ āĻŽā§āĻ¯āĻžāĻ¨ā§āĻāĻžāĻ°āĻĻā§āĻ° āĻ¸āĻžāĻĨā§āĻ āĻāĻ¸ā§āĨ¤ āĻāĻŽāĻžāĻ° āĻ¨āĻŋāĻā§āĻ° āĻĒāĻā§āĻˇ āĻĨā§āĻā§, āĻāĻŽāĻŋ āĻ¨ā§āĻĄ-āĻāĻŋāĻĒ āĻ¯ā§āĻ āĻāĻ°āĻŦ, āĻ¯āĻž āĻāĻŋāĻā§ āĻāĻ¨āĻĒāĻŋāĻāĻŽ āĻĒā§āĻ¯āĻžāĻā§āĻ āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻ¤ā§ āĻĒā§āĻ°āĻ¯āĻŧā§āĻāĻ¨ āĻāĻŦāĻ āĻā§āĻāĻ˛ā§āĻ° āĻŦā§āĻ°āĻāĻ˛āĻŋ āĻāĻŽā§āĻĒā§āĻ°ā§āĻ¸āĻžāĻ°, āĻ¯āĻž āĻĒāĻ°ā§ āĻāĻŽāĻžāĻĻā§āĻ° āĻāĻžāĻā§ āĻ˛āĻžāĻāĻŦā§āĨ¤
āĻŽāĻ¨ā§āĻ¤āĻŦā§āĻ¯ āĻ¸āĻš āĻĄāĻāĻžāĻ°āĻĢāĻžāĻāĻ˛.
# ĐаСОвŅĐš ОйŅаС
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
āĻāĻ¤āĻŋāĻŽāĻ§ā§āĻ¯ā§ āĻāĻāĻžāĻ¨ā§ āĻāĻŽāĻŋ minimalism āĻāĻ¨ā§āĻ¯ āĻ¯ā§āĻĻā§āĻ§ āĻāĻ°āĻāĻŋ, āĻ¤āĻžāĻ āĻāĻŽā§āĻ āĻāĻāĻāĻŋ āĻŦāĻĄāĻŧ āĻĻāĻ˛ āĻĻā§āĻŦāĻžāĻ°āĻž āĻāĻāĻ¤ā§āĻ°āĻŋāĻ¤ āĻāĻ°āĻž āĻšāĻ¯āĻŧ.
āĻ¸āĻŽāĻžāĻĒā§āĻ¤ āĻāĻŋāĻ¤ā§āĻ° āĻāĻāĻžāĻ¨ā§ āĻĒāĻžāĻāĻ¯āĻŧāĻž āĻ¯āĻžāĻŦā§:
nginx
āĻāĻĒāĻ¨āĻŋ āĻ¸ā§āĻā§āĻ¯āĻžāĻāĻŋāĻ āĻŦāĻŋāĻˇāĻ¯āĻŧāĻŦāĻ¸ā§āĻ¤ā§ āĻŦāĻŋāĻ¤āĻ°āĻŖ āĻāĻ°āĻ¤ā§ āĻ¯ā§ āĻā§āĻ¨ā§ āĻāĻ¯āĻŧā§āĻŦ āĻ¸āĻžāĻ°ā§āĻāĻžāĻ° āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§āĻ¨āĨ¤ āĻāĻŽāĻŋ nginx āĻāĻ° āĻ¸āĻžāĻĨā§ āĻāĻžāĻ āĻāĻ°āĻ¤ā§ āĻ āĻā§āĻ¯āĻ¸ā§āĻ¤, āĻ¤āĻžāĻ āĻāĻŽāĻŋ āĻāĻāĻ¨ āĻāĻāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻŦāĨ¤
Nginx āĻāĻ° āĻāĻāĻāĻŋ āĻ āĻĢāĻŋāĻ¸āĻŋāĻ¯āĻŧāĻžāĻ˛ āĻĄāĻāĻžāĻ° āĻāĻŽā§āĻ āĻ°āĻ¯āĻŧā§āĻā§, āĻ¤āĻŦā§ āĻāĻāĻŋāĻ¤ā§ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ āĻ¸ā§āĻā§āĻ¯āĻžāĻāĻŋāĻ āĻĄāĻŋāĻ¸ā§āĻā§āĻ°āĻŋāĻŦāĻŋāĻāĻļāĻ¨ā§āĻ° āĻāĻ¨ā§āĻ¯ āĻ āĻ¨ā§āĻāĻā§āĻ˛āĻŋ āĻŽāĻĄāĻŋāĻāĻ˛ āĻ°āĻ¯āĻŧā§āĻā§āĨ¤ āĻā§āĻ¨āĻāĻŋ āĻĄā§āĻ˛āĻŋāĻāĻžāĻ°āĻŋāĻ¤ā§ āĻ āĻ¨ā§āĻ¤āĻ°ā§āĻā§āĻā§āĻ¤ āĻāĻ°āĻž āĻšāĻ¯āĻŧā§āĻā§ āĻ¤āĻž āĻāĻāĻāĻŋ āĻŦāĻŋāĻļā§āĻˇ āĻĻāĻ˛ āĻŦāĻž āĻ āĻĢāĻŋāĻ¸āĻŋāĻ¯āĻŧāĻžāĻ˛ āĻĄāĻāĻžāĻ°āĻĢāĻžāĻāĻ˛ā§ āĻĻā§āĻāĻž āĻ¯āĻžāĻŦā§āĨ¤
$ āĻĄāĻāĻžāĻ° āĻ°āĻžāĻ¨ --rm nginx:1-āĻāĻ˛ā§āĻĒāĻžāĻāĻ¨ nginx -V
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
āĻāĻŽāĻŋ āĻĄāĻāĻžāĻ°āĻĢāĻžāĻāĻ˛āĻāĻŋāĻā§ āĻāĻāĻāĻŋ āĻāĻŋāĻ¤ā§āĻ¤āĻŋ āĻšāĻŋāĻ¸āĻžāĻŦā§ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻŦ, āĻ¤āĻŦā§ āĻ¸ā§āĻā§āĻ¯āĻžāĻāĻŋāĻ āĻ¸āĻžāĻŽāĻā§āĻ°ā§ āĻŦāĻŋāĻ¤āĻ°āĻŖ āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻ¯āĻž āĻĒā§āĻ°āĻ¯āĻŧā§āĻāĻ¨ āĻ¤āĻž āĻāĻŽāĻŋ āĻāĻ¤ā§ āĻ°ā§āĻā§ āĻĻā§āĻŦāĨ¤ āĻāĻŽāĻžāĻ° āĻ¸āĻāĻ¸ā§āĻāĻ°āĻŖ HTTPS āĻāĻ° āĻāĻĒāĻ° āĻāĻžāĻ āĻāĻ°āĻ¤ā§ āĻ¸āĻā§āĻˇāĻŽ āĻšāĻŦā§ āĻ¨āĻž, āĻ āĻ¨ā§āĻŽā§āĻĻāĻ¨ āĻ¸āĻŽāĻ°ā§āĻĨāĻ¨ āĻāĻ°āĻŦā§ āĻ¨āĻž āĻāĻŦāĻ āĻāĻ°āĻ āĻ āĻ¨ā§āĻ āĻāĻŋāĻā§āĨ¤ āĻāĻŋāĻ¨ā§āĻ¤ā§ āĻāĻŽāĻžāĻ° āĻ¸āĻāĻ¸ā§āĻāĻ°āĻŖāĻāĻŋ āĻŦā§āĻ°āĻāĻ˛āĻŋ āĻ ā§āĻ¯āĻžāĻ˛āĻāĻ°āĻŋāĻĻāĻŽā§āĻ° āĻ¸āĻžāĻĨā§ āĻ¸āĻāĻā§āĻāĻŋāĻ¤ āĻĢāĻžāĻāĻ˛āĻā§āĻ˛āĻŋ āĻŦāĻŋāĻ¤āĻ°āĻŖ āĻāĻ°āĻ¤ā§ āĻ¸āĻā§āĻˇāĻŽ āĻšāĻŦā§, āĻ¯āĻž āĻāĻŋāĻāĻŋāĻĒā§āĻ° āĻā§āĻ¯āĻŧā§ āĻāĻŋāĻā§āĻāĻž āĻŦā§āĻļāĻŋ āĻĻāĻā§āĻˇāĨ¤ āĻāĻŽāĻ°āĻž āĻĢāĻžāĻāĻ˛āĻā§āĻ˛āĻŋ āĻāĻāĻŦāĻžāĻ° āĻ¸āĻāĻā§āĻāĻŋāĻ¤ āĻāĻ°āĻŦ; āĻāĻĄāĻŧā§ āĻāĻŋāĻ¯āĻŧā§ āĻāĻāĻŋ āĻāĻ°āĻžāĻ° āĻĻāĻ°āĻāĻžāĻ° āĻ¨ā§āĻāĨ¤
āĻāĻāĻŋ āĻ¸ā§āĻ āĻĄāĻāĻžāĻ°āĻĢāĻžāĻāĻ˛ āĻ¯āĻž āĻāĻŽāĻŋ āĻļā§āĻˇ āĻāĻ°ā§āĻāĻŋāĨ¤ āĻ°āĻžāĻļāĻŋāĻ¯āĻŧāĻžāĻ¨ āĻāĻžāĻˇāĻžāĻ¯āĻŧ āĻŽāĻ¨ā§āĻ¤āĻŦā§āĻ¯āĻā§āĻ˛āĻŋ āĻāĻŽāĻžāĻ°, āĻāĻāĻ°ā§āĻāĻŋāĻ¤ā§ - āĻŽā§āĻ˛ āĻĨā§āĻā§āĨ¤
Dockerfile
# ĐаСОвŅĐš ОйŅаС ŅĐŊОва 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;"]
āĻāĻŽāĻŋ āĻ āĻŦāĻŋāĻ˛āĻŽā§āĻŦā§ nginx.conf āĻ āĻŋāĻ āĻāĻ°āĻŦ āĻ¯āĻžāĻ¤ā§ āĻāĻŋāĻāĻŋāĻĒ āĻāĻŦāĻ āĻŦā§āĻ°ā§āĻāĻ˛āĻŋ āĻĄāĻŋāĻĢāĻ˛ā§āĻāĻ°ā§āĻĒā§ āĻ¸āĻā§āĻ°āĻŋāĻ¯āĻŧ āĻĨāĻžāĻā§āĨ¤ āĻāĻŽāĻŋ āĻā§āĻ¯āĻžāĻļāĻŋāĻ āĻšā§āĻĄāĻžāĻ°āĻ āĻ āĻ¨ā§āĻ¤āĻ°ā§āĻā§āĻā§āĻ¤ āĻāĻ°āĻŦ, āĻāĻžāĻ°āĻŖ āĻāĻŽāĻ°āĻž āĻāĻāĻ¨āĻ āĻ¸ā§āĻā§āĻ¯āĻžāĻāĻŋāĻ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻāĻ°āĻŦ āĻ¨āĻžāĨ¤ āĻāĻŦāĻ āĻā§āĻĄāĻŧāĻžāĻ¨ā§āĻ¤ āĻ¸ā§āĻĒāĻ°ā§āĻļ āĻ¸āĻŽāĻ¸ā§āĻ¤ 404 āĻ āĻ¨ā§āĻ°ā§āĻ§ index.html āĻ āĻĒā§āĻ¨āĻāĻ¨āĻŋāĻ°ā§āĻĻā§āĻļ āĻāĻ°āĻž āĻšāĻŦā§, āĻāĻāĻŋ SPA-āĻ¤ā§ āĻ¨ā§āĻāĻŋāĻā§āĻļāĻ¨ā§āĻ° āĻāĻ¨ā§āĻ¯ āĻĒā§āĻ°āĻ¯āĻŧā§āĻāĻ¨ā§āĻ¯āĻŧāĨ¤
nginx.conf
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";
}
}
}
}
āĻāĻĒāĻ¨āĻŋ āĻāĻāĻžāĻ¨ā§ āĻ¸āĻŽāĻžāĻĒā§āĻ¤ āĻāĻŽā§āĻ āĻĄāĻžāĻāĻ¨āĻ˛ā§āĻĄ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§āĻ¨:
āĻĒāĻ°āĻŋāĻŦā§āĻļā§āĻ° āĻā§āĻ°āĻŋāĻ¯āĻŧā§āĻŦāĻ˛ āĻŦā§āĻāĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻ¸ā§āĻā§āĻ¯āĻžāĻāĻŋāĻā§āĻ¸ āĻļā§āĻāĻžāĻ¨ā§
āĻā§āĻ¨ SPA-āĻ¤ā§ āĻ¸ā§āĻāĻŋāĻāĻ¸ā§āĻ° āĻĒā§āĻ°āĻ¯āĻŧā§āĻāĻ¨ āĻšāĻ¤ā§ āĻĒāĻžāĻ°ā§? āĻāĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§āĻĒ, āĻā§āĻ¨ RESTful API āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻ¤ā§ āĻšāĻŦā§ āĻ¤āĻž āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻ āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯āĨ¤ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖāĻ¤, āĻāĻžāĻā§āĻāĻŋāĻ¤ āĻĒāĻ°āĻŋāĻŦā§āĻļā§āĻ° āĻāĻ¨ā§āĻ¯ āĻ¸ā§āĻāĻŋāĻāĻ¸ āĻŦāĻŋāĻ˛ā§āĻĄ āĻĒāĻ°ā§āĻ¯āĻžāĻ¯āĻŧā§ āĻāĻ¸āĻĒāĻŋāĻāĻ¤ā§ āĻ¸ā§āĻĨāĻžāĻ¨āĻžāĻ¨ā§āĻ¤āĻ°āĻŋāĻ¤ āĻšāĻ¯āĻŧāĨ¤ āĻāĻĒāĻ¨āĻŋ āĻ¯āĻĻāĻŋ āĻāĻŋāĻā§ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻāĻ°āĻ¤ā§ āĻāĻžāĻ¨ āĻ¤āĻŦā§ āĻāĻĒāĻ¨āĻžāĻā§ āĻ ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻā§āĻļāĻ¨āĻāĻŋ āĻĒā§āĻ¨āĻ°ā§āĻ¨āĻŋāĻ°ā§āĻŽāĻžāĻŖ āĻāĻ°āĻ¤ā§ āĻšāĻŦā§āĨ¤ āĻāĻŽāĻŋ āĻāĻāĻž āĻāĻžāĻ āĻ¨āĻž. āĻāĻŽāĻŋ āĻāĻžāĻ āĻ¸āĻŋāĻāĻ āĻĒāĻ°ā§āĻ¯āĻžāĻ¯āĻŧā§ āĻ ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻā§āĻļāĻ¨āĻāĻŋ āĻāĻāĻŦāĻžāĻ° āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻž āĻšā§āĻ āĻāĻŦāĻ āĻĒāĻ°āĻŋāĻŦā§āĻļā§āĻ° āĻā§āĻ°āĻŋāĻ¯āĻŧā§āĻŦāĻ˛ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§ āĻ¸āĻŋāĻĄāĻŋ āĻĒāĻ°ā§āĻ¯āĻžāĻ¯āĻŧā§ āĻ¯āĻ¤āĻāĻž āĻĒā§āĻ°āĻ¯āĻŧā§āĻāĻ¨ āĻ¤āĻ¤āĻāĻž āĻāĻ¨āĻĢāĻŋāĻāĻžāĻ° āĻāĻ°āĻž āĻšā§āĻāĨ¤
āĻ āĻŦāĻļā§āĻ¯āĻ, āĻ¸ā§āĻā§āĻ¯āĻžāĻāĻŋāĻ āĻĢāĻžāĻāĻ˛āĻā§āĻ˛āĻŋ āĻ¨āĻŋāĻā§āĻ°āĻžāĻ āĻā§āĻ¨āĻ āĻĒāĻ°āĻŋāĻŦā§āĻļā§āĻ° āĻā§āĻ°āĻŋāĻ¯āĻŧā§āĻŦāĻ˛ āĻŦā§āĻā§ āĻ¨āĻžāĨ¤ āĻ āĻ¤āĻāĻŦ, āĻāĻĒāĻ¨āĻžāĻā§ āĻāĻāĻāĻŋ āĻā§āĻļāĻ˛ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻ¤ā§ āĻšāĻŦā§āĨ¤ āĻā§āĻĄāĻŧāĻžāĻ¨ā§āĻ¤ āĻāĻŋāĻ¤ā§āĻ°ā§, āĻāĻŽāĻŋ nginx āĻāĻžāĻ˛ā§ āĻāĻ°āĻŦ āĻ¨āĻž, āĻ¤āĻŦā§ āĻāĻāĻāĻŋ āĻŦāĻŋāĻļā§āĻˇ āĻļā§āĻ˛ āĻ¸ā§āĻā§āĻ°āĻŋāĻĒā§āĻ āĻ¯āĻž āĻĒāĻ°āĻŋāĻŦā§āĻļā§āĻ° āĻā§āĻ°āĻŋāĻ¯āĻŧā§āĻŦāĻ˛āĻā§āĻ˛āĻŋ āĻĒāĻĄāĻŧāĻŦā§, āĻ¸ā§āĻā§āĻ¯āĻžāĻāĻŋāĻ āĻĢāĻžāĻāĻ˛āĻā§āĻ˛āĻŋāĻ¤ā§ āĻ˛āĻŋāĻāĻŦā§, āĻ¸ā§āĻā§āĻ˛āĻŋāĻā§ āĻ¸āĻāĻā§āĻāĻŋāĻ¤ āĻāĻ°āĻŦā§ āĻāĻŦāĻ āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻ¤āĻžāĻ°āĻĒāĻ°ā§ nginx-āĻ āĻ¨āĻŋāĻ¯āĻŧāĻ¨ā§āĻ¤ā§āĻ°āĻŖ āĻ¸ā§āĻĨāĻžāĻ¨āĻžāĻ¨ā§āĻ¤āĻ° āĻāĻ°āĻŦā§āĨ¤
āĻāĻ āĻāĻĻā§āĻĻā§āĻļā§āĻ¯ā§, āĻĄāĻāĻžāĻ°āĻĢāĻžāĻāĻ˛ ENTRYPOINT āĻĒā§āĻ¯āĻžāĻ°āĻžāĻŽāĻŋāĻāĻžāĻ° āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻāĻ°ā§āĨ¤ āĻāĻ¸ā§āĻ¨ āĻ¤āĻžāĻā§ āĻ¨āĻŋāĻŽā§āĻ¨āĻ˛āĻŋāĻāĻŋāĻ¤ āĻ¸ā§āĻā§āĻ°āĻŋāĻĒā§āĻāĻāĻŋ āĻĻāĻŋāĻ (āĻāĻĻāĻžāĻšāĻ°āĻŖ āĻšāĻŋāĻ¸āĻžāĻŦā§ āĻā§āĻŖāĻŋāĻ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§):
docker-entrypoint.sh
#!/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 "$@"
āĻ¸ā§āĻā§āĻ°āĻŋāĻĒā§āĻ āĻ¤āĻžāĻ° āĻāĻžāĻ āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯, āĻ¸ā§āĻāĻŋāĻāĻ¸ āĻāĻ āĻĢāĻ°ā§āĻŽā§āĻ° js āĻĢāĻžāĻāĻ˛āĻā§āĻ˛āĻŋāĻ¤ā§ āĻ˛āĻŋāĻāĻ¤ā§ āĻšāĻŦā§:${API_URL}
.āĻāĻāĻŋ āĻ˛āĻā§āĻˇāĻŖā§āĻ¯āĻŧ āĻ¯ā§ āĻŦā§āĻļāĻŋāĻ°āĻāĻžāĻ āĻāĻ§ā§āĻ¨āĻŋāĻ āĻāĻ¸āĻĒāĻŋāĻāĻā§āĻ˛āĻŋ āĻ¨āĻŋāĻ°ā§āĻŽāĻžāĻŖā§āĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻ¤āĻžāĻĻā§āĻ° āĻĢāĻžāĻāĻ˛āĻā§āĻ˛āĻŋāĻ¤ā§ āĻšā§āĻ¯āĻžāĻļ āĻ¯ā§āĻā§āĻ¤ āĻāĻ°ā§āĨ¤ āĻāĻāĻŋ āĻĒā§āĻ°āĻ¯āĻŧā§āĻāĻ¨ā§āĻ¯āĻŧ āĻ¯āĻžāĻ¤ā§ āĻŦā§āĻ°āĻžāĻāĻāĻžāĻ°āĻāĻŋ āĻĻā§āĻ°ā§āĻ āĻ¸āĻŽāĻ¯āĻŧā§āĻ° āĻāĻ¨ā§āĻ¯ āĻĢāĻžāĻāĻ˛āĻāĻŋ āĻ¨āĻŋāĻ°āĻžāĻĒāĻĻā§ āĻā§āĻ¯āĻžāĻļā§ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§āĨ¤ āĻ¯āĻĻāĻŋ āĻĢāĻžāĻāĻ˛āĻāĻŋ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻšāĻ¯āĻŧ, āĻ¤āĻŦā§ āĻāĻ° āĻšā§āĻ¯āĻžāĻļ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻšāĻŦā§, āĻ¯āĻž āĻŦā§āĻ°āĻžāĻāĻāĻžāĻ°āĻāĻŋāĻā§ āĻāĻŦāĻžāĻ° āĻĢāĻžāĻāĻ˛āĻāĻŋ āĻĄāĻžāĻāĻ¨āĻ˛ā§āĻĄ āĻāĻ°āĻ¤ā§ āĻŦāĻžāĻ§ā§āĻ¯ āĻāĻ°āĻŦā§āĨ¤
āĻĻā§āĻ°ā§āĻāĻžāĻā§āĻ¯āĻŦāĻļāĻ¤, āĻāĻŽāĻžāĻ° āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻ¤ā§, āĻāĻ¨āĻāĻžāĻ¯āĻŧāĻ°āĻ¨āĻŽā§āĻ¨ā§āĻ āĻā§āĻ°āĻŋāĻ¯āĻŧā§āĻŦāĻ˛ā§āĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§ āĻāĻ¨āĻĢāĻŋāĻāĻžāĻ°ā§āĻļāĻ¨ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻāĻ°āĻž āĻĢāĻžāĻāĻ˛ āĻšā§āĻ¯āĻžāĻļā§āĻ° āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ā§āĻ° āĻĻāĻŋāĻā§ āĻĒāĻ°āĻŋāĻāĻžāĻ˛āĻŋāĻ¤ āĻāĻ°ā§ āĻ¨āĻž, āĻ¯āĻžāĻ° āĻŽāĻžāĻ¨ā§ āĻŦā§āĻ°āĻžāĻāĻāĻžāĻ° āĻā§āĻ¯āĻžāĻļā§ āĻ āĻ¨ā§āĻ¯ āĻā§āĻ¨ā§ āĻāĻĒāĻžāĻ¯āĻŧā§ āĻ āĻŦā§āĻ§ āĻšāĻ¤ā§ āĻšāĻŦā§āĨ¤ āĻāĻŽāĻžāĻ° āĻāĻ āĻ¸āĻŽāĻ¸ā§āĻ¯āĻž āĻ¨ā§āĻ āĻāĻžāĻ°āĻŖ āĻŦāĻŋāĻāĻŋāĻ¨ā§āĻ¨ āĻāĻ¨āĻĢāĻŋāĻāĻžāĻ°ā§āĻļāĻ¨ āĻŦāĻŋāĻāĻŋāĻ¨ā§āĻ¨ āĻĒāĻ°āĻŋāĻŦā§āĻļā§ āĻ¸ā§āĻĨāĻžāĻĒāĻ¨ āĻāĻ°āĻž āĻšāĻ¯āĻŧāĨ¤
āĻā§āĻĄāĻŧāĻžāĻ¨ā§āĻ¤ āĻāĻŋāĻ¤ā§āĻ° āĻāĻāĻ¸āĻžāĻĨā§ āĻ¨āĻŋāĻ°ā§āĻŦāĻžāĻŖ
āĻ āĻŦāĻļā§āĻˇā§.
Dockerfile
# ĐĐĩŅвŅĐš йаСОвŅĐš ОйŅаС Đ´ĐģŅ ŅйОŅĐēи 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;"]
āĻāĻāĻ¨ āĻĢāĻ˛āĻ¸ā§āĻŦāĻ°ā§āĻĒ āĻāĻŋāĻ¤ā§āĻ°āĻāĻŋ āĻ¯ā§ āĻā§āĻ¨āĻ āĻāĻžāĻ¯āĻŧāĻāĻžāĻ¯āĻŧ āĻāĻāĻ¤ā§āĻ°āĻŋāĻ¤ āĻāĻŦāĻ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻž āĻ¯ā§āĻ¤ā§ āĻĒāĻžāĻ°ā§āĨ¤
āĻāĻ¤ā§āĻ¸: www.habr.com