2017-03-15 1 views
2

Ich bin Docker für eine Produktion PHP-FPM/Nginx-Anwendung ausgeführt, ich möchte Docker-stack.yml verwenden und zu einem Schwarm-Cluster bereitstellen. Hier ist meine Datei:Docker-Stack Bereitstellung Rolling Updates Volume-Problem

version: "3" 
services: 

app: 
    image: <MYREGISTRY>/app 
volumes: 
    - app-data:/var/www/app 
deploy: 
    mode: global 

php: 
    image: <MYREGISTRY>/php 
volumes: 
    - app-data:/var/www/app 
deploy: 
    replicas: 2 

nginx: 
    image: <MYREGISTRY>/nginx 
    depends_on: 
     - php 
    volumes: 
    - app-data:/var/www/app 
    deploy: 
    replicas: 2 
    ports: 
    - "80:80" 

volumes: 
app-data: 

Mein Code ist in app Behälter mit Bild von meiner Registrierung.

Ich möchte meinen Code mit docker service update --image <MYREGISTRY>/app:latest aktualisieren, aber es funktioniert nicht, der Code wird nicht geändert. Ich denke, es verwendet stattdessen das lokale Volume app-data.

Ist es normal, dass die neuen Containerdaten die Volumendaten nicht überschreiben?

Antwort

0

Ja, das ist das erwartete Verhalten. Benannte Volumes werden nur dann auf den Image-Inhalt initialisiert, wenn sie leer sind (der Standardstatus beim ersten Erstellen). Wenn Sie das Volume jederzeit nach diesem Zeitpunkt aktualisieren, besteht das Risiko eines Datenverlusts beim Überschreiben oder Löschen von Volumendaten, die Sie explizit beibehalten möchten.

Wenn die Dateien mit jedem neuen Image aktualisiert werden müssen, sollten sie nicht in einem Volume sein? Wenn Sie diese in einem Volume benötigen, müssen Sie möglicherweise eine Prozedur erstellen, um die Volumes aus dem Image zu aktualisieren, z. wenn dies ein docker run ist, könnten Sie tun:

docker run -v app-data:/target --rm <your_registry>/app cp -a /var/www/app/. /target/. 

Ansonsten können Sie die Lautstärke löschen, oder einfach alle Dateien aus dem Volumen entfernen, und starten Sie den Stapel wieder zu bevölkern.

+1

Vielen Dank für Ihre Antwort, in der Tat denke ich, dass es nicht in einem Volumen sein sollte, aber wie kann ich den Code von 'app' zu' php' und 'nginx' ohne ein Volumen teilen? Ich dachte auch an das Verfahren, um das Volume zu aktualisieren, ich denke, das ist meine beste Option für jetzt –

+0

Ich bin ein wenig verwirrt, warum Sie einen Nginx und einen PHP-Container haben und welchen Zweck der App-Container bietet außer Ihrem Volumen. Scheint, als sollte es zu einem einzelnen Behälter vereinfacht werden, der nicht einmal ein Volumen benötigen würde. – BMitch

+0

Sie haben Recht, der einzige Zweck des App-Containers ist es, den Code zu haben und Volumen bereitzustellen. Ein einzelner Container für alle ist schwieriger zu aktualisieren (Wenn ich nur den Code zum Beispiel aktualisieren möchte) und ich denke, es ist besser, nur Bild zu versionieren. –

0

Ich hatte das gleiche Problem, dass ich app und nginx Container das gleiche Volumen teilen. Meine aktuelle Lösung hat ein Bereitstellungsskript, das

für App und Nginx nach Docker-Stack-Bereitstellung ausgeführt wird. Es wird erzwungen, das Volume für App- und Nginx-Container zu aktualisieren.