簡體   English   中英

通過 kubernetes/skaffold 將私有 npm 存儲庫拉到 docker 容器

[英]Pulling private npm repository to docker container through kubernetes/skaffold

我是 skaffold、k8s、docker 集的新手,我在本地集群上構建應用程序時遇到了麻煩。

我有一個代碼存儲庫試圖提取私有 NPM package 但是在構建它時會丟失 .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-args”和 npm 秘密(不安全的方式)
  • 用“--secret”和 npm 秘密(更好的方法)
  • 直接復制.npmrc文件, npm install后立即刪除

當我嘗試使用 kubernetes/skaffold 構建它時,就會出現問題。 運行后,似乎沒有找到任何 args、env 變量,甚至 .npmrc 文件。 在檢查 dockerfile 中的線索時,我能夠確定沒有任何內容從清單(定義的參數、.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: .

幾點注意事項:

  • 無論我在哪里復制和粘貼它(在 auth、manifest、skaffold 和 ~/ 目錄中),我都找不到 .npmrc 文件
  • 我也想讓它在生產中半可用(相當可重復使用),這樣如果可能的話我不需要進行徹底的檢修(但如果這是不好的做法,我想聽聽更多關於它的信息)
  • 我已經能夠使其與 skaffold.yaml 文件中的 buildArgs 一起使用,但我不確定這將如何轉化為生產環境,因為我無法將構建參數從 kubernetes 傳遞給 Z05B6063C41A21430 '不安全,應該使用秘密)
  • 清單中的參數也拋出此錯誤(如果參數被注釋掉,服務器運行):
 - 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 來運行容器,但這是一個隱藏的細節並且也在發生變化。)

有兩個地方可以傳達秘密:

  • 在圖像構建時(步驟 #1 到 #2):您可以使用 Docker --build-args或使用--secret安裝機密(都需要 Buildkit)
  • 在部署時(步驟 #3):您使用 Kubernetes 機密或配置映射,它們與映像構建分開配置

Skaffold 支持傳遞構建時機密,例如您的 npm 密碼,帶有 Docker 的--build-args--secret標志,盡管它們略有重命名。

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 不會傳播到您的容器中。

如果秘密在本地文件中,您可以使用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指令。 此字段用於提供命令行 arguments 提供給圖像的入口點,可能是node 如果你想在集群上運行的容器中引用一個秘密,你可以使用SecretConfigMap

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM