Как запустить команду npm в контейнере docker? - PullRequest
0 голосов
/ 05 февраля 2020

Я пытаюсь запустить приложение angular в режиме разработки внутри docker контейнера, но когда я запускаю его с docker -композицией сборки, оно работает правильно, но когда я пытаюсь установить контейнер, я получаю ошибка ниже:



ERROR: for sypgod  Cannot start service sypgod: OCI runtime create failed: container_linux.go:346: starting container process caused "exec: \"npm\": executable file not found in $PATH

Реальная проблема в том, что она не распознает команду npm serve, но почему ??

Настройка будет ниже:

* Контейнер 1024 * (Nginx Обратный прокси-сервер -> Angular, работающий в порту 4000)

Я знаю, что есть лучшие способы его развертывания, но в данный момент мне нужна эта настройка по некоторым личным причинам

Dockerfile:


FROM node:10.9 


COPY package.json package-lock.json ./

RUN npm ci && mkdir /angular && mv ./node_modules ./angular

WORKDIR /angular

RUN npm install -g @angular/cli 

COPY . . 


FROM nginx:alpine
COPY toborFront.conf /etc/nginx/conf.d/
EXPOSE 8080
CMD ["nginx", "-g", "daemon off;"]
CMD ["npm", "serve", "--port 4000"]

NginxServerSite

server{
    listen 80;
    server_name sypgod;


    location / {
            proxy_read_timeout 5m;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_pass http://localhost:4000/;


    }

}


Docker Создать файл (важная часть, в которой у меня возникла проблема)

 sypgod: # The name of the service
        container_name: sypgod  # Container name
        build: 
            context: ../angular
            dockerfile: Dockerfile # Location of our Dockerfile


Ответы [ 3 ]

1 голос
/ 05 февраля 2020

Вы можете сделать что-то вроде ниже

### STAGE 1: Build ###

# We label our stage as ‘builder’
FROM node:alpine as builder

RUN apk --no-cache --virtual build-dependencies add \
    git \
    python \
    make \
    g++

    RUN mkdir -p /ng-app/dist

    WORKDIR /ng-app

    COPY package.json package-lock.json ./

    ## Storing node modules on a separate layer will prevent unnecessary npm installs at each build
    RUN npm install

    COPY . .

    ## Build the angular app in production mode and store the artifacts in dist folder

    RUN npm run ng build -- --prod --output-path=dist


    ### STAGE 2: Setup ###

    FROM nginx:1.14.1-alpine

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

    ## Remove default nginx website
    RUN rm -rf "/usr/share/nginx/html/*"

    ## From ‘builder’ stage copy over the artifacts in dist folder to default nginx public folder
    COPY --from=builder /ng-app/dist /usr/share/nginx/html

    CMD ["nginx", "-g", "daemon off;"]
1 голос
/ 05 февраля 2020

Образ, который наконец запускается, выглядит следующим образом:

FROM nginx:alpine
COPY toborFront.conf /etc/nginx/conf.d/
EXPOSE 8080
CMD ["npm", "serve", "--port 4000"]

Первый этап не имеет никакого эффекта (вы могли бы COPY --from=... файлы из него), и, если есть несколько CMD с, только последний имеет эффект. Поскольку вы запускаете это в виде простого nginx образа, команды npm нет, что приводит к появившейся ошибке.

Я бы рекомендовал использовать Node на хосте для живой среды разработки. Когда вы собрали и протестировали свое приложение и хотите его развернуть, используйте Docker, если это подходит. В вашем Dockerfile запустите ng build на первом этапе, чтобы скомпилировать приложение для файлов * stati c, добавьте COPY --from=... на втором этапе, чтобы получить встроенное приложение в образ Nginx, и удалите все CMD линии (nginx имеет соответствующее значение по умолчанию CMD). Ответ @ VikramJakhar содержит более полный Dockerfile, показывающий это.

Похоже, вы пытаетесь запустить и Nginx, и Angular сервер разработки в Docker. Если это ваша цель, вам нужно запустить их в двух отдельных контейнерах. Для этого:

  • Разделите этот Dockerfile на две части. Поместите строку CMD ["npm", "serve"] в конец первого (Angular -только) Dockerfile.
  • Добавьте второй блок в файл docker-compose.yml, чтобы запустить второй контейнер. Внутренний контейнер npm serve не нужно публиковать sh ports:.
  • Измените имя хоста внутреннего сервера в конфигурации Nginx с localhost на Docker Compose name другого контейнера.
0 голосов
/ 05 февраля 2020

Может показаться, что npm недоступен из контейнера. Попробуйте определить, откуда он пытается его выполнить:

docker run -v "$PWD":/usr/src/app -w /usr/src/app node:10.9 npm serve --port 4000

source: https://gist.github.com/ArtemGordinsky/b79ea473e8bc6f67943b

Также убедитесь, что на компьютере под управлением npm установлена ​​программа docker контейнер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...