为什么“Skaffold”为每个容器创建 2 个不同的图像?

为什么“Skaffold”为每个容器创建 2 个不同的图像?

我有一个这样的 Skaffold 文件:


apiVersion: skaffold/v4beta1
kind: Config
build:
  artifacts:
  - image: app/auth
    context: auth
    sync:
      manual:
      - src: src/**/*.ts
        dest: .
    docker:
      dockerfile: Dockerfile

以及deploymant如下文件:


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: app/auth
          env:
            - name: MONGO_URI
              value: 'mongodb://auth-mongo-srv:27017/auth'
            - name: JWT_KEY
              valueFrom:
                secretKeyRef:
                  name: jwt-secret
                  key: JWT_KEY

---
apiVersion: v1
kind: Service
metadata:
  name: auth-srv
spec:
  selector:
    app: auth
  ports:
    - name: auth
      protocol: TCP
      port: 3000
      targetPort: 3000

点赞Dockerfile如下:


FROM node:alpine

WORKDIR /app
COPY package.json .
RUN npm install --only=prod
COPY . .

CMD ["npm", "start"]


但运行之后skaffold dev我看到如下的 docker 镜像列表:

REPOSITORY                       TAG                                                                IMAGE ID       CREATED             SIZE
app/auth               429eadf4af2ad66af9f364eb3cfe8926e05276c4f579fe39c5112e3201b1e4ac   429eadf4af2a   15 minutes ago      345MB
app/auth               latest                                                             429eadf4af2a   15 minutes ago      345MB

每个容器有 2 个不同的图像是正常的吗?

答案1

After referring to a lot of documents it seems they're OK and no need to fix them.

运行skaffold build命令会触发图像构建,从而产生image with two tags

一个具有最新的 git 标签或 git 提交(例如 my-app:ae7926d),并且由于图像未被推送到容器注册表,因此使用图像的 64 个字符 ID 的标签。

Skaffold 在图像不变性方面非常出色,latter tag并且内容可寻址参考指向本地缓存中的图像。如果已将其推送到注册表,则不可变引用将是图像的摘要。

这确保我们只使用 Skaffold 构建的图像,并且not a nefarious image masquerading as one and the same

除了提供我们前面提到的构建方法的灵活性(即 Docker、Jib 等)之外,Skaffold 还可以适应执行镜像构建的不同位置。它们可以在本地执行,在 Kubernetes 集群内(使用 Kaniko),或者(不出所料)使用 Google Cloud Build 远程执行。

请通过使用 Skaffold 进行 Kubernetes 开发(构建镜像)了解更多信息。

另请参阅类似所以其中清楚地解释了为什么 Skaffold 在构建到本地 docker 守护进程时维护两个标签?

标签很便宜:它们就像符号链接,指向图像标识符。

Skaffold 不能只使用计算出的图像标签,因为许多标签约定不会产生唯一的标签,并且该标签可能会被其他开发人员覆盖并指向不同的图像。开发团队或并行测试将图像推送到同一个图像存储库并遇到标签冲突的情况并不罕见。

相关内容