Подтвердить что ты не робот

Docker COPY не обновляет файлы при восстановлении контейнера

У меня есть файл docker-compose-staging.yml, который я использую для определения приложения PHP. Я определил контейнер объема данных (приложение), в котором живет мой код приложения, и делится с другими контейнерами с помощью volume_from.

докер-Compose-staging.yml:

version: '2'
services:
    nginx:
        build:
            context: ./
            dockerfile: docker/staging/nginx/Dockerfile
        ports:
            - 80:80
        links:
            - php
        volumes_from:
            - app

    php:
        build:
            context: ./
            dockerfile: docker/staging/php/Dockerfile
        expose:
            - 9000
        volumes_from:
            - app

    app:
        build:
            context: ./
            dockerfile: docker/staging/app/Dockerfile
        volumes:
            - /var/www/html
        entrypoint: /bin/bash

Этот конкретный docker-compose-staging.yml используется для развертывания приложения в облачном провайдере (DigitalOcean), а в файле Docker для контейнера приложения есть команды COPY, которые копируют по папкам из локального каталога в том, который определен в конфигурации.

Докер/постановка/приложение/Dockerfile:

FROM php:7.1-fpm
COPY ./public /var/www/html/public
COPY ./code /var/www/html/code

Это работает, когда я сначала создаю и развертываю приложение. Код в моих общедоступных и кодовых каталогах присутствует и корректен на удаленном сервере. Я использую следующую команду:

docker-compose -f docker-compose-staging.yml up -d

Однако в следующий раз я попытаюсь добавить файл в свой локальный общий каталог, а затем запустите следующую команду, чтобы перестроить обновленный код:

docker-compose -f docker-compose-staging.yml build app

Результат этой перестройки показывает, что команды COPY были успешными:

Building app
Step 1 : FROM php:7.1-fpm
 ---> 6ed35665f88f
Step 2 : COPY ./public /var/www/html/public
 ---> 4df40d48e6a5
Removing intermediate container 7c0fbbb7f8b6
Step 3 : COPY ./code /var/www/html/code
 ---> 643d8745a479
Removing intermediate container cfb4f1a4f208
Successfully built 643d8745a479

Затем я развертываю с помощью:

docker-compose -f docker-compose-staging.yml up -d

Со следующим выходом:

Recreating docker_app_1
Recreating docker_php_1
Recreating docker_nginx_1

Однако при входе в удаленные контейнеры изменений файла нет.

Я относительно новичок в Docker, поэтому не уверен, не понял ли я какую-либо часть этого процесса! Любые рекомендации будут оценены.

4b9b3361

Ответ 1

Вы пытаетесь обновить существующий том с содержимым нового изображения, которое не работает.

https://docs.docker.com/engine/tutorials/dockervolumes/#/data-volumes

Государства:

Changes to a data volume will not be included when you update an image.

Ответ 2

Это из-за кеша.

Выполнить

docker-compose build --no-cache

Это приведет к восстановлению изображений без использования кеша.

И затем,

docker-compose -f docker-compose-staging.yml up -d

Ответ 3

У меня была аналогичная проблема, если не такая же, когда работала над ядром приложения dotnet.

То, что я пытался сделать, это перестроить мое приложение и получить его обновление моего изображения докеров, чтобы я мог видеть, что мои изменения отражены в контейнеризованной копии.

Итак, я пошел, удалив основное изображение, сгенерированное командой docker-compose, используя команду, чтобы отразить мои изменения:

docker rmi *[imageId]*

Я верю, что в этой докере должна быть поддержка, но этого было достаточно для моей потребности в данный момент.

Ответ 4

Я не уверен, что это кеширование, потому что (а) в выводе сборки обычно указывается, использовался ли кеш или нет, и (б) "сборка" должна воспринимать измененный контент в вашем каталоге и сводить к нулю кеш.

Я бы попытался открыть контейнер на том же компьютере, который использовался для его сборки, чтобы узнать, обновлено или нет. если это так, измененное изображение не распространяется. Я не вижу никакой версии, используемой в ваших файлах (build -t XXXX: 0.1 или build -t XXXX: последняя), поэтому может быть, что ваш промежуточный компьютер использует устаревшее изображение. Или вы нажимаете новое изображение, чтобы промежуточный сервер его куда-то вытащил?

Ответ 5

Ни одно из вышеперечисленных решений не помогло мне, но в конечном итоге сработали следующие шаги:

  1. Копировать/Переместить файл за пределы папки приложения Docker
  2. Удалить файл, который вы хотите обновить
  3. Перестройте докер img без обновленного файла
  4. Переместить скопированный файл обратно в папку приложения Docker
  5. Снова перестройте образ докера

    Теперь изображение будет содержать обновления файла.