Docker +私有npm程序包=找不到模块/找不到模块

时间:2018-09-07 03:49:20

标签: node.js typescript docker npm

我在gitlab存储库中有一个名为“ anvil”的私有软件包(源代码)。我有一个项目,该程序包的使用者,称为“ warden”,它将在Docker容器(具有Dockerfile)中启动。

我已经在看守(消费者)依赖项中定义了一个条目,该条目将安装砧(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"
    ]
}

如您所见,砧(包)具有postinstall脚本,该脚本在由warden安装时执行。构建docker文件时,这就是我得到的:

...
> 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 repo普通安装它只是将源代码放在node_modules下,而不是 actualrated 包下。顺便说一下,anvil是discord-anvil的缩写,它是官方的软件包名称。

但是,如果我在本地 (不是docker容器)重复相同的过程,一切都会很好,并且打字稿不会引发错误。

有什么想法吗?预先感谢。

1 个答案:

答案 0 :(得分:0)

发现这些错误是因为打字稿正在编译整个项目而不仅仅是我想要的砧,这可能是由于砧的this.userClicks.forEach(function(item){ item.user.visit.forEach(function(elem){ console.log(elem.visitCount) }) }) 'files'属性设置为only包含“ dist”文件夹,并且当它从gitlab中拉出时,实际上只会拉README,LICENSE和package.json,而没有其他

我认为打字稿编译器如果找不到要编译的文件,也找不到package.json文件,它将在父目录(这是根目录,病房)中查找,并且从而引发错误。