docker build +私人NPM(+私人码头中心)

GTF*_*GTF 13 node.js npm docker docker-registry npm-private-modules

我有一个在Docker容器中运行的应用程序.它需要公司私有NPM注册机构(Sinopia)的一些私有模块,访问这些模块需要用户身份验证.Dockerfile是FROM iojs:latest.

我试过了:

1)创造在项目的根的.npmrc文件,这其实没有什么区别和NPM似乎使用ENV变量忽略它2) NPM_CONFIG_REGISTRY,NPM_CONFIG_USER等等,但用户不登录.

从本质上讲,我似乎无法在docker build流程中对用户进行身份验证.我希望有人可能已经遇到这个问题(似乎是一个明显的问题)并且有一个很好的解决方法.

(最重要的是,我在Docker Hub上使用自动构建(在推送时触发),以便我们的服务器可以使用预构建的图像访问私有Docker注册表.)

有没有好的方法:1)在构建时注入NPM的凭据(所以我不必将凭据提交到我的Dockerfile)或2)以另一种方式执行此操作,我没有想到?

GTF*_*GTF 25

我在为node.js/io.js容器(you/iojs)创建基本映像时找到了一些优雅的解决方案:

  1. 使用您要用于docker的用户登录到您的私有npm注册表
  2. 复制.npmrc这个生成的文件

示例.npmrc:

registry=https://npm.mydomain.com/
username=dockerUser
email=docker@mydomain.com
strict-ssl=false
always-auth=true
//npm.mydomain.com/:_authToken="someAuthToken"
Run Code Online (Sandbox Code Playgroud)
  1. 创建一个适当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" ]
Run Code Online (Sandbox Code Playgroud)
  1. 制作所有的node.js/io.js容器FROM you/iojs,你就可以了.


Krz*_*iec 8

2020 年,我们推出了 BuildKit。您不必通过COPYENV再传递秘密,因为它被认为是不安全的。

样品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...
Run Code Online (Sandbox Code Playgroud)

然后,您的构建命令可能如下所示:

docker build --no-cache --progress=plain --secret id=npmrc,src=/path-to/.npmrc .
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请查看:https : //docs.docker.com/develop/develop-images/build_enhancements/#new-docker-build-secret-information


小智 6

对于那些正在通过google找到本文并且仍在寻找不涉及在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
Run Code Online (Sandbox Code Playgroud)

您还需要确保您的.dockerignore文件不排除该node_modules文件夹。

将文件夹复制到图像后,诀窍是到npm rebuild 而不是npm install。这将重建受构建服务器和Docker操作系统之间的任何差异影响的所有本机依赖关系:

    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
Run Code Online (Sandbox Code Playgroud)


Pau*_*l S 4

buildkit 的答案是正确的,但它以 root 身份运行所有内容,这被认为是一种不好的安全实践。

这是一个 Dockerfile,它可以工作并使用正确的用户node作为 Dockerfile 设置的节点。注意秘密挂载有uid参数设置,否则会以 root 身份挂载,用户node无法读取。user:group另请注意 chown 为of的正确 COPY 命令node:node

FROM node:12-alpine

USER node

WORKDIR /home/node/app

COPY --chown=node:node package*.json ./

RUN --mount=type=secret,id=npm,target=./.npmrc,uid=1000 npm ci

COPY --chown=node:node index.js .

COPY --chown=node:node src ./src

CMD [ "node", "index.js" ]

Run Code Online (Sandbox Code Playgroud)