Журналы неудачной сборки Docker

У меня есть простое приложение nodejs. При попытке загрузить библиотеки я использовал npm link library1 library2, который создал символические ссылки на /usr/local/lib/node_modules. Я пытаюсь создать образ докера, используя следующие инструкции в моем файле Docker.

FROM node:13-alpine
ENV MONGO_DB_USERNAME=admin \
    MONGO_DB_PWD=password
RUN mkdir -p /home/app 
COPY ./app /home/app
WORKDIR /home/app
RUN npm install
CMD ["node", "server.js"]

Теперь при построении образа вылетела секция RUN npm install с последующим выводом в терминал

npm ERR! syscall access
npm ERR! path /home/app/node_modules/body-parser
npm ERR! errno -2
npm ERR! enoent ENOENT: no such file or directory, access '/home/app/node_modules/body-parser'
npm ERR! enoent This is related to npm not being able to find a file.
npm ERR! enoent
npm ERR! A complete log of this run can be found in:
npm ERR!     /root/.npm/_logs/2020-12-23T21_41_24_539Z-debug.log

Мне удалось создать образ после удаления папки node_modules в моем месте кода. Также мне удалось создать образ, когда я загрузил библиотеки через npm install libary1 library2 в расположении кода.

Мои вопросы

  1. Почему процесс сборки образа завершается ошибкой, когда я использую глобальные библиотеки
  2. Где я могу найти файл журналов, указанный в терминале. На моем локальном ноутбуке нет папки /root/.

Не могли бы вы предоставить полный файл Dockerfile или, по крайней мере, из каких базовых образов он взят? Также ошибка npm говорит, что журнал находится в папке /root внутри контейнера Docker, вам нужно получить доступ к контейнеру через оболочку или скопировать файл (используя команду Docker exec или cp.

cam 24.12.2020 00:37

приносим свои извинения за отсутствие полного Dockerfile. обновил его. Какой контейнер мне нужно будет выполнить, чтобы получить журналы. Я заметил, что несколько временных контейнеров были запущены и остановлены (а не удалены в случае успешной сборки образа). Я попытался перезапустить остановленный контейнер, но он остановился в течение нескольких минут, не дав мне изменить команду exec.

Garvit Arora 24.12.2020 00:52

Как вы пытаетесь запустить остановленный контейнер? Используете ли вы такую ​​команду, как docker run -it CONTAINER bash? Эта ошибка, по-видимому, связана с файлами пакета npm, но это может помочь получить эти журналы.

cam 24.12.2020 01:13

Я не уверен, что вы имели в виду docker run или docker exec. Но я получил идентификатор контейнера, используя «docker ps -a», затем используя «docker start <container_id>» и «docker exec -it <container_id> bash». docker exec завершится через минуту, потому что временный контейнер, созданный для сборки образа, остановится.

Garvit Arora 24.12.2020 01:52
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
6 099
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Контейнеры Docker имеют изолированные файловые системы от хоста и от других контейнеров. /usr/local/lib/node_modules в контейнере полностью отличается от того же каталога на хосте, и аналогичным образом /root на хосте отделен от /root в любом конкретном контейнере. Вот почему сборка образа не может использовать модули host-global и почему у вас возникают проблемы с чтением подробных журналов.

Что касается Dockerfile, важно убедиться, что файл package.json завершен. npm link не будет работать; убедитесь, что вы npm install body-parser и любые другие модули, которые вам нужны, и что все зависимости перечислены в package.json и package-lock.json.

Дерево хоста node_modules может отличаться от изображения по нескольким причинам (в первую очередь, если вы используете контейнер Linux на хосте, отличном от Linux). Вы можете избежать проблем здесь и ускорить сборку, убедившись, что node_modules указан в файле .dockerignore в том же каталоге, что и Dockerfile.

Вы говорите, что удаление каталога хоста node_modules исправляет сборку, поэтому исключение его из контекста docker build, скорее всего, также исправит это.


Если это не сработает, но вы все равно хотите просмотреть журналы, вы можете получить оболочку в контейнере на основе частичной сборки вплоть до последнего успешного шага. Скажем, результат docker build

Step 5/7 : WORKDIR /home/app
 ---> 123456789abc
Step 6/7 : RUN npm install
 ... the error text you quoted ...

Это шестнадцатеричное число является действительным идентификатором образа Docker, поэтому вы можете вручную повторить последний (неудачный) шаг, начиная с результатов предыдущего (успешного) шага. Бегать:

host$ sudo docker run --rm -it 123456789abc sh
13579bdf2468# npm install
...
npm ERR! A complete log of this run can be found in:
npm ERR!     /root/.npm/_logs/2020-12-23T21_41_24_539Z-debug.log
13579bdf2468# cat /root/.npm/_logs/2020-12-23T21_41_24_539Z-debug.log

(Самые последние версии Docker имеют другой механизм сборки и немного другой вывод. Возможно, вам придется добавить --progress=plain, чтобы получить больше информации.)

Спасибо за разъяснение ошибки и шаги по входу в контейнер на основе частичной сборки. Но каталога с именем .npm в корневом каталоге нет. я на самом деле запустил ls alR | grep "<filename>", но это не дало результата. Просто чтобы убедиться, что я также сделал screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty и проверил наличие журналов в /root/.npm, которые все еще не являются каталогом или файлом. Я что-то упустил? Я имею в виду, что я знаю, почему на этот раз ошибка, поэтому я могу разрешить журналы, но в случае будущей ошибки я хочу понять, где находятся журналы.

Garvit Arora 24.12.2020 14:46

Я немного уточнил ответ: нужно заново выполнить последний шаг, вручную, в интерактивной оболочке, начиная с последнего успешного шага. Как только шаг RUN терпит неудачу, все его выходы исчезают. (Он не будет находиться на хосте или в скрытой виртуальной машине Linux где-либо.) (IME, вам обычно не нужен этот журнал, и ENOENT ошибка, которую узел уже распечатывает, достаточна информация.)

David Maze 24.12.2020 14:55

Это работает, и я могу воспроизвести ошибку и журнал. Спасибо.

Garvit Arora 24.12.2020 15:12

Другие вопросы по теме