@laravel_creative_3103

По какой причине проявляется ошибка внутри докера? как можно его пофиксить?

FROM node:14-alpine

# Linux setup
RUN apk update \
  && apk add --update --no-cache alpine-sdk \
  && apk del alpine-sdk \
  && rm -rf /tmp/* /var/cache/apk/* *.tar.gz ~/.npm \
  && npm cache verify \
  && sed -i -e "s/bin\/ash/bin\/sh/" /etc/passwd

# Install npm 6.14.18
RUN npm install -g npm@6.14.18

# Angular CLI
RUN npm install -g @angular/cli

# Create directory
RUN mkdir app
WORKDIR /app

# Install dependencies
ADD package.json .
ADD package-lock.json .
ADD angular.json .
RUN npm update

# Build
ARG WEBPACK_COMMAND
ADD /src src
ADD /tsconfig.json .
RUN ${WEBPACK_COMMAND:- ng build --configuration=production}

# Run (update nginx static files)
CMD rm -rf /usr/share/nginx/html/* && cp -r /app/dist/frontend/* /usr/share/nginx/html


ERROR:

Dockerfile:32
--------------------
  30 |     ADD /src src
  31 |     ADD /tsconfig.json .
  32 | >>> RUN ${WEBPACK_COMMAND:- ng build --configuration=production}
  33 |     
  34 |     # Run (update nginx static files)
--------------------
ERROR: failed to solve: process "/bin/sh -c ${WEBPACK_COMMAND:- ng build --configuration=production}" did not complete successfully: exit code: 3
  • Вопрос задан
  • 209 просмотров
Пригласить эксперта
Ответы на вопрос 1
shurshur
@shurshur
Сисадмин, просто сисадмин...
А вот что именно должна делать команда

${WEBPACK_COMMAND:- ng build --configuration=production}


и почему удивляет, что она завершается некорректно? Определена ли вообще переменная $WEBPACK_COMMAND? Почему при сборке вообще потребовалось брать название команды из внешней переменной? Тут вообще работают bash-евые подстановки в командах (подозреваю что нет, но не проверял)? Может, там и shell в базовом образе не bash, а классический sh?

Логичнее вызывать команду для webpack напрямую, без внешних переменных, именно такую, которая точно будет работать в указанных условиях. Мы же используем конкретную версию базового образа и конкретные действия производим для получения предсказуемого результата.

До кучи, тут CMD - это команда, запускаемая при старте контейнера. Но по логике этого докерфайал, эта команда предполагалась к запуску только при сборке образа. Чтоб это исправить, надо поменять CMD на RUN.

Что будет при неуказании CMD запускаться в создаваемом на базе этого образа контейнере будет в таком случае унаследовано из FROM node:14-alpine, в данном случае видимо это запуск nginx. Если нужно запускать что-то своё вместо дефолта, то CMD надо переопределить на команду реального запуска приложения (типа CMD node /path/to/app.js или что там у вас в node.js принято делать для запуска?),

Ну и делать внутри образа две копии приложения тоже немного странно. Лучше или собирать приложение сразу в конечном каталоге /usr/share/nginx/html, либо изменить конфиг nginx на использование другого каталога. Скорее всего, в этом образе - как и в официальном образе nginx - конфиг лежит в /etc/nginx/conf.d/default.conf.

А ещё более хорошо и правильно освоить multi stage build в докере.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы