要在 Docker 容器中安装私有 npm 包,您需要使用 Docker 构建密钥

背景:运行时变量

您不能只使用运行时变量在 Docker 容器中安装私有 npm 包。请考虑以下 Dockerfile

FROM node
COPY package.json package.json
RUN npm install
# Add your source files
COPY . .
CMD npm start

它将使用官方 Node.js 镜像,将 package.json 复制到我们的容器中,安装依赖项,复制源文件并运行 package.json 中指定的启动命令。

为了安装私有包,您可能会认为我们可以在运行 npm install 之前添加一行,使用 ENV 参数

ENV NPM_TOKEN=00000000-0000-0000-0000-000000000000

但是,这不会按预期工作,因为您希望在运行 docker build 时执行 npm install,在这种情况下,ENV 变量不会被使用,它们仅在运行时设置。

您必须使用 Docker 构建密钥而不是运行时变量。

更新 Dockerfile

利用此功能的 Dockerfile 比前面的示例多几行,它允许我们使用您的全局 .npmrc 和在运行 npm login 命令时创建的访问令牌(如果您还没有运行它,请在继续之前运行)。

# https://docs.npmjs.net.cn/docker-and-private-modules
FROM node:18
ENV APP_HOME="/app"
WORKDIR ${APP_HOME}
COPY package*.json ${APP_HOME}/
RUN --mount=type=secret,id=npmrc,target=/root/.npmrc npm install
COPY . ${APP_HOME}/
CMD npm start

这将配置您的 Dockerfile,以便通过构建密钥接收 .npmrc 文件,该文件将在 npm 依赖项安装完成后不再留下任何痕迹。

构建 Docker 镜像

要使用上述 Dockerfile 和 npm 身份验证令牌构建镜像,您可以运行以下命令。请注意末尾的 .,它会将当前目录作为参数传递给 docker build

docker build . -t secure-app-secrets:1.0 --secret id=npmrc,src=$HOME/.npmrc

这将构建 Docker 镜像,其中访问令牌来自您的全局 .npmrc 文件,该文件通过构建密钥接收,因此您可以在容器中以当前登录用户的身份运行 npm install

注意:您可能需要指定一个与默认的 / 不同的工作目录,否则一些框架(如 Angular)将失败。

在 GitHub 上编辑此页面
3 贡献者matzarmikhailianethomson
最后编辑者:matzar,时间: 2023 年 3 月 16 日