Docker COPY на многоступенчатой ​​сборке не работает - PullRequest
0 голосов
/ 11 июля 2020

Я использую многоступенчатую сборку для компиляции приложения реакции. В первую очередь я использую образ базового узла, после того как использую изображение nginx для доступа к порту 80.

Я пытаюсь КОПИРОВАТЬ файлы сборки со стадии компоновщика в / usr / share / nginx / html, но ничего не получает.

Создание образа, который работает, с docker -compose ничего не делает.

Я попытался открыть проблему в репозитории docker, но закрыто, поэтому открытие на движке moby также не вариант, когда podman (который использует движок moby) работает хорошо, за исключением compose, который порождает команду как not 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, появляется запрещенная ошибка, а при попытке доступа к индексу. html Я получаю 404.

Я вошел в папку html, используя bash, и проверил, используя namei -l. а файла вообще нет.

Что я делаю не так? Я просмотрел массу вопросов и не получил ответа или каких-либо указаний, кроме факта добавления sla sh копируемой папки.

В настоящее время я использую RHEL. Итак, требуется разрешение sudoers для запуска docker команд. Может в этом проблема? В podman-compose мне нужно создать команду сборки sudo docker -compose, и она запускает другие команды сборки как non root.

Следовательно, это не происходит на docker -ce.

1 Ответ

0 голосов
/ 12 июля 2020

Прежде всего, убедитесь, что у вас правильная конфигурация 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
...