docker build + 私有 NPM(+ 私有 docker hub)

Posted

技术标签:

【中文标题】docker build + 私有 NPM(+ 私有 docker hub)【英文标题】:docker build + private NPM (+ private docker hub) 【发布时间】:2015-08-14 21:54:23 【问题描述】:

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

我试过了:

1) 在项目根目录中创建一个 .npmrc 文件,这实际上没有区别,npm 似乎忽略了它 2) 使用NPM_CONFIG_REGISTRYNPM_CONFIG_USER等的环境变量,但用户没有登录。

基本上,我似乎无法在docker build 进程中验证用户身份。我希望有人可能已经遇到过这个问题(这似乎是一个足够明显的问题)并且有解决它的好方法。

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

有没有好的方法: 1) 在构建时为 NPM 注入凭据(因此我不必将凭据提交到我的 Dockerfile)或 2)以另一种我没有想到的方式做这件事 ?

【问题讨论】:

你解决过这个问题吗?我遇到了同样的问题:( 是的,刚刚发布了我的答案! 【参考方案1】:

在为您的 node.js / io.js 容器 (you/iojs) 创建基础映像时,我发现了一个有点优雅的解决方案:

    使用您要用于 docker 的用户登录到您的私有 npm 注册表 复制此生成的.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" ]
    制作所有 node.js/io.js 容器FROM you/iojs,一切顺利。

【讨论】:

我今天最终做了类似的事情。这是我在构建时需要的所有项目中唯一的密钥:(。我认为这是目前最好的解决方案,感谢您发布您的答案! 这里是关于私有 npm repo 和 Docker 的官方 Dock:docs.npmjs.com/private-modules/docker-and-private-modules 当心MAINTAINER 已弃用,请改用LABEL【参考方案2】:

我们在 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...

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

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

【讨论】:

【参考方案3】:

对于那些通过 google 找到这篇文章并且仍在寻找一种不涉及在 docker 映像和容器上留下私有 npm 令牌的替代方法的人:

我们能够通过在docker build 之前执行npm install 来完成这项工作(通过这样做,您可以在图像\容器之外拥有您的.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 操作系统之间任何差异影响的任何本机依赖项:

    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

【讨论】:

【参考方案4】:

我建议不要使用.npmrc 文件,而是使用npm config set。这就像一个魅力,而且更干净:

ARG AUTH_TOKEN_PRIVATE_REGISTRY

FROM node:latest

ARG AUTH_TOKEN_PRIVATE_REGISTRY
ENV AUTH_TOKEN_PRIVATE_REGISTRY=$AUTH_TOKEN_PRIVATE_REGISTRY

WORKDIR /home/usr/app

RUN npm config set @my-scope:registry https://my.private.registry && npm config set '//my.private.registry/:_authToken' $AUTH_TOKEN_PRIVATE_REGISTRY

RUN npm ci

CMD ["bash"]

【讨论】:

以上是关于docker build + 私有 NPM(+ 私有 docker hub)的主要内容,如果未能解决你的问题,请参考以下文章

运维工具搭建npm私有镜像仓库,天下苦于npm build久矣

docker用verdacci搭建私有npm

docker用verdacci搭建私有npm

Docker `npm install` 与 TypeScript 中的 GitHub 私有 repo 依赖项

npm安装在docker build中

npm install 后 Gitlab Shared Runner docker build