it-swarm.com.de

Wie mounten Sie eine einzelne Datei in einem Volume

Ich versuche, eine PHP-Anwendung zu andocken. In der Docker-Datei lade ich das Archiv herunter, entpacke es usw.

Alles funktioniert gut, wenn jedoch eine neue Version veröffentlicht wird und ich die Andockdatei aktualisiere, muss ich die Anwendung erneut installieren, da die config.php überschrieben wird.

Also dachte ich, ich könnte die Datei als Volume mounten, so wie ich es mit der Datenbank mache.

Ich habe es auf zwei Arten ausprobiert, mit einem Volumen und einem direkten Pfad.

docker-Compose:

version: '2'
services:
  app:
    build: src
    ports:
      - "8080:80"
    depends_on:
      - mysql
    volumes:
      -  app-conf:/var/www/html/upload
      -  app-conf:/var/www/html/config.php
    environment:
      DB_TYPE: mysql
      DB_MANAGER: MysqlManager

  mysql:
    image: mysql:5.6
    container_name: mysql
    volumes:
      - mysqldata:/var/lib/mysql
    ports:
      - 3306:3306
    environment:
      MYSQL_ROOT_PASSWORD:
      MYSQL_DATABASE:
      MYSQL_USER:
      MYSQL_PASSWORD:

volumes:
  mysqldata:
  app-conf:

Welche Ergebnisse ergeben sich aus dem Fehler:

Und ich habe es mit einem bestimmten Pfad als montiertem Volume versucht.

/src/docker/myapp/upload:/var/www/html/upload
/src/docker/myapp/upload:/var/www/html/config.php

Beide Möglichkeiten funktionieren jedoch nicht. Mit dem gemounteten Volume sehe ich, dass der Upload erstellt wird. 

Aber dann scheitert mit 

/var/www/html/config.php \\ "verursacht \\" kein Verzeichnis \\ "\" "

Wenn ich es mit /src/docker/myapp/upload/config.php:/var/www/html/config.php probiere

Docker erstellt den Upload-Ordner und dann einen config.php-Ordner. Keine Datei.

Oder gibt es eine andere Möglichkeit, die Konfiguration beizubehalten?

96
Jakub Juszczak

Dateisysteme werden im Andockfenster auf diese Weise erstellt (absoluter Pfadbeispiel (kann env-Variablen verwenden) und Sie müssen den Dateinamen angeben)

    volumes:
      - /src/docker/myapp/upload:/var/www/html/upload
      - /src/docker/myapp/upload/config.php:/var/www/html/config.php

Sie können auch tun:

    volumes:
      - ${PWD}/upload:/var/www/html/upload
      - ${PWD}/upload/config.php:/var/www/html/config.php

Wenn Sie den Docker-Composer aus dem /src/docker/myapp-Ordner auslösen

126
BlackStork

Ich hatte an einem ähnlichen Problem gelitten. Ich habe versucht, meine Konfigurationsdatei in meinen Container zu importieren, damit ich sie jederzeit reparieren kann, ohne das Image neu erstellen zu müssen.

Ich meine, ich dachte, der untenstehende Befehl würde $(pwd)/config.py von Docker Host in /root/app/config.py als Datei in den Container abbilden.

docker run -v $(pwd)/config.py:/root/app/config.py my_docker_image

Es wurde jedoch immer ein Verzeichnis mit dem Namen config.py erstellt, nicht eine Datei.

bei der suche nach ahnung fand ich den grund (von hier )

Wenn Sie -v oder --volume verwenden, um eine Datei oder ein Verzeichnis, die. auf dem Docker-Host noch nicht vorhanden, erstellt -v den Endpunkt für Sie . Es wird immer als Verzeichnis angelegt.

Daher wird es immer als Verzeichnis erstellt, da mein Docker-Host $(pwd)/config.py nicht hat.

Auch wenn ich config.py im Docker-Host erstelle. $(pwd)/config.py nur überschreiben /root/app/config.py exportiert /root/app/config.py nicht.

51
SangminKim

Sie können auch einen relativen Pfad zu Ihrer docker-compose.yml -Datei wie folgt verwenden (getestet auf Windows Host, Linux-Container):

 volumes:
      - ./test.conf:/fluentd/etc/test.conf
1
Daniel

Für mich bestand das Problem darin, dass die Datei, die ich in den Container einhängen wollte, einen defekten symbolischen Link hatte

0
jla

Verwenden Sie stattdessen mount (-v) Weitere Informationen: https://docs.docker.com/storage/bind-mounts/

Beispiel: Stellen Sie sicher, dass /tmp/a.txt auf dem Docker-Host vorhanden ist .__

0
Subbu M

Wenn Sie in Windows __..... Eine usv-Variable $ {PWD} in Ihrer docker-compose.yml benötigen, können Sie eine .env-Datei in demselben Verzeichnis wie Ihre docker-compose.yml-Datei erstellen und dann manuell den Speicherort Ihrer Mappe.

CMD (pwd_var.bat): 

echo PWD=%cd% >> .env

Powershell (pwd_var.ps1):

$PSDefaultParameterValues['Out-File:Encoding'] = 'utf8'; echo "PWD=$(get-location).path" >> .env

Es gibt weitere nützliche Funktionen für die Docker-Compose-.env-Variablen: https://docs.docker.com/compose/reference/envvars/ , insbesondere für die COMPOSE_CONVERT_WINDOWS_PATHS-env-Variable, die es dem Docker-Composer ermöglicht, Fenster zu akzeptieren Pfad mit baskslash "\".

Wenn Sie eine Datei unter Windows freigeben möchten, muss die Datei vorhanden sein, bevor Sie sie für den Container freigeben kann.

0
CallMarl

Ich hatte das gleiche Problem unter Windows, Docker 18.06.1-ce-win73 (19507).

Entfernen und erneutes Hinzufügen des freigegebenen Laufwerks über das Docker-Einstellungsfenster und alles funktionierte wieder.

0
Pool

Wenn Sie einen Windows-Container wie mich verwenden, sollten Sie wissen, dass Sie KEINE Dateien mit dem Windows-Container binden oder laden können. 

Die folgenden Beispiele schlagen fehl, wenn Windows-basierte Container verwendet werden, da das Ziel eines Volumes oder Bindungs-Mount im Container eines der folgenden sein muss: ein nicht vorhandenes oder leeres Verzeichnis; oder ein anderes Laufwerk als C :. Außerdem muss die Quelle eines Bind-Mount-Objekts ein lokales Verzeichnis sein, keine Datei.

Net Use z: \\remotemachine\share

docker run -v z:\foo:c:\dest ...

docker run -v \\uncpath\to\directory:c:\dest ...

docker run -v c:\foo\somefile.txt:c:\dest ...

docker run -v c:\foo:c: ...

docker run -v c:\foo:c:\existing-directory-with-contents ...

Es ist schwer zu erkennen, aber es ist da

Link zum Github-Problem bezüglich der Zuordnung von Dateien in Windows-Container

0
Justin Lessard