分享我的发现、想法与心得

0%

在Docker下解决私有组件的授权问题

起因

在使用 verdaccio 进行管理私有模块的管理后,在部署构建Docker镜像时,却提示没有权限访问私有包。这该如何解决?

解决办法

答案很简单!

在项目中添加 .npmrc 来管理私有包的来源。在构建Docker镜像时,传入授权token的方式来实现授权安装。最后将 .npmrc 删除就能正常运行了。

1
2
3
4
5
6
7
8
9
10
11
FROM node

ARG NPM_TOKEN
COPY .npmrc .npmrc
COPY package.json package.json
RUN npm install
RUN rm -f .npmrc #必要行为,记得删除

# Add your source files
COPY . .
CMD npm start

然后跑构建命令:

1
2
3
# `${NPM_TOKEN}`这段内容可以键入你的本地登录后的token
# token可在`~/.npmrc`中找到
docker build --build-arg NPM_TOKEN=${NPM_TOKEN} .

意外情况

假如跑构建命令,出现下面错误提示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Error: Failed to replace env in config: ${NPM_TOKEN}
at /usr/local/lib/node_modules/npm/lib/config/core.js:415:13
at String.replace (<anonymous>)
at envReplace (/usr/local/lib/node_modules/npm/lib/config/core.js:411:12)
at parseField (/usr/local/lib/node_modules/npm/lib/config/core.js:389:7)
at /usr/local/lib/node_modules/npm/lib/config/core.js:330:24
at Array.forEach (<anonymous>)
at Conf.add (/usr/local/lib/node_modules/npm/lib/config/core.js:328:23)
at ConfigChain.addString (/usr/local/lib/node_modules/npm/node_modules/config-chain/index.js:244:8)
at Conf.<anonymous> (/usr/local/lib/node_modules/npm/lib/config/core.js:316:10)
at /usr/local/lib/node_modules/npm/node_modules/graceful-fs/graceful-fs.js:78:16
/usr/local/lib/node_modules/npm/lib/npm.js:61
throw new Error('npm.load() required')
^

Error: npm.load() required
at Object.get (/usr/local/lib/node_modules/npm/lib/npm.js:61:13)
at process.errorHandler (/usr/local/lib/node_modules/npm/lib/utils/error-handler.js:205:18)
at process.emit (events.js:182:13)
at process._fatalException (internal/bootstrap/node.js:448:27)

其原因是运行时,没有把.npmrc文件删除。.npmrc 文件只在Docker镜像构建环节时需要,运行时下由于缺少${NPM_TOKEN}环境变量而报错。Dockerfile构建脚本中,在完成npm install后,记得删除.npmrc文件。

来源: