Ошибка Forbidden 403 с контейнером nginx при обслуживании статических файлов - PullRequest
0 голосов
/ 27 июня 2018

Я пытаюсь запустить свой проект angular-cli с помощью контейнера док-станции nginx в режиме разработки. Здесь - полный шаблонный код.

Чтобы избежать повторной перестройки полного образа докера при каждом изменении исходного кода, я использую тома в своем файле компоновки докера и отображаю мой dist / {имя-проекта} путь с контейнером путь usr / share / nginx / html и, наконец, запуск проекта Angular на хост-компьютере с ng build --watch

Но использование томов, по-видимому, вызывает проблемы чтения файлов в nginx, и он не может прочитать index.html

dev.dockerfile:

FROM nginx:alpine
LABEL author="Saurabh Palatkar"
COPY nginx.conf /etc/nginx/nginx.conf

COPY /dist/ng-docker /usr/share/nginx/html
RUN ls /usr/share/nginx/html
RUN ps aux | grep nginx
RUN chown -R root:root /usr/share/nginx/html/index.html
RUN chmod -R 755 /usr/share/nginx/html
RUN ls -al /usr
RUN chmod o+x /usr
RUN chmod o+x /usr/share
RUN chmod o+x /usr/share/nginx
RUN chmod o+x /usr/share/nginx/html
# RUN ls /usr/share/nginx/html
# RUN ls /etc/nginx
EXPOSE 80 443
CMD [ "nginx", "-g", "daemon off;" ]

докер-compose.dev.yml:

version: "2.0"

services:

      angular-nginx-docker:
        image: ng-docker-dev
        build: 
          context: .
          dockerfile: .docker/dev.dockerfile
        environment:
          NODE_ENV: development
        volumes: 
          - "/dist/ng-docker:/usr/share/nginx/html"
        ports:
          - 8080:80
        command: [nginx-debug, '-g', 'daemon off;']

Однако я могу обслуживать свои статические файлы Angular через докер-контейнер nginx в режиме prod (единственное отличие, которое я вижу, это то, что я не использую тома) докер-compose.yml:

version: "2.0"

services:
  angular-nginx-docker:
    image: ng-docker-prod
    build: 
      context: .
      dockerfile: .docker/prod.dockerfile
    environment:
      NODE_ENV: production
    ports:
      - 80:80
      - 443:443
      - 9229:9229
    command: [nginx, '-g', 'daemon off;'] 

prod.dockerfile:

FROM node:latest as angular-built
WORKDIR /usr/src/app
RUN npm i -g @angular/cli
COPY package.json package.json
COPY package-lock.json package-lock.json
RUN npm install --silent
COPY . .
RUN ng build --prod --build-optimizer

FROM nginx:alpine
LABEL author="Saurabh Palatkar"
COPY nginx.conf /etc/nginx/nginx.conf

COPY --from=angular-built /usr/src/app/dist/ng-docker /usr/share/nginx/html

EXPOSE 80 443
CMD [ "nginx", "-g", "daemon off;" ]

1 Ответ

0 голосов
/ 27 июня 2018

При использовании томов docker будет использовать режим разрешений файлов системы хоста. Я подозреваю, что ваши статические файлы на вашем хосте (которые вы отображаете) не имеют прав на чтение с правами root.

Выполнение chmod в dockerfile ничего не даст, так как во время сборки файлов там нет (тома отображаются при запуске контейнера).

Я бы предложил запустить chmod -R o+rx /dist/ng-docker на хосте, чтобы каждый пользователь - в том числе root - на их можно было прочитать. Если вы не хотите этого, попробуйте настроить ACL специально для root (uid: 0) или измените контейнер, чтобы иметь пользователя, который будет запускать nginx, с такими же uid и guid, как у вас.

...