我正在使用
.npmrc
文件来配置私人存储库 (font-awesome-pro)。
无需 docker 即可正常工作。
但是对于 docker,
npm install
失败了:
npm ERR! code E401
npm ERR! 404 401 Unauthorized: @fortawesome/fontawesome-pro-light@https://npm.fontawesome.com/7D46BEC2-1565-40B5-B5FC-D40C724E60C6/@fortawesome/fontawesome-pro-light/-/fontawesome-pro-light-5.0.12.tgz
我已经阅读了 NPM 的文档:Docker 和私有包,但我不知道如何使用
docker-compose.yml
应用它,并且我不确定传递变量是解决方案(?)。
在 docker 实例内安装期间是否可能未读取 .npmrc
文件?我是不是错过了什么?
这是我的
docker-compose.yaml
:
version: '2.1'
services:
app:
image: node:8.9.4
# restart: always
container_name: jc-vc
environment:
- APP_ENV=${JC_ENV:-dev}
- HOST=0.0.0.0
- BASE_URL=${JC_BASE_URL}
- BROWSER_BASE_URL=${JC_BROWSER_BASE_URL}
working_dir: /usr/src/app
volumes:
- ${DOCKER_PATH}/jc/vc/app:/usr/src/app
command: npm install
# command: npm run dev
# command: npm run lintfix
# command: npm run build
# command: npm start
expose:
- 3000
nginx:
image: nginx
logging:
driver: none
# restart: always
volumes:
- ${DOCKER_PATH}/jc/vc/nginx/www:/usr/share/nginx/html
- ${DOCKER_PATH}/jc/vc/nginx/default.${JC_ENV:-dev}.conf:/etc/nginx/nginx.conf
- ${DOCKER_PATH}/jc/vc/nginx/.htpasswd:/etc/nginx/.htpasswd
- ${DOCKER_PATH}/jc/letsencrypt:/etc/letsencrypt
container_name: jc-nginx-vc
depends_on:
- app
ports:
- ${PORT_80:-4020}:${PORT_80:-4020}
- ${PORT_443:-4021}:${PORT_443:-4021}
和我的
.npmrc
(已替换令牌):
@fortawesome:registry=https://npm.fontawesome.com/
//npm.fontawesome.com/:_authToken=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXX
解决此问题的正确方法(如您引用的链接中所述)是在 dockerfile 中使用 arg 变量。我认为您缺少的是如何在撰写中做到这一点:
version: "3"
services:
myapp:
build:
context: "."
args:
NPM_TOKEN: "s3kr!t"
您需要在 dockerfile 中引用此参数,并在项目的根目录中创建一个 .npmrc 文件:
//registry.npmjs.org/:_authToken=${NPM_TOKEN}
我喜欢在 dockerfile 中生成它,以最大程度地降低暴露风险(但是,请注意,令牌仍然存储在图像的层中),因此它看起来像这样:
FROM node:current-buster-slim
ARG NPM_TOKEN
WORKDIR /app
COPY package.json /app/package.json
RUN echo "//registry.npmjs.org/:_authToken=${NPM_TOKEN}" > /app/.npmrc && \
npm install && \
rm -f /app/.npmrc
COPY . /app/
CMD npm start
然后您可以运行
docker-compose build myapp
并获得良好的结果。该解决方案仍然面临着在您的撰写文件和 docker 映像中包含秘密的问题,但这只是一个草图。在现实世界中,您不希望将机密放入源文件中,因此您可以将机密替换为具有较短生存时间 (TTL) 和一次性策略的动态机密(并且您我可能想使用 Hashicorp Vault 来帮助解决这个问题)。
我遇到了同样的问题,但就我而言,我忘记将 .npmrc 文件复制到容器中,只复制了 package.json,然后将其添加到我的 Dockerfile 中
npm install
:
COPY .npmrc ./
在项目的根目录中,创建一个包含以下内容的自定义 .npmrc 文件:
//registry.npmjs.org/:_authToken=${NPM_TOKEN}
现在将这些命令添加到 Dockerfile
复制 .npmrc .npmrc
复制 package.json package.json
运行 npm 安装
运行 rm -f .npmrc
这应该可以解决问题,希望有帮助
我想复制项目和用户的
.npmrc
文件,因为私人源安装需要这两个文件。
Docker 只能从指定的上下文复制文件,因此需要使用 additional_contexts 定义附加上下文。
# docker-compose.yml
services:
my-service:
...
build:
context: .
dockerfile: Dockerfile
additional_contexts:
user: ~/
# Dockerfile
FROM node:latest
COPY .npmrc .
COPY --from=user .npmrc /root/.npmrc
RUN npm config ls
COPY package.json .
RUN npm i
我们发现我们的一个 GitHub 存储库意外公开,并将其移至私有 AWS CodeArtifact 存储库。然后我们遇到了同样的问题。
问题的根本原因是我们已经
package-lock.json
签入了GitHub(一个很好的做法),但在里面,package-lock.json
仍然引用了GitHub。
修复方法是删除 package-lock.json (这是一个一次性事件,因为我们正在切换注册表)并重新生成它。然后我们对其进行比较,以确保只有我们期望更改的包被修改为指向新的注册表。
以下是步骤(Windows):
del package.json
npm install
然后比较 package.json 以确保只有注册表发生了变化。
package-lock.json
需要使用新的 .npmrc
文件重新生成。删除它 package-lock.json
并使用 npm install
重新创建它,然后重新部署映像。