skaffold перестраивает изображение для некоторых файлов и не для других - PullRequest
0 голосов
/ 30 марта 2020

Я пытаюсь понять, почему иногда я обновляю .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, чтобы убить Скаффолда и перезапустить его ... просто CTRL+S в .yaml или lib.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. Как я могу получить мои изменения для отражения в приложении, не вызывая полной перестройки?

Спасибо!

Ответы [ 2 ]

1 голос
/ 04 апреля 2020

Итак, есть несколько вопросов. Во-первых, ваши подстановочные знаки должны быть **, а не ***. Библиотека globbing, используемая Skaffold, не распознает *** и поэтому рассматривает ее как буквальную часть имени пути. А так как у вас нет каталога с буквальным названием ***, правила syn c не совпадают, и поэтому изменения вашего файла приводят к перестроению образа.

Когда я исправляю символы подстановки, ваша установка все еще не выполняется работать для меня.

Во-первых, я вижу предупреждение, когда я изменяю 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 syn c сохраняет путь в app/admin. Вы можете исправить это, внеся изменения в skaffold.yaml, чтобы убрать ведущие src:

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

Возможно, вам придется изменить и другие правила, а также заметить, что вы можете использовать dest: .. в своих правилах. .

(Примечание: я все еще вижу ошибку didn't sync any files. Я действительно запускаю skaffold dev --status-check=false, чтобы предотвратить ожидание Skaffold состояния развертывания - я полагал, что развертывание никогда не будет успешным, поскольку я не сделал ' не может иметь никаких допустимых файлов PHP. Но оказывается, что развертывания на самом деле заканчивались неудачей, потому что у меня не было доступной заявки на постоянный том, и поэтому модуль не запустился. И поскольку не было запущенных контейнеров, файлы никогда не были синхронизировал, и поэтому Скаффолд сообщил, что синхронизация не удалась. Поэтому мораль этой истории в том, что синхронизация файлов работает только для запуска контейнеров.)

0 голосов
/ 30 марта 2020

Для 1-го вопроса рекомендуется изменить порядок команд в 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
...