npm не может найти package.json при запуске docker-контейнера с помощью compose - PullRequest
2 голосов
/ 09 апреля 2019

Я пытаюсь подключить мое клиентское приложение Angular 7 к локальному средству создания докеров.

При получении docker-compose появляется следующая ошибка:

client-app    | npm ERR! errno -2
client-app    | npm ERR! syscall open
client-app    | npm ERR! enoent ENOENT: no such file or directory, open '/app/package.json'

Dockerfile:

FROM node:9.6.1

RUN mkdir -p /app
WORKDIR /app
EXPOSE 4200

ENV PATH /app/node_modules/.bin:$PATH

COPY . /app

RUN npm install --silent
RUN npm rebuild node-sass

CMD ["npm", "run", "docker-start"]

Составная часть для клиента:

  client-app:
    image: ${DOCKER_REGISTRY-}client
    container_name: client-app
    ports:
      - "4200:81"
    build:
      context: .
      dockerfile: ClientApp/Dockerfile

package.json находится в папке ClientApp рядом с Dockerfile, я бы предположил, что это COPY./ app должен скопировать package.json в контейнер.У меня нет исключений в dockerignore.Я использую Docker для Windows с контейнерами Unix.Я пробовал npm init ранее (но это все равно создаст пустой package.json) и просмотрел сообщения SO, но большинство определений dockerfile выглядят точно так же.Я также попробовал: скопировать пакет * .json ./ дополнительно и создать образ с помощью --no-cache.

Ответы [ 2 ]

1 голос
/ 09 апреля 2019

Ваш Dockerfile в порядке, и COPY package*.json ./ не требуется - он копируется со всем вашим приложением.

Проблема в файле docker-compose .

вы определили:

build:
      context: .
      dockerfile: ClientApp/Dockerfile

означает, что ваш Dockerfile примет контекст создания docker, который на 1 каталог выше:

├── docker-compose.yml -- this is the actual context
└── ClientApp
    ├── Dockerfile -- this is the expected context

поэтому, когда CMD работает, он на 1 каталог выше package.json , поэтому он не может выполнить команду и контейнер завершается.

чтобы исправить это, дайте вашему docker-compose файлу правильный контекст:

build:
      context: ClientApp
      dockerfile: Dockerfile

и должно работать.

1 голос
/ 09 апреля 2019

Эта команда COPY package*.json ./ попытается скопировать package.json из корневого каталога. Однако похоже, что вам нужно скопировать package.json из ClientApp dir

Два способа исправить это: 1) Изменить файл композиции context: ./ClientApp/ 2) Изменить файл Docker COPY ./ClientApp/package.json /app/package.json

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

...