ಏಕ ಪುಟದ ಅಪ್ಲಿಕೇಶನ್‌ನ ವಿತರಣೆಗಾಗಿ ಡಾಕರ್ ಚಿತ್ರ

ಏಕ-ಪುಟ ಅಪ್ಲಿಕೇಶನ್ (SPA) ಸ್ಥಿರವಾದ ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ ಮತ್ತು HTML ಫೈಲ್‌ಗಳು, ಹಾಗೆಯೇ ಚಿತ್ರಗಳು ಮತ್ತು ಇತರ ಸಂಪನ್ಮೂಲಗಳ ಗುಂಪಾಗಿದೆ. ಅವು ಕ್ರಿಯಾತ್ಮಕವಾಗಿ ಬದಲಾಗದ ಕಾರಣ, ಅವುಗಳನ್ನು ಆನ್‌ಲೈನ್‌ನಲ್ಲಿ ಪ್ರಕಟಿಸುವುದು ತುಂಬಾ ಸುಲಭ. ಇದಕ್ಕಾಗಿ ಹೆಚ್ಚಿನ ಸಂಖ್ಯೆಯ ಅಗ್ಗದ ಮತ್ತು ಉಚಿತ ಸೇವೆಗಳಿವೆ, ಸರಳವಾದ GitHub ಪುಟಗಳಿಂದ (ಮತ್ತು ಕೆಲವು narod.ru ನೊಂದಿಗೆ) ಪ್ರಾರಂಭಿಸಿ ಮತ್ತು Amazon S3 ನಂತಹ CDN ನೊಂದಿಗೆ ಕೊನೆಗೊಳ್ಳುತ್ತದೆ. ಆದಾಗ್ಯೂ, ನನಗೆ ಬೇರೆ ಏನಾದರೂ ಬೇಕಿತ್ತು.

ನನಗೆ SPA ಜೊತೆಗೆ ಡಾಕರ್ ಚಿತ್ರದ ಅಗತ್ಯವಿದೆ, ಇದರಿಂದ ಅದನ್ನು ಕುಬರ್ನೆಟ್ಸ್ ಕ್ಲಸ್ಟರ್‌ನ ಭಾಗವಾಗಿ ಉತ್ಪಾದನೆಯಲ್ಲಿ ಮತ್ತು SPA ಎಂದರೇನು ಎಂದು ತಿಳಿದಿಲ್ಲದ ಬ್ಯಾಕ್-ಎಂಡ್ ಡೆವಲಪರ್‌ನ ಯಂತ್ರದಲ್ಲಿ ಸುಲಭವಾಗಿ ಪ್ರಾರಂಭಿಸಬಹುದು.

ನನಗಾಗಿ ಈ ಕೆಳಗಿನ ಚಿತ್ರದ ಅವಶ್ಯಕತೆಗಳನ್ನು ನಾನು ನಿರ್ಧರಿಸಿದ್ದೇನೆ:

  • ಬಳಕೆಯ ಸುಲಭ (ಆದರೆ ಜೋಡಣೆ ಅಲ್ಲ);
  • ಡಿಸ್ಕ್ ಮತ್ತು RAM ಎರಡರಲ್ಲೂ ಕನಿಷ್ಠ ಗಾತ್ರ;
  • ಪರಿಸರದ ಅಸ್ಥಿರಗಳ ಮೂಲಕ ಸಂರಚನೆಯನ್ನು ಮಾಡುವುದರಿಂದ ಚಿತ್ರವನ್ನು ವಿವಿಧ ಪರಿಸರಗಳಲ್ಲಿ ಬಳಸಬಹುದು;
  • ಕಡತಗಳ ಅತ್ಯಂತ ಪರಿಣಾಮಕಾರಿ ವಿತರಣೆ.

ಹೇಗೆ ಎಂದು ಇಂದು ನಾನು ನಿಮಗೆ ಹೇಳುತ್ತೇನೆ:

  • ಕರುಳಿನ nginx;
  • ಮೂಲಗಳಿಂದ brotli ನಿರ್ಮಿಸಲು;
  • ಪರಿಸರ ವೇರಿಯಬಲ್‌ಗಳನ್ನು ಅರ್ಥಮಾಡಿಕೊಳ್ಳಲು ಸ್ಥಿರ ಫೈಲ್‌ಗಳನ್ನು ಕಲಿಸಿ;
  • ಮತ್ತು ಸಹಜವಾಗಿ ಈ ಎಲ್ಲದರಿಂದ ಡಾಕರ್ ಚಿತ್ರವನ್ನು ಹೇಗೆ ಜೋಡಿಸುವುದು.

