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?
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
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.
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
Für mich bestand das Problem darin, dass die Datei, die ich in den Container einhängen wollte, einen defekten symbolischen Link hatte
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 .__
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.
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.
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