gpt4 book ai didi

docker - 通过 kubernetes/skaffold 将私有(private) npm 存储库拉到 docker 容器

转载 作者:行者123 更新时间:2023-12-05 00:44:10 28 4
gpt4 key购买 nike

我是 skaffold、k8s、docker set 的新手,在本地集群上构建我的应用程序时遇到了麻烦。

我有一个代码库,它试图拉取私有(private) NPM 包,但在构建它时会丢失 .npmrc 文件或 npm secret 。

npm ERR! code E404
npm ERR! 404 Not Found - GET https://registry.npmjs.org/@sh1ba%2fcommon - Not found
npm ERR! 404
npm ERR! 404 '@sh1ba/common@^1.0.3' is not in the npm registry.
npm ERR! 404 You should bug the author to publish it (or use the name yourself!)
npm ERR! 404
npm ERR! 404 Note that you can also install from a
npm ERR! 404 tarball, folder, http url, or git url.

npm ERR! A complete log of this run can be found in:
npm ERR! /root/.npm/_logs/2021-06-02T06_08_57_246Z-debug.log
unable to stream build output: The command '/bin/sh -c npm install' returned a non-zero code: 1. Please fix the Dockerfile and try again..

理想情况下,我希望避免将 secret 硬编码到文件中,并使用 k8s 环境变量将 key 作为 secret 传递给 docker。我可以(有点)使用 docker build 命令来做到这一点:

  • 使用带有 npm secret 的“--build-args”(不安全的方式)
  • 使用“--secret”和 npm secret(更好的方法)
  • 直接复制 .npmrc 文件,npm install在之后立即删除

当我尝试使用 kubernetes/skaffold 构建它时,就会出现问题。运行后,似乎没有找到任何 args、env 变量,甚至 .npmrc 文件。在检查 dockerfile 中的线索时,我能够确定没有任何内容从 list (定义的 args、.npmrc 文件等)传递到 dockerfile。

以下是应用程序的 list :

apiVersion: apps/v1
kind: Deployment
metadata:
name: auth-depl
spec:
replicas: 1
selector:
matchLabels:
app: auth
template:
metadata:
labels:
app: auth
spec:
containers:
- name: auth
image: auth
env:
- name: NPM_SECRET
valueFrom:
secretKeyRef:
name: npm-secret
key: NPM_SECRET
args: ["--no-cache", "--progress=plain", "--secret", "id=npmrc,src=.npmrc"]

这是 dockerfile 中的代码:

# syntax=docker/dockerfile:1.2
# --------------> The build image
FROM node:alpine AS build
WORKDIR /app
COPY package*.json .
RUN --mount=type=secret,mode=0644,id=npmrc,target=/app/.npmrc \
npm install

# --------------> The production image
FROM node:alpine

WORKDIR /app
COPY package.json .
COPY tsconfig.json .
COPY src .
COPY prisma .

COPY --chown=node:node --from=build /app/node_modules /app/node_modules
COPY --chown=node:node . /app
s
RUN npm run build

CMD ["npm", "start"]

还有 skaffold 文件:

apiVersion: skaffold/v2alpha3
kind: Config
deploy:
kubectl:
manifests:
- ./infra/k8s/*
- ./infra/k8s-dev/*
build:
local:
push: false
artifacts:
- image: auth
context: auth
docker:
dockerfile: Dockerfile
sync:
manual:
- src: 'src/**/*.ts'
dest: .

几点说明:

  • 无论我复制和粘贴到何处(在 auth、 list 、skaffold 和 ~/目录中),我都找不到 .npmrc 文件
  • 我也想在生产中使其半可用(相当可重复使用),这样如果可能的话我不需要进行彻底的大修(但如果这是不好的做法,我想听听更多关于它的信息)
  • 我已经能够使其与 skaffold.yaml 文件中的 buildArgs 一起工作,但我不确定这将如何转化为生产环境,因为我无法将构建参数从 kubernetes 传递给 docker(我读过它不安全,应该使用 secret )
  • list 中的 args 也抛出此错误(如果 args 被注释掉,服务器运行):
 - deployment/auth-depl: container auth terminated with exit code 9
- pod/auth-depl-85fb8975d8-4rh9r: container auth terminated with exit code 9
> [auth-depl-85fb8975d8-4rh9r auth] node: bad option: --progress=plain
> [auth-depl-85fb8975d8-4rh9r auth] node: bad option: --secret
- deployment/auth-depl failed. Error: container auth terminated with exit code 9.

任何见解都会令人惊叹,我已经摆弄这个太久了。

谢谢!

最佳答案

构建和部署镜像到 Kubernetes 分为三个层次:

  1. 您开始构建镜像的本地系统
  2. 填充镜像然后将该镜像存储在某处的 Docker 构建
  3. 加载并开始运行该镜像的 Kubernetes 集群

Docker 不参与#3。 (这只是部分正确,因为一些集群也使用 Docker 来运行容器,但这是一个隐藏的细节,并且也在发生变化。)

您可以在两个地方传达 secret :

  • 在图像构建时(步骤 #1 到 #2):您可以使用 Docker --build-args 或使用 --secret 安装 secret (两者都需要 Buildkit )
  • 在部署时(第 3 步):您使用 Kubernetes secret 或配置映射,它们与镜像构建分开配置

Skaffold 支持使用 Docker 的 --build-args--secret 标志传递构建时 secret ,例如您的 npm 密码,尽管它们稍作重命名。

buildArgs支持 Go 风格的模板,因此您可以将 MYSECRET 等环境变量引用为 {{.MYSECRET}}:

build:
local:
useBuildkit: true
artifacts:
- image: auth
context: auth
docker:
buildArgs:
MYSECRET: "{{.MYSECRET}}"

然后您可以在 Dockerfile 中引用 MYSECRET:

ARG MYSECRET
RUN echo MYSECRET=${MYSECRET}

请注意,除非您通过 ENV MYSECRET=${MYSECRET} 明确分配,否则 build-args 不会传播到您的容器中。

如果 key 在本地文件中,您可以使用 secret skaffold.yaml 中的字段:

build:
local:
useBuildkit: true
artifacts:
- image: auth
context: auth
docker:
secret:
id: npmrc
src: /path/to/.npmrc

然后您将像在 Dockerfile 中一样引用该 key :

RUN --mount=type=secret,mode=0644,id=npmrc,target=/app/.npmrc \
npm install

现在在您的 Deployment 中,您正在尝试为您的容器设置 args:

          args: ["--no-cache", "--progress=plain", "--secret", "id=npmrc,src=.npmrc"]

args 字段会覆盖图像中设置的 CMD 指令。此字段用于提供提供给图像入口点的命令行参数,该入口点可能是 node。如果您想在集群上运行的容器中引用 secret ,您可以使用 SecretConfigMap

关于docker - 通过 kubernetes/skaffold 将私有(private) npm 存储库拉到 docker 容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67799874/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com