[英]Docker + private npm package = module not found/cannot find module
我在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 .
啟動容器sudo docker run .
一切正常,直到執行了砧(包)中的postinstall
腳本。
Anvil的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
腳本,該腳本在由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
下, node_modules
不是實際的已編譯包中。 順便說一句,anvil是discord-anvil的縮寫,后者是官方的軟件包名稱。
但是,如果我在本地重復相同的過程(不是docker容器),一切都會順利進行,並且打字稿不會引發錯誤。
有任何想法嗎? 提前致謝。
原來這些錯誤是因為打字稿正在編譯整個項目,而不僅僅是我想要的砧,這可能是由於砧的package.json
'屬性設置為僅包含'dist'文件夾以及何時將其拉出從gitlab,它實際上只會拉README,LICENSE和package.json, 別無其他 。
我認為打字稿編譯器如果找不到要編譯的文件或tsconfig.json
文件,它將在父目錄 (即根目錄, tsconfig.json
查找,從而tsconfig.json
錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.