ನನ್ನ ಅನುಭವವನ್ನು ಹಂಚಿಕೊಳ್ಳುವುದು ಮತ್ತು ಅನುಭವಿ ಸಮುದಾಯದ ಸದಸ್ಯರನ್ನು ರಚನಾತ್ಮಕ ಟೀಕೆಗೆ ಪ್ರಚೋದಿಸುವುದು ಈ ಲೇಖನದ ಉದ್ದೇಶವಾಗಿದೆ.

ಜೋಡಣೆಗಾಗಿ ಚಿತ್ರವನ್ನು ನಿರ್ಮಿಸುವುದು

ಅಂತಿಮ ಡಾಕರ್ ಚಿತ್ರವನ್ನು ಗಾತ್ರದಲ್ಲಿ ಚಿಕ್ಕದಾಗಿಸಲು, ನೀವು ಎರಡು ನಿಯಮಗಳಿಗೆ ಬದ್ಧರಾಗಿರಬೇಕು: ಕನಿಷ್ಠ ಪದರಗಳು ಮತ್ತು ಕನಿಷ್ಠ ಮೂಲ ಚಿತ್ರ. ಚಿಕ್ಕ ಮೂಲ ಚಿತ್ರಗಳಲ್ಲಿ ಒಂದಾದ ಆಲ್ಪೈನ್ ಲಿನಕ್ಸ್ ಚಿತ್ರ, ಹಾಗಾಗಿ ನಾನು ಅದನ್ನು ಆಯ್ಕೆ ಮಾಡುತ್ತೇನೆ. ಆಲ್ಪೈನ್ ಉತ್ಪಾದನೆಗೆ ಸೂಕ್ತವಲ್ಲ ಎಂದು ಕೆಲವರು ವಾದಿಸಬಹುದು, ಮತ್ತು ಅವರು ಸರಿಯಾಗಿರಬಹುದು. ಆದರೆ ವೈಯಕ್ತಿಕವಾಗಿ, ನಾನು ಅವರೊಂದಿಗೆ ಯಾವುದೇ ಸಮಸ್ಯೆಗಳನ್ನು ಹೊಂದಿಲ್ಲ ಮತ್ತು ಅವರ ವಿರುದ್ಧ ಯಾವುದೇ ವಾದಗಳಿಲ್ಲ.

ಕಡಿಮೆ ಪದರಗಳನ್ನು ಹೊಂದಲು, ನಾನು ಚಿತ್ರವನ್ನು 2 ಹಂತಗಳಲ್ಲಿ ಜೋಡಿಸುತ್ತೇನೆ. ಮೊದಲನೆಯದು ಡ್ರಾಫ್ಟ್; ಎಲ್ಲಾ ಸಹಾಯಕ ಉಪಯುಕ್ತತೆಗಳು ಮತ್ತು ತಾತ್ಕಾಲಿಕ ಫೈಲ್‌ಗಳು ಅದರಲ್ಲಿ ಉಳಿಯುತ್ತವೆ. ಮತ್ತು ಅಂತಿಮ ಹಂತದಲ್ಲಿ ನಾನು ಅಪ್ಲಿಕೇಶನ್‌ನ ಅಂತಿಮ ಆವೃತ್ತಿಯನ್ನು ಮಾತ್ರ ಬರೆಯುತ್ತೇನೆ.

ಸಹಾಯಕ ಚಿತ್ರದೊಂದಿಗೆ ಪ್ರಾರಂಭಿಸೋಣ.

SPA ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಕಂಪೈಲ್ ಮಾಡಲು, ನಿಮಗೆ ಸಾಮಾನ್ಯವಾಗಿ node.js ಅಗತ್ಯವಿರುತ್ತದೆ. ನಾನು ಅಧಿಕೃತ ಚಿತ್ರವನ್ನು ತೆಗೆದುಕೊಳ್ಳುತ್ತೇನೆ, ಇದು npm ಮತ್ತು ನೂಲು ಪ್ಯಾಕೇಜ್ ಮ್ಯಾನೇಜರ್‌ಗಳೊಂದಿಗೆ ಬರುತ್ತದೆ. ನನ್ನ ಪರವಾಗಿ, ನಾನು ಕೆಲವು npm ಪ್ಯಾಕೇಜ್‌ಗಳನ್ನು ನಿರ್ಮಿಸಲು ಅಗತ್ಯವಿರುವ node-gyp ಮತ್ತು Google ನಿಂದ ಬ್ರೋಟ್ಲಿ ಸಂಕೋಚಕವನ್ನು ಸೇರಿಸುತ್ತೇನೆ, ಅದು ನಮಗೆ ನಂತರ ಉಪಯುಕ್ತವಾಗಿರುತ್ತದೆ.

