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.
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
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.
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?
Keine der oben genannten Lösungen hat für mich funktioniert, aber was schließlich funktioniert hat, waren die folgenden Schritte:
Erstellen Sie das Docker-Image erneut
Jetzt enthält das Image die Aktualisierungen der Datei.