web-dev-qa-db-fra.com

Docker COPY ne met pas à jour les fichiers lors de la reconstruction du conteneur

J'ai un fichier docker-compose-staging.yml que j'utilise pour définir une application PHP. J'ai défini un conteneur de volume de données (application) dans lequel mon code d'application vit et est partagé avec d'autres conteneurs à l'aide de volumes_from.

docker-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

Ce fichier docker-compose-staging.yml est utilisé pour déployer l’application sur un fournisseur de cloud (DigitalOcean), et le fichier Dockerfile pour le conteneur d’applications comporte des commandes COPY qui copient les dossiers du répertoire local sur le volume défini dans la configuration.

docker/staging/app/Dockerfile:

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

Cela fonctionne lorsque je construis et déploie l'application pour la première fois. Le code dans mes répertoires public et code est présent et correct sur le serveur distant. Je déploie en utilisant la commande suivante:

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

Cependant, j'essaie ensuite d'ajouter un fichier à mon répertoire public local, puis d'exécuter la commande suivante pour reconstruire le code mis à jour:

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

Le résultat de cette reconstruction suggère que les commandes COPY ont réussi:

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

Je déploie alors en utilisant:

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

Avec la sortie suivante:

Recreating docker_app_1
Recreating docker_php_1
Recreating docker_nginx_1

Cependant, lorsque je me connecte aux conteneurs distants, les modifications de fichier ne sont pas présentes.

Docker étant relativement nouveau, je ne suis donc pas sûr d'avoir mal compris une partie de ce processus! Toute orientation serait appréciée.

16
Alex H

C'est à cause du cache.

Courir,

docker-compose build --no-cache

Cela reconstruira les images sans utiliser de cache.

Et alors,

docker-compose -f docker-compose-staging.yml up -d
10
Harsh Vakharia

J'ai eu le même problème si ce n'est pas le même lorsque je travaillais sur une application centrale dotnet.

Ce que j’essayais de faire, c’était de reconstruire mon application et de la mettre à jour sur mon image de menu fixe afin que je puisse voir mes modifications reflétées dans la copie conteneurisée.

Je me suis donc lancé en supprimant l'image sous-jacente générée par docker-compos up en utilisant la commande pour que mes modifications soient reflétées:

docker rmi *[imageId]*

Je pense qu’il devrait y avoir un soutien pour cela dans docker-compose mais c’était suffisant pour mes besoins du moment.

1
Esayas

Je ne suis pas sûr qu'il s'agisse de la mise en cache, car (a) il est généralement indiqué dans la sortie de la construction que le cache a été utilisé ou non et (b) 'build' devrait détecter le contenu modifié dans votre répertoire et annuler le cache.

J'essayerais de faire apparaître le conteneur sur la même machine que celle utilisée pour le construire afin de voir s'il est mis à jour ou non. si c'est le cas, l'image modifiée n'est pas propagée. Je ne vois aucune version utilisée dans vos fichiers (build -t XXXX: 0.1 ou build -t XXXX: latest). Il est donc possible que votre machine de transfert utilise une image périmée. Ou bien, insérez-vous la nouvelle image afin que le serveur de transfert le récupère quelque part?

0
Ehud Kaldor