码头建筑+私人NPM(+私人码头枢纽)

mklgxw1f  于 2022-11-14  发布在  其他
关注(0)|答案(6)|浏览(160)

我有一个在Docker容器中运行的应用程序。它需要一些来自公司私有NPM注册表(Sinopia)的私有模块,访问这些模块需要用户身份验证。Docker文件是FROM iojs:latest
我试过:
1)在项目根目录中创建一个.npmrc文件,这实际上没有什么区别,npm似乎忽略了它2)使用NPM_CONFIG_REGISTRYNPM_CONFIG_USER等的env变量,但用户没有登录。
从本质上讲,我似乎没有办法在docker build进程中对用户进行身份验证。我希望有人可能已经遇到了这个问题(似乎是一个足够明显的问题),并有一个很好的方法来解决它。
(To最重要的是,我在Docker Hub上使用了自动构建(在推送时触发),这样我们的服务器就可以使用预构建的映像访问私有Docker注册表。)
是否有好的方法:1)在构建时为NPM注入凭据(这样我就不必将凭据提交到我的Dockerfile),或者2)用我没有想到的另一种方式来做这件事?

eh57zj3b

eh57zj3b1#

我在为node.js/io.js容器(you/iojs)创建一个基础映像时发现了一个比较优雅的解决方案:
1.登录到你的私人npm注册表与这用户你想使用的docker
1.复制此操作生成的.npmrc文件
示例.npmrc

registry=https://npm.mydomain.com/
username=dockerUser
email=docker@mydomain.com
strict-ssl=false
always-auth=true
//npm.mydomain.com/:_authToken="someAuthToken"

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" ]

1.将所有的node.js/io.js容器都设置为FROM you/iojs,就可以开始了。

2izufjch

2izufjch2#

在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

slsn1g29

slsn1g293#

对于那些通过google找到这篇文章,并且仍然在寻找一种替代方式,不涉及在你的Docker图像和容器上留下你的私人npm令牌的人:
我们可以在docker build之前先执行npm install(这样做可以让您的.npmrc不在您的image\container中)。一旦私有模块安装在本地,您就可以将您的文件复制到映像中,作为构建的一部分:

# 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
w80xi6nr

w80xi6nr4#

我建议不要使用.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"]
von4xj4u

von4xj4u5#

buildkit的答案是正确的,除了它以root身份运行所有内容,这被认为是一种糟糕的安全做法。
下面是一个工作的Dockerfile,它使用正确的用户node作为节点Dockerfile设置。注意,secret mount设置了uid参数,否则它将以root用户的身份挂载,用户node无法读取该参数。还要注意,将node:node更改为user:group的正确COPY命令

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" ]
inn6fuwd

inn6fuwd6#

@paul-s现在应该是可接受的答案,因为它是更新的IMO。作为补充,您提到您正在使用docker/build-push-action操作,因此您的工作流程必须如下所示:

- uses: docker/build-push-action@v3
  with:
    context: .
    # ... all other config inputs
    secret-files: |
      NPM_CREDENTIALS=./.npmrc

然后,当然,使用您指定的ID从您的dockerfile绑定.npmrc文件。在我的例子中,我使用的是基于Debian的映像(uid从1000开始)。

RUN --mount=type=secret,id=NPM_CREDENTIALS,target=<container-workdir>/.npmrc,uid=1000 \
npm install --only=production

相关问题