我有一个这样的 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 个不同的图像是否正常?
运行
skaffold build
命令会触发图像构建,这会导致image with two tags
;一个带有最新的 git 标签或 git commit(例如 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 开发(构建图像)以获取更多信息。
另请参阅类似的SO,它清楚地解释了Why does Skaffold maintains two tags when building to the local docker daemon?
标签很便宜:它们就像符号链接,指向图像标识符。
Skaffold 不能只使用计算图像标签,因为许多标签约定不会生成唯一标签,并且标签可以被其他开发人员覆盖并指向不同的图像。一组开发人员或并行测试将图像推送到同一个图像存储库并遇到标签冲突的情况并不少见。