Вопрос или проблема
Мне действительно нужна помощь с проектом. Я переношу API-пайплайн на GitHub Actions, но он использует устаревшие версии Java и Node (обе версии 8). У нас нет времени на обновление, потому что старая служба закроется через 4 дня, поэтому обновление произойдет позже.
Проблема связана с Dockerfile: до того, как я добавил команду WORKDIR /app, команда RUN gulp build
выполнялась нормально, как и другие команды, но теперь возникает ошибка. Вот сообщение об ошибке:
module.js:538
throw err;
^
Ошибка: Не удается найти модуль 'inherits'
в Function.Module._resolveFilename (module.js:536:15)
в Function.Module._load (module.js:466:25)
в Module.require (module.js:579:17)
в require (internal/module.js:11:18)
в Object.<anonymous> (/usr/local/nvm/versions/node/v8.9.1/lib/node_modules/gulp/node_modules/through2/node_modules/readable-stream/lib/_stream_readable.js:68:17)
в Module._compile (module.js:635:30)
в Object.Module._extensions..js (module.js:646:10)
в Module.load (module.js:554:32)
в tryModuleLoad (module.js:497:12)
в Function.Module._load (module.js:489:3)
Я добавил команду WORKDIR /app, чтобы держать зависимости в одном слое, гарантируя, что ничего не пропущено, когда приложение разворачивается на Google Cloud.
Вот Dockerfile:
FROM openjdk:8
COPY . /app
WORKDIR /app
// Здесь я запускаю некоторые команды для установки зависимостей, я удалил их, чтобы сократить файл.
RUN mkdir -p "$NVM_DIR"; \
curl -o- --retry 5 --retry-delay 10 \
"https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh" | \
bash \
; \
source $NVM_DIR/nvm.sh; \
nvm install $NODE_VERSION --latest-npm
ENV PATH=/usr/local/nvm/versions/node/v8.9.1/bin:/usr/local/bundle/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/openjdk-8/bin
RUN npm install -g grunt gulp
# Копируем файлы проекта
COPY . /app
WORKDIR /app
RUN npm install -g --quiet [email protected]
#Установка NPM в корневой директории
RUN rm -rf node_modules ~/tmp && npm cache clean -f
RUN npm install --ignore-scripts
WORKDIR /app/src/main/resources/static
# Установка NPM для статических файлов
RUN rm -rf node_modules ~/tmp && npm cache clean -f
RUN npm install --ignore-scripts
WORKDIR /app
RUN npm rebuild node-sass
// здесь происходит сбой
RUN gulp build
Я пытался переместить команду WORKDIR /app
в разные части Dockerfile, проверял путь, подтверждал, что gulpfile.js
присутствовал перед выполнением gulp build
, и повторно запускал npm install
. Я также проверял, что gulp распознается в проекте, но проблема остается. Без WORKDIR /app
проект теряет важные зависимости в статической папке, необходимые для развертывания в тестовой среде. Я ожидал, что gulp build будет работать так же, как и раньше — есть идеи?
Ответ или решение
Ситуация, в которой вы оказались, требует внимательного анализа, особенно учитывая сроки вашего проекта и необходимость минимизации времени на изменения. Давайте разберемся с вашей проблемой и предложим потенциальные решения.
Проблема
Вы добавили команду WORKDIR /app
в ваш Dockerfile, которая изменила рабочую директорию для последующих команд. В результате выполнения команды RUN gulp build
появляется ошибка: Error: Cannot find module 'inherits'
. Эта ошибка указывает на то, что Node.js не может найти необходимый модуль, который, вероятно, не установлен или не доступен в текущей директории.
Причины ошибки
-
Модули в разных директориях: При использовании
WORKDIR
вы изменяете контекст для последующих команд на/app
, и если ваши зависимости устанавливаются, возможно, они находятся в другом месте (например, вnode_modules
, который мог находиться в другой директории в предыдущей конфигурации Dockerfile). -
Необновленные зависимости: Возможно, часть зависимостей, которые требуются для сборки приложения, не была корректно установлена по причине изменения структуры вашего Dockerfile.
-
Кэширование Docker: Docker использует кэш для слоев образа, и если после добавления
WORKDIR
не все команды были выполнены, могут возникнуть неожиданные результаты.
Возможные решения
-
Проверьте и обновите пути: Убедитесь, что все ваши зависимости установлены в каталоге
/app
. В текущих установках вы дважды используетеCOPY . /app
, что может привести к путанице. Возможно, стоит убрать один из этих вызовов. -
Убедитесь в корректности путей: Перед выполнением
RUN gulp build
добавьте команду для проверки наличия модуляinherits
:RUN npm list inherits
Это поможет удостовериться, что модуль действительно установлен.
-
Разделение установки зависимостей: Возможно, стоит разделить установку зависимостей на несколько этапов. Убедитесь, что вы вызываете
npm install
в правильных директориях, прежде чем запускатьgulp build
. -
Попробуйте переместить
WORKDIR
: Пробуйте разместить командуWORKDIR /app
после каждой установки зависимости, чтобы обеспечить правильное рабочее окружение для последующих команд:RUN npm install WORKDIR /app/src/main/resources/static RUN npm install --ignore-scripts WORKDIR /app RUN gulp build
-
Запуск сборки в интерактивном режиме: Если возможно, попробуйте запустить контейнер с интерактивным доступом и выполните команды вручную, чтобы лучше понять, что именно идет не так.
Заключение
Следуя указанным рекомендациям, вы сможете диагностировать и, возможно, устранить проблему, связавшуюся с ошибками при сборке gulp
. Этот подход поможет обеспечить, чтобы все необходимые зависимости были доступны в правильной директории, что критично для вашего проекта с коротким сроком выполнения.
Если проблема не разрешается, рекомендую вернуть исходное состояние Dockerfile и поочередно добавлять изменения, чтобы изолировать причину ошибки, а также безотлагательно рассмотреть обновление окружения, если это станет возможным в будущем.