1

我试图理解为什么有时我.php在我的项目中更新 a 它每次都会完全重建图像,而其他时候它似乎没有做任何事情。实际上关于后者,它说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当我对or进行更改时./admin/src/index.php,我只得到Syncing 1 files for...,但没有任何更改反映在应用程序中。我必须CTRL+C杀死 Skaffold 并重新启动它......只是CTRL+S在一个.yamllib.php触发重建。

当我对 进行更改时./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. 如何在不触发完全重建的情况下让我的更改反映在应用程序中?

谢谢!

4

2 回答 2

1

所以有几个问题。**首先,您的通配符不应该是***. Skaffold 使用的 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

Skaffold 默认情况下会在警告级别切断日志。如果我改为运行,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。当src您的图像WORKDIR设置为/app/src,并且您的 PHP 同步规则将路径保留在app/admin. 您可以通过修改您skaffold.yaml来解决此问题,以剥离前导src

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

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

(旁注:我仍然看到didn't sync any files错误。我实际上是在运行skaffold dev --status-check=false以防止 Skaffold 等待部署状态——我认为部署永远不会成功,因为我没有任何有效的 PHP 文件。但结果是部署实际上失败了,因为我没有您的持久卷声明可用,因此 pod 无法启动。而且由于没有正在运行的容器,文件从未同步,因此 Skaffold 报告同步失败。所以道德故事是文件同步仅适用于正在运行的容器。)

于 2020-04-04T18:38:07.977 回答
0

对于第一个问题,建议更改 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"]

对于第二个和第三个问题,请运行以下命令来启动 skaffold。

skaffold dev --trigger polling
于 2020-03-29T23:54:16.387 回答