我正在尝试在开发模式下使用 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;']
但是,我可以通过 nginx docker 容器以 prod 模式提供 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;" ]
最佳答案
当使用卷时,docker将使用主机系统文件权限模式。 我怀疑,您的主机上的静态文件(您映射的)没有被 root 读取的权限。
执行chmod
dockerfile 中的文件不会执行任何操作,因为在构建期间文件不在那里(卷映射到容器运行上)。
我建议运行 chmod -R o+rx /dist/ng-docker
在主机上,所以每个用户
- 包括 root - 可以读取它们。如果您不想这样做,请尝试专门为 root (uid: 0) 设置 ACL,或修改容器以拥有一个用户,该用户将运行 nginx,具有相同的 uid
和guid
就像你一样。
关于angular - 提供静态文件时,nginx docker 容器出现 Forbidden 403 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51056400/