Как подключить каталог Conainter в другой После запуска контейнеров? - PullRequest
0 голосов
/ 28 мая 2019

У меня есть угловое приложение, которое создается при запуске контейнера, как показано в Dockerfile, оно построено из двух изображений.

FROM node:10.15.3-alpine as builder

RUN mkdir -p /usr/src/banax_education_platform
WORKDIR /usr/src/banax_education_platform

RUN apk add git
COPY package*.json /usr/src/banax_education_platform/
RUN npm i

COPY . /usr/src/banax_education_platform

RUN npm i -g @angular/cli && npm run-script build


FROM nginx:1.13.12-alpine

RUN rm -rf /usr/share/nginx/html/*

COPY /nginx/default.conf /etc/nginx/conf.d/default.conf

COPY --from=builder /usr/src/banax_education_platform/dist/edu-app /usr/share/nginx/html

EXPOSE 80

CMD ["nginx", "-g", "daemon off;"]

Итак, прежде всего, он выбирает образ узла и создает приложениесо всеми требованиями.а затем он получает другое изображение nginx и создает блок сервера, чтобы показать приложение.Теперь я хочу разделить оба изображения, поэтому один контейнер содержит угловое приложение, а второй - обратный прокси-сервер nginx.

Придумал это docker-compose.yml

version: "2"
services:
 nginx:
  build: ./nginx
  container_name: angular-nginx
  ports:
   - "80:80"
  volumes:
   - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
  depends_on:
   - web
 web:
  build: ./angular
  container_name: angular-app
  ports:
   - "8000"

Но проблема в том, что я хочуэта задача: COPY --from=builder /usr/src/banax_education_platform/dist/edu-app /usr/share/nginx/html должна быть выполнена с помощью docker-compose, потому что теперь у меня есть 2 Dockerfiles, один для angular и один для nginx, поэтому я не знаю, как связать каталог этого углового контейнера с контейнером nginx.У кого-нибудь есть идеи?

Ответы [ 2 ]

2 голосов
/ 28 мая 2019

В типичном веб-приложении вы запускаете какой-то упаковщик (например, Webpack ), который «компилирует» ваше приложение в набор статических файлов. Затем вам понадобится веб-сервер для отправки этих файлов клиентам, но ничто не запускает этот код на стороне сервера после его сборки.

Это очень хорошо соответствует многоступенчатому изображению Docker, которое вы показываете в вопросе. На первом этапе создаются только артефакты, и, как только это будет сделано, ничто никогда не запускает создаваемый ими образ. (Обратите внимание, например, на отсутствие CMD.) Второй этап COPY --from=build статических артефактов, которые он создает, и все.

Поскольку на первом этапе нет реального приложения для запуска, нет смысла запускать его как отдельную службу Docker Compose или иным образом "разбивать это" так, как вы показываете.

Если вы не возражаете против использования нескольких инструментов сборки, вы можете рассматривать упакованное приложение как «данные» с точки зрения Nginx (он ничего не знает о содержимом этих файлов, он просто отправляет данные по сети). Вы можете выбрать какой-либо каталог на вашем хосте и смонтировать его в контейнер Nginx

version: "3"
services:
  nginx:
    image: nginx:1.13.12-alpine
    ports:
      - "80:80"
    volumes:
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
      - ./dist:/usr/share/nginx/html

, а затем npm run-script build в вашей хост-системе, когда вам нужно пересобрать и повторно развернуть приложение.

1 голос
/ 28 мая 2019

Я думаю, что есть концептуальное недоразумение.Я не знаком с Angular, но вот как я бы подошел к этому (не проверено).

Самому обратному прокси-серверу не нужны скомпилированные файлы, которые вы генерируете в своем Dockerfile.Этот контейнер (web в вашем случае) как раз для передачи HTTP (S) запросов к правильной конечной точке (которая является другим веб-сервером, назовем его app).app сам по себе является веб-сервером Nginx, который обслуживает ваше приложение Angular.

Итак, вам нужно сделать что-то вроде этого:

version: "3.7"

services:

  web:
    image: nginx
    volumes:
      - ./config/with/proxy/rules:/etc/nginx/conf.d/default.conf
    ports:
      - 80:80
      - 443:443

  app:
    build: ./path/to/your/dockerfile
    expose:
      - "8000"
    volumes:
      - ./path/to/nice/config:/etc/nginx/conf.d/default.conf
    depends_on:
      - web

Файл конфигурации первого тома будетдолжны включать все необходимые вам правила прокси.По сути, что-то подобное должно происходить где-то:

location / {
      proxy_pass http://app:8000;
}

Это все, что должен знать ваш обратный прокси.

...