#node.js #docker #nginx #npm
Вопрос:
В настоящее время у меня есть файл docker, в котором запущено неоптимизированное приложение react (в нем говорится: «Обратите внимание, что сборка разработки не оптимизирована. Чтобы создать производственную сборку, используйте npm run build.’). Файл docker находится:
FROM node:16
# A directory within the virtualized Docker environment
# Becomes more relevant when using Docker Compose later
WORKDIR /usr/src/app
# Copies package.json and package-lock.json to Docker environment
COPY package*.json ./
# Installs all node packages
RUN npm install
# Copies everything over to Docker environment
COPY . .
# Uses port which is used by the actual application
EXPOSE 3000
# Finally runs the application
CMD [ "npm", "start" ]
С учетом вышесказанного я могу обратиться в свой сервис по адресу http://localhost:3000/ .
Я попробовал следующее (из https://medium.com/geekculture/dockerizing-a-react-application-with-multi-stage-docker-build-4a5c6ca68166) но я не смог получить доступ к своему сервису:
Файл docker, который я пытался,
# pull official base image
FROM node:16 AS builder
# set working directory
WORKDIR /app
# install app dependencies
#copies package.json and package-lock.json to Docker environment
COPY package.json ./
# Installs all node packages
EXPOSE 3000
RUN npm install
# Copies everything over to Docker environment
COPY . ./
RUN npm run build
#Stage 2
#######################################
#pull the official nginx:1.19.0 base image
FROM nginx:1.19.0
#copies React to the container directory
# Set working directory to nginx resources directory
WORKDIR /usr/share/nginx/html
# Remove default nginx static resources
RUN rm -rf ./*
# Copies static resources from builder stage
COPY --from=builder /app/build .
EXPOSE 3000
# Containers run nginx with global directives and daemon off
ENTRYPOINT ["nginx", "-g", "daemon off;"]
Кто-нибудь знает, что нужно сделать, чтобы исправить это (или как создать оптимизированную сборку)?
Комментарии:
1. Как вы запускаете контейнер?
nginx
Изображение прослушивает HTTP-порт 80 по умолчанию, поэтому, если вы используетеdocker run -p
опцию или создаетеports:
для публикации контейнерного порта, номер второго порта должен измениться с 3000 до 80 в этом параметре.
Ответ №1:
Основная проблема заключалась в том, что я не знал, что nginx обслуживает порт 80. Следующий файл docker работает и запускается следующим образом: docker run -p 80:80 my-ui-приложение
# pull official base image
FROM node:16 AS builder
# set working directory
WORKDIR /app
# install app dependencies
#copies package.json and package-lock.json to Docker environment
COPY package.json ./
# Installs all node packages
RUN npm install
# Copies everything over to Docker environment
COPY . ./
RUN npm run build
#Stage 2
#######################################
#pull the official nginx:1.19.0 base image
FROM nginx:1.19.0
#copies React to the container directory
# Set working directory to nginx resources directory
WORKDIR /usr/share/nginx/html
# Remove default nginx static resources
RUN rm -rf ./*
# Copies static resources from builder stage
COPY --from=builder /app/build .
EXPOSE 80
# Containers run nginx with global directives and daemon off
ENTRYPOINT ["nginx", "-g", "daemon off;"]