Ошибка при построении docker многоступенчатого изображения через миникуб: файл не найден - PullRequest
2 голосов
/ 16 января 2020

У меня есть этот Dockerfile, который я написал для Angular приложения:

#### Stage 1: Build the angular application
FROM node:12.4.0-alpine as build

# Configure the main working directory inside the docker image.
# This is the base directory used in any further RUN, COPY, and ENTRYPOINT
# commands.
WORKDIR /app

# Copy the package.json as well as the package-lock.json and install
# the dependencies. This is a separate step so the dependencies
# will be cached unless changes to one of those two files
# are made.
COPY package.json package-lock.json ./
RUN npm ci
RUN npm install -g @angular/cli

# Copy the main application
COPY . ./

# Build the application
RUN npm run build:prod

#### Stage 2: Serve the Angular application from Nginx
FROM nginx:1.17.0-alpine

RUN rm -rf /usr/share/nginx/html/*

# Copy the angular build from Stage 1
COPY --from=build /app/dist/MyAngularApp /usr/share/nginx/html

# Copy our custom nginx config
COPY nginx/default.conf /etc/nginx/conf.d/default.conf
COPY nginx/status.conf /etc/nginx/conf.d/status.conf

# Expose port 80 to the Docker host, so we can access it
# from the outside.
EXPOSE 80
# Expose port 8081 to the Docker host, for nginx status pages
EXPOSE 8081

ENTRYPOINT ["nginx","-g","daemon off;"]

Я могу прекрасно создать этот образ на моей машине с помощью docker build -t my-angular-app:v1 .

Но если я сначала выполните eval $(minikube docker-env), чтобы использовать docker демон minikube вместо локального, и выполните ту же команду: docker build -t my-angular-app:v1 . (как указано в README )

Я получаю следующую ошибку (нет такого файла или каталога):

Step 10/15 : COPY --from=build /app/dist/MyAngularApp /usr/share/nginx/html
COPY failed: stat /var/lib/docker/overlay2/2972c4790d70a2e0c98895855e5bde894a97ebab8c5a8b2efab5100c3f8c6fbb/merged/app/dist/MyAngularApp: no such file or directory

Действительно, в виртуальной машине нет папки / var / lib / docker / overlay2 / 2972c4 ...

Что я пропустил?

Я использую minikube v1.6.2 с virtualbox v5.2.34

local docker v19.03.5

minikube's docker is также v19.03.5

FIY minikube docker-env устанавливает следующие переменные env:

export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/home/myUser/.minikube/certs"

Ответы [ 2 ]

1 голос
/ 17 января 2020

Хорошо, я нашел проблему: она не имеет никакого отношения к моему Dockerfile или отсутствующим файлам в мини-кубе.

TLDR в конце.

Так что проблема в том, Docker не находит папку / app / dist / MyAngularApp, созданную на первом этапе.

Предполагается, что эта папка будет создана командой npm run build:prod.

При сборке с моя машина, все работает. При сборке через миникуб, папка не создается. Нет ошибок или предупреждений. Команда запускается ... и ничего.

Кто-то предложил использовать Yarn вместо Npm, чтобы увидеть, показывает ли она какую-то ошибку или предупреждение. Бин go!

yarn run build:prod показывает: error Command failed with signal "SIGKILL".

Ха-ха! Сборка отнимает слишком много ресурсов и уничтожается.

Я увеличил объем памяти на мини-кубе с помощью:

minikube delete;
minikube start --memory 4096

И теперь он работает нормально!

Надеюсь Не знаю, почему Yarn отображает ошибку, а Npm нет, даже с параметром --verbose.

TLDR; Недостаточно памяти на мини-кубе, что привело к SIGKILL my npm build. Нет сборки, нет результирующей папки, следовательно, ошибка копирования. При использовании npm ошибки не отображаются. Переключился на пряжу и показывает ошибку SIGKILL.

0 голосов
/ 17 января 2020

Как отмечается в комментариях, это вызвано тем, что файлы, необходимые для создания образа, не найдены на хосте виртуальной машины, на котором работает minikube.

Чтобы получить файлы на виртуальную машину minikube, вы можете использовать команду minikube ssh, а затем использовать scp или любая другая команда bash для копирования файлов туда, где они должны быть.

...