wake-up-neo.com

Docker COPY aktualisiert keine Dateien, wenn Container neu erstellt werden

Ich habe eine Docker-Compose-Staging.yml-Datei, die ich zum Definieren einer Anwendung PHP verwende. Ich habe einen Datenvolumencontainer (App) definiert, in dem mein Anwendungscode gespeichert ist, und er wird mithilfe von Volumes_from für andere Container freigegeben.

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

Diese spezielle Docker-compose-staging.yml wird zum Bereitstellen der Anwendung bei einem Cloud-Provider (DigitalOcean) verwendet. Die Docker-Datei für den App-Container verfügt über COPY-Befehle, mit denen Ordner aus dem lokalen Verzeichnis auf das in der Konfiguration definierte Volume kopiert werden.

docker/Staging/App/Dockerfile:

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

Dies funktioniert, wenn ich zum ersten Mal die Anwendung erstelle und bereitstelle. Der Code in meinen öffentlichen und Codeverzeichnissen ist auf dem Remote-Server vorhanden und korrekt. Ich setze mit folgendem Befehl ein:

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

Als nächstes versuche ich jedoch, eine Datei zu meinem lokalen öffentlichen Verzeichnis hinzuzufügen, und dann den folgenden Befehl ausführen, um den aktualisierten Code neu zu erstellen:

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

Die Ausgabe dieser Neuerstellung zeigt, dass die COPY-Befehle erfolgreich waren:

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

Ich implementiere dann mit:

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

Mit folgender Ausgabe:

Recreating docker_app_1
Recreating docker_php_1
Recreating docker_nginx_1

Wenn ich mich jedoch bei den Remote-Containern anmelde, sind die Dateiänderungen nicht vorhanden.

Ich bin relativ neu bei Docker, also bin ich mir nicht sicher, ob ich irgendeinen Teil dieses Prozesses falsch verstanden habe! Jede Anleitung wäre dankbar.

16
Alex H

Das liegt am Cache.

Lauf,

docker-compose build --no-cache

Dadurch werden Images ohne Cache neu erstellt.

Und dann,

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

Ich hatte ein ähnliches Problem, wenn ich nicht an der Dotnet-Kernanwendung arbeitete.

Ich habe versucht, meine Anwendung neu zu erstellen und mein Andockbild zu aktualisieren, damit ich meine Änderungen in der containerisierten Kopie sehen kann.

Also habe ich mit dem Befehl das zugrunde liegende Bild entfernt, das von docker-compose erstellt wurde, um meine Änderungen zu reflektieren:

docker rmi *[imageId]*

Ich glaube, es sollte Unterstützung für Docker-Compose geben, aber das war im Moment für meine Bedürfnisse ausreichend.

1
Esayas

Ich bin nicht sicher, ob es sich um eine Zwischenspeicherung handelt, da (a) normalerweise in der Build-Ausgabe angegeben wird, ob der Cache verwendet wurde oder nicht und (b) 'build' den geänderten Inhalt in Ihrem Verzeichnis erkennen und den Cache aufheben sollte.

Ich würde versuchen, den Container auf der gleichen Maschine aufzurufen, auf der er erstellt wurde, um zu sehen, ob er aktualisiert ist oder nicht. Wenn dies der Fall ist, wird das geänderte Bild nicht weitergegeben. Ich sehe keine Version in Ihren Dateien (build -t XXXX: 0.1 oder build -t XXXX: latest), so dass Ihre Staging-Maschine möglicherweise ein veraltetes Image verwendet. Oder treiben Sie das neue Image so vor, dass der Staging-Server es von irgendwo her abzieht?

0
Ehud Kaldor

Keine der oben genannten Lösungen hat für mich funktioniert, aber was schließlich funktioniert hat, waren die folgenden Schritte:

  1. Kopieren/Verschieben von Dateien aus dem Docker-App-Ordner
  2. Löschen Sie die Datei, die Sie aktualisieren möchten
  3. Erstellen Sie das Docker-Bild ohne aktualisierte Datei neu
  4. Verschieben Sie die kopierte Datei zurück in den Docker-App-Ordner
  5. Erstellen Sie das Docker-Image erneut

    Jetzt enthält das Image die Aktualisierungen der Datei.

0
Blake Rieschick