ಕಾಮೆಂಟ್‌ಗಳೊಂದಿಗೆ ಡಾಕರ್‌ಫೈಲ್.

# Базовый образ
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

ಈಗಾಗಲೇ ಇಲ್ಲಿ ನಾನು ಕನಿಷ್ಠೀಯತೆಗಾಗಿ ಹೋರಾಡುತ್ತಿದ್ದೇನೆ, ಆದ್ದರಿಂದ ಚಿತ್ರವನ್ನು ಒಂದು ದೊಡ್ಡ ತಂಡವು ಒಟ್ಟುಗೂಡಿಸುತ್ತದೆ.

ಮುಗಿದ ಚಿತ್ರವನ್ನು ಇಲ್ಲಿ ಕಾಣಬಹುದು: https://hub.docker.com/r/alexxxnf/spa-builder. ಇತರ ಜನರ ಚಿತ್ರಗಳನ್ನು ಅವಲಂಬಿಸದಂತೆ ಮತ್ತು ನಿಮ್ಮದೇ ಆದದನ್ನು ಸಂಗ್ರಹಿಸಲು ನಾನು ಶಿಫಾರಸು ಮಾಡುವುದಿಲ್ಲ.

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 ಮೂಲಕ ಕೆಲಸ ಮಾಡಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ, ದೃಢೀಕರಣವನ್ನು ಬೆಂಬಲಿಸುವುದಿಲ್ಲ ಮತ್ತು ಇನ್ನಷ್ಟು. ಆದರೆ ನನ್ನ ಆವೃತ್ತಿಯು ಬ್ರೋಟ್ಲಿ ಅಲ್ಗಾರಿದಮ್‌ನೊಂದಿಗೆ ಸಂಕುಚಿತಗೊಂಡ ಫೈಲ್‌ಗಳನ್ನು ವಿತರಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತದೆ, ಇದು gzip ಗಿಂತ ಸ್ವಲ್ಪ ಹೆಚ್ಚು ಪರಿಣಾಮಕಾರಿಯಾಗಿದೆ. ನಾವು ಒಮ್ಮೆ ಫೈಲ್‌ಗಳನ್ನು ಸಂಕುಚಿತಗೊಳಿಸುತ್ತೇವೆ; ಹಾರಾಡುತ್ತ ಇದನ್ನು ಮಾಡುವ ಅಗತ್ಯವಿಲ್ಲ.

ಇದು ನಾನು ಕೊನೆಗೊಂಡ ಡಾಕರ್‌ಫೈಲ್ ಆಗಿದೆ. ರಷ್ಯನ್ ಭಾಷೆಯಲ್ಲಿ ಕಾಮೆಂಟ್‌ಗಳು ನನ್ನದು, ಇಂಗ್ಲಿಷ್‌ನಲ್ಲಿ - ಮೂಲದಿಂದ.

ಡಾಕರ್‌ಫೈಲ್

# Базовый образ снова 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 ಗೆ ಮರುನಿರ್ದೇಶಿಸುತ್ತದೆ, ಇದು 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";
            }
        }
    }
}

ಮುಗಿದ ಚಿತ್ರವನ್ನು ನೀವು ಇಲ್ಲಿ ಡೌನ್‌ಲೋಡ್ ಮಾಡಬಹುದು: https://hub.docker.com/r/alexxxnf/nginx-spa. ಇದು 10,5 MB ತೆಗೆದುಕೊಳ್ಳುತ್ತದೆ. ಮೂಲ nginx 19,7 MB ಯನ್ನು ತೆಗೆದುಕೊಂಡಿತು. ನನ್ನ ಕ್ರೀಡಾ ಆಸಕ್ತಿ ತೃಪ್ತಿಕರವಾಗಿದೆ.

ಪರಿಸರದ ಅಸ್ಥಿರಗಳನ್ನು ಅರ್ಥಮಾಡಿಕೊಳ್ಳಲು ಅಂಕಿಅಂಶಗಳನ್ನು ಕಲಿಸುವುದು

