首页 > 解决方案 > 多阶段构建上的 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 上。

标签: dockerdocker-composecreate-react-app

解决方案


首先,确保文件中有正确的 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

推荐阅读