我有一个在Docker容器中运行的应用程序。它需要来自公司的私人NPM注册机构(Sinopia)的一些私人模块,并且访问这些模块需要用户认证。 Dockerfile是FROM iojs:latest
。
我试过了:
1)在项目根目录中创建.npmrc文件,这实际上没有区别,npm似乎忽略它
2)使用NPM_CONFIG_REGISTRY
,NPM_CONFIG_USER
等的env变量,但用户没有登录。
基本上,我似乎无法在docker build
进程中对用户进行身份验证。我希望有人可能已经遇到这个问题(似乎是一个明显的问题),并且有一个很好的解决方法。
(最重要的是,我在Docker Hub上使用自动构建(在推送时触发),以便我们的服务器可以使用预构建的图像访问私有Docker注册表。)
是否有好方法: 1)在构建时注入NPM的凭据(因此我不必将凭据提交到我的Dockerfile)或者 2)这样做是我想不到的另一种方式 ?
答案 0 :(得分:24)
我在为您的node.js / io.js容器(you/iojs
)创建基本映像时找到了一个优雅的解决方案:
.npmrc
文件示例.npmrc
:
registry=https://npm.mydomain.com/
username=dockerUser
email=docker@mydomain.com
strict-ssl=false
always-auth=true
//npm.mydomain.com/:_authToken="someAuthToken"
Dockerfile
,以便相应地复制.npmrc
文件。这是我的Dockerfile
(基于iojs:onbuild
):
FROM iojs:2.2.1
MAINTAINER YourSelf
# Exclude the NPM cache from the image
VOLUME /root/.npm
# Create the app directory
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
# Copy npm config
COPY .npmrc /root/.npmrc
# Install app
ONBUILD COPY package.json /usr/src/app/
ONBUILD RUN npm install
ONBUILD COPY . /usr/src/app
# Run
CMD [ "npm", "start" ]
FROM you/iojs
,您就可以了。答案 1 :(得分:5)
对于那些通过谷歌发现这篇文章的人,仍然在寻找一种替代方法,不会让您在docker图像和容器上留下私密的npm标记:
我们可以通过在npm install
之前执行docker build
来实现此功能(通过执行此操作,您可以将.npmrc
置于图像\容器之外。在本地安装私有模块后,您可以将文件作为构建的一部分复制到映像中:
# Make sure the node_modules contain only the production modules when building this image
COPY . /usr/src/app
您还需要确保.dockerignore
文件不排除node_modules
文件夹。
将文件夹复制到图片后,诀窍是npm rebuild
而不是npm install
。这将重建由构建服务器和docker OS之间的任何差异影响的任何本机依赖:
FROM nodesource/vivid:LTS
# For application location, default from nodesource is /usr/src/app
# Make sure the node_modules contain only the production modules when building this image
COPY . /usr/src/app
WORKDIR /usr/src/app
RUN npm rebuild
CMD npm start
答案 2 :(得分:1)
在2020年,我们将提供BuildKit。您不再需要通过COPY
或ENV
传递秘密,因为它不安全。
示例Dockerfile
:
# syntax=docker/dockerfile:experimental
FROM node:13-alpine
WORKDIR /app
COPY package.json yarn.lock ./
RUN --mount=type=ssh --mount=type=secret,id=npmrc,dst=$HOME/.npmrc \
yarn install --production --ignore-optional --frozen-lockfile
# More stuff...
然后,您的构建命令应如下所示:
docker build --no-cache --progress=plain --secret id=npmrc,src=/path-to/.npmrc .
有关更多详细信息,请查看:https://docs.docker.com/develop/develop-images/build_enhancements/#new-docker-build-secret-information