docker - 多阶段构建上的 Docker COPY 不起作用
问题描述
我正在使用多阶段构建来编译反应应用程序。在我使用 nginx 映像公开到端口 80 之后,我主要使用基本节点映像。
我正在尝试将构建文件从构建器阶段复制到 /usr/share/nginx/html 文件夹,但一无所获。
单独构建它正在工作的图像,使用 docker-compose 什么都不做。
我试图在 docker repo 上打开一个问题但已关闭,因此当 podman(使用 moby 引擎)运行良好时,在 moby 引擎上打开也不是一个选项,除了生成命令的 compose 不是 sudoers 和构建节点映像下载失败。
FROM node:slim as build
WORKDIR /usr/app
COPY package.json .
COPY public public
COPY src src
RUN npm install
RUN npm run build
COPY build .
RUN rm -rf src
RUN rm -rf build
FROM nginx:latest
COPY --from=build /usr/app /usr/share/nginx/html
# RUN chown www-data:www-data ./usr/share/nginx/html/*
EXPOSE 80
在 ls 命令上,我看到了构建,但是当我尝试连接到 localhost 时,得到了禁止的错误,当尝试访问 index.html 时,我得到了 404。
我使用 bash 进入 html 文件夹并使用 namei -l 进行验证。而且根本没有文件。
我可能做错了什么?我搜索了很多问题,但没有得到答案或任何方向,除了添加要复制的文件夹的斜线这一事实。
目前我正在使用 RHEL。因此,需要 sudoers 权限才能运行 docker 命令。也许是问题所在?在 podman-compose 上,我需要生成一个 sudo docker-compose build 命令,它以非 root 身份运行另一个构建命令。
因此,这不会发生在 docker-ce 上。
解决方案
首先,确保文件中有正确的 nginx 配置nginx.conf
。例如:
server {
listen 80;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
其次,没有必要运行这些行:
COPY build . # you should call directly the build folder, because there isn't any other files of build stage
RUN rm -rf src #after finish build step, this image will no longer exist.
RUN rm -rf build
RUN ls
最后你的 Dockerfile 应该是这样的
FROM node:slim as build
WORKDIR /usr/app
COPY package.json .
COPY public public
COPY src src
RUN npm install
RUN npm run build
FROM nginx:latest
COPY --from=build /usr/app/build /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d
# if you are using react router
# you need to overwrite the default nginx configurations
# remove default nginx configuration file
RUN rm /etc/nginx/conf.d/default.conf
EXPOSE 80
推荐阅读
- c# - Graph Api 读取电子邮件的权限
- python - python: tkinter 切换 svg 内容
- javascript - 比较两个不同的对象数组并在 API 调用后找到匹配项时将数据推送到新对象
- c - 无法在 VSCode 中编译 C
- r - 尝试使用底格里斯河获取人口普查区代码时出现错误找不到函数“call_geolocator_latlon”
- swiftui - swiftui 按钮在预览中显示,但从不在模拟器或设备中显示
- flutter - IllegalFloatingActionButtonSizeException 浮动动作按钮必须是圆形
- python - 如何让我的函数使用字符串元组执行?
- rest - REST 服务的身份验证不适用于 jBPM(KIE 服务器和业务中心)和 Keycloak
- swift - 应该在哪里使用循环来为 SwiftUI 预览生成虚拟数据?