У меня есть простое приложение 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
в расположении кода.
Мои вопросы
приносим свои извинения за отсутствие полного Dockerfile. обновил его. Какой контейнер мне нужно будет выполнить, чтобы получить журналы. Я заметил, что несколько временных контейнеров были запущены и остановлены (а не удалены в случае успешной сборки образа). Я попытался перезапустить остановленный контейнер, но он остановился в течение нескольких минут, не дав мне изменить команду exec.
Как вы пытаетесь запустить остановленный контейнер? Используете ли вы такую команду, как docker run -it CONTAINER bash
? Эта ошибка, по-видимому, связана с файлами пакета npm, но это может помочь получить эти журналы.
Я не уверен, что вы имели в виду docker run или docker exec. Но я получил идентификатор контейнера, используя «docker ps -a», затем используя «docker start <container_id>» и «docker exec -it <container_id> bash». docker exec завершится через минуту, потому что временный контейнер, созданный для сборки образа, остановится.
Контейнеры 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, которые все еще не являются каталогом или файлом. Я что-то упустил? Я имею в виду, что я знаю, почему на этот раз ошибка, поэтому я могу разрешить журналы, но в случае будущей ошибки я хочу понять, где находятся журналы.
Я немного уточнил ответ: нужно заново выполнить последний шаг, вручную, в интерактивной оболочке, начиная с последнего успешного шага. Как только шаг RUN
терпит неудачу, все его выходы исчезают. (Он не будет находиться на хосте или в скрытой виртуальной машине Linux где-либо.) (IME, вам обычно не нужен этот журнал, и ENOENT
ошибка, которую узел уже распечатывает, достаточна информация.)
Это работает, и я могу воспроизвести ошибку и журнал. Спасибо.
Не могли бы вы предоставить полный файл Dockerfile или, по крайней мере, из каких базовых образов он взят? Также ошибка npm говорит, что журнал находится в папке
/root
внутри контейнера Docker, вам нужно получить доступ к контейнеру через оболочку или скопировать файл (используя команду Dockerexec
илиcp
.