【问题标题】:Getting Forbidden 403 error with nginx docker container when serving static files提供静态文件时使用 nginx docker 容器出现 Forbidden 403 错误
【发布时间】:2018-12-05 23:20:48
【问题描述】:

我正在尝试在开发模式下使用 nginx docker 容器运行我的 angular-cli 项目。 Here 是完整的样板代码。

为了避免每次更改源代码时都重新构建完整的 docker 映像,我在 docker compose 文件中使用卷并将我的 dist/{project-name} 路径映射到容器的 usr/share/nginx/html 路径,然后最后在主机中使用 ng build --watch

运行 Angular 项目

但使用卷似乎会导致 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;" ]

docker-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;']

但是,我可以在 prod 模式下通过 nginx docker 容器提供我的 Angular 静态文件(我看到的唯一区别是,我没有使用卷) docker-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;" ]

【问题讨论】:

    标签: angular docker nginx docker-compose angular-cli


    【解决方案1】:

    使用volumes时,docker会使用宿主系统文件权限模式。 我怀疑,您主机上的静态文件(您映射的)没有root读取的权限。

    在 dockerfile 中执行 chmod 将不会执行任何操作,因为在构建期间文件不在其中(卷在容器运行时映射)。

    我建议在主机上运行chmod -R o+rx /dist/ng-docker,这样每个用户 - 包括root - 就可以阅读它们。如果您不希望这样做,请尝试专门为 root (uid: 0) 设置 ACL,或修改容器以拥有一个用户,该用户将运行 nginx,使用与您相同的 uidguid

    【讨论】:

      猜你喜欢
      • 2020-01-21
      • 2015-03-13
      • 2013-12-09
      • 2015-04-28
      • 2017-09-04
      • 1970-01-01
      • 2018-12-28
      • 2019-01-30
      • 2019-01-16
      相关资源
      最近更新 更多