#node.js #docker #nginx #docker-compose
#node.js #docker #nginx #docker-compose
Вопрос:
Итак, я пытаюсь настроить среду для моего проекта на использование docker. Структура проекта выглядит следующим образом.
/client
/server
/nginx
docker-compose.yml
docker-compose.override.yml
docker-compose.prod.yml
в Dockerfile
for each /client
, /server
, и nginx
у меня есть базовый образ, который устанавливает мои зависимости, затем образ разработки, который устанавливает зависимости разработчика, и рабочий образ, который создает или запускает образ для клиента и сервера соответственно
пример.
# start from a node image
FROM node:14.8.0-alpine as base
WORKDIR /client
COPY package.json package-lock.json ./
RUN npm i --only=prod
FROM base as development
RUN npm install --only=dev
CMD [ "npm", "run", "start" ]
FROM base as production
COPY . .
RUN npm run build
итак, вот где возникает моя проблема.
В /nginx
я хочу, чтобы nginx в разработке просто действовал как обратный прокси-сервер для create-react-app, но когда я нахожусь в рабочей среде, я хочу взять client/build
из образа рабочего клиента и скопировать его на сервер nginx для статического обслуживания без затрат на всю цепочку инструментов сборки для react.
ie.
FROM nginx:stable-alpine as base
FROM base as development
COPY development.conf /etc/nginx/nginx.conf
FROM base as production
COPY production.conf /etc/nginx/nginx.conf
COPY --from=??? /client/build /usr/share/nginx/html
^
what goes here?
Если у кого-нибудь есть какие-либо подсказки, как заставить это работать, не извлекая из docker hub и не загружая изображения в docker hub каждый раз, когда вносятся изменения, это было бы здорово.
Ответ №1:
Вы можете COPY --from=
использовать другое изображение по имени. Точно так docker run
же, образ должен быть локальным, и Docker не будет связываться с Docker Hub или другим сервером реестра, если у вас уже есть образ.
# Most basic form; "myapp" is the containing directory name
COPY --from=myapp_client /client/build /usr/share/nginx/html
У Compose нет прямого способа указать эту зависимость сборки, но docker-compose build
повторный запуск должен сделать свое дело.
Если вы планируете развернуть это, вам, вероятно, нужен некоторый контроль над именем и тегом изображения. В docker-compose.yml
вы можете указать оба build:
и image:
, которые хорошо сообщают Compose, какое имя использовать при создании образа. Вы также можете использовать переменные среды почти везде в файле компоновки и переходить ARG
в сборку для ее настройки. Объединение всего этого даст вам:
version: '3.8'
services:
client:
build: ./client
image: registry.example.com/my/client:${TAG:-latest}
nginx:
build:
context: ./nginx
args:
TAG: ${TAG:-latest}
image: registry.example.com/my/client:${TAG:-latest}
FROM nginx:stable-alpine
ARG TAG=latest
COPY --from=registry.example.com/my/client:${TAG} /usr/share/nginx/html
TAG=20210113 docker-compose build
TAG=20210113 docker-compose build
TAG=20210113 docker-compose up -d
# TAG=20210113 docker-compose push