通过 kubernetes/skaffold 将私有 npm 存储库拉入 docker 容器

如何解决通过 kubernetes/skaffold 将私有 npm 存储库拉入 docker 容器

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

我有一个代码存储库,它试图提取私有 NPM 包,但在构建它时丢失了 .npmrc 文件或 npm 机密。

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..

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

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

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

以下是应用程序的清单:

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

还有脚手架文件:

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: .

一些注意事项:

  • 无论我将 .npmrc 文件复制并粘贴到何处(在身份验证、清单、脚手架和 ~/ 目录中),我都无法找到它
  • 我也想让它在生产中半可用(非常可重用),这样我就不需要在可能的情况下进行彻底的检修(但如果这是不好的做法,我想听听更多关于它的信息)
  • 我已经能够使其与 skaffold.yaml 文件中的 buildArgs 一起使用,但我不确定这将如何转化为生产环境,因为我无法将构建 args 从 kubernetes 传递到 docker(并且我阅读了它不安全,应该使用秘密)
  • 清单中的参数也抛出了这个错误(如果参数被注释掉,服务器就会运行):
 - 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 集群

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

您可以在两个地方交流秘密:

  • 在映像构建时(第 1 步到第 2 步):您可​​以使用 Docker --build-args 或使用 --secret 挂载机密(都需要 Buildkit)
  • 在部署时(第 3 步):您使用 Kubernetes 机密或配置映射,它们与映像构建分开配置

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

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

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

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

ARG MYSECRET
RUN echo MYSECRET=${MYSECRET}

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

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

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

然后您将在 Dockerfile 中引用该机密:

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。如果您想引用集群上正在运行的容器中的机密,您可以使用 SecretConfigMap

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)> insert overwrite table dwd_trade_cart_add_inc > select data.id, > data.user_id, > data.course_id, > date_format(
错误1 hive (edu)> insert into huanhuan values(1,'haoge'); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive> show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 <configuration> <property> <name>yarn.nodemanager.res