копировать сборку из контейнера в другом контексте

#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