{"id":328436,"date":"2022-01-23T15:00:11","date_gmt":"2022-01-23T15:00:11","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=328436"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=328436","title":{"rendered":"<span>\u041f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044f Vue.js-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 GitHub Packages \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e GitHub Actions \u0434\u043b\u044f \u0441\u0430\u043c\u044b\u0445 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0435\u0440\u0438\u0438 \u0432\u044b \u0443\u0437\u043d\u0430\u0435\u0442\u0435 \u043a\u0430\u043a \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0434\u043e\u043a\u0435\u0440-\u043e\u0431\u0440\u0430\u0437 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 <a href=\"https:\/\/vuejs.org\/\" rel=\"noopener noreferrer nofollow\">Vue.js<\/a> \u0438 \u043a\u0430\u043a \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0432\u00a0<a href=\"https:\/\/github.com\/features\/packages\" rel=\"noopener noreferrer nofollow\">GitHub Packages<\/a>. \u0412\u043e\u0442\u00a0<a href=\"https:\/\/github.com\/vanbv\/list-keep\/blob\/main\/.github\/workflows\/build.yml\" rel=\"noopener noreferrer nofollow\">\u0442\u0430\u043a<\/a>. \u0412\u043e\u0442 \u0432 \u043e\u0431\u0449\u0435\u043c-\u0442\u043e \u0438&#8230; \u043d\u0435 \u0432\u0441\u0451&#8230; \u041e\u0434\u043d\u0438\u043c <a href=\"https:\/\/github.com\/features\/actions\" rel=\"noopener noreferrer nofollow\">GitHub Action<\/a>, \u043a\u0430\u043a \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u0434\u043b\u044f <a href=\"https:\/\/spring.io\/projects\/spring-boot\" rel=\"noopener noreferrer nofollow\">Spring Boot<\/a>\u00a0\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043b <a href=\"https:\/\/habr.com\/ru\/post\/576412\/\" rel=\"noopener noreferrer nofollow\">\u0442\u0443\u0442<\/a>, \u0432 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f. \u041d\u0443\u0436\u043d\u043e \u0435\u0449\u0451 \u043f\u0440\u043e\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0438, \u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u044f \u0438 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u0432 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435.<\/p>\n<h3>\u0421\u0431\u043e\u0440\u043a\u0430 docker-\u043e\u0431\u0440\u0430\u0437\u0430<\/h3>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0431\u0443\u0434\u0435\u043c \u0432\u043e\u0442\u00a0<a href=\"https:\/\/github.com\/vanbv\/list-keep-front\" rel=\"noopener noreferrer nofollow\">\u044d\u0442\u043e\u0442<\/a>\u00a0\u043f\u0440\u043e\u0435\u043a\u0442. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e \u043d\u0451\u043c \u044f \u043f\u0438\u0441\u0430\u043b \u0432\u00a0<a href=\"https:\/\/habr.com\/ru\/post\/546428\/\" rel=\"noopener noreferrer nofollow\">\u044d\u0442\u043e\u0439<\/a>\u00a0\u0441\u0442\u0430\u0442\u044c\u0435.<\/p>\n<p>\u0418\u0442\u0430\u043a, \u043a\u0430\u043a \u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0434\u043e\u043a\u0435\u0440-\u043e\u0431\u0440\u0430\u0437 \u0434\u043b\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 <a href=\"https:\/\/vuejs.org\/\" rel=\"noopener noreferrer nofollow\">Vue.js<\/a>?! \u041e\u0431\u0440\u0430\u0442\u0438\u043c\u0441\u044f \u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c \u044d\u0442\u043e\u0433\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 \u0438 \u043f\u043e\u0438\u0449\u0435\u043c \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u0430\u0439\u0442\u0435 <a href=\"https:\/\/vuejs.org\/\" rel=\"noopener noreferrer nofollow\">Vue.js<\/a>. <a href=\"https:\/\/ru.vuejs.org\/v2\/cookbook\/dockerize-vuejs-app.html\" rel=\"noopener noreferrer nofollow\">\u0422\u0430\u043c<\/a> \u043d\u0430\u043c \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c Dockerfile \u0438 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0434\u0430\u044e\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0434\u0432\u0443\u0445 \u0434\u043e\u043a\u0435\u0440-\u0444\u0430\u0439\u043b\u043e\u0432.<\/p>\n<p>\u0412 \u043f\u0435\u0440\u0432\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0439, \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438,\u00a0<a href=\"https:\/\/github.com\/indexzero\/http-server\" rel=\"noopener noreferrer nofollow\">HTTP-\u0441\u0435\u0440\u0432\u0435\u0440<\/a>.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 \u0441 \u043f\u0440\u043e\u0441\u0442\u044b\u043c HTTP-\u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>FROM node:lts-alpine  # \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 HTTP-\u0441\u0435\u0440\u0432\u0435\u0440 \u0434\u043b\u044f \u0441\u0442\u0430\u0442\u0438\u043a\u0438 RUN npm install -g http-server  # \u0434\u0435\u043b\u0430\u0435\u043c \u043a\u0430\u0442\u0430\u043b\u043e\u0433 'app' \u0442\u0435\u043a\u0443\u0449\u0438\u043c \u0440\u0430\u0431\u043e\u0447\u0438\u043c \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u043e\u043c WORKDIR \/app  # \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u043e\u0431\u0430 'package.json' \u0438 'package-lock.json' (\u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c) COPY package*.json .\/  # \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 RUN npm install  # \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0444\u0430\u0439\u043b\u044b \u0438 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0432 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u043a\u0430\u0442\u0430\u043b\u043e\u0433 (\u0442.\u0435. \u0432 \u043a\u0430\u0442\u0430\u043b\u043e\u0433 'app') COPY . .  # \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f production \u0441 \u043c\u0438\u043d\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0435\u0439 RUN npm run build  EXPOSE 8080 CMD [ \"http-server\", \"dist\" ]<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0412 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043e\u0431 \u044d\u0442\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u043f\u0438\u0448\u0443\u0442, \u0447\u0442\u043e \u043e\u043d \u043f\u0440\u043e\u0441\u0442 \u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0443\u044f\u0437\u0432\u0438\u043c \u0434\u043b\u044f \u0445\u0430\u043a\u0435\u0440\u0441\u043a\u0438\u0445 \u0430\u0442\u0430\u043a, \u0438 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0448\u0438\u0440\u043e\u043a\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a\u00a0<a href=\"https:\/\/www.nginx.com\/\" rel=\"noopener noreferrer nofollow\">NGINX<\/a>\u00a0\u0438\u043b\u0438\u00a0<a href=\"https:\/\/httpd.apache.org\/\" rel=\"noopener noreferrer nofollow\">Apache<\/a>.<\/p>\n<p>\u0412\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0443\u0436\u0435 \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0435\u043d \u043a \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u0438 \u0432 \u043d\u0451\u043c \u043a\u0430\u043a \u0440\u0430\u0437 \u0442\u0430\u043a\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432\u044b\u0448\u0435 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044b\u0439 <a href=\"https:\/\/www.nginx.com\/\" rel=\"noopener noreferrer nofollow\">NGINX<\/a>.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 \u0441 NGINX<\/summary>\n<div class=\"spoiler__content\">\n<pre><code># \u044d\u0442\u0430\u043f \u0441\u0431\u043e\u0440\u043a\u0438 (build stage) FROM node:lts-alpine as build-stage WORKDIR \/app COPY package*.json .\/ RUN npm install COPY . . RUN npm run build  # \u044d\u0442\u0430\u043f production (production-stage) FROM nginx:stable-alpine as production-stage COPY --from=build-stage \/app\/dist \/usr\/share\/nginx\/html EXPOSE 80 CMD [\"nginx\", \"-g\", \"daemon off;\"]<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435, \u0447\u0435\u0433\u043e \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435, \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, \u044d\u0442\u043e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u044d\u0442\u043e\u0433\u043e \u0441\u0430\u043c\u043e\u0433\u043e NGINX. \u041e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u043d\u0443\u0436\u043d\u0430, \u0435\u0441\u043b\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0438\u0437 Vue.js \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u0431\u044d\u043a\u0435\u043d\u0434, \u0442.\u0435. \u043f\u0440\u043e\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u043a\u043e\u043f\u0430\u0442\u044c\u0441\u044f, \u0442\u043e \u0438 \u0442\u0430\u043a\u043e\u0439 <a href=\"https:\/\/cli.vuejs.org\/ru\/guide\/deployment.html#docker-nginx\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0438\u043c\u0435\u0440<\/a> \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043d\u0430 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u0430\u0439\u0442\u0435.<\/p>\n<pre><code>FROM node:latest as build-stage WORKDIR \/app COPY package*.json .\/ RUN npm install COPY .\/ . RUN npm run build  FROM nginx as production-stage RUN mkdir \/app COPY --from=build-stage \/app\/dist \/app COPY nginx.conf \/etc\/nginx\/nginx.conf<\/code><\/pre>\n<p>\u0412 \u044d\u0442\u043e\u043c Dockerfile \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <a href=\"https:\/\/docs.docker.com\/develop\/develop-images\/multistage-build\/\" rel=\"noopener noreferrer nofollow\">\u043c\u043d\u043e\u0433\u043e\u0441\u0442\u0443\u043f\u0435\u043d\u0447\u0430\u0442\u0430\u044f \u0441\u0431\u043e\u0440\u043a\u0430<\/a> \u0434\u043e\u043a\u0435\u0440-\u043e\u0431\u0440\u0430\u0437\u0430. \u041c\u043d\u043e\u0433\u043e\u0441\u0442\u0443\u043f\u0435\u043d\u0447\u0430\u0442\u044b\u0435 \u0441\u0431\u043e\u0440\u043a\u0438 \u043d\u0443\u0436\u043d\u044b, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0435 \u043e\u0431\u0440\u0430\u0437\u044b, \u0441\u00a0\u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u043d\u0430\u0431\u043e\u0440\u043e\u043c \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439, \u0442.\u0435. \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u00a0\u0442\u0435\u043c, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0434\u0432\u0430 \u044d\u0442\u0430\u043f\u0430 \u0441\u0431\u043e\u0440\u043a\u0438. \u041d\u0430 \u043f\u0435\u0440\u0432\u043e\u043c \u044d\u0442\u0430\u043f\u0435 &#8212; <code>build-stage<\/code> &#8212; \u0441\u0442\u044f\u0433\u0438\u0432\u0430\u0435\u0442\u0441\u044f <a href=\"https:\/\/nodejs.org\/\" rel=\"noopener noreferrer nofollow\">Node.js<\/a> \u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441\u0431\u043e\u0440\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f Vue.js \u0434\u043b\u044f production. \u041d\u0430 \u0432\u0442\u043e\u0440\u043e\u043c \u044d\u0442\u0430\u043f\u0435 &#8212; <code>production-stage<\/code> &#8212; \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0443\u0436\u0435 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0441\u0431\u043e\u0440\u043a\u0430 production \u043e\u0431\u0440\u0430\u0437\u0430.<\/p>\n<details class=\"spoiler\">\n<summary>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e Dockerfile<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0417\u0434\u0435\u0441\u044c, \u0434\u043b\u044f \u0441\u0430\u043c\u044b\u0445 \u043b\u044e\u0431\u043e\u0437\u043d\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445, \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u0434\u0430\u043d\u043d\u043e\u043c <a href=\"https:\/\/docs.docker.com\/engine\/reference\/builder\/\" rel=\"noopener noreferrer nofollow\">Dockerfile<\/a>.<\/p>\n<p><code>FROM node:latest as build-stage<\/code>. \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 <a href=\"https:\/\/docs.docker.com\/glossary\/#base-image\" rel=\"noopener noreferrer nofollow\">\u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043e\u0431\u0440\u0430\u0437\u0430<\/a> (\u0442.\u0435. \u043e\u0431\u0440\u0430\u0437\u0430, \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u044b, \u043f\u043e \u0441\u0443\u0442\u0438, \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u0441\u0432\u043e\u0439 \u043e\u0431\u0440\u0430\u0437 \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438), <a href=\"https:\/\/hub.docker.com\/_\/node\" rel=\"noopener noreferrer nofollow\">\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0440\u0430\u0437 Node.js<\/a> \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438. \u0422\u0430\u043a \u0436\u0435, \u0437\u0434\u0435\u0441\u044c \u043c\u044b \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u0442\u0430\u043f\u0430 \u0441\u0431\u043e\u0440\u043a\u0438 &#8212; build-stage, \u0447\u0442\u043e\u0431\u044b \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u0432 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 <code>COPY<\/code> \u043a \u044d\u0442\u043e\u043c\u0443 \u044d\u0442\u0430\u043f\u0443 \u043f\u043e \u0438\u043c\u0435\u043d\u0438. \u0418\u043c\u0435\u043d\u0430 \u044d\u0442\u0430\u043f\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u043d\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c, \u0438 \u0442\u043e\u0433\u0434\u0430 \u043a \u043d\u0438\u043c \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0446\u0438\u0444\u0440 (\u043a \u043f\u0435\u0440\u0432\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 <code>FROM<\/code> \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e 0 \u0438 \u0442.\u0434.).<\/p>\n<p><code>WORKDIR \/app<\/code>. \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e <code>app<\/code> \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0435\u0439, \u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 <code>COPY<\/code>, <code>ADD<\/code>, <code>RUN<\/code>, <code>CMD<\/code> \u0438 <code>ENTRYPOINT<\/code>, \u0438\u0434\u0443\u0449\u0438\u0435 \u0437\u0430 <code>WORKDIR<\/code>, \u0443\u0436\u0435 \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u044d\u0442\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0435\u0439. \u0415\u0441\u043b\u0438 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u0442\u043e <code>WORKDIR<\/code> \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u0435\u0451.<\/p>\n<p><code>COPY package*.json .\/<\/code>. \u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c <code>package.json<\/code> \u0438 <code>package-lock.json<\/code> \u0438\u0437 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0441\u0431\u043e\u0440\u043a\u0438 \u0432 \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0440\u0430\u0431\u043e\u0447\u0443\u044e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u044b\u043b\u0430 \u0437\u0430\u0434\u0430\u043d\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0435\u0439 <code>WORKDIR<\/code>, \u0442.\u0435. \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 <code>\/app<\/code>. \u0422\u0435\u043a\u0443\u0449\u0438\u0439 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0441\u0431\u043e\u0440\u043a\u0438 \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 <code>docker build<\/code>. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 <code>docker build .<\/code> \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0441\u0431\u043e\u0440\u043a\u0438 \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>.<\/code>, \u0447\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u044b\u043b\u0430 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430.<\/p>\n<p><code>RUN npm install<\/code>. \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <code>npm install<\/code>, \u0447\u0442\u043e\u0431\u044b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 (\u0430 \u0442\u0430\u043a\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u043e\u0432\u044b\u0439 <a href=\"https:\/\/docs.docker.com\/storage\/storagedriver\/#images-and-layers\" rel=\"noopener noreferrer nofollow\">\u0441\u043b\u043e\u0439<\/a> \u0432 \u0434\u043e\u043a\u0435\u0440-\u043e\u0431\u0440\u0430\u0437).<\/p>\n<p><code>COPY .\/ .<\/code>. \u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0432\u0441\u0435 \u0444\u0430\u0439\u043b\u044b \u0438 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0438\u0437 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0441\u0431\u043e\u0440\u043a\u0438 \u0432 \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0440\u0430\u0431\u043e\u0447\u0443\u044e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e. \u041d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044f \u043f\u043e\u043d\u0438\u043c\u0430\u044e <code>.\/<\/code> \u0438 <code>.<\/code> &#8212; \u044d\u0442\u043e \u043e\u0434\u043d\u043e \u0438 \u0442\u043e \u0436\u0435 \u0438 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e; \u043f\u0438\u0448\u0443\u0442 \u043f\u043e-\u0440\u0430\u0437\u043d\u043e\u043c\u0443, \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0434\u0447\u0435\u0440\u043a\u043d\u0443\u0442\u044c, \u0447\u0442\u043e \u044d\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f (\u043b\u0438\u0431\u043e \u043d\u0435\u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438 \u043a\u043e\u043f\u0438\u043f\u0430\u0441\u0442\u0430). \u0415\u0441\u043b\u0438 \u044f \u043e\u0448\u0438\u0431\u0430\u044e\u0441\u044c \u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u0435 \u0432\u0441\u0451-\u0442\u0430\u043a\u0438 \u0435\u0441\u0442\u044c &#8212; \u043f\u0438\u0448\u0438\u0442\u0435 \u043e\u0431 \u044d\u0442\u043e\u043c \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445.<br \/>\u0412\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c (\u0445\u043e\u0442\u044f, \u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, \u0438 \u043d\u0435\u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0442\u043e\u0436\u0435) \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c \u0447\u0442\u043e \u0437\u0430\u0447\u0435\u043c-\u0442\u043e \u0434\u043e \u044d\u0442\u043e\u0433\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0431\u044b\u043b\u0438 \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u044b <code>package.json<\/code> \u0438 <code>package-lock.json<\/code>, \u0430 \u0442\u0435\u043f\u0435\u0440\u044c \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432\u043e\u043e\u0431\u0449\u0435 \u0432\u0441\u0451, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0438 \u044d\u0442\u0438 \u0444\u0430\u0439\u043b\u044b. \u042d\u0442\u043e \u043d\u0443\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043a\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 <code>npm install<\/code>, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043b\u043e\u0451\u0432 \u0434\u043e\u043a\u0435\u0440\u0430. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0435\u0441\u043b\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f, \u0430 \u0442\u043e\u0447\u043d\u0435\u0435 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u0444\u0430\u0439\u043b\u044b <code>package.json<\/code> \u0438 <code>package-lock.json<\/code>, \u0442\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c, \u0430 \u0441\u0440\u0430\u0437\u0443 \u0432\u043e\u0437\u044c\u043c\u0451\u0442\u0441\u044f \u0438\u0437 \u043a\u0435\u0448\u0430. \u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u0441\u0431\u043e\u0440\u043a\u0438, \u0442.\u043a. \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043e\u043b\u0433\u043e\u0439.  \u0415\u0441\u043b\u0438 \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0440\u0430\u0437\u0443 \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0435\u0441\u044c \u043f\u0440\u043e\u0435\u043a\u0442, \u0430 \u0437\u0430\u0442\u0435\u043c \u0432\u044b\u0437\u0432\u0430\u0442\u044c <code>npm install<\/code>, \u0442\u043e \u043f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u043b\u044e\u0431\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e\u0431 \u044d\u0442\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c <a href=\"http:\/\/bitjudo.com\/blog\/2014\/03\/13\/building-efficient-dockerfiles-node-dot-js\/\" rel=\"noopener noreferrer nofollow\">\u0442\u0443\u0442<\/a>.<\/p>\n<p><code>RUN npm run build<\/code>. \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0441\u043a\u0440\u0438\u043f\u0442 <code>build<\/code> \u0438\u0437 <code>package.json<\/code>. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442<code>vue-cli-service build<\/code>. <a href=\"https:\/\/cli.vuejs.org\/ru\/guide\/cli-service.html#vue-cli-service-build\" rel=\"noopener noreferrer nofollow\">\u0414\u0430\u043d\u043d\u0430\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430<\/a> \u0441\u043e\u0431\u0435\u0440\u0451\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f production \u0441 \u043c\u0438\u043d\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0435\u0439 \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 <code>\/app\/dist<\/code>.<\/p>\n<p><code>FROM nginx as production-stage<\/code>. \u0417\u0434\u0435\u0441\u044c \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0432\u0442\u043e\u0440\u043e\u0439 \u044d\u0442\u0430\u043f \u0441\u0431\u043e\u0440\u043a\u0438 &#8212; <code>production-stage<\/code>. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043e\u0431\u0440\u0430\u0437\u0430 \u0431\u0435\u0440\u0451\u0442\u0441\u044f \u043e<a href=\"https:\/\/hub.docker.com\/_\/nginx\" rel=\"noopener noreferrer nofollow\">\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0440\u0430\u0437 NGINX<\/a> \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 (\u0442.\u043a. \u0442\u0435\u0433 \u044f\u0432\u043d\u043e \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d, \u0442\u043e \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f <code>latest<\/code>).<\/p>\n<p><code>RUN mkdir \/app<\/code>. \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \/app.<\/p>\n<p><code>COPY --from=build-stage \/app\/dist \/app<\/code>. \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>--from<\/code> \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u044d\u0442\u0430\u043f \u0441\u0431\u043e\u0440\u043a\u0438<code>build-stage<\/code> \u0438 \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0444\u0430\u0439\u043b\u044b \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 production \u043e\u0431\u0440\u0430\u0437.<\/p>\n<p><code>COPY nginx.conf \/etc\/nginx\/nginx.conf<\/code>. \u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u043a\u043e\u043d\u0444\u0438\u0433 \u0434\u043b\u044f NGINX \u0432 production \u043e\u0431\u0440\u0430\u0437.<\/p>\n<\/div>\n<\/details>\n<p>\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u0434\u043e\u043a\u0435\u0440-\u043e\u0431\u0440\u0430\u0437. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c Dockerfile \u0432 \u043a\u043e\u0440\u043d\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043d\u0430 Vue.js \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <code>docker build<\/code>.<\/p>\n<pre><code>docker build -t list-keep-front .<\/code><\/pre>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0438\u043c\u0435\u043d\u0438 \u0434\u043e\u043a\u0435\u0440-\u043e\u0431\u0440\u0430\u0437\u0430 \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u043b\u0438 <code>list-keep-front<\/code>, \u0430 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0437\u0430\u0434\u0430\u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e <code>.<\/code>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0438 \u0434\u043e\u043b\u0436\u0435\u043d \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f Dockerfile.<\/p>\n<p>\u0418\u0442\u0430\u043a \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0438&#8230; \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 (\u043f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435 \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u044c\u0438). \u0421\u044b\u043f\u0435\u0442\u0441\u044f \u043a\u0430\u043a\u0430\u044f-\u0442\u043e \u043e\u0448\u0438\u0431\u043a\u0430. \u0425\u043e\u0442\u044f, \u0432\u0440\u043e\u0434\u0435 \u0431\u044b, \u0432\u0441\u0451 \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0447\u0451\u0442\u043a\u043e \u043f\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438&#8230;<br \/>\u0412\u044b \u0432\u0441\u0451 \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u043f\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0438 \u0443 \u0432\u0430\u0441 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442?! \u0427\u0442\u043e \u0436, \u0434\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u0432 \u0443\u0432\u043b\u0435\u043a\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0438\u0440 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438!<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 \u043e\u0448\u0438\u0431\u043a\u0438 \u043f\u0440\u0438 \u0441\u0431\u043e\u0440\u043a\u0435 Dockerfile<\/summary>\n<div class=\"spoiler__content\">\n<pre><code> => ERROR [build-stage 6\/6] RUN npm run build                                                                                                                                                            4.2s ------  > [build-stage 6\/6] RUN npm run build: #15 0.782 #15 0.782 > list-keep-front@0.1.0 build #15 0.782 > vue-cli-service build #15 0.782 #15 1.284 #15 1.285 -  Building for production... #15 2.300 Error: error:0308010C:digital envelope routines::unsupported #15 2.300     at new Hash (node:internal\/crypto\/hash:67:19) #15 2.300     at Object.createHash (node:crypto:130:10) #15 2.300     at module.exports (\/app\/node_modules\/webpack\/lib\/util\/createHash.js:135:53) #15 2.300     at NormalModule._initBuildHash (\/app\/node_modules\/webpack\/lib\/NormalModule.js:417:16) #15 2.300     at handleParseError (\/app\/node_modules\/webpack\/lib\/NormalModule.js:471:10) #15 2.300     at \/app\/node_modules\/webpack\/lib\/NormalModule.js:503:5 #15 2.300     at \/app\/node_modules\/webpack\/lib\/NormalModule.js:358:12 #15 2.300     at \/app\/node_modules\/loader-runner\/lib\/LoaderRunner.js:373:3 #15 2.300     at iterateNormalLoaders (\/app\/node_modules\/loader-runner\/lib\/LoaderRunner.js:214:10) #15 2.300     at iterateNormalLoaders (\/app\/node_modules\/loader-runner\/lib\/LoaderRunner.js:221:10) #15 2.300     at \/app\/node_modules\/loader-runner\/lib\/LoaderRunner.js:236:3 #15 2.300     at runSyncOrAsync (\/app\/node_modules\/loader-runner\/lib\/LoaderRunner.js:130:11) #15 2.300     at iterateNormalLoaders (\/app\/node_modules\/loader-runner\/lib\/LoaderRunner.js:232:2) #15 2.300     at Array.&lt;anonymous> (\/app\/node_modules\/loader-runner\/lib\/LoaderRunner.js:205:4) #15 2.300     at Storage.finished (\/app\/node_modules\/enhanced-resolve\/lib\/CachedInputFileSystem.js:55:16) #15 2.300     at \/app\/node_modules\/enhanced-resolve\/lib\/CachedInputFileSystem.js:91:9 #15 4.161 \/app\/node_modules\/loader-runner\/lib\/LoaderRunner.js:114 #15 4.161                       throw e; #15 4.161                       ^ #15 4.161 #15 4.161 Error: error:0308010C:digital envelope routines::unsupported #15 4.161     at new Hash (node:internal\/crypto\/hash:67:19) #15 4.161     at Object.createHash (node:crypto:130:10) #15 4.161     at module.exports (\/app\/node_modules\/webpack\/lib\/util\/createHash.js:135:53) #15 4.161     at NormalModule._initBuildHash (\/app\/node_modules\/webpack\/lib\/NormalModule.js:417:16) #15 4.161     at handleParseError (\/app\/node_modules\/webpack\/lib\/NormalModule.js:471:10) #15 4.161     at \/app\/node_modules\/webpack\/lib\/NormalModule.js:503:5 #15 4.161     at \/app\/node_modules\/webpack\/lib\/NormalModule.js:358:12 #15 4.161     at \/app\/node_modules\/loader-runner\/lib\/LoaderRunner.js:373:3 #15 4.161     at iterateNormalLoaders (\/app\/node_modules\/loader-runner\/lib\/LoaderRunner.js:214:10) #15 4.161     at iterateNormalLoaders (\/app\/node_modules\/loader-runner\/lib\/LoaderRunner.js:221:10) #15 4.161     at \/app\/node_modules\/loader-runner\/lib\/LoaderRunner.js:236:3 #15 4.161     at context.callback (\/app\/node_modules\/loader-runner\/lib\/LoaderRunner.js:111:13) #15 4.161     at \/app\/node_modules\/cache-loader\/dist\/index.js:147:7 #15 4.161     at \/app\/node_modules\/graceful-fs\/graceful-fs.js:61:14 #15 4.161     at FSReqCallback.oncomplete (node:fs:188:23) { #15 4.161   opensslErrorStack: [ 'error:03000086:digital envelope routines::initialization error' ], #15 4.161   library: 'digital envelope routines', #15 4.161   reason: 'unsupported', #15 4.161   code: 'ERR_OSSL_EVP_UNSUPPORTED' #15 4.161 } #15 4.161 #15 4.161 Node.js v17.3.0 ------ executor failed running [\/bin\/sh -c npm run build]: exit code: 1<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0412\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u0437\u0430\u043c\u0435\u0442\u0438\u0442, \u0447\u0442\u043e \u043c\u044b \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u043a\u043e\u043d\u0444\u0438\u0433 NGINX, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0435\u0449\u0451 \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u043b\u0438. \u041c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432\u0441\u0451 \u0434\u0435\u043b\u043e \u0432 \u044d\u0442\u043e\u043c?! \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043d\u0435\u0442. \u0415\u0441\u043b\u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043b\u043e\u0433\u0438 \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u0447\u0442\u043e \u0432\u0441\u0451 \u0432\u0430\u043b\u0438\u0442\u0441\u044f \u043d\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 <code>RUN npm run build<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u0434\u0451\u0442 \u0437\u0430\u0434\u043e\u043b\u0433\u043e \u0434\u043e \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0435\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u043a\u043e\u043d\u0444\u0438\u0433\u0430. \u0418\u0442\u0430\u043a, \u0447\u0442\u043e \u0436\u0435 \u0434\u0435\u043b\u0430\u0442\u044c? \u041a\u0430\u043a \u0431\u044b\u0442\u044c? \u0418\u0434\u0451\u043c \u043a \u043d\u0430\u0448\u0435\u043c\u0443 \u043b\u0443\u0447\u0448\u0435\u043c\u0443 \u0434\u0440\u0443\u0433\u0443 <a href=\"https:\/\/www.google.ru\/\" rel=\"noopener noreferrer nofollow\">Google<\/a> \u0438 \u0438\u0449\u0435\u043c \u043e\u0442\u0432\u0435\u0442\u044b \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u0442\u0430\u043c. \u0418 <a href=\"https:\/\/github.com\/webpack\/webpack\/issues\/14532#issuecomment-947807590\" rel=\"noopener noreferrer nofollow\">\u0443\u0437\u043d\u0430\u0451\u043c<\/a>, \u0447\u0442\u043e \u044d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u043c\u0438 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 <a href=\"https:\/\/webpack.js.org\/\" rel=\"noopener noreferrer nofollow\">Webpack<\/a> (\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432\u043e Vue.js) \u0438 Node.js 17, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0434\u043b\u044f <a href=\"https:\/\/www.openssl.org\/\" rel=\"noopener noreferrer nofollow\">OpenSSL<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 Webpack, \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0432 Node.js. \u041d\u0430 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044f \u043f\u043e\u043d\u044f\u043b, \u0432 5-\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 Webpack \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0440\u0435\u0448\u0438\u043b\u0438, \u043d\u043e \u0432 4-\u0439 <a href=\"https:\/\/github.com\/webpack\/webpack\/issues\/14532#issuecomment-947513562\" rel=\"noopener noreferrer nofollow\">\u0440\u0435\u0448\u0438\u043b\u0438 \u043d\u0435 \u043f\u0440\u0430\u0432\u0438\u0442\u044c<\/a>. \u0410 Vue.js \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043c\u043e\u043c\u0435\u043d\u0442, \u0434\u0430\u0436\u0435 \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445, \u0435\u0441\u043b\u0438 \u044f \u043d\u0435 \u043e\u0448\u0438\u0431\u0430\u044e\u0441\u044c, <a href=\"https:\/\/github.com\/vuejs\/vue\/blob\/dev\/package.json\" rel=\"noopener noreferrer nofollow\">\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442<\/a> Webpack 4, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u0430\u0436\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u0430 \u0441\u0430\u043c\u0443\u044e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u0432\u0435\u0440\u0441\u0438\u044e Vue.js, \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u043d\u0435 \u043f\u043e\u043c\u043e\u0436\u0435\u0442 (\u043d\u043e \u044f \u043d\u0435 \u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b).<\/p>\n<p>\u0418\u0442\u0430\u043a, \u043a\u0430\u043a \u0436\u0435 \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430\u0445 <a href=\"https:\/\/github.com\/facebook\/create-react-app\/issues\/11708#issuecomment-985218108\" rel=\"noopener noreferrer nofollow\">\u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e\u0442<\/a> \u0440\u0435\u0448\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u0443\u044e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443? \u041e\u0434\u0438\u043d \u0438\u0437 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 &#8212; \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0441\u0442\u0430\u0440\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e Node.js, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, 16. \u041d\u043e \u0443 \u043c\u0435\u043d\u044f \u044d\u0442\u043e\u0442 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043d\u0435 \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u043b, \u044f \u043f\u043e\u043b\u0443\u0447\u0430\u043b \u0432\u0441\u0451 \u0442\u0443 \u0436\u0435 \u043e\u0448\u0438\u0431\u043a\u0443. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u044d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e, \u0432 \u0441\u0432\u044f\u0437\u0438 \u0441 \u043d\u0435 \u0442\u0430\u043a \u0434\u0430\u0432\u043d\u043e \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u0439 <a href=\"https:\/\/www.docker.com\/blog\/apache-log4j-2-cve-2021-44228\/\" rel=\"noopener noreferrer nofollow\">\u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u044c\u044e log4j<\/a>, \u0432\u0441\u0435 \u0434\u043e\u043a\u0435\u0440-\u043e\u0431\u0440\u0430\u0437\u044b \u043f\u043e\u043f\u0435\u0440\u0435\u0441\u043e\u0431\u0440\u0430\u043b\u0438 \u0438 \u0432 \u0438\u0442\u043e\u0433\u0435 \u0432 16-\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0447\u0435\u0433\u043e-\u0442\u043e \u043f\u043e\u0432\u044b\u043f\u0438\u043b\u0438\u0432\u0430\u043b\u0438. \u0415\u0449\u0451 \u043e\u0434\u0438\u043d \u0432\u0430\u0440\u0438\u0430\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u044f \u0438 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f &#8212; \u044d\u0442\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f <a href=\"https:\/\/nodejs.org\/api\/cli.html#node_optionsoptions\" rel=\"noopener noreferrer nofollow\">NODE_OPTIONS<\/a> \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f <a href=\"https:\/\/www.openssl.org\/docs\/man3.0\/man7\/OSSL_PROVIDER-legacy.html\" rel=\"noopener noreferrer nofollow\">&#8212;openssl-legacy-provider<\/a>, \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0447\u0435\u0433\u043e \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u0439 OpenSSL \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0431\u0443\u0434\u0443\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u043b\u044f Webpack. \u0421\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u0432 Dockerfile \u0441\u0442\u0440\u043e\u043a\u0443 <code>ENV NODE_OPTIONS=--openssl-legacy-provider<\/code>.<\/p>\n<details class=\"spoiler\">\n<summary>\u0418\u0442\u043e\u0433\u043e\u0432\u044b\u0439 Dockerfile<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>FROM node:latest as build-stage ENV NODE_OPTIONS=--openssl-legacy-provider WORKDIR \/app COPY package*.json .\/ RUN npm install COPY .\/ . RUN npm run build  FROM nginx as production-stage RUN mkdir \/app COPY --from=build-stage \/app\/dist \/app COPY nginx.conf \/etc\/nginx\/nginx.conf<\/code><\/pre>\n<\/div>\n<\/details>\n<h2>\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f NGINX<\/h2>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 NGINX \u043c\u043e\u0436\u043d\u043e \u0432\u0437\u044f\u0442\u044c \u0441 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u0430\u0439\u0442\u0430 Vue.js \u0438\u0437 \u0442\u043e\u0433\u043e \u0436\u0435 <a href=\"https:\/\/cli.vuejs.org\/ru\/guide\/deployment.html#docker-nginx\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0438\u043c\u0435\u0440\u0430<\/a>, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u044b \u0431\u0440\u0430\u043b\u0438 \u043f\u0440\u0438\u043c\u0435\u0440 Dockerfile. \u0418\u0442\u043e\u0433\u043e, \u0434\u043b\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 NGINX \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0432 \u043a\u043e\u0440\u043d\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043d\u0430 Vue.js \u0444\u0430\u0439\u043b <code>nginx.conf<\/code> \u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c.<\/p>\n<pre><code>user  nginx; worker_processes  1; error_log  \/var\/log\/nginx\/error.log warn; pid        \/var\/run\/nginx.pid; events {   worker_connections  1024; } http {   include       \/etc\/nginx\/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;   server {     listen       80;     server_name  localhost;     location \/ {       root   \/app;       index  index.html;       try_files $uri $uri\/ \/index.html;     }     error_page   500 502 503 504  \/50x.html;     location = \/50x.html {       root   \/usr\/share\/nginx\/html;     }   } }<\/code><\/pre>\n<p>\u0414\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u043d\u0444\u0438\u0433 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u043f\u043e\u0440\u0442\u0443 80 \u0434\u043e\u043a\u0435\u0440-\u043e\u0431\u0440\u0430\u0437\u0430 \u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 http-\u0437\u0430\u043f\u0440\u043e\u0441\u0430 <code>\/<\/code> \u043d\u0430 \u0444\u0430\u0439\u043b <code>index.html<\/code>. \u0422.\u0435. \u043f\u0440\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0435 <code>\/<\/code> <a href=\"https:\/\/cli.vuejs.org\/ru\/guide\/html-and-static-assets.html#%D1%81%D1%82%D0%B0%D1%80%D1%82%D0%BE%D0%B2%D1%8B%D0%B9-%D1%84%D0%B0%D0%B9n\" rel=\"noopener noreferrer nofollow\">\u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f<\/a>, \u043f\u043e \u0441\u0443\u0442\u0438, \u043d\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 Vue.js.<\/p>\n<details class=\"spoiler\">\n<summary>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e nginx.conf<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0417\u0434\u0435\u0441\u044c, \u043e\u043f\u044f\u0442\u044c \u0436\u0435, \u0434\u043b\u044f \u0441\u0430\u043c\u044b\u0445 \u043b\u044e\u0431\u043e\u0437\u043d\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445, \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u0434\u0430\u043d\u043d\u043e\u043c <a href=\"https:\/\/nginx.org\/ru\/docs\/beginners_guide.html#conf_structure\" rel=\"noopener noreferrer nofollow\">nginx.conf<\/a>.<\/p>\n<p>\u041a\u043e\u043d\u0444\u0438\u0433 NGINX \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0437 \u0441\u0435\u0431\u044f, \u043f\u043e \u0441\u0443\u0442\u0438, \u043d\u0430\u0431\u043e\u0440 \u0434\u0438\u0440\u0435\u043a\u0442\u0438\u0432. \u0414\u0438\u0440\u0435\u043a\u0442\u0438\u0432\u044b \u0431\u044b\u0432\u0430\u044e\u0442 \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u0438 \u0431\u043b\u043e\u0447\u043d\u044b\u0435. \u041f\u0440\u043e\u0441\u0442\u0430\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u0438\u0432\u0430 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0438\u043c\u0435\u043d\u0438 \u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432, \u0440\u0430\u0437\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0431\u0435\u043b\u0430\u043c\u0438, \u0438 \u043e\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u0447\u043a\u043e\u0439 \u0441 \u0437\u0430\u043f\u044f\u0442\u043e\u0439. \u0411\u043b\u043e\u0447\u043d\u0430\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u0438\u0432\u0430 \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u0430 \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a \u0438 \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u0438\u0432\u0430, \u043d\u043e \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0447\u043a\u0438 \u0441 \u0437\u0430\u043f\u044f\u0442\u043e\u0439 \u043f\u043e\u0441\u043b\u0435 \u0438\u043c\u0435\u043d\u0438 \u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043d\u0430\u0431\u043e\u0440 \u0434\u0440\u0443\u0433\u0438\u0445 \u0434\u0438\u0440\u0435\u043a\u0442\u0438\u0432, \u043f\u043e\u043c\u0435\u0449\u0451\u043d\u043d\u044b\u0445 \u0432\u043d\u0443\u0442\u0440\u0438 \u0444\u0438\u0433\u0443\u0440\u043d\u044b\u0445 \u0441\u043a\u043e\u0431\u043e\u043a.<\/p>\n<p>\u0418\u0442\u0430\u043a, \u043f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043a \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u043d\u0430\u0448\u0435\u0433\u043e \u043a\u043e\u043d\u0444\u0438\u0433\u0430.<\/p>\n<p><a href=\"https:\/\/nginx.org\/ru\/docs\/ngx_core_module.html#user\" rel=\"noopener noreferrer nofollow\">user nginx<\/a>. \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c, \u043f\u043e\u0434 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f NGINX \u0432 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u043c <a href=\"https:\/\/hub.docker.com\/_\/nginx\" rel=\"noopener noreferrer nofollow\">\u0434\u043e\u043a\u0435\u0440-\u043e\u0431\u0440\u0430\u0437\u0435<\/a> (\u0431\u0435\u0437 \u043f\u0440\u0438\u0432\u0438\u043b\u0435\u0433\u0438\u0439 root).<\/p>\n<p><a href=\"https:\/\/nginx.org\/ru\/docs\/ngx_core_module.html#worker_processes\" rel=\"noopener noreferrer nofollow\">worker_processes 1<\/a>. \u0427\u0438\u0441\u043b\u043e \u0440\u0430\u0431\u043e\u0447\u0438\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432. \u041e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0444\u0430\u043a\u0442\u043e\u0440\u043e\u0432, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0447\u0438\u0441\u043b\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043d\u044b\u0445 \u044f\u0434\u0435\u0440, \u0447\u0438\u0441\u043b\u043e \u0436\u0451\u0441\u0442\u043a\u0438\u0445 \u0434\u0438\u0441\u043a\u043e\u0432  \u0438 \u0442.\u043f. \u0412 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e\u0442 \u043f\u0440\u0438 \u0437\u0430\u0442\u0440\u0443\u0434\u043d\u0435\u043d\u0438\u0438 \u0432 \u0432\u044b\u0431\u043e\u0440\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0430\u0447\u0430\u0442\u044c \u0441 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0435\u0433\u043e \u0440\u0430\u0432\u043d\u044b\u043c \u0447\u0438\u0441\u043b\u0443 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043d\u044b\u0445 \u044f\u0434\u0435\u0440. \u0422\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>auto <\/code>\u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043d\u044b\u0445 \u044f\u0434\u0435\u0440.<\/p>\n<p><a href=\"https:\/\/nginx.org\/ru\/docs\/ngx_core_module.html#error_log\" rel=\"noopener noreferrer nofollow\">error_log \/var\/log\/nginx\/error.log warn<\/a>. \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u043b\u043e\u0433\u043e\u0432 \u043e\u0448\u0438\u0431\u043e\u043a. \u041f\u0435\u0440\u0432\u044b\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 &#8212; <code>\/var\/log\/nginx\/error.log<\/code> &#8212; \u0437\u0430\u0434\u0430\u0451\u0442 \u0444\u0430\u0439\u043b, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0431\u0443\u0434\u0443\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u043b\u043e\u0433\u0438. \u0412 \u043d\u0451\u043c \u0431\u0443\u0434\u0443\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432\u0441\u0435 \u043e\u0448\u0438\u0431\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0438 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b NGIINX. \u0412\u0442\u043e\u0440\u043e\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 &#8212; <code>warn<\/code> &#8212; \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p><a href=\"https:\/\/nginx.org\/ru\/docs\/ngx_core_module.html#pid\" rel=\"noopener noreferrer nofollow\">pid \/var\/run\/nginx.pid<\/a>. \u0417\u0430\u0434\u0430\u0451\u0442\u00a0\u0444\u0430\u0439\u043b, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u043d\u043e\u043c\u0435\u0440 \u0433\u043b\u0430\u0432\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430.<\/p>\n<p><a href=\"https:\/\/nginx.org\/ru\/docs\/ngx_core_module.html#events\" rel=\"noopener noreferrer nofollow\">events<\/a>. \u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0431\u043b\u043e\u0447\u043d\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u0438\u0432\u0435 \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f, \u0432\u043b\u0438\u044f\u044e\u0449\u0430\u044f \u043d\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439.<\/p>\n<p><a href=\"https:\/\/nginx.org\/ru\/docs\/ngx_core_module.html#worker_connections\" rel=\"noopener noreferrer nofollow\">worker_connections 1024<\/a>. \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441. \u0421\u043b\u0435\u0434\u0443\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u0432 \u0432\u0438\u0434\u0443, \u0447\u0442\u043e \u0432 \u044d\u0442\u043e \u0447\u0438\u0441\u043b\u043e \u0432\u0445\u043e\u0434\u044f\u0442 \u0432\u0441\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0441 \u043f\u0440\u043e\u043a\u0441\u0438\u0440\u0443\u0435\u043c\u044b\u043c\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u043c\u0438, \u0430 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0441 \u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043c\u0438.<\/p>\n<p><a href=\"https:\/\/nginx.org\/ru\/docs\/http\/ngx_http_core_module.html#http\" rel=\"noopener noreferrer nofollow\">http<\/a>. \u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0431\u043b\u043e\u0447\u043d\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u0438\u0432\u0435 \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f HTTP-\u0441\u0435\u0440\u0432\u0435\u0440\u0430.<\/p>\n<p><a href=\"https:\/\/nginx.org\/ru\/docs\/ngx_core_module.html#include\" rel=\"noopener noreferrer nofollow\">include \/etc\/nginx\/mime.types<\/a>. \u0412\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0444\u0430\u0439\u043b <a href=\"https:\/\/nginx.org\/ru\/docs\/http\/ngx_http_core_module.html#types\" rel=\"noopener noreferrer nofollow\">mime.types<\/a>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u043e\u043b\u043d\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0439 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 \u0438\u043c\u0451\u043d \u0444\u0430\u0439\u043b\u043e\u0432 \u0438 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA_MIME-%D1%82%D0%B8%D0%BF%D0%BE%D0%B2\" rel=\"noopener noreferrer nofollow\">MIME-\u0442\u0438\u043f\u043e\u0432<\/a> \u043e\u0442\u0432\u0435\u0442\u043e\u0432.<\/p>\n<p><a href=\"https:\/\/nginx.org\/ru\/docs\/http\/ngx_http_core_module.html#default_type\" rel=\"noopener noreferrer nofollow\">default_type application\/octet-stream<\/a>. \u0417\u0430\u0434\u0430\u0451\u0442 MIME-\u0442\u0438\u043f \u043e\u0442\u0432\u0435\u0442\u043e\u0432 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e.<\/p>\n<p><a href=\"https:\/\/nginx.org\/ru\/docs\/http\/ngx_http_log_module.html#log_format\" rel=\"noopener noreferrer nofollow\">log_format main &#8216;&#8230;&#8217;<\/a>. \u0417\u0430\u0434\u0430\u0451\u0442 \u0444\u043e\u0440\u043c\u0430\u0442 \u043b\u043e\u0433\u043e\u0432, \u0433\u0434\u0435<code>main<\/code> &#8212; \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043b\u043e\u0433\u0430, \u0430 \u0437\u0430\u0442\u0435\u043c  \u0438\u0434\u0451\u0442 \u0441\u0442\u0440\u043e\u043a\u0430 \u0441\u0430\u043c\u043e\u0433\u043e \u043b\u043e\u0433\u0430. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <a href=\"http:\/\/nginx.org\/ru\/docs\/varindex.html\" rel=\"noopener noreferrer nofollow\">\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435<\/a>. \u0415\u0441\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0439\u0434\u0435\u043d\u043e, \u0442\u043e \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u043b\u043e\u0433 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u0438\u043c\u0432\u043e\u043b <code>-<\/code>. \u041d\u0438\u0436\u0435 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u044b \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0432 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u043b\u043e\u0433\u043e\u0432.<\/p>\n<ul>\n<li>\n<p><a href=\"http:\/\/nginx.org\/ru\/docs\/http\/ngx_http_core_module.html#var_remote_addr\" rel=\"noopener noreferrer nofollow\">$remote_addr<\/a> &#8212; \u0430\u0434\u0440\u0435\u0441 \u043a\u043b\u0438\u0435\u043d\u0442\u0430.<\/p>\n<\/li>\n<li>\n<p><a href=\"http:\/\/nginx.org\/ru\/docs\/http\/ngx_http_core_module.html#var_remote_user\" rel=\"noopener noreferrer nofollow\">$remote_user<\/a> &#8212; \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0432 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%90%D1%83%D1%82%D0%B5%D0%BD%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%8F_%D0%B2_%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%BD%D0%B5%D1%82%D0%B5#%D0%91%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D1%8F_%D0%B0%D1%83%D1%82%D0%B5%D0%BD%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%8F\" rel=\"noopener noreferrer nofollow\">Basic \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438<\/a>.<\/p>\n<\/li>\n<li>\n<p><a href=\"http:\/\/nginx.org\/ru\/docs\/http\/ngx_http_log_module.html#var_time_local\" rel=\"noopener noreferrer nofollow\">$time_local<\/a> &#8212; \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0432 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Common_Log_Format\" rel=\"noopener noreferrer nofollow\">Common Log Format<\/a>.<\/p>\n<\/li>\n<li>\n<p><a href=\"http:\/\/nginx.org\/ru\/docs\/http\/ngx_http_core_module.html#var_request\" rel=\"noopener noreferrer nofollow\">$request<\/a> &#8212; \u043f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0446\u0435\u043b\u0438\u043a\u043e\u043c.<\/p>\n<\/li>\n<li>\n<p><a href=\"http:\/\/nginx.org\/ru\/docs\/http\/ngx_http_log_module.html#var_status\" rel=\"noopener noreferrer nofollow\">$status<\/a> &#8212; \u0441\u0442\u0430\u0442\u0443\u0441 \u043e\u0442\u0432\u0435\u0442\u0430.<\/p>\n<\/li>\n<li>\n<p><a href=\"http:\/\/nginx.org\/ru\/docs\/http\/ngx_http_core_module.html#var_body_bytes_sent\" rel=\"noopener noreferrer nofollow\">$body_bytes_sent<\/a> &#8212; \u0447\u0438\u0441\u043b\u043e \u0431\u0430\u0439\u0442, \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u0443, \u0431\u0435\u0437 \u0443\u0447\u0451\u0442\u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u043e\u0442\u0432\u0435\u0442\u0430.<\/p>\n<\/li>\n<li>\n<p><a href=\"http:\/\/nginx.org\/ru\/docs\/http\/ngx_http_core_module.html#var_http_\" rel=\"noopener noreferrer nofollow\">$http_\u0438\u043c\u044f<\/a> &#8212; \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0437\u0430\u043f\u0440\u043e\u0441\u0430. \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0447\u0430\u0441\u0442\u044c \u0438\u043c\u0435\u043d\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0438\u043c\u0435\u043d\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430, \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043d\u043d\u043e\u043c\u0443 \u043a \u043d\u0438\u0436\u043d\u0435\u043c\u0443 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0443, \u0441 \u0437\u0430\u043c\u0435\u043d\u043e\u0439 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0442\u0438\u0440\u0435 \u043d\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u043f\u043e\u0434\u0447\u0451\u0440\u043a\u0438\u0432\u0430\u043d\u0438\u044f. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c <code>$http_referer<\/code>, <code>$http_user_agent<\/code> \u0438 <code>$http_x_forwarded_for<\/code>.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u043b\u043e\u0433\u0430 \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043d\u0438\u0436\u0435.<\/p>\n<pre><code>172.17.0.1 - - [08\/Jan\/2022:19:53:06 +0000] \"GET \/js\/app.18156e39.js HTTP\/1.1\" 200 6365 \"http:\/\/localhost:8081\/\" \"Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/96.0 .4664.110 Safari\/537.36\" \"-\"<\/code><\/pre>\n<p><a href=\"https:\/\/nginx.org\/ru\/docs\/http\/ngx_http_log_module.html#access_log\" rel=\"noopener noreferrer nofollow\">access_log  \/var\/log\/nginx\/access.log main<\/a>. \u0417\u0430\u0434\u0430\u0451\u0442 \u043f\u0443\u0442\u044c, \u0444\u043e\u0440\u043c\u0430\u0442 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u043b\u043e\u0433\u043e\u0432 \u0434\u043e\u0441\u0442\u0443\u043f\u0430. \u0412 \u043b\u043e\u0433\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0443\u0442\u0438 \u0443\u043a\u0430\u0437\u0430\u043d <code>\/var\/log\/nginx\/access.log<\/code>, \u0430 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 &#8212; <code>main<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b\u043b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d \u0440\u0430\u043d\u0435\u0435 \u0447\u0435\u0440\u0435\u0437 <code>log_format<\/code>.<\/p>\n<p>\u041a\u0441\u0442\u0430\u0442\u0438 \u0433\u043e\u0432\u043e\u0440\u044f, \u0435\u0441\u043b\u0438 \u0432\u044b \u0432\u0434\u0440\u0443\u0433 \u0437\u0430\u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043b\u043e\u0433\u0438 \u0432 \u0434\u043e\u043a\u0435\u0440-\u043e\u0431\u0440\u0430\u0437\u0435 \u0438 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u0442\u0435 \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0444\u0430\u0439\u043b <code>\/var\/log\/nginx\/access.log<\/code> \u0438\u043b\u0438 <code>\/var\/log\/nginx\/error.log<\/code>, \u0442\u043e \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0442\u0435, \u0447\u0442\u043e \u044d\u0442\u0438 \u0444\u0430\u0439\u043b\u044b \u0431\u0443\u0434\u0443\u0442 \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u0443\u0441\u0442\u044b, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043b\u043e\u0433\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u0438\u0441\u0430\u0442\u044c\u0441\u044f \u0432 \u044d\u0442\u0438 \u0444\u0430\u0439\u043b\u044b, \u043f\u0438\u0448\u0443\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c. \u041f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u044d\u0442\u043e \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043b\u043e\u0433\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0438 \u043e\u0448\u0438\u0431\u043e\u043a <a href=\"https:\/\/docs.docker.com\/config\/containers\/logging\/\" rel=\"noopener noreferrer nofollow\">\u043f\u0435\u0440\u0435\u0441\u044b\u043b\u0430\u044e\u0442\u0441\u044f<\/a> \u0432 \u0441\u0431\u043e\u0440\u0449\u0438\u043a \u043b\u043e\u0433\u043e\u0432 docker. \u0414\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u044d\u0442\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u0438\u043c\u0432\u043e\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u0441\u044b\u043b\u043e\u043a \u0441 <code>\/var\/log\/nginx\/access.log<\/code> \u043d\u0430 <a href=\"https:\/\/unix.stackexchange.com\/a\/400864\" rel=\"noopener noreferrer nofollow\">\/dev\/stdout<\/a> \u0438 \u0441 <code>\/var\/log\/nginx\/error.log<\/code> \u043d\u0430 <a href=\"https:\/\/unix.stackexchange.com\/a\/400864\" rel=\"noopener noreferrer nofollow\">\/dev\/stderr<\/a>. \u0412 <a href=\"https:\/\/github.com\/nginxinc\/docker-nginx\/blob\/master\/Dockerfile-alpine.template\" rel=\"noopener noreferrer nofollow\">Dockerfile<\/a>, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f <a href=\"https:\/\/hub.docker.com\/_\/nginx\" rel=\"noopener noreferrer nofollow\">\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0440\u0430\u0437 \u0434\u043b\u044f NGINX<\/a>, \u044d\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e <a href=\"https:\/\/github.com\/nginxinc\/docker-nginx\/blob\/master\/Dockerfile-alpine.template#L107\" rel=\"noopener noreferrer nofollow\">\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c<\/a>:<\/p>\n<pre><code># forward request and error logs to docker log collector     &amp;&amp; ln -sf \/dev\/stdout \/var\/log\/nginx\/access.log \\     &amp;&amp; ln -sf \/dev\/stderr \/var\/log\/nginx\/error.log \\<\/code><\/pre>\n<p><a href=\"https:\/\/nginx.org\/ru\/docs\/http\/ngx_http_core_module.html#sendfile\" rel=\"noopener noreferrer nofollow\">sendfile on<\/a>. \u0420\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442 \u0438\u043b\u0438 \u0437\u0430\u043f\u0440\u0435\u0449\u0430\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u00a0<a href=\"https:\/\/man7.org\/linux\/man-pages\/man2\/sendfile.2.html\" rel=\"noopener noreferrer nofollow\">sendfile()<\/a>. sendfile() \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u043c \u0432\u044b\u0437\u043e\u0432\u043e\u043c \u0438 \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c. \u0412 \u0441\u0442\u0430\u0442\u044c\u044f\u0445 \u043f\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0430\u0431\u043e\u0442\u044b NGINX \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e\u0442 \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0434\u043b\u044f \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u0435\u0441\u043b\u0438 NGINX \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0444\u0430\u0439\u043b\u044b.\u00a0\u0415\u0441\u043b\u0438 \u0436\u0435 NGINX, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043f\u0440\u043e\u043a\u0441\u0438 \u0434\u043b\u044f \u0432\u044b\u0434\u0430\u0447\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u0442\u043e sendfile() \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f, \u0438 \u044d\u0442\u043e\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043a\u043b\u044e\u0447\u0438\u0442\u044c.  <\/p>\n<p><a href=\"https:\/\/nginx.org\/ru\/docs\/http\/ngx_http_core_module.html#keepalive_timeout\" rel=\"noopener noreferrer nofollow\">keepalive_timeout 65<\/a>. \u0417\u0430\u0434\u0430\u0451\u0442 \u0442\u0430\u0439\u043c\u0430\u0443\u0442, \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9F%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%BD%D0%BE%D0%B5_HTTP-%D1%81%D0%BE%D0%B5%D0%B4%D0%B8%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5\" rel=\"noopener noreferrer nofollow\">keep-alive<\/a> \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0441 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u043c \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043a\u0440\u044b\u0442\u043e \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0441\u0435\u0440\u0432\u0435\u0440\u0430. \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 0 \u0437\u0430\u043f\u0440\u0435\u0449\u0430\u0435\u0442 <code>keep-alive<\/code> \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0441 \u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043c\u0438.<\/p>\n<p><a href=\"https:\/\/nginx.org\/ru\/docs\/http\/ngx_http_core_module.html#server\" rel=\"noopener noreferrer nofollow\">server<\/a>. \u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0431\u043b\u043e\u0447\u043d\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u0438\u0432\u0435 \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430. \u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e.<\/p>\n<p><a href=\"https:\/\/nginx.org\/ru\/docs\/http\/ngx_http_core_module.html#listen\" rel=\"noopener noreferrer nofollow\">listen 80<\/a>. \u0417\u0430\u0434\u0430\u0451\u0442 \u0430\u0434\u0440\u0435\u0441 \u0438 \u043f\u043e\u0440\u0442, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u0435\u0440\u0432\u0435\u0440 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b. \u041c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0430\u0434\u0440\u0435\u0441 \u0438 \u043f\u043e\u0440\u0442, \u043b\u0438\u0431\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0430\u0434\u0440\u0435\u0441 \u0438\u043b\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0440\u0442. \u0422\u0430\u043a\u0436\u0435 \u0437\u0434\u0435\u0441\u044c \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>default_server<\/code>. \u0415\u0441\u043b\u0438 \u0443 \u0434\u0438\u0440\u0435\u043a\u0442\u0438\u0432\u044b \u0435\u0441\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>default_server<\/code>, \u0442\u043e \u0441\u0435\u0440\u0432\u0435\u0440, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043e\u043f\u0438\u0441\u0430\u043d\u0430 \u044d\u0442\u0430 \u0434\u0438\u0440\u0435\u043a\u0442\u0438\u0432\u0430, \u0431\u0443\u0434\u0435\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0434\u043b\u044f \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u043f\u0430\u0440\u044b <code>\u0430\u0434\u0440\u0435\u0441:\u043f\u043e\u0440\u0442<\/code>. \u0415\u0441\u043b\u0438 \u0436\u0435 \u0434\u0438\u0440\u0435\u043a\u0442\u0438\u0432 \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c <code>default_server<\/code> \u043d\u0435\u0442, \u0442\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043e\u043f\u0438\u0441\u0430\u043d\u0430 \u043f\u0430\u0440\u0430 <code>\u0430\u0434\u0440\u0435\u0441:\u043f\u043e\u0440\u0442<\/code>.<\/p>\n<p><a href=\"https:\/\/nginx.org\/ru\/docs\/http\/ngx_http_core_module.html#server_name\" rel=\"noopener noreferrer nofollow\">server_name localhost<\/a>. \u0417\u0430\u0434\u0430\u0451\u0442 \u0438\u043c\u0435\u043d\u0430 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430. \u0418\u043c\u0435\u043d\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442, \u0432 \u043a\u0430\u043a\u043e\u043c \u0431\u043b\u043e\u043a\u0435\u00a0server\u00a0\u0431\u0443\u0434\u0435\u0442 <a href=\"https:\/\/nginx.org\/ru\/docs\/http\/request_processing.html\" rel=\"noopener noreferrer nofollow\">\u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c\u0441\u044f<\/a> \u0437\u0430\u043f\u0440\u043e\u0441. \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u044d\u0442\u043e \u043f\u0443\u0442\u0451\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 <code>Host<\/code> \u043d\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0438\u043c\u0435\u043d\u0430\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043f\u043e <a href=\"https:\/\/nginx.org\/ru\/docs\/http\/server_names.html\" rel=\"noopener noreferrer nofollow\">\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u043c \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c<\/a>. \u0415\u0441\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 <code>Host<\/code> \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043d\u0438 \u043e\u0434\u043d\u043e\u043c\u0443 \u0438\u0437 \u0438\u043c\u0451\u043d \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 \u0438\u043b\u0438 \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043d\u0435\u0442 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u044f \u0432\u043e\u0432\u0441\u0435, NGINX \u043d\u0430\u043f\u0440\u0430\u0432\u0438\u0442 \u0437\u0430\u043f\u0440\u043e\u0441 \u0432 \u0441\u0435\u0440\u0432\u0435\u0440 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0440\u0442\u0430. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0443 \u043d\u0430\u0441 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0441\u0435\u0440\u0432\u0435\u0440 <code>localhost<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0434\u043b\u044f \u043f\u043e\u0440\u0442\u0430 <code>80<\/code>.<\/p>\n<p><a href=\"https:\/\/nginx.org\/ru\/docs\/http\/ngx_http_core_module.html#location\" rel=\"noopener noreferrer nofollow\">location \/<\/a>. \u0414\u0430\u043d\u043d\u0430\u044f \u0431\u043b\u043e\u0447\u043d\u0430\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u0438\u0432\u0430 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 URI \u0437\u0430\u043f\u0440\u043e\u0441\u0430. <code>location<\/code> \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u043e\u0439 \u0438\u043b\u0438 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u043c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c. \u0420\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u044e\u0442\u0441\u044f \u043b\u0438\u0431\u043e \u0441 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c <code>~*<\/code> \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u044f \u0431\u0435\u0437 \u0443\u0447\u0451\u0442\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432, \u043b\u0438\u0431\u043e \u0441 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c <code>~<\/code> \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0441 \u0443\u0447\u0451\u0442\u043e\u043c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430. \u0427\u0442\u043e\u0431\u044b \u043d\u0430\u0439\u0442\u0438 <code>location<\/code>, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0437\u0430\u043f\u0440\u043e\u0441\u0443, \u0432\u043d\u0430\u0447\u0430\u043b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442\u0441\u044f \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043d\u044b\u0435 <code>location\u2019\u044b<\/code>. \u0421\u0440\u0435\u0434\u0438 \u043d\u0438\u0445 \u0438\u0449\u0435\u0442\u0441\u044f <code>location<\/code> \u0441 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u043c \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043e\u043c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b\u00a0\u0438 \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442\u0441\u044f. \u0417\u0430\u0442\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442\u0441\u044f \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0438\u0445 \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u043f\u0440\u0435\u043a\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u044f, \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0430\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f. \u0415\u0441\u043b\u0438 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435 \u0441 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u043c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e, \u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0437\u0430\u043f\u043e\u043c\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u043d\u0435\u0435 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043d\u043e\u0433\u043e <code>location\u2019\u0430<\/code>. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 <code>=<\/code> \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0442\u044c \u0442\u043e\u0447\u043d\u043e\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435 URI \u0438 <code>location<\/code>. \u041f\u0440\u0438 \u0442\u043e\u0447\u043d\u043e\u043c \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0438 \u043f\u043e\u0438\u0441\u043a \u0441\u0440\u0430\u0437\u0443 \u0436\u0435 \u043f\u0440\u0435\u043a\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043d\u044b\u0439 <code>location<\/code> , \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u0432 \u043e\u0431\u0449\u0435\u043c-\u0442\u043e, \u0432\u0441\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443.<\/p>\n<p><a href=\"https:\/\/nginx.org\/ru\/docs\/http\/ngx_http_core_module.html#root\" rel=\"noopener noreferrer nofollow\">root \/app<\/a>. \u0417\u0430\u0434\u0430\u0451\u0442 \u043a\u043e\u0440\u043d\u0435\u0432\u0443\u044e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u0434\u043b\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f <code>\/app<\/code>, \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u043f\u043e\u043b\u043e\u0436\u0438\u043b\u0438 \u043d\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 Vue.js.<\/p>\n<p><a href=\"https:\/\/nginx.org\/ru\/docs\/http\/ngx_http_index_module.html#index\" rel=\"noopener noreferrer nofollow\">index index.html<\/a>. \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0444\u0430\u0439\u043b\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/Index.html#:~:text=Index%20%C2%AB%D1%83%D0%BA%D0%B0%D0%B7%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%C2%BB%20%2B%20.,%D0%BD%D0%B0%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%20%D1%8F%D0%B7%D1%8B%D0%BA%D0%BE%D0%BC%20%D0%B3%D0%B8%D0%BF%D0%B5%D1%80%D1%82%D0%B5%D0%BA%D1%81%D1%82%D0%BE%D0%B2%D0%BE%D0%B9%20%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%82%D0%BA%D0%B8%20HTML.\" rel=\"noopener noreferrer nofollow\">\u0438\u043d\u0434\u0435\u043a\u0441\u0430<\/a>. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u0434\u0430\u0432\u0430\u0442\u044c <a href=\"https:\/\/cli.vuejs.org\/ru\/guide\/html-and-static-assets.html#%D1%81%D1%82%D0%B0%D1%80%D1%82%D0%BE%D0%B2%D1%8B%D0%B9-%D1%84%D0%B0%D0%B9n\" rel=\"noopener noreferrer nofollow\">index.html<\/a> \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p><a href=\"https:\/\/nginx.org\/ru\/docs\/http\/ngx_http_core_module.html#try_files\" rel=\"noopener noreferrer nofollow\">try_files $uri $uri\/ \/index.html<\/a>. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u043e\u0432 \u0432 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b, \u043f\u0440\u0438\u0447\u0451\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u044d\u0442\u043e\u0433\u043e \u0436\u0435 <code>location\u2019\u0430<\/code>. \u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f <a href=\"http:\/\/nginx.org\/ru\/docs\/http\/ngx_http_core_module.html#var_uri\" rel=\"noopener noreferrer nofollow\">$uri<\/a> &#8212; \u044d\u0442\u043e \u0442\u0435\u043a\u0443\u0449\u0438\u0439 URI \u0437\u0430\u043f\u0440\u043e\u0441\u0430. \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043b\u044d\u0448\u0430 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0438\u043c\u0435\u043d\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>$uri\/<\/code>. \u0422.\u0435. \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>$uri<\/code> \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043b\u0438 \u0444\u0430\u0439\u043b \u0441 \u0437\u0430\u043f\u0440\u043e\u0448\u0435\u043d\u043d\u044b\u043c \u0438\u043c\u0435\u043d\u0435\u043c. \u0415\u0441\u043b\u0438 \u0442\u0430\u043a\u043e\u0439 \u0444\u0430\u0439\u043b \u0435\u0441\u0442\u044c, \u0442\u043e \u043e\u0442\u0434\u0430\u0451\u043c \u0435\u0433\u043e, \u0435\u0441\u043b\u0438 \u0435\u0433\u043e \u043d\u0435\u0442, \u0442\u043e \u0438\u0434\u0451\u043c \u0434\u0430\u043b\u044c\u0448\u0435. \u0414\u0430\u043b\u0435\u0435, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>$uri\/<\/code> \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043b\u0438 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u0441 \u0437\u0430\u043f\u0440\u043e\u0448\u0435\u043d\u043d\u044b\u043c \u0438\u043c\u0435\u043d\u0435\u043c. \u0415\u0441\u043b\u0438 \u0434\u0430, \u0442\u043e \u043e\u0442\u0434\u0430\u0451\u043c \u044d\u0442\u0443 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e, \u0435\u0441\u043b\u0438 \u043d\u0435\u0442, \u0442\u043e \u0438\u0434\u0451\u043c \u0434\u0430\u043b\u044c\u0448\u0435. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c, \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0435\u0439, \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044f \u043f\u043e\u043d\u0438\u043c\u0430\u044e, \u0442\u043e, \u0447\u0442\u043e \u0443\u043a\u0430\u0437\u043d\u043e \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u0438\u0432\u0435 <code>index<\/code>.  \u0422.\u0435. \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u0444\u0430\u0439\u043b <code>index.html<\/code> (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c <code>\/test\/<\/code>, \u0442\u043e \u0432\u0435\u0440\u043d\u0451\u0442\u0441\u044f <code>\/test\/index.html<\/code>). \u0415\u0441\u043b\u0438 \u0442\u0430\u043a\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u0432 \u0443\u043a\u0430\u0437\u0430\u043d\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u043d\u0435\u0442 (\u043d\u043e \u0441\u0430\u043c\u0430 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0435\u0441\u0442\u044c), \u0442\u043e NGINX \u043e\u0442\u0434\u0430\u0441\u0442 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0441 \u043e\u0448\u0438\u0431\u043e\u043a\u043e\u0439 403. \u0418 \u0432 \u0441\u0430\u043c\u043e\u043c \u043a\u043e\u043d\u0446\u0435, \u0435\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430\/\u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u043d\u0435\u0442, \u043e\u0442\u0434\u0430\u0451\u043c <code>index.html<\/code>.<\/p>\n<p>\u041d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043e\u0442\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435. \u0415\u0441\u043b\u0438 \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0434\u043e\u043a\u0435\u0440-\u043a\u043e\u043d\u0442\u0435\u043d\u0435\u0440\u0430 NGINX \u043f\u043e\u0440\u0442 80, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0435\u0442  NGINX \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043d\u0435\u0439\u0442\u043d\u0435\u0440\u0430, \u0441\u0432\u044f\u0437\u0430\u0442\u044c \u0441 \u043a\u0430\u043a\u0438\u043c-\u0442\u043e \u0434\u0440\u0443\u0433\u0438\u043c \u043f\u043e\u0440\u0442\u043e\u043c \u0445\u043e\u0441\u0442\u0430, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438 \u043a \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0435\u0441\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0438 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 <code>\/app<\/code> (\u043a\u043e\u0442\u043e\u0440\u0430\u044f, \u043d\u0430\u043f\u043e\u043c\u043d\u044e, \u0443\u043a\u0430\u0437\u0430\u043d\u0430 \u043a\u0430\u043a \u043a\u043e\u0440\u043d\u0435\u0432\u0430\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0435\u0439 \u0434\u043b\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432), \u0431\u0435\u0437 <code>\/<\/code> \u043d\u0430 \u043a\u043e\u043d\u0446\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430, \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u0440\u0435\u0434\u0438\u0440\u0435\u043a\u0442 \u043d\u0430 <code>localhost<\/code>  \u0431\u0435\u0437 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u043f\u043e\u0440\u0442\u0430.<\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0441 \u0438\u043c\u0435\u043d\u0435\u043c <code>list-keep-front<\/code> \u0438\u0437 \u043e\u0431\u0440\u0430\u0437\u0430 <code>list-keep-front<\/code> \u0438 \u0441\u0432\u044f\u0437\u0430\u0442\u044c \u043f\u043e\u0440\u0442 80, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0435\u0442 NGINX, \u0441 \u043f\u043e\u0440\u0442\u043e\u043c 8081 \u0445\u043e\u0441\u0442\u0430, \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443:<\/p>\n<pre><code>docker run -it -p 8081:80 --rm --name list-keep-front list-keep-front<\/code><\/pre>\n<p>\u0424\u043b\u0430\u0433\u00a0<code>--rm<\/code>\u00a0\u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u043f\u043e\u0441\u043b\u0435 \u0435\u0433\u043e \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438. <code>-it<\/code>\u00a0&#8212; \u044d\u0442\u043e \u0441\u043e\u0432\u043c\u0435\u0449\u0451\u043d\u043d\u044b\u0435 \u0444\u043b\u0430\u0433\u0438 <code>-i<\/code> \u0438 <code>-t<\/code>. \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>-i<\/code> <code>STDIN<\/code>\u00a0\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u00a0\u043d\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0451\u043d \u043a\u00a0<code>STDIN<\/code>. \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>-t<\/code> \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0441\u0435\u0432\u0434\u043e\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b \u0441 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438\u00a0<code>STDIN<\/code>\u00a0\u0438\u00a0<code>STDOUT<\/code>\u00a0\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430. \u0422.\u0435., \u043f\u043e \u0441\u0443\u0442\u0438, <code>-it<\/code> \u043d\u0443\u0436\u0435\u043d \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u043c \u0447\u0435\u0440\u0435\u0437 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b.<\/p>\n<p>\u0418 \u0442\u0435\u043f\u0435\u0440\u044c, \u0435\u0441\u043b\u0438 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0441\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e \u044d\u0442\u043e\u043c\u0443 \u0430\u0434\u0440\u0435\u0441\u0443 <a href=\"http:\/\/localhost:8081\/js\" rel=\"noopener noreferrer nofollow\">http:\/\/localhost:8081\/js<\/a>, \u0442\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0451\u0442 \u0440\u0435\u0434\u0438\u0440\u0435\u043a\u0442 \u043d\u0430 <a href=\"http:\/\/localhost\/js\/\" rel=\"noopener noreferrer nofollow\">http:\/\/localhost\/js\/<\/a>. \u0418 \u0442.\u043a. \u043d\u0430\u0448 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0437\u0430\u043f\u0443\u0449\u0435\u043d \u043d\u0430 \u043f\u043e\u0440\u0442\u0435 8081, \u0442\u043e \u0437\u0430\u043f\u0440\u043e\u0441 \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 <a href=\"http:\/\/localhost\/js\/\" rel=\"noopener noreferrer nofollow\">http:\/\/localhost\/js\/<\/a> \u043f\u043e\u043f\u0440\u043e\u0441\u0442\u0443 \u043d\u0435\u043a\u043e\u043c\u0443 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u0438 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0435.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"\/img\/image-loader.svg\" height=\"622\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/497\/5be\/a64\/4975bea641c78f0a6501e0c0a0874edb.png\" data-width=\"969\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0415\u0441\u043b\u0438 \u0436\u0435 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u0434\u0440\u0435\u0441\u0430 \u0443\u043a\u0430\u0437\u0430\u0442\u044c <a href=\"http:\/\/localhost:8081\/js\" rel=\"noopener noreferrer nofollow\">http:\/\/localhost:8081\/js<\/a>\/ (\u0441\u043e <code>\/<\/code> \u043d\u0430 \u043a\u043e\u043d\u0446\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430), \u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442\u0441\u044f \u0438 \u0432 \u043e\u0442\u0432\u0435\u0442 \u0432\u0435\u0440\u043d\u0451\u0442\u0441\u044f 403, \u0442.\u043a. \u0444\u0430\u0439\u043b\u0430 <code>index.html<\/code> \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 <code>\/js\/<\/code> \u043d\u0435\u0442.<\/p>\n<p>\u041c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432 \u0441\u0430\u043c\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 NGINX \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0435\u0442 \u043f\u043e\u0440\u0442 80 \u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0437\u043d\u0430\u0435\u0442 \u043e \u043f\u043e\u0440\u0442\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b \u0443\u043a\u0430\u0437\u0430\u043b\u0438 \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430. \u041f\u0440\u0430\u0432\u0434\u0430, \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0432 \u0430\u0434\u0440\u0435\u0441\u0435, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u0451\u043b \u0440\u0435\u0434\u0438\u0440\u0435\u043a\u0442, \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u043f\u043e\u0440\u0442, \u0445\u043e\u0442\u044f \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0440\u0442 80. \u041d\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c, \u0447\u0442\u043e \u044d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043f\u043e\u0440\u0442 80 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0440\u0442\u043e\u043c \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0434\u043b\u044f HTTP \u0438 \u043c\u043e\u0436\u0435\u0442 \u044f\u0432\u043d\u043e \u043d\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f. \u0418 \u0435\u0441\u043b\u0438 \u0432 \u0430\u0434\u0440\u0435\u0441\u0435 \u043e\u043d \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d, \u0442\u043e \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0438\u0434\u0442\u0438 \u043d\u0430 \u044d\u0442\u043e\u0442 \u043f\u043e\u0440\u0442, \u0442.\u0435., \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0430\u0434\u0440\u0435\u0441 <a href=\"http:\/\/localhost\/js\/\" rel=\"noopener noreferrer nofollow\">http:\/\/localhost\/<\/a> \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u0435\u043d <a href=\"http:\/\/localhost\/js\/\" rel=\"noopener noreferrer nofollow\">http:\/\/localhost:80\/<\/a>. \u0418 \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u043e\u0440\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0435\u0442 NGINX, \u043d\u0430 \u043f\u043e\u0440\u0442 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>listen 8081<\/code> \u0438 \u0441\u0432\u044f\u0437\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u043f\u043e\u0440\u0442 \u0441 \u043f\u043e\u0440\u0442\u043e\u043c 8081 \u043d\u0430\u0448\u0435\u0433\u043e \u0445\u043e\u0441\u0442\u0430. \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u0442\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0441\u044f \u0438 \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438 \u043d\u0430 <a href=\"http:\/\/localhost:8081\/js\" rel=\"noopener noreferrer nofollow\">http:\/\/localhost:8081\/js<\/a> \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u0432\u0441\u0451 \u0442\u0430\u043a \u0436\u0435 \u0440\u0435\u0434\u0438\u0440\u0435\u043a\u0442\u0438\u0442\u044c \u043d\u0430 <a href=\"http:\/\/localhost\/js\/\" rel=\"noopener noreferrer nofollow\">http:\/\/localhost\/js\/<\/a> \u0431\u0435\u0437 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u043f\u043e\u0440\u0442\u0430.<\/p>\n<p>\u0412 \u043e\u0431\u0449\u0435\u043c, \u043e \u0434\u0430\u043d\u043d\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0435 \u0438 \u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u0430\u0445 \u0435\u0451 \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u0445 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c <a href=\"https:\/\/serverfault.com\/questions\/739498\/nginx-rewrite-on-docker-machine-when-host-port-container-port\" rel=\"noopener noreferrer nofollow\">\u0442\u0443\u0442<\/a>. \u0415\u0441\u043b\u0438 \u043a\u043e\u0440\u043e\u0442\u043a\u043e, \u0442\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 <code>try_files<\/code>, \u0430 \u0442\u043e\u0447\u043d\u0435\u0435 \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0435 <code>$uri\/<\/code>. \u0418 \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043d\u0443\u0436\u043d\u043e \u043f\u043e-\u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c <code>try_files<\/code>. \u041a\u0430\u043a \u0432\u0430\u0440\u0438\u0430\u043d\u0442, \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u0431\u0440\u0430\u0442\u044c <code>$uri\/<\/code> \u0438\u0437 <code>try_files<\/code> \u0438 \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e <code>try_files $uri \/index.html<\/code>, \u0442.\u0435. \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043e\u0442\u0434\u0430\u0432\u0430\u0442\u044c \u043b\u0438\u0431\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0444\u0430\u0439\u043b <code>$uri<\/code>, \u043b\u0438\u0431\u043e <code>\/index.html<\/code>. \u0422.\u043a. \u0432\u0441\u0451  \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 Vue.js., \u043f\u043e \u0441\u0443\u0442\u0438, \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 <code>\/index.html<\/code>, \u0442\u043e, \u0434\u0443\u043c\u0430\u044e, \u044d\u0442\u043e\u0433\u043e \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e. \u0422\u0430\u043a\u0436\u0435 \u0434\u0430\u043d\u043d\u0443\u044e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0448\u0438\u0442\u044c, \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u0432 \u043f\u043e\u0440\u0442 80 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0441 \u043f\u043e\u0440\u0442\u043e\u043c 80 \u0445\u043e\u0441\u0442\u0430.<\/p>\n<pre><code>docker run -it -p 80:80 --rm --name list-keep-front list-keep-front<\/code><\/pre>\n<p>\u0418\u0442\u0430\u043a, \u0432\u0435\u0440\u043d\u0451\u043c\u0441\u044f \u043a \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0430.<\/p>\n<p><a href=\"https:\/\/nginx.org\/ru\/docs\/http\/ngx_http_core_module.html#error_page\" rel=\"noopener noreferrer nofollow\">error_page 500 502 503 504 \/50x.html<\/a>. \u0417\u0430\u0434\u0430\u0451\u0442 URI, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043b\u044f \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0438 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b NGINX.<\/p>\n<p><a href=\"https:\/\/nginx.org\/ru\/docs\/http\/ngx_http_core_module.html#location\" rel=\"noopener noreferrer nofollow\">location = \/50x.html { root   \/usr\/share\/nginx\/html; }<\/a>. \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e, \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432 \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441 <code>\/50x.html<\/code> \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0444\u0430\u0439\u043b <code>\/usr\/share\/nginx\/html\/50x.html<\/code>.<\/p>\n<p>\u0412 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435, \u0432 \u0434\u043e\u043a\u0435\u0440-\u043e\u0431\u0440\u0430\u0437\u0435 NGINX \u0443\u0436\u0435 \u043b\u0435\u0436\u0438\u0442 <code>nginx.conf,<\/code> \u0438 \u0435\u0441\u043b\u0438 \u0445\u043e\u0447\u0435\u0442\u0441\u044f, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433 \u043d\u0430 \u0435\u0433\u043e \u043e\u0441\u043d\u043e\u0432\u0435.<\/p>\n<details class=\"spoiler\">\n<summary>\u0414\u0435\u0444\u043e\u043b\u0442\u043e\u0432\u044b\u0439 \u043a\u043e\u043d\u0444\u0438\u0433 \u0438\u0437 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0434\u043e\u043a\u0435\u0440-\u043e\u0431\u0440\u0430\u0437\u0430 NGINX<\/summary>\n<div class=\"spoiler__content\">\n<p>\u041a\u043e\u043d\u0444\u0438\u0433 \u0432 \u0434\u043e\u043a\u0435\u0440-\u043e\u0431\u0440\u0430\u0437\u0435 NGINX \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0444\u0430\u0439\u043b\u043e\u0432. \u041f\u0435\u0440\u0432\u044b\u0439 &#8212; \u044d\u0442\u043e <code>\/etc\/nginx\/nginx.conf<\/code>.<\/p>\n<pre><code>user  nginx; worker_processes  auto;  error_log  \/var\/log\/nginx\/error.log notice; pid        \/var\/run\/nginx.pid;   events {     worker_connections  1024; }   http {     include       \/etc\/nginx\/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;     #tcp_nopush     on;      keepalive_timeout  65;      #gzip  on;      include \/etc\/nginx\/conf.d\/*.conf; }<\/code><\/pre>\n<p>\u0410 \u0432\u0442\u043e\u0440\u043e\u0439 &#8212; <code>\/etc\/nginx\/conf.d\/default.conf<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 <code>\/etc\/nginx\/nginx.conf<\/code> \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>include<\/code>.<\/p>\n<pre><code>server {     listen       80;     listen  [::]:80;     server_name  localhost;      #access_log  \/var\/log\/nginx\/host.access.log  main;      location \/ {         root   \/usr\/share\/nginx\/html;         index  index.html index.htm;     }      #error_page  404              \/404.html;      # redirect server error pages to the static page \/50x.html     #     error_page   500 502 503 504  \/50x.html;     location = \/50x.html {         root   \/usr\/share\/nginx\/html;     }      # proxy the PHP scripts to Apache listening on 127.0.0.1:80     #     #location ~ \\.php$ {     #    proxy_pass   http:\/\/127.0.0.1;     #}      # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000     #     #location ~ \\.php$ {     #    root           html;     #    fastcgi_pass   127.0.0.1:9000;     #    fastcgi_index  index.php;     #    fastcgi_param  SCRIPT_FILENAME  \/scripts$fastcgi_script_name;     #    include        fastcgi_params;     #}      # deny access to .htaccess files, if Apache's document root     # concurs with nginx's one     #     #location ~ \/\\.ht {     #    deny  all;     #} }<\/code><\/pre>\n<\/div>\n<\/details>\n<\/div>\n<\/details>\n<p>NGINX, \u043a\u0440\u043e\u043c\u0435 \u043f\u043e\u043c\u043e\u0449\u0438 \u0432 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0438 \u0441\u0430\u043c\u043e\u0433\u043e Vue.js-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043c\u043e\u0447\u044c \u043d\u0430\u043c \u0432 \u043f\u0440\u043e\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432, \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u043c\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u0431\u044d\u043a\u0435\u043d\u0434 \u0432\u0441\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442\u0441\u044f \u0441\u00a0<code>\/api\/<\/code>. \u041f\u0440\u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/cli.vuejs.org\/ru\/config\/#devserver\" rel=\"noopener noreferrer nofollow\">devServer<\/a> \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0435 <code>vue.config.js<\/code>.<\/p>\n<pre><code>module.exports = {   devServer: {     port: 8081,     proxy: {       '^\/api\/': {         target: 'http:\/\/localhost:8082'       }     }   } }<\/code><\/pre>\n<p>\u0427\u0442\u043e\u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u043e\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 NGINX, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432 \u0431\u043b\u043e\u043a server \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<\/p>\n<pre><code>    location \/api\/ {       proxy_pass http:\/\/host.docker.internal:8082;     }<\/code><\/pre>\n<p>\u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/nginx.org\/ru\/docs\/http\/ngx_http_proxy_module.html#proxy_pass\" rel=\"noopener noreferrer nofollow\">proxy_pass<\/a> \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f \u0430\u0434\u0440\u0435\u0441 \u043f\u0440\u043e\u043a\u0441\u0438\u0440\u0443\u0435\u043c\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430. \u0411\u044d\u043a\u0435\u043d\u0434 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u0437\u0430\u043f\u0443\u0449\u0435\u043d \u043d\u0430 \u043f\u043e\u0440\u0442\u0443 8082. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u0434\u0440\u0435\u0441\u0430 \u0431\u044d\u043a\u0435\u043d\u0434\u0430 \u0443\u043a\u0430\u0437\u0430\u043d <a href=\"https:\/\/docs.docker.com\/desktop\/windows\/networking\/\" rel=\"noopener noreferrer nofollow\">host.docker.internal<\/a>. \u0414\u0430\u043d\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c (\u043d\u0430 Windows) \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u043a \u0445\u043e\u0441\u0442\u0443. \u042d\u0442\u043e\u0442 \u0430\u0434\u0440\u0435\u0441 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 production. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044f \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e, \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e\u0431\u044b \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u0432\u0441\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e.<\/p>\n<details class=\"spoiler\">\n<summary>\u0418\u0442\u043e\u0433\u043e\u0432\u044b\u0439 nginx.conf<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>user  nginx; worker_processes  1; error_log  \/var\/log\/nginx\/error.log warn; pid        \/var\/run\/nginx.pid; events {   worker_connections  1024; } http {   include       \/etc\/nginx\/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;   server {     listen       80;     server_name  localhost;     location \/ {       root   \/app;       index  index.html;       try_files $uri $uri\/ \/index.html;     }     location \/api\/ {       proxy_pass http:\/\/host.docker.internal:8082;     }     error_page   500 502 503 504  \/50x.html;     location = \/50x.html {       root   \/usr\/share\/nginx\/html;     }   } } <\/code><\/pre>\n<\/div>\n<\/details>\n<h2>\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f<\/h2>\n<p>\u0415\u0441\u043b\u0438 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f <a href=\"https:\/\/cli.vuejs.org\/ru\/guide\/mode-and-env.html#%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5-%D0%BE%D0%BA%D1%80%D1%83%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F\" rel=\"noopener noreferrer nofollow\">\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f<\/a>, \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0438\u0445 \u0432 production \u0441\u0431\u043e\u0440\u043a\u0443. \u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0432 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u0430\u0445 \u0432 \u043a\u043e\u0440\u043d\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430:<\/p>\n<pre><code>.env                # \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442\u0441\u044f \u0432\u043e \u0432\u0441\u0435\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 .env.local          # \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442\u0441\u044f \u0432\u043e \u0432\u0441\u0435\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445, \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f git .env.[mode]         # \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 \u0440\u0430\u0431\u043e\u0442\u044b .env.[mode].local   # \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 \u0440\u0430\u0431\u043e\u0442\u044b, \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f git<\/code><\/pre>\n<p>\u0414\u043b\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0438 \u0432 \u043a\u043e\u0440\u043d\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0443 \u043c\u0435\u043d\u044f \u043b\u0435\u0436\u0438\u0442 \u0444\u0430\u0439\u043b <code>.env.local<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f <code>git<\/code>, \u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c:<\/p>\n<pre><code>VUE_APP_KEYCLOAK_URL = http:\/\/localhost:8080\/auth<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u0443\u043a\u0430\u0437\u0430\u043d \u0430\u0434\u0440\u0435\u0441 <a href=\"https:\/\/habr.com\/ru\/post\/546428\/\" rel=\"noopener noreferrer nofollow\">Keycloak<\/a>, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0445\u043e\u0434\u0438\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 Vue.js \u043f\u0440\u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0435.<\/p>\n<p>\u0418\u0442\u0430\u043a, \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0432 production \u0441\u0431\u043e\u0440\u043a\u0443, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043d\u0430\u0437\u0432\u0430\u0442\u044c \u0444\u0430\u0439\u043b <code>.env.[mode]<\/code>. \u0422.\u0435. \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0443\u0437\u043d\u0430\u0442\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043d\u0430\u0448\u0435\u0433\u043e \u0440\u0435\u0436\u0438\u043c\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0427\u0442\u043e \u0436, \u043e\u0431\u0440\u0430\u0442\u0438\u043c\u0441\u044f \u043a <a href=\"https:\/\/cli.vuejs.org\/ru\/guide\/mode-and-env.html#%D1%80%D0%B5%D0%B6%D0%B8%D0%BC%D1%8B-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B\" rel=\"noopener noreferrer nofollow\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/a>. \u0422\u0430\u043c \u0441\u043a\u0430\u0437\u0430\u043d\u043e, \u0447\u0442\u043e \u043f\u0440\u0438 \u0441\u0431\u043e\u0440\u043a\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 <code>vue-cli-service build<\/code>, \u043a\u043e\u0442\u043e\u0440\u0443\u044e, \u043d\u0430\u043f\u043e\u043c\u043d\u044e, \u043c\u044b \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0440\u0435\u0436\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u044b <code>production<\/code>. \u0422.\u0435. \u0444\u0430\u0439\u043b \u0434\u043e\u043b\u0436\u0435\u043d \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f <code>.env.production<\/code>. \u041d\u0438\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043e \u0435\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435.<\/p>\n<pre><code>VUE_APP_KEYCLOAK_URL = http:\/\/localhost:8080\/auth<\/code><\/pre>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u043d\u043e \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c <code>.env.local<\/code>, \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0417\u0434\u0435\u0441\u044c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>host.docker.internal<\/code>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0432 <a href=\"https:\/\/habr.com\/ru\/post\/546428\/\" rel=\"noopener noreferrer nofollow\">Keycloak<\/a> \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0438\u0437 js-\u043a\u043e\u0434\u0430 (\u0430 \u0442\u043e\u0447\u043d\u0435\u0435 \u0438\u0437 \u043b\u0438\u0431\u044b <a href=\"https:\/\/github.com\/keycloak\/keycloak-documentation\/blob\/main\/securing_apps\/topics\/oidc\/javascript-adapter.adoc\" rel=\"noopener noreferrer nofollow\">keycloak-js<\/a>) \u0438 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0438\u0434\u0442\u0438 \u0447\u0435\u0440\u0435\u0437 NGINX. \u0422.\u0435. \u043e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0435\u0442\u0438, \u0433\u0434\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043d\u0430\u0448 localhost.<\/p>\n<h3>\u0421\u0431\u043e\u0440\u043a\u0430 \u0438 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044f \u0447\u0435\u0440\u0435\u0437 GitHub Actions<\/h3>\n<p>\u0418\u0442\u0430\u043a, \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u0442\u044c \u043a \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e <a href=\"https:\/\/github.com\/features\/actions\" rel=\"noopener noreferrer nofollow\">GitHub Action<\/a>. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e\u00a0\u0432 GitHub-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443\u00a0<code>Actions<\/code>.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"\/img\/image-loader.svg\" height=\"1103\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ca7\/edb\/43c\/ca7edb43c3b759841c79870ba3e454e4.png\" data-width=\"2511\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041d\u0430 \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u043c\u043e\u0436\u043d\u043e \u043b\u0438\u0431\u043e \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c <code>workflow<\/code>,\u00a0 \u043b\u0438\u0431\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0438\u0437 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0438 \u0432\u0438\u0434\u043e\u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0435\u0433\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c. \u0418\u0442\u0430\u043a, \u043d\u0430\u0448 <code>action<\/code> \u0434\u043e\u043b\u0436\u0435\u043d \u0443\u043c\u0435\u0442\u044c \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0434\u043e\u043a\u0435\u0440-\u043e\u0431\u0440\u0430\u0437 \u0438 \u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e <a href=\"https:\/\/github.com\/features\/packages\" rel=\"noopener noreferrer nofollow\">GitHub Packages<\/a>. \u0414\u043b\u044f \u044d\u0442\u0438\u0445 \u0446\u0435\u043b\u0435\u0439 \u0432\u043f\u043e\u043b\u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 <code>Publish Docker Container<\/code>.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"\/img\/image-loader.svg\" height=\"360\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ef3\/171\/53c\/ef317153ca192a02be6897b93463fbe4.png\" data-width=\"2018\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041d\u0430\u0436\u0438\u043c\u0430\u0435\u043c \u043d\u0430 <code>Configure<\/code> \u0438 \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u043c \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e\u00a0<code>action<\/code>\u00a0\u0434\u043b\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0443\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"\/img\/image-loader.svg\" height=\"787\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/57f\/f6a\/9bf\/57ff6a9bf05d0a41393631f17c7b811a.png\" data-width=\"1716\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0444\u0430\u0439\u043b \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f\u00a0<code>docker-publish.yml<\/code>. \u0422.\u043a. \u0434\u0430\u043d\u043d\u044b\u0439\u00a0<code>action<\/code>\u00a0\u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c\u0441\u044f \u0441\u0431\u043e\u0440\u043a\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0432\u00a0<code>build.yml<\/code>. \u041d\u0438\u0436\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u0434\u0430\u043d\u043d\u043e\u0433\u043e <code>action<\/code>.<\/p>\n<pre><code>name: Docker  # This workflow uses actions that are not certified by GitHub. # They are provided by a third-party and are governed by # separate terms of service, privacy policy, and support # documentation.  on:   schedule:     - cron: '44 21 * * *'   push:     branches: [ main ]     # Publish semver tags as releases.     tags: [ 'v*.*.*' ]   pull_request:     branches: [ main ]  env:   # Use docker.io for Docker Hub if empty   REGISTRY: ghcr.io   # github.repository as &lt;account>\/&lt;repo>   IMAGE_NAME: ${{ github.repository }}   jobs:   build:      runs-on: ubuntu-latest     permissions:       contents: read       packages: write       # This is used to complete the identity challenge       # with sigstore\/fulcio when running outside of PRs.       id-token: write      steps:       - name: Checkout repository         uses: actions\/checkout@v2        # Install the cosign tool except on PR       # https:\/\/github.com\/sigstore\/cosign-installer       - name: Install cosign         if: github.event_name != 'pull_request'         uses: sigstore\/cosign-installer@1e95c1de343b5b0c23352d6417ee3e48d5bcd422         with:           cosign-release: 'v1.4.0'         # Workaround: https:\/\/github.com\/docker\/build-push-action\/issues\/461       - name: Setup Docker buildx         uses: docker\/setup-buildx-action@79abd3f86f79a9d68a23c75a09a9a85889262adf        # Login against a Docker registry except on PR       # https:\/\/github.com\/docker\/login-action       - name: Log into registry ${{ env.REGISTRY }}         if: github.event_name != 'pull_request'         uses: docker\/login-action@28218f9b04b4f3f62068d7b6ce6ca5b26e35336c         with:           registry: ${{ env.REGISTRY }}           username: ${{ github.actor }}           password: ${{ secrets.GITHUB_TOKEN }}        # Extract metadata (tags, labels) for Docker       # https:\/\/github.com\/docker\/metadata-action       - name: Extract Docker metadata         id: meta         uses: docker\/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38         with:           images: ${{ env.REGISTRY }}\/${{ env.IMAGE_NAME }}        # Build and push Docker image with Buildx (don't push on PR)       # https:\/\/github.com\/docker\/build-push-action       - name: Build and push Docker image         id: build-and-push         uses: docker\/build-push-action@ad44023a93711e3deb337508980b4b5e9bcdc5dc         with:           context: .           push: ${{ github.event_name != 'pull_request' }}           tags: ${{ steps.meta.outputs.tags }}           labels: ${{ steps.meta.outputs.labels }}        # Sign the resulting Docker image digest except on PRs.       # This will only write to the public Rekor transparency log when the Docker       # repository is public to avoid leaking data.  If you would like to publish       # transparency data even for private images, pass --force to cosign below.       # https:\/\/github.com\/sigstore\/cosign       - name: Sign the published Docker image         if: ${{ github.event_name != 'pull_request' }}         env:           COSIGN_EXPERIMENTAL: \"true\"         # This step uses the identity token to provision an ephemeral certificate         # against the sigstore community Fulcio instance.         run: cosign sign ${{ env.REGISTRY }}\/${{ env.IMAGE_NAME }}@${{ steps.build-and-push.outputs.digest }} <\/code><\/pre>\n<p>\u0414\u0430\u043d\u043d\u044b\u0439 <code>action<\/code> \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0438 \u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u0434\u043e\u043a\u0435\u0440-\u043e\u0431\u0440\u0430\u0437\u044b: \u043f\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c\u0443 \u043a\u0440\u043e\u043d\u0443, \u043f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0432\u0435\u0442\u043a\u0438 <code>main<\/code> \u0438 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0442\u0435\u0433\u0430 \u0441 \u0438\u043c\u0435\u043d\u0435\u043c, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0443 <code>v*.*.*<\/code>, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u043e\u0433\u043e\u043d\u044f\u0442\u044c \u0441\u0431\u043e\u0440\u043a\u0443 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 <code>Pull Request<\/code>  \u0432 \u0432\u0435\u0442\u043a\u0443 <code>main<\/code>. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0432 \u0434\u0430\u043d\u043d\u043e\u043c <code>action<\/code> \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u0434\u043e\u043a\u0435\u0440-\u043e\u0431\u0440\u0430\u0437\u043e\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/docs.sigstore.dev\/cosign\/overview\" rel=\"noopener noreferrer nofollow\">cosign<\/a> \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0439 \u043f\u043e\u0434\u043f\u0438\u0441\u0438 \u0432 <a href=\"https:\/\/github.com\/features\/packages\" rel=\"noopener noreferrer nofollow\">GitHub Packages<\/a>.<\/p>\n<details class=\"spoiler\">\n<summary>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e docker-publish.yml<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0418 \u043e\u043f\u044f\u0442\u044c \u0436\u0435, \u0434\u043b\u044f \u0441\u0430\u043c\u044b\u0445 \u043b\u044e\u0431\u043e\u0437\u043d\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445, \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0439 \u0440\u0430\u0437\u0431\u043e\u0440 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 <code>docker-publish.yml<\/code>.<\/p>\n<p><a href=\"https:\/\/docs.github.com\/en\/actions\/using-workflows\/workflow-syntax-for-github-actions#name\" rel=\"noopener noreferrer nofollow\">name: Docker<\/a>. \u0418\u043c\u044f\u00a0<code>workflow<\/code> \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043a\u0435\u00a0<code>Actions<\/code>\u00a0\u0432\u00a0<a href=\"https:\/\/github.com\/\" rel=\"noopener noreferrer nofollow\">GitHub<\/a>.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"\/img\/image-loader.svg\" height=\"383\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4d9\/0c4\/63c\/4d90c463c9c12ed196ec17f0a67a10d4.png\" data-width=\"1414\"\/><figcaption><\/figcaption><\/figure>\n<p><a href=\"https:\/\/yaml.org\/spec\/1.2.2\/#66-comments\" rel=\"noopener noreferrer nofollow\"># This workflow&#8230;<\/a> \u0412\u0441\u0451, \u0447\u0442\u043e \u0438\u0434\u0451\u0442 \u043f\u043e\u0441\u043b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 <code>#<\/code>, \u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430 \u0442\u043e\u0439 \u0436\u0435 \u0441\u0442\u0440\u043e\u043a\u0435 \u0447\u0442\u043e \u0438 \u0441\u0430\u043c \u0441\u0438\u043c\u0432\u043e\u043b <code>#<\/code>, \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u043c.<\/p>\n<p><a href=\"https:\/\/docs.github.com\/en\/actions\/using-workflows\/workflow-syntax-for-github-actions#on\" rel=\"noopener noreferrer nofollow\">on<\/a> \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442, \u043a\u0430\u043a\u0438\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0434\u043e\u043b\u0436\u043d\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439\u00a0<code>workflow<\/code>.<\/p>\n<p><a href=\"https:\/\/docs.github.com\/en\/actions\/using-workflows\/workflow-syntax-for-github-actions#onschedule\" rel=\"noopener noreferrer nofollow\">schedule<\/a>. \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 <code>workflow<\/code> \u043f\u043e \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u0434\u043b\u044f \u0434\u0435\u0444\u043e\u043b\u0442\u043e\u0432\u043e\u0439 \u0432\u0435\u0442\u043a\u0438. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u044d\u0442\u043e <code>main<\/code>. \u0412\u0440\u0435\u043c\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>cron<\/code>, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f <a href=\"https:\/\/pubs.opengroup.org\/onlinepubs\/9699919799\/utilities\/crontab.html#tag_20_25_07\" rel=\"noopener noreferrer nofollow\">POSIX cron \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441<\/a>. \u0412\u0440\u0435\u043c\u044f \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%92%D1%81%D0%B5%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B5_%D0%BA%D0%BE%D0%BE%D1%80%D0%B4%D0%B8%D0%BD%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5_%D0%B2%D1%80%D0%B5%D0%BC%D1%8F#:~:text=%D0%92%D1%81%D0%B5%D0%BC%D0%B8%CC%81%D1%80%D0%BD%D0%BE%D0%B5%20%D0%BA%D0%BE%D0%BE%D1%80%D0%B4%D0%B8%D0%BD%D0%B8%CC%81%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5%20%D0%B2%D1%80%D0%B5%CC%81%D0%BC%D1%8F%20(%D0%B0%D0%BD%D0%B3%D0%BB.,%D1%81%D0%B5%D0%BA%D1%83%D0%BD%D0%B4%20%D0%BE%D1%82%20%D0%B2%D1%81%D0%B5%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B3%D0%BE%20%D0%B2%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%B8%20UT1.\" rel=\"noopener noreferrer nofollow\">UTC<\/a>. \u041c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e <code>cron<\/code>. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 <code>cron: '44 21 * * *'<\/code> \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0447\u0442\u043e <code>workflow<\/code> \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u0434\u0435\u043d\u044c \u0432 21:44 UTC.<\/p>\n<p><a href=\"https:\/\/docs.github.com\/en\/actions\/using-workflows\/workflow-syntax-for-github-actions#onpushbranchestagsbranches-ignoretags-ignore\" rel=\"noopener noreferrer nofollow\">push<\/a>. \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 <code>workflow<\/code>, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0443\u0448 \u043a\u043e\u043c\u043c\u0438\u0442\u0430 \u0438\u043b\u0438 \u0442\u0435\u0433\u0430. \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0438\u043b\u044c\u0442\u0440\u0430 <code>branches<\/code> \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f \u0437\u0430\u043f\u0443\u0441\u043a <code>workflow<\/code> \u043d\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0445 \u0432\u0435\u0442\u043a\u0430\u0445. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 <code>branches: [ main ]<\/code> \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a <code>workflow<\/code>, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0443\u0448 \u0432 \u0432\u0435\u0442\u043a\u0443 <code>main<\/code>. \u0424\u0438\u043b\u044c\u0442\u0440 <code>tags<\/code> \u0437\u0430\u0434\u0430\u0451\u0442 \u0437\u0430\u043f\u0443\u0441\u043a <code>workflow<\/code> \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0445 \u0442\u0435\u0433\u043e\u0432. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 <code>tags: [ 'v*.*.*' ]<\/code> \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a <code>workflow<\/code>, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0443\u0448 \u0442\u0435\u0433\u0430, \u0438\u043c\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 <a href=\"https:\/\/docs.github.com\/en\/actions\/using-workflows\/workflow-syntax-for-github-actions#filter-pattern-cheat-sheet\" rel=\"noopener noreferrer nofollow\">\u0448\u0430\u0431\u043b\u043e\u043d\u0443<\/a> <code>v*.*.*<\/code>, \u0442.\u0435. \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 <a href=\"https:\/\/semver.org\/lang\/ru\/\" rel=\"noopener noreferrer nofollow\">SemVer<\/a>.<\/p>\n<p><a href=\"https:\/\/docs.github.com\/en\/actions\/using-workflows\/workflow-syntax-for-github-actions#onpull_requestpull_request_targetbranchesbranches-ignore\" rel=\"noopener noreferrer nofollow\">pull_request<\/a>. \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 <code>workflow<\/code>, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 <code>Pull Request<\/code>. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0444\u0438\u043b\u044c\u0442\u0440 <code>branches: [ main ]<\/code> \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a <code>workflow<\/code>, \u043a\u043e\u0433\u0434\u0430 \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f<code>Pull Request<\/code> \u0432 \u0432\u0435\u0442\u043a\u0443 <code>main<\/code>.<\/p>\n<p><a href=\"https:\/\/docs.github.com\/en\/actions\/using-workflows\/workflow-syntax-for-github-actions#env\" rel=\"noopener noreferrer nofollow\">env<\/a>. \u0412 \u044d\u0442\u043e\u043c \u0431\u043b\u043e\u043a\u0435 \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u0441\u0432\u043e\u0451\u043c <code>workflow<\/code>. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 <code>REGISTRY<\/code> \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f <code>ghcr.io<\/code> &#8212; \u0430\u0434\u0440\u0435\u0441 <a href=\"https:\/\/github.com\/features\/packages\" rel=\"noopener noreferrer nofollow\">GitHub Packages<\/a>. \u0410 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 <code>IMAGE_NAME<\/code> \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>${{ github.repository }}<\/code>. \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0431\u0435\u0440\u0451\u0442\u0441\u044f \u0438\u0437 <a href=\"https:\/\/docs.github.com\/en\/actions\/learn-github-actions\/contexts#github-context\" rel=\"noopener noreferrer nofollow\">github-\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430<\/a> \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 <code>&lt;\u0438\u043c\u044f \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0430>\/&lt;\u0438\u043c\u044f \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f><\/code>. \u0414\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 <a href=\"https:\/\/docs.github.com\/en\/actions\/learn-github-actions\/expressions\" rel=\"noopener noreferrer nofollow\">\u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f<\/a> &#8212; <code>${{ &lt;expression> }}<\/code>.<\/p>\n<p><a href=\"https:\/\/docs.github.com\/en\/actions\/using-workflows\/workflow-syntax-for-github-actions#jobs\" rel=\"noopener noreferrer nofollow\">jobs<\/a>. \u0412 \u044d\u0442\u043e\u043c \u0431\u043b\u043e\u043a\u0435 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f\u00a0<code>job'\u044b<\/code>\u00a0(\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u0431\u043e\u0440\u043a\u0430, \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0442.\u043f.). \u0418\u0445 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e, \u043d\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0433\u043e\u0432\u043e\u0440\u0438\u0442, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0438\u0445 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0435\u0441\u0442\u044c \u043b\u0438\u0448\u044c \u043e\u0434\u043d\u0430\u00a0<code>job<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f\u00a0<code>build<\/code>.<\/p>\n<p><a href=\"https:\/\/docs.github.com\/en\/actions\/using-workflows\/workflow-syntax-for-github-actions#jobsjob_idruns-on\" rel=\"noopener noreferrer nofollow\">runs-on: ubuntu-latest<\/a>. \u0412 \u044d\u0442\u043e\u043c \u0431\u043b\u043e\u043a\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f\u00a0<code>runner<\/code>, \u0442.\u0435., \u043f\u043e \u0441\u0443\u0442\u0438, \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0448\u0438\u043d\u0430, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f\u00a0<code>job<\/code>. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e\u00a0<code>ubuntu-latest<\/code>.<\/p>\n<p><a href=\"https:\/\/docs.github.com\/en\/actions\/using-workflows\/workflow-syntax-for-github-actions#jobsjob_idpermissions\" rel=\"noopener noreferrer nofollow\">permissions<\/a>. \u041f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430\u0431\u043e\u0440 <a href=\"https:\/\/docs.github.com\/en\/actions\/security-guides\/automatic-token-authentication#permissions-for-the-github_token\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0430\u0432 \u0434\u043e\u0441\u0442\u0443\u043f\u0430, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e<\/a> \u0434\u043b\u044f <a href=\"https:\/\/docs.github.com\/en\/actions\/security-guides\/automatic-token-authentication#about-the-github_token-secret\" rel=\"noopener noreferrer nofollow\">GITHUB_TOKEN<\/a>. \u042d\u0442\u043e\u0442 \u0442\u043e\u043a\u0435\u043d \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u0432 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u00a0<code>workflow<\/code>, \u0438 \u043e\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043a\u0430\u043a \u0441\u0435\u043a\u0440\u0435\u0442\u00a0<code>secrets.GITHUB_TOKEN<\/code>,\u00a0\u043b\u0438\u0431\u043e \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u0437\u00a0<a href=\"https:\/\/docs.github.com\/en\/actions\/learn-github-actions\/contexts#github-context\" rel=\"noopener noreferrer nofollow\">github-\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430<\/a> \u043a\u0430\u043a\u00a0<code>github.token<\/code>. \u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435<code>contents: read<\/code> \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u0438\u0437 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f, <code>packages: write<\/code> &#8212; \u0434\u043b\u044f \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u0432\u00a0<a href=\"https:\/\/github.com\/features\/packages\" rel=\"noopener noreferrer nofollow\">GitHub Packages<\/a>, \u0430 <code>id-token: write<\/code> &#8212; \u0434\u043b\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f <a href=\"https:\/\/docs.github.com\/en\/actions\/deployment\/security-hardening-your-deployments\/configuring-openid-connect-in-cloud-providers\" rel=\"noopener noreferrer nofollow\">OIDC<\/a>\u00a0\u0442\u043e\u043a\u0435\u043d\u0430. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 OIDC\u00a0\u0442\u043e\u043a\u0435\u043d \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f <a href=\"https:\/\/github.com\/sigstore\/fulcio\" rel=\"noopener noreferrer nofollow\">sigstore\/fulcio<\/a>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043f\u043e\u0434\u043f\u0438\u0441\u0438 \u0434\u043b\u044f \u0434\u043e\u043a\u0435\u0440-\u043e\u0431\u0440\u0430\u0437\u043e\u0432.<\/p>\n<p><a href=\"https:\/\/docs.github.com\/en\/actions\/using-workflows\/workflow-syntax-for-github-actions#jobsjob_idsteps\" rel=\"noopener noreferrer nofollow\">steps<\/a>. \u0411\u043b\u043e\u043a, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0448\u0430\u0433\u0438, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043e\u0441\u0442\u043e\u0438\u0442\u00a0<code>job<\/code>. \u041a\u0430\u0436\u0434\u044b\u0439 \u0448\u0430\u0433 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c\u00a0<code>GitHub Action<\/code>\u00a0\u0438\u043b\u0438 shell-\u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439.<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0448\u0430\u0433\u0438 \u0434\u0430\u043d\u043d\u043e\u0433\u043e <code>GitHub Action<\/code>.<\/p>\n<pre><code>      - name: Checkout repository         uses: actions\/checkout@v2<\/code><\/pre>\n<p>\u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/docs.github.com\/en\/actions\/using-workflows\/workflow-syntax-for-github-actions#jobsjob_idstepsname\" rel=\"noopener noreferrer nofollow\">name<\/a> \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f \u0438\u043c\u044f \u0448\u0430\u0433\u0430. \u041e\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u0432 \u043b\u043e\u0433\u0430\u0445 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f\u00a0<code>job<\/code>\u00a0\u043d\u0430\u00a0<a href=\"https:\/\/github.com\/\" rel=\"noopener noreferrer nofollow\">GitHub<\/a>.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"\/img\/image-loader.svg\" height=\"893\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f9d\/9be\/baf\/f9d9bebaf9e9e2bbd88563ac25d694fd.png\" data-width=\"2520\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/docs.github.com\/en\/actions\/using-workflows\/workflow-syntax-for-github-actions#jobsjob_idstepsuses\" rel=\"noopener noreferrer nofollow\">uses<\/a> \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439\u00a0<code>GitHub Action<\/code>. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 &#8212; \u044d\u0442\u043e <a href=\"https:\/\/github.com\/actions\/checkout\" rel=\"noopener noreferrer nofollow\">actions\/checkout@v2<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0442\u044f\u0433\u0438\u0432\u0430\u0435\u0442 \u043a\u043e\u0434 \u0438\u0437 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u0432\u00a0<code>runner<\/code>.<\/p>\n<pre><code>      - name: Install cosign         if: github.event_name != 'pull_request'         uses: sigstore\/cosign-installer@1e95c1de343b5b0c23352d6417ee3e48d5bcd422         with:           cosign-release: 'v1.4.0'<\/code><\/pre>\n<p>\u042d\u0442\u043e\u0442 \u0448\u0430\u0433 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 <code>Pull Request<\/code>. \u042d\u0442\u043e \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/docs.github.com\/en\/actions\/using-workflows\/workflow-syntax-for-github-actions#jobsjob_idstepsif\" rel=\"noopener noreferrer nofollow\">if<\/a>. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0432 <code>if<\/code> \u043d\u0430 \u0434\u0430\u043d\u043d\u043e\u043c \u0448\u0430\u0433\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043e <code>github.event_name != 'pull_request'<\/code>. \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 <code>github.event_name<\/code> \u0431\u0435\u0440\u0451\u0442\u0441\u044f \u0438\u0437 <a href=\"https:\/\/docs.github.com\/en\/actions\/learn-github-actions\/contexts#github-context\" rel=\"noopener noreferrer nofollow\">github-\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430<\/a> \u0438 \u0432 \u043d\u0451\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u0438\u043c\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0438\u043d\u0438\u0446\u0438\u0438\u0440\u043e\u0432\u0430\u043b\u043e \u0437\u0430\u043f\u0443\u0441\u043a <code>workflow<\/code>. \u0414\u0430\u043d\u043d\u044b\u0439 \u0448\u0430\u0433 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 <a href=\"https:\/\/docs.sigstore.dev\/cosign\/overview\" rel=\"noopener noreferrer nofollow\">cosign<\/a> \u0432 \u043d\u0430\u0448 <code>runner<\/code> \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>GitHub Action <\/code><a href=\"https:\/\/github.com\/sigstore\/cosign-installer\" rel=\"noopener noreferrer nofollow\">sigstore\/cosign-installer<\/a>. \u042d\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0434\u043e\u043a\u0435\u0440-\u043e\u0431\u0440\u0430\u0437\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/docs.sigstore.dev\/cosign\/overview\" rel=\"noopener noreferrer nofollow\">cosign<\/a>. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 <code>GitHub Action<\/code> \u0437\u0434\u0435\u0441\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <a href=\"https:\/\/git-scm.com\/book\/ru\/v2\/%D0%98%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B-Git-%D0%92%D1%8B%D0%B1%D0%BE%D1%80-%D1%80%D0%B5%D0%B2%D0%B8%D0%B7%D0%B8%D0%B8\" rel=\"noopener noreferrer nofollow\">\u0445\u0435\u0448\u00a0\u043a\u043e\u043c\u043c\u0438\u0442\u0430 SHA <\/a>&#8212;<code>1e95c1de343b5b0c23352d6417ee3e48d5bcd422<\/code>. \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e\u00a0<code>with<\/code>\u00a0\u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0434\u043b\u044f<code>GitHub Action<\/code>. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>cosign-release<\/code> \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f \u0432\u0435\u0440\u0441\u0438\u044f <a href=\"https:\/\/docs.sigstore.dev\/cosign\/overview\" rel=\"noopener noreferrer nofollow\">cosign<\/a>.<\/p>\n<pre><code>      - name: Setup Docker buildx         uses: docker\/setup-buildx-action@79abd3f86f79a9d68a23c75a09a9a85889262adf<\/code><\/pre>\n<p>\u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/github.com\/docker\/setup-buildx-action\" rel=\"noopener noreferrer nofollow\">docker\/setup-buildx-action<\/a> \u043d\u0430 \u044d\u0442\u043e\u043c \u0448\u0430\u0433\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Docker\u00a0<a href=\"https:\/\/github.com\/docker\/buildx\" rel=\"noopener noreferrer nofollow\">Buildx<\/a>. <code>buildx<\/code> &#8212;\u00a0\u044d\u0442\u043e \u043f\u043b\u0430\u0433\u0438\u043d <a href=\"https:\/\/docs.docker.com\/engine\/reference\/commandline\/cli\/\" rel=\"noopener noreferrer nofollow\">Docker CLI<\/a> \u0434\u043b\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u044b\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u0441\u0431\u043e\u0440\u043a\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e\u00a0<a href=\"https:\/\/github.com\/moby\/buildkit\" rel=\"noopener noreferrer nofollow\">BuildKit<\/a>. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441 \u0435\u0433\u043e \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u043e\u0436\u043d\u043e <a href=\"https:\/\/github.com\/docker\/buildx#building-multi-platform-images\" rel=\"noopener noreferrer nofollow\">\u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u043c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u0431\u0440\u0430\u0437\u044b<\/a>.<\/p>\n<pre><code>      - name: Log into registry ${{ env.REGISTRY }}         if: github.event_name != 'pull_request'         uses: docker\/login-action@28218f9b04b4f3f62068d7b6ce6ca5b26e35336c         with:           registry: ${{ env.REGISTRY }}           username: ${{ github.actor }}           password: ${{ secrets.GITHUB_TOKEN }}<\/code><\/pre>\n<p>\u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/github.com\/docker\/login-action\" rel=\"noopener noreferrer nofollow\">docker\/login-action<\/a> \u043d\u0430 \u044d\u0442\u043e\u043c \u0448\u0430\u0433\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043b\u043e\u0433\u0438\u043d \u0432 <a href=\"https:\/\/docs.docker.com\/registry\/\" rel=\"noopener noreferrer nofollow\">Docker Registry<\/a>. \u042d\u0442\u043e\u0442 \u0448\u0430\u0433 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 <code>Pull Request<\/code>.<\/p>\n<p>\u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 <code>registry<\/code> \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f \u0430\u0434\u0440\u0435\u0441 <a href=\"https:\/\/docs.docker.com\/registry\/\" rel=\"noopener noreferrer nofollow\">Docker Registry<\/a>. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e <code>ghcr.io<\/code>  &#8212; \u0430\u0434\u0440\u0435\u0441 <a href=\"https:\/\/github.com\/features\/packages\" rel=\"noopener noreferrer nofollow\">GitHub Packages<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0435\u0440\u0451\u0442\u0441\u044f \u0438\u0437 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f <code>env.REGISTRY<\/code>.  \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u0435\u0441\u043b\u0438 \u0430\u0434\u0440\u0435\u0441 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d, \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0430\u0434\u0440\u0435\u0441 <a href=\"https:\/\/hub.docker.com\/\" rel=\"noopener noreferrer nofollow\">Docker Hub<\/a>.<\/p>\n<p>\u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>username<\/code> \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0434\u043b\u044f \u043b\u043e\u0433\u0438\u043d\u0430 \u0432  <a href=\"https:\/\/docs.docker.com\/registry\/\" rel=\"noopener noreferrer nofollow\">Docker Registry<\/a>. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u043d\u043e \u0431\u0435\u0440\u0451\u0442\u0441\u044f \u0438\u0437 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 <a href=\"https:\/\/docs.github.com\/en\/actions\/learn-github-actions\/contexts#github-context\" rel=\"noopener noreferrer nofollow\">github-\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430<\/a> <code>github.actor<\/code>, \u0433\u0434\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u043d\u0438\u0446\u0438\u0438\u0440\u043e\u0432\u0430\u043b \u0437\u0430\u043f\u0443\u0441\u043a <code>workflow<\/code>.<\/p>\n<p>\u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>password<\/code> \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f \u043f\u0430\u0440\u043e\u043b\u044c \u0438\u043b\u0438 \u0442\u043e\u043a\u0435\u043d \u043b\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430  \u0434\u043b\u044f \u043b\u043e\u0433\u0438\u043d\u0430 \u0432  <a href=\"https:\/\/docs.docker.com\/registry\/\" rel=\"noopener noreferrer nofollow\">Docker Registry<\/a>. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e <a href=\"https:\/\/docs.github.com\/en\/actions\/security-guides\/automatic-token-authentication#about-the-github_token-secret\" rel=\"noopener noreferrer nofollow\">GITHUB_TOKEN<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u0432 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u00a0<code>workflow<\/code>.<\/p>\n<pre><code>      - name: Extract Docker metadata         id: meta         uses: docker\/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38         with:           images: ${{ env.REGISTRY }}\/${{ env.IMAGE_NAME }}<\/code><\/pre>\n<p><code>GitHub Action<\/code> <a href=\"https:\/\/github.com\/docker\/metadata-action\" rel=\"noopener noreferrer nofollow\">docker\/metadata-action<\/a> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0442\u044c \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 <a href=\"https:\/\/git-scm.com\/docs\" rel=\"noopener noreferrer nofollow\">\u0441\u0441\u044b\u043b\u043e\u043a Git<\/a> \u0438 <a href=\"https:\/\/docs.github.com\/en\/actions\/using-workflows\/events-that-trigger-workflows#using-event-information\" rel=\"noopener noreferrer nofollow\">\u0441\u043e\u0431\u044b\u0442\u0438\u0439 GitHub<\/a>, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u0430\u043a\u0438\u0435, \u043a\u0430\u043a \u0442\u0435\u0433\u0438 (<code>--tag<\/code>) \u0438 \u043c\u0435\u0442\u043a\u0438 (<code>--label<\/code>) \u0434\u043b\u044f \u0434\u043e\u043a\u0435\u0440\u0430. \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 <code>images<\/code> \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043e\u043a\u0435\u0440-\u043e\u0431\u0440\u0430\u0437\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0438\u0445 \u0438\u043c\u0451\u043d. \u0415\u0441\u043b\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u043c\u0451\u043d, \u0442\u043e, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e\u0433\u043e \u0442\u0435\u0433\u043e\u0432. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f<code>${{ env.REGISTRY }}\/${{ env.IMAGE_NAME }}<\/code> \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f \u043e\u0434\u043d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 &#8212; <code>ghcr.io\/vanbv\/list-keep-front<\/code>. \u0422\u0430\u043a\u0436\u0435 \u0434\u043b\u044f \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0448\u0430\u0433\u0430 \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f <a href=\"https:\/\/docs.github.com\/en\/actions\/using-workflows\/workflow-syntax-for-github-actions#jobsjob_idstepsid\" rel=\"noopener noreferrer nofollow\">id<\/a> <code>meta<\/code> &#8212; \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0448\u0430\u0433\u0430, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043a <a href=\"https:\/\/docs.github.com\/en\/actions\/learn-github-actions\/contexts#steps-context\" rel=\"noopener noreferrer nofollow\">\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0443 \u0448\u0430\u0433\u0430<\/a>. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u044d\u0442\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043a \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c \u0448\u0430\u0433\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c: <code>${{ steps.meta.outputs }}<\/code> .<\/p>\n<p>\u041f\u043e\u043c\u0438\u043c\u043e \u044f\u0432\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0435\u0441\u0442\u044c \u0435\u0449\u0451 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0436\u043d\u044b\u0445, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. \u042d\u0442\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b <a href=\"https:\/\/github.com\/docker\/metadata-action#overwrite-labels\" rel=\"noopener noreferrer nofollow\">labels<\/a>, <a href=\"https:\/\/github.com\/docker\/metadata-action#tags-input\" rel=\"noopener noreferrer nofollow\">tags<\/a> \u0438 <a href=\"https:\/\/github.com\/docker\/metadata-action#flavor-input\" rel=\"noopener noreferrer nofollow\">flavor<\/a>.<\/p>\n<p>\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0432 <a href=\"https:\/\/github.com\/docker\/metadata-action#overwrite-labels\" rel=\"noopener noreferrer nofollow\">labels<\/a> \u0431\u0443\u0434\u0443\u0442 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043c\u0435\u0442\u043a\u0438 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441\u043e  <a href=\"https:\/\/github.com\/opencontainers\/image-spec\/blob\/master\/annotations.md\" rel=\"noopener noreferrer nofollow\">\u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0435\u0439 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 \u043e\u0431\u0440\u0430\u0437\u043e\u0432 OCI<\/a> \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0432\u0430\u0448\u0435\u0433\u043e \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u043a \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u044f \u0438 \u043f\u0440.). \u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u044d\u0442\u043e \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442, \u0442\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u043c\u043e\u0436\u043d\u043e \u044d\u0442\u0438 \u043c\u0435\u0442\u043a\u0438 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c. \u041f\u0440\u0438\u043c\u0435\u0440 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043d\u0438\u0436\u0435.<\/p>\n<pre><code>  org.opencontainers.image.title=list-keep-front   org.opencontainers.image.description=   org.opencontainers.image.url=https:\/\/github.com\/vanbv\/list-keep-front   org.opencontainers.image.source=https:\/\/github.com\/vanbv\/list-keep-front   org.opencontainers.image.version=v1.0.0   org.opencontainers.image.created=2022-01-22T09:31:27.670Z   org.opencontainers.image.revision=3e3e0ee1aeb21aae68e76865937c2b78383aa1be   org.opencontainers.image.licenses=<\/code><\/pre>\n<p><a href=\"https:\/\/github.com\/docker\/metadata-action#tags-input\" rel=\"noopener noreferrer nofollow\">tags<\/a> &#8212; \u044d\u0442\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u044d\u0442\u043e\u0433\u043e <code>GitHub Action<\/code>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u0442 \u043d\u0435\u0433\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u0442, \u043a\u0430\u043a \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0435 \u043c\u0435\u0442\u0430-\u0434\u0430\u043d\u043d\u044b\u0435. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u0435\u0441\u043b\u0438 \u044d\u0442\u043e\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u043d\u0435 \u0437\u0430\u0434\u0430\u0442\u044c, \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c:<\/p>\n<pre><code>tags: |   type=schedule   type=ref,event=branch   type=ref,event=tag   type=ref,event=pr<\/code><\/pre>\n<p>\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0437 \u0441\u0435\u0431\u044f \u0441\u043f\u0438\u0441\u043e\u043a \u0437\u0430\u043f\u0438\u0441\u0435\u0439 (\u0441\u0442\u0440\u043e\u043a), \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043a\u0430\u0436\u0434\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0437 \u0441\u0435\u0431\u044f \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0430\u0440 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 CSV (\u043f\u0430\u0440\u044b \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u044b \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439 \u0437\u0430\u043f\u044f\u0442\u044b\u043c\u0438). \u0424\u043e\u0440\u043c\u0430\u0442 \u043a\u0430\u0436\u0434\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>type<\/code>. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0437\u0430\u043f\u0438\u0441\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e.<\/p>\n<p><a href=\"https:\/\/github.com\/docker\/metadata-action#typeschedule\" rel=\"noopener noreferrer nofollow\">type=schedule<\/a> &#8212; \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u044f <a href=\"https:\/\/docs.github.com\/en\/actions\/using-workflows\/workflow-syntax-for-github-actions#onschedule\" rel=\"noopener noreferrer nofollow\">schedule<\/a>. \u0414\u043b\u044f \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0437\u0430\u043f\u0438\u0441\u0438 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0442\u044c \u0430\u0442\u0440\u0438\u0431\u0443\u0442 <code>pattern<\/code>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/handlebarsjs.com\/guide\/\" rel=\"noopener noreferrer nofollow\">Handlebars<\/a> \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u0434\u043b\u044f \u0442\u0435\u0433\u0430, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c\u043e\u0433\u043e \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435. \u0415\u0441\u043b\u0438 \u044d\u0442\u043e\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u043d\u0435 \u0437\u0430\u0434\u0430\u043d, \u0442\u043e \u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0431\u0443\u0434\u0435\u0442 <code>nightly<\/code>. \u0422.\u0435. \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u044f <a href=\"https:\/\/docs.github.com\/en\/actions\/using-workflows\/workflow-syntax-for-github-actions#onschedule\" rel=\"noopener noreferrer nofollow\">schedule<\/a>, \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0438\u043c\u044f \u0442\u0435\u0433\u0430 &#8212; <code>nightly<\/code>.<\/p>\n<p><a href=\"https:\/\/github.com\/docker\/metadata-action#typeref\" rel=\"noopener noreferrer nofollow\">type=ref<\/a> &#8212; \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u044f <code>branch<\/code>, <code>tag<\/code>, <code>pr<\/code>. \u041f\u0440\u0438\u043c\u0435\u0440 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043d\u0438\u0436\u0435.<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"center\"><strong>Event<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"238\" width=\"238\">\n<p align=\"center\"><strong>Ref<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"center\"><strong>Output<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p><code>pull_request<\/code><\/p>\n<\/td>\n<td data-colwidth=\"238\" width=\"238\">\n<p><code>refs\/pull\/2\/merge<\/code><\/p>\n<\/td>\n<td>\n<p><code>pr-2<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p><code>push<\/code><\/p>\n<\/td>\n<td data-colwidth=\"238\" width=\"238\">\n<p><code>refs\/heads\/master<\/code><\/p>\n<\/td>\n<td>\n<p><code>master<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p><code>push<\/code><\/p>\n<\/td>\n<td data-colwidth=\"238\" width=\"238\">\n<p><code>refs\/heads\/my\/branch<\/code><\/p>\n<\/td>\n<td>\n<p><code>my-branch<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p><code>push tag<\/code><\/p>\n<\/td>\n<td data-colwidth=\"238\" width=\"238\">\n<p><code>refs\/tags\/v1.2.3<\/code><\/p>\n<\/td>\n<td>\n<p><code>v1.2.3<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p><code>push tag<\/code><\/p>\n<\/td>\n<td data-colwidth=\"238\" width=\"238\">\n<p><code>refs\/tags\/v2.0.8-beta.67<\/code><\/p>\n<\/td>\n<td>\n<p><code>v2.0.8-beta.67<\/code><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u044d\u0442\u043e \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0442\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 <code>workflow<\/code>, &#8212; \u044d\u0442\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f <a href=\"https:\/\/github.com\/docker\/metadata-action\" rel=\"noopener noreferrer nofollow\">docker\/metadata-action<\/a>. \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u044f <a href=\"https:\/\/docs.github.com\/en\/actions\/using-workflows\/workflow-syntax-for-github-actions#onschedule\" rel=\"noopener noreferrer nofollow\">schedule<\/a>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 <code>workflow<\/code> \u043f\u043e \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044e, \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043f\u0438\u0441\u044c <code>type=schedule<\/code>, \u043d\u043e \u0438 <code>type=ref,event=branch<\/code>. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0447\u0435\u0433\u043e \u0432 \u043d\u0430\u0448\u0435\u043c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0434\u0432\u0430 \u0442\u0435\u0433\u0430: \u043e\u0434\u0438\u043d \u0442\u0435\u0433<code>nightly<\/code>, \u043f\u043e <code>type=schedule<\/code> \u0438 \u043e\u0434\u0438\u043d \u0442\u0435\u0433 <code>main<\/code>, \u043f\u043e <code>type=ref,event=branch<\/code>.<\/p>\n<p>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <a href=\"https:\/\/github.com\/docker\/metadata-action#flavor-input\" rel=\"noopener noreferrer nofollow\">flavor<\/a> \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 <a href=\"https:\/\/github.com\/docker\/metadata-action#tags-input\" rel=\"noopener noreferrer nofollow\">tags<\/a>. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043d\u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u044b \u0438 \u0441\u0443\u0444\u0444\u0438\u043a\u0441\u044b \u0434\u043b\u044f \u0442\u0435\u0433\u043e\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432 <code>prefix<\/code> \u0438 <code>suffix<\/code>.  \u0422\u0430\u043a\u0436\u0435 \u0443 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0430\u0442\u0440\u0438\u0431\u0443\u0442 <code>latest<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u043c\u0435\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e <code>auto<\/code>. \u042d\u0442\u043e\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0442\u043e, \u0431\u0443\u0434\u0435\u0442 \u043b\u0438 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u0442\u0435\u0433 <code>latest<\/code>. \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>auto<\/code> \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0442\u0435\u0433 <code>latest<\/code> \u0431\u0443\u0434\u0435\u0442, \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435 \u0445\u043e\u0442\u044f \u0431\u044b \u043f\u043e \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/github.com\/docker\/metadata-action#typeref\" rel=\"noopener noreferrer nofollow\">type=ref,event=tag<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/docker\/metadata-action#typesemver\" rel=\"noopener noreferrer nofollow\">type=semver,pattern=&#8230;<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/docker\/metadata-action#typematch\" rel=\"noopener noreferrer nofollow\">type=match,pattern=&#8230;<\/a><\/p>\n<\/li>\n<\/ul>\n<p>\u0417\u0430\u043f\u0438\u0441\u044c <code>type=ref,event=tag<\/code> \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u044e <code>push tag<\/code>. <code>type=semver<\/code> \u0442\u0430\u043a\u0436\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u044e <code>push tag<\/code>, \u043d\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0442\u0435\u0433 \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 <a href=\"https:\/\/semver.org\/lang\/ru\/\" rel=\"noopener noreferrer nofollow\">SemVer<\/a>. <code>type=match<\/code> \u0442\u043e\u0436\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u044e <code>push tag<\/code>, \u043d\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0442\u0435\u0433 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u043c\u0443 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044e \u0432 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0435 <code>pattern<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435 \u0437\u0430\u0434\u0430\u043d \u0438, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u044d\u0442\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043d\u0438 \u043e\u0434\u0438\u043d \u0442\u0435\u0433. \u0422.\u0435. \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e, \u0432 \u043e\u0431\u0449\u0435\u043c-\u0442\u043e, \u0442\u0435\u0433 <code>latest<\/code> \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u043b\u044e\u0431\u043e\u0433\u043e \u0442\u0435\u0433\u0430. \u041f\u0440\u0430\u0432\u0434\u0430, \u0432 \u0441\u0430\u043c\u043e\u043c \u043d\u0430\u0447\u0430\u043b\u0435 \u043d\u0430\u0448\u0435\u0433\u043e <code>workflow<\/code> \u0431\u044b\u043b\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043e, \u0447\u0442\u043e \u0435\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0442\u0435\u0433\u0438 <code>git<\/code> \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 <a href=\"https:\/\/semver.org\/lang\/ru\/\" rel=\"noopener noreferrer nofollow\">SemVer<\/a>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430 \u0434\u0440\u0443\u0433\u0438\u0435 \u0442\u0435\u0433\u0438 \u043d\u0430\u0448 <code>workflow<\/code> \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u0438 \u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0441\u044f.<\/p>\n<pre><code>      - name: Build and push Docker image         id: build-and-push         uses: docker\/build-push-action@ad44023a93711e3deb337508980b4b5e9bcdc5dc         with:           context: .           push: ${{ github.event_name != 'pull_request' }}           tags: ${{ steps.meta.outputs.tags }}           labels: ${{ steps.meta.outputs.labels }}<\/code><\/pre>\n<p>\u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e\u00a0<a href=\"https:\/\/github.com\/docker\/build-push-action\" rel=\"noopener noreferrer nofollow\">docker\/build-push-action<\/a>\u00a0\u043d\u0430 \u044d\u0442\u043e\u043c \u0448\u0430\u0433\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441\u0431\u043e\u0440\u043a\u0430 \u0438 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044f \u0434\u043e\u043a\u0435\u0440-\u043e\u0431\u0440\u0430\u0437\u043e\u0432 \u0432 <a href=\"https:\/\/github.com\/features\/packages\" rel=\"noopener noreferrer nofollow\">GitHub Packages<\/a>.  \u0414\u043b\u044f \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0448\u0430\u0433\u0430 \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f <a href=\"https:\/\/docs.github.com\/en\/actions\/using-workflows\/workflow-syntax-for-github-actions#jobsjob_idstepsid\" rel=\"noopener noreferrer nofollow\">id<\/a> <code>build-and-push<\/code>, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043a <a href=\"https:\/\/docs.github.com\/en\/actions\/learn-github-actions\/contexts#steps-context\" rel=\"noopener noreferrer nofollow\">\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0443 \u0448\u0430\u0433\u0430<\/a>.<\/p>\n<p>\u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 <code>context<\/code> \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0441\u0431\u043e\u0440\u043a\u0438 \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f \u0442\u0435\u043a\u0443\u0449\u0430\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f <code>.<\/code>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u044b\u043b\u0430 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0441\u0431\u043e\u0440\u043a\u0438.<\/p>\n<p>\u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 <code>push<\/code> \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0442\u044c, \u043d\u0443\u0436\u043d\u043e \u043b\u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0441\u0431\u043e\u0440\u043a\u0438 \u0434\u043e\u043a\u0435\u0440-\u043e\u0431\u0440\u0430\u0437\u043e\u0432 \u0432 <a href=\"https:\/\/docs.docker.com\/registry\/\" rel=\"noopener noreferrer nofollow\">Docker Registry<\/a>. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044f \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 <code>Pull Request<\/code>(\u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0441\u0431\u043e\u0440\u043a\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u0431\u0443\u0434\u0435\u0442).<\/p>\n<p>\u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>tags<\/code> \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0435\u0433\u043e\u0432. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>${{ steps.meta.outputs.tags }}<\/code> \u043e\u043d \u0431\u0435\u0440\u0451\u0442\u0441\u044f \u0438\u0437 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u0448\u0430\u0433\u0430 \u0441 <a href=\"https:\/\/docs.github.com\/en\/actions\/using-workflows\/workflow-syntax-for-github-actions#jobsjob_idstepsid\" rel=\"noopener noreferrer nofollow\">id<\/a> <code>meta<\/code>.<\/p>\n<p>\u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>labels<\/code> \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f \u0441\u043f\u0438\u0441\u043e\u043a \u043c\u0435\u0442\u0430-\u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0437\u0430. \u042d\u0442\u043e\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0438\u0437 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u0448\u0430\u0433\u0430 <code>meta<\/code> \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>${{ steps.meta.outputs.labels }}<\/code>.<\/p>\n<pre><code>     - name: Sign the published Docker image         if: ${{ github.event_name != 'pull_request' }}         env:           COSIGN_EXPERIMENTAL: \"true\"         run: cosign sign ${{ env.REGISTRY }}\/${{ env.IMAGE_NAME }}@${{ steps.build-and-push.outputs.digest }}<\/code><\/pre>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u0448\u0430\u0433\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u0434\u043e\u043a\u0435\u0440-\u043e\u0431\u0440\u0430\u0437\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/github.com\/sigstore\/cosign\" rel=\"noopener noreferrer nofollow\">cosign<\/a>. \u042d\u0442\u043e\u0442 \u0448\u0430\u0433 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 <code>Pull Request<\/code>. \u041f\u043e\u0434\u043f\u0438\u0441\u044c \u0434\u043e\u043a\u0435\u0440-\u043e\u0431\u0440\u0430\u0437\u043e\u0432 \u043d\u0443\u0436\u043d\u0430, \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0438\u0445 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435, \u0442.\u0435., \u043f\u043e \u0441\u0443\u0442\u0438, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c, \u043a\u0435\u043c \u043e\u043d\u0438 \u0431\u044b\u043b\u0438 \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u044b. \u0414\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 <a href=\"https:\/\/github.com\/sigstore\/cosign\" rel=\"noopener noreferrer nofollow\">cosign<\/a> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <a href=\"https:\/\/docs.github.com\/en\/actions\/using-workflows\/workflow-syntax-for-github-actions#jobsjob_idstepsrun\" rel=\"noopener noreferrer nofollow\">run<\/a>. <a href=\"https:\/\/docs.github.com\/en\/actions\/using-workflows\/workflow-syntax-for-github-actions#jobsjob_idstepsrun\" rel=\"noopener noreferrer nofollow\">run<\/a> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%98%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81_%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%BD%D0%BE%D0%B9_%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B8\" rel=\"noopener noreferrer nofollow\">CLI-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/a>. <\/p>\n<p>\u0420\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u0430\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430. \u0418\u0442\u0430\u043a, <code>cosign sign<\/code> \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u0442\u044c \u0434\u043e\u043a\u0435\u0440-\u043e\u0431\u0440\u0430\u0437, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>${{ env.REGISTRY }}\/${{ env.IMAGE_NAME }}<\/code>. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 <code>ghcr.io\/vanbv\/list-keep-front<\/code>. \u0422\u0430\u043a\u0436\u0435, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e @ \u043f\u043e\u0441\u043b\u0435 \u0434\u043e\u043a\u0435\u0440-\u043e\u0431\u0440\u0430\u0437\u0430, \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0442\u044c <a href=\"https:\/\/www.mikenewswanger.com\/posts\/2020\/docker-image-digests\/\" rel=\"noopener noreferrer nofollow\">digest<\/a>. <a href=\"https:\/\/www.mikenewswanger.com\/posts\/2020\/docker-image-digests\/\" rel=\"noopener noreferrer nofollow\">digest<\/a> \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0437 \u0441\u0435\u0431\u044f <a href=\"https:\/\/ru.wikipedia.org\/wiki\/SHA-2\" rel=\"noopener noreferrer nofollow\">SHA-256 \u0445\u0435\u0448<\/a>, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0448 \u043e\u0431\u0440\u0430\u0437. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 <a href=\"https:\/\/www.mikenewswanger.com\/posts\/2020\/docker-image-digests\/\" rel=\"noopener noreferrer nofollow\">digest<\/a> \u0431\u0435\u0440\u0435\u0442\u0441\u044f \u0438\u0437 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u0448\u0430\u0433\u0430 <code>build-and-push<\/code>, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u0438\u0437 <code>steps.build-and-push.outputs.digest<\/code>.<code>cosign<\/code> \u043f\u043e\u0434\u043f\u0438\u0448\u0435\u0442 \u044d\u0442\u043e\u0442 \u043e\u0431\u0440\u0430\u0437 \u0438 \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u0442 \u044d\u0442\u0443 \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u0432 <a href=\"https:\/\/github.com\/features\/packages\" rel=\"noopener noreferrer nofollow\">GitHub Packages<\/a>, \u0440\u044f\u0434\u043e\u043c \u0441 \u043d\u0430\u0448\u0438\u043c \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c. \u0418\u043c\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u0438 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u043a\u0430\u043a-\u0442\u043e \u0442\u0430\u043a <code>sha256-61d911ad3a5689dc2ed30a30a0f66be2fb72a59ba1bc41a5cb8516d5b74b7101.sig<\/code>.<\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0437\u0434\u0435\u0441\u044c \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f <a href=\"https:\/\/github.com\/sigstore\/cosign#anything-under-the-cosign_experimental-environment-variable\" rel=\"noopener noreferrer nofollow\">COSIGN_EXPERIMENTAL<\/a>. \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043d\u0435\u0451 \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0442\u0441\u044f \u044d\u043a\u0441\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441 <a href=\"https:\/\/docs.sigstore.dev\/rekor\/overview\" rel=\"noopener noreferrer nofollow\">Rekor<\/a> \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u043e\u0434\u043f\u0438\u0441\u0438 \u0431\u0435\u0437 \u043a\u043b\u044e\u0447\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/docs.sigstore.dev\/fulcio\/overview\" rel=\"noopener noreferrer nofollow\">Fulcio<\/a>.<\/p>\n<\/div>\n<\/details>\n<p>\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0443\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u043a\u043e\u0434 \u0434\u0430\u043d\u043d\u043e\u0433\u043e <code>GitHub Action<\/code>. \u0410 \u0438\u043c\u0435\u043d\u043d\u043e \u0443\u0431\u0440\u0430\u0442\u044c \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044e \u043f\u043e \u043a\u0440\u043e\u043d\u0443, \u0442.\u043a. \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044f \u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0432\u0435\u0442\u043a\u0438 <code>main<\/code>, \u0438 \u044d\u0442\u043e\u0433\u043e, \u043c\u043d\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0431\u043e\u0440\u043e\u043a \u0434\u043e\u043a\u0435\u0440-\u043e\u0431\u0440\u0430\u0437\u043e\u0432. \u0422\u0430\u043a\u0436\u0435, \u0434\u0443\u043c\u0430\u044e, \u043c\u043e\u0436\u043d\u043e \u0443\u0431\u0440\u0430\u0442\u044c \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u0434\u043e\u043a\u0435\u0440-\u043e\u0431\u0440\u0430\u0437\u043e\u0432, \u0442.\u043a. \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u0434\u043e\u043a\u0435\u0440-\u043e\u0431\u0440\u0430\u0437\u044b \u044f \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0441\u0435\u0431\u044f. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0442\u043e\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0443\u0431\u0440\u0430\u0442\u044c \u0438 \u0431\u043b\u043e\u043a <a href=\"https:\/\/docs.github.com\/en\/actions\/using-workflows\/workflow-syntax-for-github-actions#jobsjob_idpermissions\" rel=\"noopener noreferrer nofollow\">permissions<\/a>, \u0442.\u043a. \u043f\u0440\u0430\u0432 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0434\u043b\u044f <a href=\"https:\/\/docs.github.com\/en\/actions\/security-guides\/automatic-token-authentication#about-the-github_token-secret\" rel=\"noopener noreferrer nofollow\">GITHUB_TOKEN<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e.<\/p>\n<details class=\"spoiler\">\n<summary>\u0418\u0442\u043e\u0433\u043e\u0432\u044b\u0439 build.yml<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>name: build  on:   push:     branches: [ main ]     tags: [ 'v*.*.*' ]   pull_request:     branches: [ main ]  env:   REGISTRY: ghcr.io   IMAGE_NAME: ${{ github.repository }}   jobs:   build:      runs-on: ubuntu-latest      steps:       - name: Checkout repository         uses: actions\/checkout@v2        - name: Setup Docker buildx         uses: docker\/setup-buildx-action@79abd3f86f79a9d68a23c75a09a9a85889262adf        - name: Log into registry ${{ env.REGISTRY }}         if: github.event_name != 'pull_request'         uses: docker\/login-action@28218f9b04b4f3f62068d7b6ce6ca5b26e35336c         with:           registry: ${{ env.REGISTRY }}           username: ${{ github.actor }}           password: ${{ secrets.GITHUB_TOKEN }}        - name: Extract Docker metadata         id: meta         uses: docker\/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38         with:           images: ${{ env.REGISTRY }}\/${{ env.IMAGE_NAME }}        - name: Build and push Docker image         id: build-and-push         uses: docker\/build-push-action@ad44023a93711e3deb337508980b4b5e9bcdc5dc         with:           context: .           push: ${{ github.event_name != 'pull_request' }}           tags: ${{ steps.meta.outputs.tags }}           labels: ${{ steps.meta.outputs.labels }}<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043c\u044b \u0437\u0430\u043f\u0443\u0448\u0438\u043c \u043d\u0430\u0448 <code>build.yml<\/code> \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0451\u0442 \u0437\u0430\u043f\u0443\u0441\u043a <code>workflow<\/code>, \u043f\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 \u0447\u0435\u0433\u043e \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u0434\u043e\u043a\u0435\u0440-\u043e\u0431\u0440\u0430\u0437, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043b\u0435\u0436\u0430\u0442\u044c \u0432 <a href=\"https:\/\/github.com\/features\/packages\" rel=\"noopener noreferrer nofollow\">GitHub Packages<\/a>. \u0423\u0432\u0438\u0434\u0435\u0442\u044c, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0447\u0442\u043e-\u0442\u043e \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043b\u043e\u0441\u044c, \u043c\u043e\u0436\u043d\u043e \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 <code>Code<\/code> \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"\/img\/image-loader.svg\" height=\"885\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/527\/d73\/6a5\/527d736a56132f3c8e7ccd6ce13e6cec.png\" data-width=\"2349\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041f\u0435\u0440\u0435\u0439\u0434\u044f \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u043d\u0430\u0448\u0435\u0433\u043e <code>Package<\/code>, \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043d\u0430\u0448\u0438 \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0434\u043e\u043a\u0435\u0440-\u043e\u0431\u0440\u0430\u0437\u044b.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"\/img\/image-loader.svg\" height=\"710\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/104\/2ef\/196\/1042ef1963c590cb68276c95124b21a6.png\" data-width=\"2044\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0418\u0442\u0430\u043a, \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0432\u0435\u0442\u043a\u0438 <code>main<\/code> \u043d\u0430\u0448 <code>workflow<\/code> \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u043a\u0430\u043a \u043e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0442\u0435\u0433\u0430. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 <code>Code<\/code> \u043d\u0430\u0448\u0435\u0433\u043e \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u0436\u043c\u0451\u043c <code>Create a new release<\/code>.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"\/img\/image-loader.svg\" height=\"624\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/42a\/c00\/384\/42ac003846d7f8c25c865e9c4d549e94.png\" data-width=\"2192\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0440\u0435\u043b\u0438\u0437\u0430 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0442\u0435\u0433. \u0427\u0442\u043e \u043d\u0430\u043c \u0438 \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043d\u0430\u0448\u0435\u0433\u043e <code>workflow<\/code>.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"\/img\/image-loader.svg\" height=\"302\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/6d8\/711\/ae0\/6d8711ae0f554ccb2e9c5d35fa6e4109.png\" data-width=\"631\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0432\u0441\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u044b\u0435 \u043d\u0430\u043c \u043f\u043e\u043b\u044f \u0438 \u0436\u043c\u0451\u043c <code>Publish release<\/code>.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"\/img\/image-loader.svg\" height=\"1098\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/623\/196\/7fd\/6231967fd6ebf1347a0c3ccb3ea893f1.png\" data-width=\"1454\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0430\u0448\u0435\u0433\u043e <code>workflow<\/code> \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u043d\u0430\u0448\u0438\u0445 <code>Packages<\/code> \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0434\u043e\u043a\u0435\u0440-\u043e\u0431\u0440\u0430\u0437 \u0441 \u0442\u0435\u0433\u043e\u043c <code>0.0.1<\/code>, \u0430 \u0442\u0430\u043a \u0436\u0435 <code>latest<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043b\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043d\u0438\u043c. \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u044d\u0442\u0438\u0445 \u0434\u0432\u0443\u0445 \u0434\u043e\u043a\u0435\u0440-\u043e\u0431\u0440\u0430\u0437\u043e\u0432 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"\/img\/image-loader.svg\" height=\"817\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d8f\/7ab\/6d3\/d8f7ab6d359c0e282da62cf5c9f0303b.png\" data-width=\"1158\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041f\u043e\u043c\u0438\u043c\u043e \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u0434\u043e\u043a\u0435\u0440-\u043e\u0431\u0440\u0430\u0437\u043e\u0432 \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 <a href=\"https:\/\/github.com\/features\/packages\" rel=\"noopener noreferrer nofollow\">GitHub Packages<\/a> \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0435\u0449\u0451 <a href=\"https:\/\/docs.github.com\/en\/packages\/managing-github-packages-using-github-actions-workflows\/publishing-and-installing-a-package-with-github-actions#upgrading-a-workflow-that-accesses-ghcrio\" rel=\"noopener noreferrer nofollow\">\u043e\u0434\u0438\u043d \u0441\u043f\u043e\u0441\u043e\u0431<\/a>. \u0415\u0433\u043e \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u043f\u0440\u0438 \u0441\u0431\u043e\u0440\u043a\u0435 <a href=\"https:\/\/spring.io\/projects\/spring-boot\" rel=\"noopener noreferrer nofollow\">Spring Boot<\/a>\u00a0\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u043b \u0432 <a href=\"https:\/\/habr.com\/ru\/post\/576412\/\" rel=\"noopener noreferrer nofollow\">\u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a>.<\/p>\n<h2>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>\u0427\u0442\u043e \u0436, \u0432\u043e\u0442 \u0438 \u043f\u043e\u0434\u043e\u0448\u043b\u0430 \u043a \u043a\u043e\u043d\u0446\u0443 \u043c\u043e\u044f \u0441\u0442\u0430\u0442\u044c\u044f. \u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0431\u044b\u043b\u0430 \u0432\u0430\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430 \u0438 \u043f\u043e\u043b\u0435\u0437\u043d\u0430 \u0438 \u043d\u0435 \u0443\u0441\u0442\u0430\u0440\u0435\u043b\u0430, \u043f\u043e\u043a\u0430 \u044f \u043f\u0438\u0441\u0430\u043b \u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043b. \u0418 \u0447\u0442\u043e \u0445\u043e\u0442\u044c \u043a\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u0437\u0430\u0433\u043b\u044f\u043d\u0443\u043b, \u0430 \u0442\u043e \u0438 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043b \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0432 \u0441\u043f\u043e\u0439\u043b\u0435\u0440\u0430\u0445. <\/p>\n<p>\u0418 \u0435\u0449\u0451: \u0431\u0435\u0440\u0435\u0433\u0438\u0442\u0435 \u0442\u0430\u043c \u0441\u0435\u0431\u044f.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"v-portal\" style=\"display:none;\"><\/div>\n<\/div>\n<p> <!----> <!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/599119\/\"> https:\/\/habr.com\/ru\/post\/599119\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0435\u0440\u0438\u0438 \u0432\u044b \u0443\u0437\u043d\u0430\u0435\u0442\u0435 \u043a\u0430\u043a \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0434\u043e\u043a\u0435\u0440-\u043e\u0431\u0440\u0430\u0437 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 <a href=\"https:\/\/vuejs.org\/\" rel=\"noopener noreferrer nofollow\">Vue.js<\/a> \u0438 \u043a\u0430\u043a \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0432\u00a0<a href=\"https:\/\/github.com\/features\/packages\" rel=\"noopener noreferrer nofollow\">GitHub Packages<\/a>. \u0412\u043e\u0442\u00a0<a href=\"https:\/\/github.com\/vanbv\/list-keep\/blob\/main\/.github\/workflows\/build.yml\" rel=\"noopener noreferrer nofollow\">\u0442\u0430\u043a<\/a>. \u0412\u043e\u0442 \u0432 \u043e\u0431\u0449\u0435\u043c-\u0442\u043e \u0438&#8230; \u043d\u0435 \u0432\u0441\u0451&#8230; \u041e\u0434\u043d\u0438\u043c <a href=\"https:\/\/github.com\/features\/actions\" rel=\"noopener noreferrer nofollow\">GitHub Action<\/a>, \u043a\u0430\u043a \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u0434\u043b\u044f <a href=\"https:\/\/spring.io\/projects\/spring-boot\" rel=\"noopener noreferrer nofollow\">Spring Boot<\/a>\u00a0\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043b <a href=\"https:\/\/habr.com\/ru\/post\/576412\/\" rel=\"noopener noreferrer nofollow\">\u0442\u0443\u0442<\/a>, \u0432 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f. \u041d\u0443\u0436\u043d\u043e \u0435\u0449\u0451 \u043f\u0440\u043e\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0438, \u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u044f \u0438 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u0432 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435.<\/p>\n<h3>\u0421\u0431\u043e\u0440\u043a\u0430 docker-\u043e\u0431\u0440\u0430\u0437\u0430<\/h3>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0431\u0443\u0434\u0435\u043c \u0432\u043e\u0442\u00a0<a href=\"https:\/\/github.com\/vanbv\/list-keep-front\" rel=\"noopener noreferrer nofollow\">\u044d\u0442\u043e\u0442<\/a>\u00a0\u043f\u0440\u043e\u0435\u043a\u0442. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e \u043d\u0451\u043c \u044f \u043f\u0438\u0441\u0430\u043b \u0432\u00a0<a href=\"https:\/\/habr.com\/ru\/post\/546428\/\" rel=\"noopener noreferrer nofollow\">\u044d\u0442\u043e\u0439<\/a>\u00a0\u0441\u0442\u0430\u0442\u044c\u0435.<\/p>\n<p>\u0418\u0442\u0430\u043a, \u043a\u0430\u043a \u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0434\u043e\u043a\u0435\u0440-\u043e\u0431\u0440\u0430\u0437 \u0434\u043b\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 <a href=\"https:\/\/vuejs.org\/\" rel=\"noopener noreferrer nofollow\">Vue.js<\/a>?! \u041e\u0431\u0440\u0430\u0442\u0438\u043c\u0441\u044f \u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c \u044d\u0442\u043e\u0433\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 \u0438 \u043f\u043e\u0438\u0449\u0435\u043c \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u0430\u0439\u0442\u0435 <a href=\"https:\/\/vuejs.org\/\" rel=\"noopener noreferrer nofollow\">Vue.js<\/a>. <a href=\"https:\/\/ru.vuejs.org\/v2\/cookbook\/dockerize-vuejs-app.html\" rel=\"noopener noreferrer nofollow\">\u0422\u0430\u043c<\/a> \u043d\u0430\u043c \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c Dockerfile \u0438 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0434\u0430\u044e\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0434\u0432\u0443\u0445 \u0434\u043e\u043a\u0435\u0440-\u0444\u0430\u0439\u043b\u043e\u0432.<\/p>\n<p>\u0412 \u043f\u0435\u0440\u0432\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0439, \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438,\u00a0<a href=\"https:\/\/github.com\/indexzero\/http-server\" rel=\"noopener noreferrer nofollow\">HTTP-\u0441\u0435\u0440\u0432\u0435\u0440<\/a>.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 \u0441 \u043f\u0440\u043e\u0441\u0442\u044b\u043c HTTP-\u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>FROM node:lts-alpine  # \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 HTTP-\u0441\u0435\u0440\u0432\u0435\u0440 \u0434\u043b\u044f \u0441\u0442\u0430\u0442\u0438\u043a\u0438 RUN npm install -g http-server  # \u0434\u0435\u043b\u0430\u0435\u043c \u043a\u0430\u0442\u0430\u043b\u043e\u0433 'app' \u0442\u0435\u043a\u0443\u0449\u0438\u043c \u0440\u0430\u0431\u043e\u0447\u0438\u043c \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u043e\u043c WORKDIR \/app  # \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u043e\u0431\u0430 'package.json' \u0438 'package-lock.json' (\u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c) COPY package*.json .\/  # \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 RUN npm install  # \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0444\u0430\u0439\u043b\u044b \u0438 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0432 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u043a\u0430\u0442\u0430\u043b\u043e\u0433 (\u0442.\u0435. \u0432 \u043a\u0430\u0442\u0430\u043b\u043e\u0433 'app') COPY . .  # \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f production \u0441 \u043c\u0438\u043d\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0435\u0439 RUN npm run build  EXPOSE 8080 CMD [ \"http-server\", \"dist\" ]<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0412 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043e\u0431 \u044d\u0442\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u043f\u0438\u0448\u0443\u0442, \u0447\u0442\u043e \u043e\u043d \u043f\u0440\u043e\u0441\u0442 \u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0443\u044f\u0437\u0432\u0438\u043c \u0434\u043b\u044f \u0445\u0430\u043a\u0435\u0440\u0441\u043a\u0438\u0445 \u0430\u0442\u0430\u043a, \u0438 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0448\u0438\u0440\u043e\u043a\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a\u00a0<a href=\"https:\/\/www.nginx.com\/\" rel=\"noopener noreferrer nofollow\">NGINX<\/a>\u00a0\u0438\u043b\u0438\u00a0<a href=\"https:\/\/httpd.apache.org\/\" rel=\"noopener noreferrer nofollow\">Apache<\/a>.<\/p>\n<p>\u0412\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0443\u0436\u0435 \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0435\u043d \u043a \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u0438 \u0432 \u043d\u0451\u043c \u043a\u0430\u043a \u0440\u0430\u0437 \u0442\u0430\u043a\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432\u044b\u0448\u0435 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044b\u0439 <a href=\"https:\/\/www.nginx.com\/\" rel=\"noopener noreferrer nofollow\">NGINX<\/a>.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 \u0441 NGINX<\/summary>\n<div class=\"spoiler__content\">\n<pre><code># \u044d\u0442\u0430\u043f \u0441\u0431\u043e\u0440\u043a\u0438 (build stage) FROM node:lts-alpine as build-stage WORKDIR \/app COPY package*.json .\/ RUN npm install COPY . . RUN npm run build  # \u044d\u0442\u0430\u043f production (production-stage) FROM nginx:stable-alpine as production-stage COPY --from=build-stage \/app\/dist \/usr\/share\/nginx\/html EXPOSE 80 CMD [\"nginx\", \"-g\", \"daemon off;\"]<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435, \u0447\u0435\u0433\u043e \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435, \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, \u044d\u0442\u043e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u044d\u0442\u043e\u0433\u043e \u0441\u0430\u043c\u043e\u0433\u043e NGINX. \u041e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u043d\u0443\u0436\u043d\u0430, \u0435\u0441\u043b\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0438\u0437 Vue.js \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u0431\u044d\u043a\u0435\u043d\u0434, \u0442.\u0435. \u043f\u0440\u043e\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u043a\u043e\u043f\u0430\u0442\u044c\u0441\u044f, \u0442\u043e \u0438 \u0442\u0430\u043a\u043e\u0439 <a href=\"https:\/\/cli.vuejs.org\/ru\/guide\/deployment.html#docker-nginx\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0438\u043c\u0435\u0440<\/a> \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043d\u0430 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u0430\u0439\u0442\u0435.<\/p>\n<pre><code>FROM node:latest as build-stage WORKDIR \/app COPY package*.json .\/ RUN npm install COPY .\/ . RUN npm run build  FROM nginx as production-stage RUN mkdir \/app COPY --from=build-stage \/app\/dist \/app COPY nginx.conf \/etc\/nginx\/nginx.conf<\/code><\/pre>\n<p>\u0412 \u044d\u0442\u043e\u043c Dockerfile \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <a href=\"https:\/\/docs.docker.com\/develop\/develop-images\/multistage-build\/\" rel=\"noopener noreferrer nofollow\">\u043c\u043d\u043e\u0433\u043e\u0441\u0442\u0443\u043f\u0435\u043d\u0447\u0430\u0442\u0430\u044f \u0441\u0431\u043e\u0440\u043a\u0430<\/a> \u0434\u043e\u043a\u0435\u0440-\u043e\u0431\u0440\u0430\u0437\u0430. \u041c\u043d\u043e\u0433\u043e\u0441\u0442\u0443\u043f\u0435\u043d\u0447\u0430\u0442\u044b\u0435 \u0441\u0431\u043e\u0440\u043a\u0438 \u043d\u0443\u0436\u043d\u044b, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0435 \u043e\u0431\u0440\u0430\u0437\u044b, \u0441\u00a0\u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u043d\u0430\u0431\u043e\u0440\u043e\u043c \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439, \u0442.\u0435. \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u00a0\u0442\u0435\u043c, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0434\u0432\u0430 \u044d\u0442\u0430\u043f\u0430 \u0441\u0431\u043e\u0440\u043a\u0438. \u041d\u0430 \u043f\u0435\u0440\u0432\u043e\u043c \u044d\u0442\u0430\u043f\u0435 &#8212; <code>build-stage<\/code> &#8212; \u0441\u0442\u044f\u0433\u0438\u0432\u0430\u0435\u0442\u0441\u044f <a href=\"https:\/\/nodejs.org\/\" rel=\"noopener noreferrer nofollow\">Node.js<\/a> \u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441\u0431\u043e\u0440\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f Vue.js \u0434\u043b\u044f production. \u041d\u0430 \u0432\u0442\u043e\u0440\u043e\u043c \u044d\u0442\u0430\u043f\u0435 &#8212; <code>production-stage<\/code> &#8212; \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0443\u0436\u0435 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0441\u0431\u043e\u0440\u043a\u0430 production \u043e\u0431\u0440\u0430\u0437\u0430.<\/p>\n<details class=\"spoiler\">\n<summary>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e Dockerfile<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0417\u0434\u0435\u0441\u044c, \u0434\u043b\u044f \u0441\u0430\u043c\u044b\u0445 \u043b\u044e\u0431\u043e\u0437\u043d\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445, \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u0434\u0430\u043d\u043d\u043e\u043c <a href=\"https:\/\/docs.docker.com\/engine\/reference\/builder\/\" rel=\"noopener noreferrer nofollow\">Dockerfile<\/a>.<\/p>\n<p><code>FROM node:latest as build-stage<\/code>. \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 <a href=\"https:\/\/docs.docker.com\/glossary\/#base-image\" rel=\"noopener noreferrer nofollow\">\u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043e\u0431\u0440\u0430\u0437\u0430<\/a> (\u0442.\u0435. \u043e\u0431\u0440\u0430\u0437\u0430, \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u044b, \u043f\u043e \u0441\u0443\u0442\u0438, \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u0441\u0432\u043e\u0439 \u043e\u0431\u0440\u0430\u0437 \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438), <a href=\"https:\/\/hub.docker.com\/_\/node\" rel=\"noopener noreferrer nofollow\">\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0440\u0430\u0437 Node.js<\/a> \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438. \u0422\u0430\u043a \u0436\u0435, \u0437\u0434\u0435\u0441\u044c \u043c\u044b \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u0442\u0430\u043f\u0430 \u0441\u0431\u043e\u0440\u043a\u0438 &#8212; build-stage, \u0447\u0442\u043e\u0431\u044b \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u0432 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 <code>COPY<\/code> \u043a \u044d\u0442\u043e\u043c\u0443 \u044d\u0442\u0430\u043f\u0443 \u043f\u043e \u0438\u043c\u0435\u043d\u0438. \u0418\u043c\u0435\u043d\u0430 \u044d\u0442\u0430\u043f\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u043d\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c, \u0438 \u0442\u043e\u0433\u0434\u0430 \u043a \u043d\u0438\u043c \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0446\u0438\u0444\u0440 (\u043a \u043f\u0435\u0440\u0432\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 <code>FROM<\/code> \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e 0 \u0438 \u0442.\u0434.).<\/p>\n<p><code>WORKDIR \/app<\/code>. \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e <code>app<\/code> \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0435\u0439, \u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 <code>COPY<\/code>, <code>ADD<\/code>, <code>RUN<\/code>, <code>CMD<\/code> \u0438 <code>ENTRYPOINT<\/code>, \u0438\u0434\u0443\u0449\u0438\u0435 \u0437\u0430 <code>WORKDIR<\/code>, \u0443\u0436\u0435 \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u044d\u0442\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0435\u0439. \u0415\u0441\u043b\u0438 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u0442\u043e <code>WORKDIR<\/code> \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u0435\u0451.<\/p>\n<p><code>COPY package*.json .\/<\/code>. \u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c <code>package.json<\/code> \u0438 <code>package-lock.json<\/code> \u0438\u0437 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0441\u0431\u043e\u0440\u043a\u0438 \u0432 \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0440\u0430\u0431\u043e\u0447\u0443\u044e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u044b\u043b\u0430 \u0437\u0430\u0434\u0430\u043d\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0435\u0439 <code>WORKDIR<\/code>, \u0442.\u0435. \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 <code>\/app<\/code>. \u0422\u0435\u043a\u0443\u0449\u0438\u0439 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0441\u0431\u043e\u0440\u043a\u0438 \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 <code>docker build<\/code>. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 <code>docker build .<\/code> \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0441\u0431\u043e\u0440\u043a\u0438 \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>.<\/code>, \u0447\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u044b\u043b\u0430 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430.<\/p>\n<p><code>RUN npm install<\/code>. \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <code>npm install<\/code>, \u0447\u0442\u043e\u0431\u044b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 (\u0430 \u0442\u0430\u043a\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u043e\u0432\u044b\u0439 <a href=\"https:\/\/docs.docker.com\/storage\/storagedriver\/#images-and-layers\" rel=\"noopener noreferrer nofollow\">\u0441\u043b\u043e\u0439<\/a> \u0432 \u0434\u043e\u043a\u0435\u0440-\u043e\u0431\u0440\u0430\u0437).<\/p>\n<p><code>COPY .\/ .<\/code>. \u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0432\u0441\u0435 \u0444\u0430\u0439\u043b\u044b \u0438 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0438\u0437 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0441\u0431\u043e\u0440\u043a\u0438 \u0432 \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0440\u0430\u0431\u043e\u0447\u0443\u044e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e. \u041d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044f \u043f\u043e\u043d\u0438\u043c\u0430\u044e <code>.\/<\/code> \u0438 <code>.<\/code> &#8212; \u044d\u0442\u043e \u043e\u0434\u043d\u043e \u0438 \u0442\u043e \u0436\u0435 \u0438 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e; \u043f\u0438\u0448\u0443\u0442 \u043f\u043e-\u0440\u0430\u0437\u043d\u043e\u043c\u0443, \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0434\u0447\u0435\u0440\u043a\u043d\u0443\u0442\u044c, \u0447\u0442\u043e \u044d\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f (\u043b\u0438\u0431\u043e \u043d\u0435\u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438 \u043a\u043e\u043f\u0438\u043f\u0430\u0441\u0442\u0430). \u0415\u0441\u043b\u0438 \u044f \u043e\u0448\u0438\u0431\u0430\u044e\u0441\u044c \u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u0435 \u0432\u0441\u0451-\u0442\u0430\u043a\u0438 \u0435\u0441\u0442\u044c &#8212; \u043f\u0438\u0448\u0438\u0442\u0435 \u043e\u0431 \u044d\u0442\u043e\u043c \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445.<br \/>\u0412\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c (\u0445\u043e\u0442\u044f, \u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, \u0438 \u043d\u0435\u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0442\u043e\u0436\u0435) \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c \u0447\u0442\u043e \u0437\u0430\u0447\u0435\u043c-\u0442\u043e \u0434\u043e \u044d\u0442\u043e\u0433\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0431\u044b\u043b\u0438 \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u044b <code>package.json<\/code> \u0438 <code>package-lock.json<\/code>, \u0430 \u0442\u0435\u043f\u0435\u0440\u044c \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432\u043e\u043e\u0431\u0449\u0435 \u0432\u0441\u0451, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0438 \u044d\u0442\u0438 \u0444\u0430\u0439\u043b\u044b. \u042d\u0442\u043e \u043d\u0443\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043a\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 <code>npm install<\/code>, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043b\u043e\u0451\u0432 \u0434\u043e\u043a\u0435\u0440\u0430. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0435\u0441\u043b\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f, \u0430 \u0442\u043e\u0447\u043d\u0435\u0435 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u0444\u0430\u0439\u043b\u044b <code>package.json<\/code> \u0438 <code>package-lock.json<\/code>, \u0442\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c, \u0430 \u0441\u0440\u0430\u0437\u0443 \u0432\u043e\u0437\u044c\u043c\u0451\u0442\u0441\u044f \u0438\u0437 \u043a\u0435\u0448\u0430. \u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u0441\u0431\u043e\u0440\u043a\u0438, \u0442.\u043a. \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043e\u043b\u0433\u043e\u0439.  \u0415\u0441\u043b\u0438 \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0440\u0430\u0437\u0443 \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0435\u0441\u044c \u043f\u0440\u043e\u0435\u043a\u0442, \u0430 \u0437\u0430\u0442\u0435\u043c \u0432\u044b\u0437\u0432\u0430\u0442\u044c <code>npm install<\/code>, \u0442\u043e \u043f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u043b\u044e\u0431\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e\u0431 \u044d\u0442\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c <a href=\"http:\/\/bitjudo.com\/blog\/2014\/03\/13\/building-efficient-dockerfiles-node-dot-js\/\" rel=\"noopener noreferrer nofollow\">\u0442\u0443\u0442<\/a>.<\/p>\n<p><code>RUN npm run build<\/code>. \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0441\u043a\u0440\u0438\u043f\u0442 <code>build<\/code> \u0438\u0437 <code>package.json<\/code>. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442<code>vue-cli-service build<\/code>. <a href=\"https:\/\/cli.vuejs.org\/ru\/guide\/cli-service.html#vue-cli-service-build\" rel=\"noopener noreferrer nofollow\">\u0414\u0430\u043d\u043d\u0430\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430<\/a> \u0441\u043e\u0431\u0435\u0440\u0451\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f production \u0441 \u043c\u0438\u043d\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0435\u0439 \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 <code>\/app\/dist<\/code>.<\/p>\n<p><code>FROM nginx as production-stage<\/code>. \u0417\u0434\u0435\u0441\u044c \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0432\u0442\u043e\u0440\u043e\u0439 \u044d\u0442\u0430\u043f \u0441\u0431\u043e\u0440\u043a\u0438 &#8212; <code>production-stage<\/code>. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043e\u0431\u0440\u0430\u0437\u0430 \u0431\u0435\u0440\u0451\u0442\u0441\u044f \u043e<a href=\"https:\/\/hub.docker.com\/_\/nginx\" rel=\"noopener noreferrer nofollow\">\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0440\u0430\u0437 NGINX<\/a> \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 (\u0442.\u043a. \u0442\u0435\u0433 \u044f\u0432\u043d\u043e \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d, \u0442\u043e \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f <code>latest<\/code>).<\/p>\n<p><code>RUN mkdir \/app<\/code>. \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \/app.<\/p>\n<p><code>COPY --from=build-stage \/app\/dist \/app<\/code>. \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>--from<\/code> \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u044d\u0442\u0430\u043f \u0441\u0431\u043e\u0440\u043a\u0438<code>build-stage<\/code> \u0438 \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0444\u0430\u0439\u043b\u044b \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 production \u043e\u0431\u0440\u0430\u0437.<\/p>\n<p><code>COPY nginx.conf \/etc\/nginx\/nginx.conf<\/code>. \u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u043a\u043e\u043d\u0444\u0438\u0433 \u0434\u043b\u044f NGINX \u0432 production \u043e\u0431\u0440\u0430\u0437.<\/p>\n<\/div>\n<\/details>\n<p>\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u0434\u043e\u043a\u0435\u0440-\u043e\u0431\u0440\u0430\u0437. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c Dockerfile \u0432 \u043a\u043e\u0440\u043d\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043d\u0430 Vue.js \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <code>docker build<\/code>.<\/p>\n<pre><code>docker build -t list-keep-front .<\/code><\/pre>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0438\u043c\u0435\u043d\u0438 \u0434\u043e\u043a\u0435\u0440-\u043e\u0431\u0440\u0430\u0437\u0430 \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u043b\u0438 <code>list-keep-front<\/code>, \u0430 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0437\u0430\u0434\u0430\u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e <code>.<\/code>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0438 \u0434\u043e\u043b\u0436\u0435\u043d \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f Dockerfile.<\/p>\n<p>\u0418\u0442\u0430\u043a \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0438&#8230; \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 (\u043f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435 \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u044c\u0438). \u0421\u044b\u043f\u0435\u0442\u0441\u044f \u043a\u0430\u043a\u0430\u044f-\u0442\u043e \u043e\u0448\u0438\u0431\u043a\u0430. \u0425\u043e\u0442\u044f, \u0432\u0440\u043e\u0434\u0435 \u0431\u044b, \u0432\u0441\u0451 \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0447\u0451\u0442\u043a\u043e \u043f\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438&#8230;<br \/>\u0412\u044b \u0432\u0441\u0451 \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u043f\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0438 \u0443 \u0432\u0430\u0441 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442?! \u0427\u0442\u043e \u0436, \u0434\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u0432 \u0443\u0432\u043b\u0435\u043a\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0438\u0440 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438!<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 \u043e\u0448\u0438\u0431\u043a\u0438 \u043f\u0440\u0438 \u0441\u0431\u043e\u0440\u043a\u0435 Dockerfile<\/summary>\n<div class=\"spoiler__content\">\n<pre><code> => ERROR [build-stage 6\/6] RUN npm run build                                                                                                                                                            4.2s ------  > [build-stage 6\/6] RUN npm run build: #15 0.782 #15 0.782 > list-keep-front@0.1.0 build #15 0.782 > vue-cli-service build #15 0.782 #15 1.284 #15 1.285 -  Building for production... #15 2.300 Error: error:0308010C:digital envelope routines::unsupported #15 2.300     at new Hash (node:internal\/crypto\/hash:67:19) #15 2.300     at Object.createHash (node:crypto:130:10) #15 2.300     at module.exports (\/app\/node_modules\/webpack\/lib\/util\/createHash.js:135:53) #15 2.300     at NormalModule._initBuildHash (\/app\/node_modules\/webpack\/lib\/NormalModule.js:417:16) #15 2.300     at handleParseError (\/app\/node_modules\/webpack\/lib\/NormalModule.js:471:10) #15 2.300     at \/app\/node_modules\/webpack\/lib\/NormalModule.js:503:5 #15 2.300     at \/app\/node_modules\/webpack\/lib\/NormalModule.js:358:12 #15 2.300     at \/app\/node_modules\/loader-runner\/lib\/LoaderRunner.js:373:3 #15 2.300     at iterateNormalLoaders (\/app\/node_modules\/loader-runner\/lib\/LoaderRunner.js:214:10) #15 2.300     at iterateNormalLoaders (\/app\/node_modules\/loader-runner\/lib\/LoaderRunner.js:221:10) #15 2.300     at \/app\/node_modules\/loader-runner\/lib\/LoaderRunner.js:236:3 #15 2.300     at runSyncOrAsync (\/app\/node_modules\/loader-runner\/lib\/LoaderRunner.js:130:11) #15 2.300     at iterateNormalLoaders (\/app\/node_modules\/loader-runner\/lib\/LoaderRunner.js:232:2) #15 2.300     at Array.&lt;anonymous> (\/app\/node_modules\/loader-runner\/lib\/LoaderRunner.js:205:4) #15 2.300     at Storage.finished (\/app\/node_modules\/enhanced-resolve\/lib\/CachedInputFileSystem.js:55:16) #15 2.300     at \/app\/node_modules\/enhanced-resolve\/lib\/CachedInputFileSystem.js:91:9 #15 4.161 \/app\/node_modules\/loader-runner\/lib\/LoaderRunner.js:114 #15 4.161                       throw e; #15 4.161                       ^ #15 4.161 #15 4.161 Error: error:0308010C:digital envelope routines::unsupported #15 4.161     at new Hash (node:internal\/crypto\/hash:67:19) #15 4.161     at Object.createHash (node:crypto:130:10) #15 4.161     at module.exports (\/app\/node_modules\/webpack\/lib\/util\/createHash.js:135:53) #15 4.161     at NormalModule._initBuildHash (\/app\/node_modules\/webpack\/lib\/NormalModule.js:417:16) #15 4.161     at handleParseError (\/app\/node_modules\/webpack\/lib\/NormalModule.js:471:10) #15 4.161     at \/app\/node_modules\/webpack\/lib\/NormalModule.js:503:5 #15 4.161     at \/app\/node_modules\/webpack\/lib\/NormalModule.js:358:12 #15 4.161     at \/app\/node_modules\/loader-runner\/lib\/LoaderRunner.js:373:3 #15 4.161     at iterateNormalLoaders (\/app\/node_modules\/loader-runner\/lib\/LoaderRunner.js:214:10) #15 4.161     at iterateNormalLoaders (\/app\/node_modules\/loader-runner\/lib\/LoaderRunner.js:221:10) #15 4.161     at \/app\/node_modules\/loader-runner\/lib\/LoaderRunner.js:236:3 #15 4.161     at<\/code><\/pre>\n<\/div>\n<\/details>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-328436","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/328436","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=328436"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/328436\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=328436"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=328436"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=328436"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}