ืืืื-ืืืึทื ืึทืคึผืคึผืืืงืึทืืืึธื (SPA) ืืื ืึท ืกืืื ืคืื ืกืืึทืืืง ืืืฉืึทืืืึทืกืงืจืืคึผื ืืื HTML ืืขืงืขืก, ืืื ืืขืืื ื ืืื ืืืืืขืจ ืืื ืื ืืขืจืข ืจืขืกืืจืกื. ืืืืึทื ืืื ืืึธื ื ืื ืืืืฉื ืืื ืึทืืืงืึทืืื, ืืจืืืกืืขืื ืืื ืึธื ืืืื ืืื ืืืืขืจ ืืจืื ื. ืขืก ืืขื ืขื ืึท ืืจืืืก ื ืืืขืจ ืคืื ืืืืืง ืืื ืืคืืื ืคืจืื ืืึทืืื ืื ืืก ืคึฟืึทืจ ืืขื, ืกืืึทืจืืื ื ืืื ืึท ืคึผืฉืื GitHub ืืืขืืขืจ (ืืื ืคึฟืึทืจ ืขืืืขืืข ืืคืืื ืืื narod.ru) ืืื ืขื ืืืงื ืืื ืึท CDN ืืื Amazon S3. ืึธืืขืจ, ืืื ืืืจืฃ ืขืคึผืขืก ืึทื ืืขืจืฉ.
ืืื ืืืจืฃ ืึท ืืึธืงืงืขืจ ืืืื ืืื ืกืคึผืึท ืึทืืื ืึทื ืขืก ืงืขื ืืืืื ืืืื ืืึธื ืืฉื ืืื ืคึผืจืึธืืืงืฆืืข ืืื ืึท ืืืื ืคืื ืึท ืงืืืขืจื ืขืืขืก ืงื ืืื ืืื ืืืืฃ ืื ืืึทืฉืื ืคืื ืึท ืฆืืจืืง-ืขื ื ืืขืืืขืืึธืคึผืขืจ ืืืึธืก ืืื ืงืืื ืืขืืึทื ืง ืืืึธืก ืกืคึผืึท ืืื.
ืืื ืืื ืืืฉืืืกื ืื ืคืืืืขื ืืข ืืืื ืจืขืงืืืืจืขืืขื ืฅ ืคึฟืึทืจ ืืื:
- ืื ืคืื ื ืืฆื (ืึธืืขืจ ื ืืฉื ืคึฟืึทืจืืึทืืืื ื);
- ืืื ืืืื ืืจืืืก ืืื ืืขืจืืื ืขื ืคืื ืืืกืง ืืื ืืึทืจืึทื;
- ืงืึทื ืคืืืืขืจืืืฉืึทื ืืืจื ืกืืืืืืข ืืืขืจืืึทืืึทืื ืึทืืื ืึทื ืื ืืืื ืงืขื ืขื ืืืื ืืขืืืืื ื ืืื ืคืึทืจืฉืืืขื ืข ืื ืืืืืจืึทื ืืึทื ืฅ;
- ืื ืืขืจืกื ืขืคืขืงืืืื ืคืึทืจืฉืคึผืจืืืืื ื ืคืื ืืขืงืขืก.
ืืืึทื ื ืืื ืืืขื ืืึธืื ืืืจ ืืื:
- ืืื nginx;
- ืืืืขื ืืจืึธืืื ืคึฟืื ืืงืืจืื;
- ืืขืจื ืขื ืกืืึทืืืง ืืขืงืขืก ืฆื ืคึฟืึทืจืฉืืืื ืกืืืืืืข ืืืขืจืืึทืืึทืื;
- ืืื ืืึธื ืืื ืฆื ืึทืกืขืืืึทื ืึท ืืึธืงืงืขืจ ืืืื ืคึฟืื ืึทืืข ืืขื.
ืืขืจ ืฆืื ืคืื ืืขื ืึทืจืืืงื ืืื ืฆื ืืืืื ืืืื ืืขืจืคืึทืจืื ื ืืื ืึทืจืืืกืจืืคื ืืงืกืคึผืืจืืึทื ืกื ืงืื ืืืืืืืืขืจ ืฆื ืงืึทื ืกืืจืึทืงืืืื ืงืจืืืืง.
ืืืืขื ืึท ืืืื ืคึฟืึทืจ ืคึฟืึทืจืืึทืืืื ื
ืฆื ืืึทืื ืื ืืขืฆื ืืึธืงืงืขืจ ืืืื ืงืืืื ืืื ืืจืืืก, ืืืจ ืืึทืจืคึฟื ืฆื ืึทืืืืจ ืฆื ืฆืืืื ืึผืืืื: ืึท ืืื ืืืื ืคืื ืืืึทืขืจืก ืืื ืึท ืืื ืืืึทืืืกืืืง ืืึทืืข ืืืื. ืืืื ืขืจ ืคืื ืื ืงืืขื ืกืืขืจ ืืึทืืข ืืืืืขืจ ืืื ืื ืึทืืคึผืืื ืืื ืืงืก ืืืื, ืึทืืื ืืึธืก ืืื ืืืึธืก ืืื ืืืขื ืงืืืึทืื. ืขืืืขืืข ืงืขื ืืขื ืื ืึทื ืื ืึทืืคึผืืื ืืื ื ืืฉื ืคึผืึทืกืืง ืคึฟืึทืจ ืคึผืจืึธืืืงืฆืืข, ืืื ืืื ืงืขื ืืืื ืจืขืื. ืืืขืจ ืคืขืจืืขื ืืื ืืื ืืื ืงืืื ืืื ื ืืฉื ืืขืืื ืงืืื ืคืจืืืืขืืขื ืืื ืืื ืืื ืขืก ืืขื ืขื ื ืืฉืื ืงืืื ืืขื ืืช ืงืขืื ืืื.
ืฆื ืืึธืื ืืืืื ืืงืขืจืข ืืืึทืขืจืก, ืืื ืืืขื ืึทืกืขืืืึทื ืื ืืืื ืืื 2 ืกืืึทืืขืก. ืืขืจ ืขืจืฉืืขืจ ืืื ืึท ืคึผืืึทื; ืึทืืข ืึทืืืืืืขืจื ืืืืืืึทืืื ืืื ืฆืืึทืืืืืึทืืืง ืืขืงืขืก ืืืขื ืืืืึทืื ืืื ืขืก. ืืื ืืื ืื ืืขืฆื ืืื ืข ืืื ืืืขื ื ืึธืจ ืฉืจืืึทืื ืื ืืขืฆื ืืืขืจืกืืข ืคืื โโืื ืึทืคึผืืึทืงืืืฉืึทื.
ืืื ืก ืึธื ืืืืื ืืื ืื ืึทืืืืืืขืจื ืืืื.
ืืื ืกืืจ ืฆื ืฆืื ืืืคื ืขืืขื ืึท ืกืคึผืึท ืึทืคึผืืึทืงืืืฉืึทื, ืืืจ ืืืืฉืึทืืืึทืื ืืึทืจืคึฟื node.js. ืืื ืืืขื ื ืขืืขื ืื ืืึทืึทืืืขืจ ืืืื, ืืืึธืก ืืืื ืงืืื ืืื ืื npm ืืื ืืึทืจื ืคึผืขืงื ืืึทื ืึทืืืฉืขืจื. ืืืืฃ ืืืื ืืืืื ืืืืึทืฃ, ืืื ืืืขื ืืืืื ื ืึธืืข-ืืืคึผ, ืืืึธืก ืืื ืืืจืฃ ืฆื ืืืืขื ืขืืืขืืข npm ืคึผืึทืงืึทืืืฉืึทื, ืืื ืื Brotli ืงืึทืืคึผืจืขืกืขืจ ืคืื Google, ืืืึธืก ืืืขื ืืืื ื ืืฆืืง ืคึฟืึทืจ ืืื ืื ืฉืคึผืขืืขืจ.
Dockerfile ืืื ืืึทืืขืจืงืื ืืขื.
# ะะฐะทะพะฒัะน ะพะฑัะฐะท
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
ืฉืืื ืืึธ ืืื ืืื ืคืืืืื ื ืคึฟืึทืจ ืืื ืึทืืึทืืืืึทื, ืึทืืื ืื ืืืื ืืื ืฉืืขืื ืฆืืืึทืืขื ืืืจื ืืืื ืืจืืืก ืืึทื ืฉืึทืคึฟื.
ืื ืคืึทืจืืืง ืืืื ืงืขื ืขื ืืืื ืืขืคึฟืื ืขื ืืึธ:
ื ืืื ืงืก
ืืืจ ืงืขื ืขื ื ืืฆื ืงืืื ืืืขื ืกืขืจืืืขืจ ืฆื ืคืึทืจืฉืคึผืจืืืื ืกืืึทืืืง ืืื ืืึทืื. ืืื ืืื ืืขืืืืื ื ืฆื ืึทืจืืขืื ืืื nginx, ืึทืืื ืืื ืืืขื ื ืืฆื ืขืก ืืืฆื.
Nginx ืืื ืึท ืืึทืึทืืืขืจ ืืึธืงืงืขืจ ืืืื, ืึธืืขืจ ืขืก ืืื ืฆื ืคืืืข ืืึทืืืฉืืื ืคึฟืึทืจ ืคึผืฉืื ืกืืึทืืืง ืคืึทืจืฉืคึผืจืืืืื ื. ืืืึธืก ืึธื ืขืก ืืขื ืขื ืึทืจืืึทื ืืขืจืขืื ื ืืื ืื ืขืงืกืคึผืจืขืก ืงืขื ืขื ืืืื ืืขืืขื ืืืจื ืึท ืกืคึผืขืฆืืขื ืืึทื ืฉืึทืคึฟื ืึธืืขืจ ืืื ืืขืจ ืืึทืึทืืืขืจ Dockerfile.
$ docker run --rm nginx:1-alpine 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
ืืื ืืืขื ื ืืฆื ืื Dockerfile ืืื ืึท ืืงืขืจ, ืึธืืขืจ ืืื ืืืขื ืืึธืื ืืื ืขืก ืืืืื ืืืึธืก ืืื ืืืจืฃ ืฆื ืคืึทืจืฉืคึผืจืืืื ืกืืึทืืืง ืืื ืืึทืื. ืืืึทื ืืืขืจืกืืข ืืืขื ื ืืฉื ืงืขื ืขื ืฆื ืึทืจืืขืื ืืืืขืจ ืืืืคึผืก, ืืืขื ื ืืฉื ืฉืืืฆื ืืขืจืืืืืขื ืืฉ ืืื ืคืื ืืขืจ. ืึธืืขืจ ืืืื ืืืขืจืกืืข ืืืขื ืงืขื ืขื ืฆื ืคืึทืจืฉืคึผืจืืืื ืืขืงืขืก ืงืึทืืคึผืจืขืกื ืืื ืื ืืจืึธืืื ืึทืืืขืจืืืึทื, ืืืึธืก ืืื ืึท ืืืกื ืืขืจ ืขืคืขืงืืืื ืืื ืืืืคึผ. ืืืจ ืืืขืื ืงืึธืืคึผืจืขืก ืืขืงืขืก ืึทืืึธื; ืขืก ืืื ื ืื ืืึทืจืคึฟื ืฆื ืืึธื ืืึธืก ืืืืฃ ืื ืคืืืขื.
ืืึธืก ืืื ืื Dockerfile ืืื ืืืึธืก ืืื ืขื ืืืงื ืืื. ืืึทืืขืจืงืื ืืขื ืืื ืจืืกืืฉ ืืขื ืขื ืืืึทื, ืืื ืขื ืืืืฉ - ืคึฟืื ืืขืจ ืึธืจืืืื ืขื.
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 ืึทืืื ืึทื gzip ืืื brotli ืืขื ืขื ืขื ืืืืึทืื ืืืจื ืคืขืืืงืืึทื. ืืื ืืืขื ืืืื ืึทืจืืึทื ื ืขืืขื ืงืึทืืฉืื ื ืืขืืขืจื, ืืืืึทื ืืืจ ืืืขืื ืงืืื ืืึธื ืืืืฉื ืกืืึทืืืง. ืืื ืื ืืขืฆื ืคืึทืจืืื ืื ืืืขื ืืืื ืจืืืขืจืขืงื ืึทืืข 404 ืจืืงืืืขืก ืฆื index.html, ืืึธืก ืืื ื ืืืืืง ืคึฟืึทืจ ื ืึทืืืืืึทืฆืืข ืืื ืื ืกืคึผืึท.
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";
}
}
}
}
ืืืจ ืงืขื ืขื ืืจืืคืงืืคืืข ืื ืคืึทืจืืืง ืืืื ืืึธ:
ืืขืจื ืขื ืกืืึทืืืงืก ืฆื ืคึฟืึทืจืฉืืืื ืกืืืืืืข ืืืขืจืืึทืืึทืื
ืคืืจืืืืก ืงืขื ืกืขืืืื ืืก ืืืื ืืืจืฃ ืืื ืกืคึผืึท? ืคึฟืึทืจ ืืืึทืฉืคึผืื, ืืื ืกืืจ ืฆื ืกืคึผืขืฆืืคืืฆืืจื ืืืึธืก RESTful API ืฆื ื ืืฆื. ืืืคึผืืงืึทืืื, ืกืขืืืื ืืก ืคึฟืึทืจ ืื ืืขืืขืื ืกืืืืืืข ืืขื ืขื ืืจืึทื ืกืคืขืจื ืฆื ืกืคึผืึท ืืื ืื ืืืืขื ืืื ืข. ืืืื ืืืจ ืืึทืจืคึฟื ืฆื ืืืืฉื ืขืคึผืขืก, ืืืจ ืืืขื ืืึธืื ืฆื ืจืืืืื ืื ืึทืคึผืืึทืงืืืฉืึทื. ืืื ืืืื ืขืก ื ืืฉื. ืืื ืืืืื ืื ืึทืคึผืืึทืงืืืฉืึทื ืฆื ืืืื ืืขืืืื ืึทืืึธื ืืื ืื ืกื ืืื ืข, ืืื ืงืึทื ืคืืืืขืจื ืืื ืคืื ืืื ื ืืืืืง ืืื ืื ืกื ืืื ืข ื ืืฆื ืกืืืืืืข ืืืขืจืืึทืืึทืื.
ืคืื ืงืืจืก, ืกืืึทืืืง ืืขืงืขืก ืืื ืืึธื ื ืื ืคึฟืึทืจืฉืืืื ืงืืื ืกืืืืืืข ืืืขืจืืึทืืึทืื. ืืขืจืืืขืจ, ืืืจ ืืืขื ืืึธืื ืฆื ื ืืฆื ืึท ืงืื ืฅ. ืืื ืื ืืขืฆื ืืืื, ืืื ืืืขื ื ืืฉื ืงืึทืืขืจ nginx, ืึธืืขืจ ืึท ืกืคึผืขืฆืืขื ืฉืึธื ืฉืจืืคื ืืืึธืก ืืืขื ืืืืขื ืขื ืกืืืืืืข ืืืขืจืืึทืืึทืื, ืฉืจืืึทืื ืืื ืฆื ืกืืึทืืืง ืืขืงืขืก, ืงืึธืืคึผืจืขืก ืืื, ืืื ืืืืื ืืขืืึธืื ืึทืจืืืขืจืคืืจื ืงืึธื ืืจืึธื ืฆื nginx.
ืคึฟืึทืจ ืืขื ืฆืืืขืง, ืื Dockerfile ืืื ืื 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