2017-02-22 7 views
2

Ich bin ziemlich neu zu Docker, und ich versuche, ein Docker-Bild für verschiedene Website zu erstellen.docker-komponieren Volumen ist leer, auch von der Initialisierung

Alles funktioniert gut, außer für meine Bände. Hier

ist ein exemple von Docker-compose:

version: '2' 

services: 
    website: 
    build: 
     context: ./dockerfiles/           
     args:                  
      MYSQL_ROOT_PASSWORD: [email protected] 
    volumes: 
     - ./logs:/var/log 
     - ./html:/var/www 
     - ./nginx:/etc/nginx 
     - ./mysql-data:/var/lib/mysql 
    ports: 
     - "8082:80" 
     - "3307:3306" 

Anf hier ist meine Docker-Datei:

FROM php:5.6-fpm 

ARG MYSQL_ROOT_PASSWORD 

RUN export DEBIAN_FRONTEND=noninteractive; \ 
echo mysql-server mysql-server/root_password password $MYSQL_ROOT_PASSWORD | debconf-set-selections; \ 
echo mysql-server mysql-server/root_password_again password $MYSQL_ROOT_PASSWORD | debconf-set-selections; 

RUN apt-get update && apt-get install -y -q mysql-server php5-mysql nginx wget 

EXPOSE 80 3306 

VOLUME ["/var/www", "/etc/nginx", "/var/lib/mysql", "/var/log"] 

Alles ist gut arbeiten, erwarten, dass alle meine Ordner leer sind in meiner Gastvolumen . Ich möchte die nginx conf und mysl Daten in meinen Ordnern sehen.

Was mache ich falsch?

Danke für Ihre Hilfe.

EDIT 1: Eigentlich ist das Problem, dass ich docker-compose das Volume in meinem Docker-Verzeichnis erstellen möchte, wenn es nicht existiert, und dieses Volume verwenden, wenn es existiert, wie es in https://stackoverflow.com/a/39181484 erklärt. aber es scheint nicht zu funktionieren.

+0

Ich glaube, dies deckt Ihren Fall: [Erstellen Sie Docker Volume mit bereits vorhandenen Daten] (http://StackOverflow.com/Questions/36152081/create-docker-Volume-with-preexisting-Data-In-it/36152439 # 36152439) – jrbeverly

+1

Mögliches Duplikat von [Docker-Volume mit bereits vorhandenen Daten erstellen] (http://stackoverflow.com/questions/36152081/create-docker-volume-with-preexisting-data-in-it) – jrbeverly

+0

Eigentlich das Problem Ich möchte, dass docker-compose das Volume in meinem docker-Verzeichnis erstellt, falls es nicht existiert, und dieses Volume verwenden, wenn es existiert, wie es in http://stackoverflow.com/a/39181484 erklärt wird. aber es scheint nicht zu funktionieren. – Mayous

Antwort

5

Das Problem ist, dass Sie erwarten, dass Dateien aus dem Container auf Ihrem Host bereitgestellt werden. Diese

ist nicht so, wie es funktioniert: es ist umgekehrt:

Docker besteigt Host-Ordner in dem Container Ordner angeben. Wenn Sie innerhalb des Containers gehen, werden Sie sehen, wo sich die Init-Dateien befinden sollten, es wird nichts (oder was auch immer in Ihrem Host-Ordner) sein, und Sie können eine Datei in den Ordner schreiben wird auf Ihrem Host angezeigt.

Ihre beste Wette die init-Dateien zu erhalten und für Ihre Behälter ändern ist:

  • einen Container erstellen, ohne die Ordner Montage (Originalbehälter Daten werden da sein)
  • Run den Behälter (die Container werden die Dateien in der richtigen Stelle von der Installation von nginx etc haben ...) docker run <image>
  • Kopieren Sie die Dateien aus dem Behälter mit docker cp <container>:<container_folder>/* <host_folder>
  • Jetzt haben Sie die ‚Original‘ Dateien aus dem Container init auf dem Host .
  • Ändern Sie die Dateien nach Bedarf für den Container.
  • Führen Sie den Container aus, der Ihre Host-Ordner mit den neuen Dateien einbindet.

Hinweise: Sie könnten im Inneren des Behälters mit Shell gehen wollen (docker run -it <image> /bin/sh) und zip alle Ordner, um sicherzustellen, Sie alles bekommen, wenn es verschachtelten Ordnern, dann docker cp ... die Zip-Datei

Auch Achten Sie auf die Groß-/Kleinschreibung des Dateisystems: Bei Linux-Dateien muss die Groß- und Kleinschreibung beachtet werden. Unter Mac OS X sind sie nicht. Wenn Sie also Init.conf und init.conf im selben Ordner haben, werden sie kollidieren, wenn Sie sie auf einen Mac OS X-Host kopieren.

+0

Danke für Ihre Antwort. Was ich sehe, ist Folgendes: Wenn ich ein Volume in den Container mounte, ohne etwas in docker-compose anzugeben, wird der Inhalt jedes Volumes nur dann im Host in "/var/lib/docker/volumes/.../_data" angezeigt das Volumen existiert vorher nicht. Was ich verstehe ist, wenn ich einen anderen Pfad für mein Volume in den Host angeben (wie ich in Docker-Compose getan habe), ist das Verhalten anders, auch wenn der Ordner vorher nicht existiert? – Mayous

+0

Sie sollten sich nicht mit den/var/lib/docker/volumes herumärgern müssen, da dies Docker's intern ist. Docker erstellt/löscht diese Ordner nach Bedarf, also verlassen Sie sich nicht darauf. Docker verwendet ein mehrschichtiges Dateisystem, sodass Volumes wiederverwendet werden, wenn sie mehrfach definiert sind. Verlassen Sie sich für Ihre Arbeit nicht auf die internen Dateien von Docker: Hängen Sie den Host-Ordner dort ein, wo er hingehört, und erwarten Sie nur, was auf dem Container angezeigt wird. Wenn Sie Dateien im Containerordner haben, sind sie vorhanden, wenn Sie den Hostordner nicht bereitstellen. – MrE

+0

Wenn Sie beide Dateien benötigen, sollten Sie einen ENTRYPOINT haben, der ein Skript ausführt und entscheidet, welches geladen werden soll. Sie können dann den richtigen Ordner/die Datei an der gewünschten Stelle einfach verknüpfen. – MrE

Verwandte Themen