Docker + приватный пакет npm = модуль не найден / не может найти модуль - PullRequest
0 голосов
/ 07 сентября 2018

У меня есть личный пакет (исходный код) в моем репозитории gitlab, который называется 'anvil'. У меня есть проект, который является потребителем этого пакета, называется warden, и он будет запущен в Docker-контейнере (в нем есть Dockerfile.)

Я определил запись в зависимостях warden (для потребителя) так, чтобы она установила anvil (пакет в моем gitlab), это выглядит так:

"dependencies": {
    "@types/knex": "^0.14.18",
    "@types/node": "^10.9.4",
    "discord-anvil": "git+https://gitlab+deploy-token-<deploy_token_here>@gitlab.com/<myusername>/anvil.git#dev-2.0",
    "discord.js": "^11.4.2",
    "knex": "^0.15.2",
    "sqlite3": "^4.0.2",
    "typescript": "^2.9.2"
}

Мой Dockerfile:

FROM node:10
WORKDIR /app
ADD . /app
RUN npm install
ENV token="<private_token_here>"
ENV prefix="."
RUN npm start

Проблема в в том, что как только я запускаю контейнер, используя sudo docker run ., все идет хорошо, пока не будет выполнен скрипт postinstall в наковальне (пакет).

Наковальня package.json (некоторые несущественные вещи вывезены):

{
    "name": "discord-anvil",
    "version": "2.9.0",
    "main": "./dist/index.js",
    "scripts": {
        "watch": "tsc --watch",
        "build": "tsc",
        "type-check": "tsc --noEmit",
        "test": "npm run build && mocha dist/test/tests.js",
        "postinstall": "npm run build"
    },
    "license": "MIT",
    "dependencies": {
        ...
    },
    "devDependencies": {
        ...
        "typescript": "^2.8.1"
    },
    "files": [
        "dist"
    ]
}

Как видите, в anvil (пакете) есть сценарий postinstall, который выполняется при установке надзирателем. Когда строится файл докера, вот что я получаю:

...
> discord-anvil@2.9.0 postinstall /app/node_modules/discord-anvil
> npm run build


> discord-anvil@2.9.0 build /app/node_modules/discord-anvil
> tsc

../../src/app.ts(14,8): error TS2307: Cannot find module 'discord-anvil'.
../../src/app.ts(15,39): error TS2307: Cannot find module 'discord-anvil/dist/commands/command'.
../../src/commands/ban.ts(3,68): error TS2307: Cannot find module 'discord-anvil'.
../../src/commands/ban.ts(4,37): error TS2307: Cannot find module 'discord-anvil/dist/commands/command'.
...

Та же ошибка повторяется в основном для каждого файла, в котором используется наковальня (требуется / импортируется). Я был вынужден использовать сценарий postinstall для сборки проекта, поскольку простая установка его из репозитория git просто помещает исходный код в node_modules, а не в фактически скомпилированный пакет . Кстати, наковальня - это просто сокращение от наковальни, которая является официальным названием пакета.

Однако, если я повторю ту же самую процедуру локально (не в контейнере Docker), все будет хорошо, и машинопись не выдаст ошибок.

Есть идеи? Заранее спасибо.

1 Ответ

0 голосов
/ 07 сентября 2018

Оказалось, что эти ошибки были из-за того, что машинописная машинка компилировала весь проект , а не просто наковальню, что я и хотел, это, вероятно, было связано с тем, что свойство package.json файлов 'anvil было установлено только для того, чтобы содержать папка dist, и когда он был извлечен из gitlab, он на самом деле извлекал бы только README, LICENSE и package.json с ничем иным .

Я думаю, что компилятор машинописного текста, если он не может найти ни файлов для компиляции, ни tsconfig.json файла, он будет смотреть на родительские каталоги (который был корнем, надзиратель) и, таким образом, выбрасывает ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...