Skaffold 为某些文件重建映像,而不为其他文件重建映像



我试图理解为什么有时我在项目中更新.php,它每次都会完全重建图像,而有时它似乎什么都没做。实际上,关于后者,它说Syncing 1 files for ...,但我的任何变化都没有反映出来。

这是我的项目结构:

/app
/admin
/conf
app.conf
/src
/lib
lib.php
index.php
Dockerfile.dev
/manifests
/dev
ingress.yaml
admin.yaml
skaffold.yaml

当我对./admin/conf/app.conf./admin/src/index.php进行更改时,我只得到Syncing 1 files for...,但这些更改都不会反映在应用程序中。我必须用CTRL+C杀死Skafold并重新启动它……只需要.yamllib.php中的CTRL+S就可以触发重建。

当我对./admin/src/lib/lib.php进行更改时,它会从头开始重建整个图像。

以下是我的配置:

# skaffold.yaml
apiVersion: skaffold/v1beta15
kind: Config
build:
local:
push: false
artifacts:
- image: postgres
context: postgres
docker:
dockerfile: Dockerfile.dev
sync:
manual:
- src: "***/*.sql"
dest: .
- image: testappacr.azurecr.io/test-app-admin
context: admin
docker:
dockerfile: Dockerfile.dev
sync:
manual:
- src: "***/*.php"
dest: .
- src: "***/*.conf"
dest: .
- src: "***/*.tbs"
dest: .
- src: "***/*.css"
dest: .
- src: "***/*.js"
dest: .
deploy:
kubectl:
manifests:
- manifests/dev/ingress.yaml 
- manifests/dev/postgres.yaml
- manifests/dev/admin.yaml
# Dockerfile.dev
FROM php:7.3-fpm
EXPOSE 4000
COPY . /app
WORKDIR /app/src
RUN apt-get update  
&& apt-get install -y libpq-dev zlib1g-dev libzip-dev 
&& docker-php-ext-install pgsql zip
CMD ["php", "-S", "0.0.0.0:4000"]
apiVersion: apps/v1
kind: Deployment
metadata:
name: admin-deployment-dev
spec:
replicas: 1
selector:
matchLabels:
component: admin
template:
metadata:
labels:
component: admin
spec:
containers:
- name: admin
image: testappacr.azurecr.io/test-app-admin
ports:
- containerPort: 4000
env:
- name: PGUSER
valueFrom:
secretKeyRef:
name: test-app-dev-secrets
key: PGUSER
- name: PGHOST
value: postgres-cluster-ip-service-dev
- name: PGPORT
value: "1423"
- name: PGDATABASE
valueFrom:
secretKeyRef:
name: test-app-dev-secrets
key: PGDATABASE
- name: PGPASSWORD
valueFrom:
secretKeyRef:
name: test-app-dev-secrets
key: PGPASSWORD
- name: SECRET_KEY
valueFrom:
secretKeyRef:
name: test-app-dev-secrets
key: SECRET_KEY
- name: SENDGRID_API_KEY
valueFrom:
secretKeyRef:
name: test-app-dev-secrets
key: SENDGRID_API_KEY
- name: DOMAIN
valueFrom:
secretKeyRef:
name: test-app-dev-secrets
key: DOMAIN           
- name: DEBUG
valueFrom:
secretKeyRef:
name: test-app-dev-secrets
key: DEBUG
# livenessProbe:
#   tcpSocket:
#     port: 4000
#   initialDelaySeconds: 2
#   periodSeconds: 2
# readinessProbe:
#   tcpSocket:
#     port: 4000
#   initialDelaySeconds: 2
#   periodSeconds: 2
volumeMounts:
- mountPath: "/docs/"
name: file-storage
volumes:
- name: file-storage
persistentVolumeClaim:
claimName: file-storage
---
apiVersion: v1
kind: Service
metadata:
name: admin-cluster-ip-service-dev
spec:
type: ClusterIP
selector:
component: admin
ports:
- port: 4000
targetPort: 4000

我想我想了解一些事情:

  1. 为什么在一种情况下会触发完全重建
  2. 为什么文件被"同步",但在我触发重建之前,更改不会反映出来
  3. 如何在不触发完全重建的情况下使我的更改反映在应用程序中

谢谢!

因此存在一些问题。首先,您的通配符应该是**,而不是***。Skafold使用的globbing库无法识别***,因此它将其视为路径名的文字部分。由于您没有名为***的目录,因此没有匹配的同步规则,因此您的文件更改会导致重建映像。

当我更正通配符时,你的设置仍然不适合我。

首先,当我修改index.php:时,我看到一个警告

Syncing 1 files for testappacr.azurecr.io/test-app-admin:4c76dec58e1ef426b89fd44e3b340810db96b6961c5cacfdb76f62c9dc6725b8
WARN[0043] Skipping deploy due to sync error: copying files: didn't sync any files

默认情况下,Skafold会以警告级别切断日志。如果我运行skaffold dev -v info,我会得到更多信息:

INFO[0011] files modified: [admin/src/index.php]        
Syncing 1 files for testappacr.azurecr.io/test-app-admin:4c76dec58e1ef426b89fd44e3b340810db96b6961c5cacfdb76f62c9dc6725b8
INFO[0011] Copying files: map[admin/src/index.php:[/app/src/src/index.php]] to testappacr.azurecr.io/test-app-admin:4c76dec58e1ef426b89fd44e3b340810db96b6961c5cacfdb76f62c9dc6725b8 
WARN[0011] Skipping deploy due to sync error: copying files: didn't sync any files 

注意所报告的目的地/app/src/src/index.php。当您的图像的WORKDIR设置为/app/src,并且您的PHP同步规则保留app/admin下的路径时,就会出现这个双src。你可以通过修改你的skaffold.yaml来解决这个问题,去掉领先的src:

- src: "src/**/*.php"
dest: .
strip: src

您可能还需要调整其他规则,并注意您可以在规则中使用dest: ..

(附带说明:我仍然看到didn't sync any files错误。我实际上是在运行skaffold dev --status-check=false,以防止Skafold等待部署状态——我认为部署永远不会成功,因为我没有任何有效的PHP文件。但事实证明,部署实际上失败了,因为我没有可用的持久卷声明,所以pod无法启动由于没有运行容器,文件从未同步,因此Skafold报告同步失败。因此,这个故事的寓意是,文件同步只适用于运行容器。(

对于第一个问题,建议更改Dockerfile中的命令顺序,以便有效地进行缓存。

# Dockerfile.dev
FROM php:7.3-fpm
EXPOSE 4000
RUN apt-get update  
&& apt-get install -y libpq-dev zlib1g-dev libzip-dev 
&& docker-php-ext-install pgsql zip
COPY . /app
WORKDIR /app/src
CMD ["php", "-S", "0.0.0.0:4000"]

对于第2个和第3个问题,请运行以下命令以启动滑板。

skaffold dev --trigger polling

最新更新