Журналы неудачной сборки 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/.

person Garvit Arora    schedule 23.12.2020    source источник
comment
Не могли бы вы предоставить полный файл Dockerfile или, по крайней мере, из каких базовых образов он взят? Также ошибка npm говорит, что журнал находится в папке /root внутри контейнера Docker, вам нужно получить доступ к контейнеру через оболочку или скопировать файл (используя команду Docker exec или cp.   -  person tentative    schedule 24.12.2020
comment
приносим свои извинения за отсутствие полного Dockerfile. обновил его. Какой контейнер мне нужно будет выполнить, чтобы получить журналы. Я заметил, что несколько временных контейнеров были запущены и остановлены (а не удалены в случае успешной сборки образа). Я попытался перезапустить остановленный контейнер, но он остановился в течение нескольких минут, не дав мне изменить команду exec.   -  person Garvit Arora    schedule 24.12.2020
comment
Как вы пытаетесь запустить остановленный контейнер? Вы используете такую ​​команду, как docker run -it CONTAINER bash? Эта ошибка, по-видимому, связана с файлами пакета npm, но это может помочь получить эти журналы.   -  person tentative    schedule 24.12.2020
comment
Я не уверен, что вы имели в виду docker run или docker exec. Но я получил идентификатор контейнера, используя «docker ps -a», затем используя «docker start ‹container_id›» и «docker exec -it ‹container_id› bash». docker exec завершится через минуту, потому что временный контейнер, созданный для сборки образа, остановится.   -  person Garvit Arora    schedule 24.12.2020


Ответы (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, чтобы получить больше информации.)

person David Maze    schedule 24.12.2020
comment
Спасибо за разъяснение ошибки и шаги по входу в контейнер на основе частичной сборки. Но каталога с именем .npm в корневом каталоге нет. я на самом деле запустил ls alR | grep "<filename>", но это не дало результата. Просто чтобы убедиться, что я также сделал screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty и проверил наличие журналов в /root/.npm, которые все еще не являются каталогом или файлом. Я что-то упустил? Я имею в виду, что я знаю, почему на этот раз ошибка, поэтому я могу разрешить журналы, но в случае будущей ошибки я хочу понять, где находятся журналы. - person Garvit Arora; 24.12.2020
comment
Я немного уточнил ответ: нужно заново выполнить последний шаг, вручную, в интерактивной оболочке, начиная с последнего успешного шага. Как только шаг RUN терпит неудачу, все его выходы исчезают. (Он не будет находиться на хосте или в скрытой виртуальной машине Linux в любом месте.) (IME, вам обычно не нужен этот журнал, а узел ошибки ENOENT уже распечатывает достаточно информации.) - person David Maze; 24.12.2020
comment
Это работает, и я могу воспроизвести ошибку и журнал. Спасибо. - person Garvit Arora; 24.12.2020