SPA ನಲ್ಲಿ ಸೆಟ್ಟಿಂಗ್‌ಗಳು ಏಕೆ ಬೇಕಾಗಬಹುದು? ಉದಾಹರಣೆಗೆ, ಯಾವ RESTful API ಅನ್ನು ಬಳಸಬೇಕೆಂದು ಸೂಚಿಸಲು. ವಿಶಿಷ್ಟವಾಗಿ, ಅಪೇಕ್ಷಿತ ಪರಿಸರದ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ನಿರ್ಮಾಣ ಹಂತದಲ್ಲಿ SPA ಗೆ ವರ್ಗಾಯಿಸಲಾಗುತ್ತದೆ. ನೀವು ಏನನ್ನಾದರೂ ಬದಲಾಯಿಸಬೇಕಾದರೆ, ನೀವು ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಮರುನಿರ್ಮಾಣ ಮಾಡಬೇಕಾಗುತ್ತದೆ. ನನಗೆ ಅದು ಬೇಡ. ನಾನು ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು CI ಹಂತದಲ್ಲಿ ಒಮ್ಮೆ ನಿರ್ಮಿಸಲು ಬಯಸುತ್ತೇನೆ ಮತ್ತು ಪರಿಸರ ವೇರಿಯಬಲ್‌ಗಳನ್ನು ಬಳಸಿಕೊಂಡು CD ಹಂತದಲ್ಲಿ ಅಗತ್ಯವಿರುವಷ್ಟು ಕಾನ್ಫಿಗರ್ ಮಾಡಬೇಕೆಂದು ನಾನು ಬಯಸುತ್ತೇನೆ.

ಸಹಜವಾಗಿ, ಸ್ಥಿರ ಫೈಲ್‌ಗಳು ಯಾವುದೇ ಪರಿಸರ ಅಸ್ಥಿರಗಳನ್ನು ಅರ್ಥಮಾಡಿಕೊಳ್ಳುವುದಿಲ್ಲ. ಆದ್ದರಿಂದ, ನೀವು ಟ್ರಿಕ್ ಅನ್ನು ಬಳಸಬೇಕಾಗುತ್ತದೆ. ಅಂತಿಮ ಚಿತ್ರದಲ್ಲಿ, ನಾನು 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}.

ಹೆಚ್ಚಿನ ಆಧುನಿಕ SPA ಗಳು ನಿರ್ಮಿಸುವಾಗ ತಮ್ಮ ಫೈಲ್‌ಗಳಿಗೆ ಹ್ಯಾಶ್‌ಗಳನ್ನು ಸೇರಿಸುತ್ತವೆ ಎಂಬುದು ಗಮನಿಸಬೇಕಾದ ಸಂಗತಿ. ಬ್ರೌಸರ್ ದೀರ್ಘಕಾಲದವರೆಗೆ ಫೈಲ್ ಅನ್ನು ಸುರಕ್ಷಿತವಾಗಿ ಸಂಗ್ರಹಿಸಲು ಇದು ಅವಶ್ಯಕವಾಗಿದೆ. ಫೈಲ್ ಬದಲಾದರೆ, ಅದರ ಹ್ಯಾಶ್ ಬದಲಾಗುತ್ತದೆ, ಅದು ಫೈಲ್ ಅನ್ನು ಮತ್ತೆ ಡೌನ್‌ಲೋಡ್ ಮಾಡಲು ಬ್ರೌಸರ್ ಅನ್ನು ಒತ್ತಾಯಿಸುತ್ತದೆ.

ದುರದೃಷ್ಟವಶಾತ್, ನನ್ನ ವಿಧಾನದಲ್ಲಿ, ಪರಿಸರ ವೇರಿಯಬಲ್‌ಗಳ ಮೂಲಕ ಕಾನ್ಫಿಗರೇಶನ್ ಅನ್ನು ಬದಲಾಯಿಸುವುದರಿಂದ ಫೈಲ್ ಹ್ಯಾಶ್‌ನಲ್ಲಿ ಬದಲಾವಣೆಗೆ ಕಾರಣವಾಗುವುದಿಲ್ಲ, ಅಂದರೆ ಬ್ರೌಸರ್ ಸಂಗ್ರಹವನ್ನು ಬೇರೆ ರೀತಿಯಲ್ಲಿ ಅಮಾನ್ಯಗೊಳಿಸಬೇಕು. ವಿಭಿನ್ನ ಪರಿಸರದಲ್ಲಿ ವಿಭಿನ್ನ ಕಾನ್ಫಿಗರೇಶನ್‌ಗಳನ್ನು ನಿಯೋಜಿಸಿರುವುದರಿಂದ ನನಗೆ ಈ ಸಮಸ್ಯೆ ಇಲ್ಲ.

ಅಂತಿಮ ಚಿತ್ರವನ್ನು ಒಟ್ಟುಗೂಡಿಸುವುದು

ಅಂತಿಮವಾಗಿ.

ಡಾಕರ್‌ಫೈಲ್

# Первый базовый образ для сборки
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