Ich versuche, eine PHP-Anwendung anzudocken. In der Docker-Datei lade ich das Archiv herunter, extrahiere es usw.
Alles funktioniert einwandfrei, aber wenn eine neue Version veröffentlicht wird und ich die Docker-Datei aktualisiere, muss ich die Anwendung neu installieren, da die config.php überschrieben wird.
Also dachte ich, ich kann die Datei als Volume mounten, so wie ich es mit der Datenbank mache.
Ich habe es auf zwei Arten versucht, mit einem Volume 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:
Was zu dem Fehler führt:
Und ich habe es mit einem bestimmten Pfad versucht, als gemountetes Volume.
/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 ein Upload erstellt wird.
Aber dann scheitert mit
/var/www/html/config.php \\ "verursacht \\" kein Verzeichnis \\ "\" "
Wenn ich es mit versuche
/src/docker/myapp/upload/config.php:/var/www/html/config.php
Docker erstellt den Upload-Ordner und anschließend einen config.php-Ordner. Keine Datei.
Oder gibt es eine andere Möglichkeit, die Konfiguration beizubehalten?
quelle
Antworten:
Dateivolumes werden im Docker auf diese Weise erstellt (Beispiel für einen absoluten Pfad (kann env-Variablen verwenden), und Sie müssen den Dateinamen angeben):
Sie können auch tun:
Wenn Sie den Docker-Compose aus
/src/docker/myapp
Ordner auslösenquelle
Ich hatte unter einem ähnlichen Problem gelitten. Ich habe versucht, meine Konfigurationsdatei in meinen Container zu importieren, damit ich sie jedes Mal reparieren kann, ohne das Image neu zu erstellen.
Ich meine, ich dachte, der folgende Befehl würde
$(pwd)/config.py
vom Docker-Host/root/app/config.py
als Datei in den Container abgebildet .Es wurde jedoch immer ein Verzeichnis mit dem Namen erstellt
config.py
, keine Datei.Auf der Suche nach einem Hinweis fand ich den Grund (von hier )
Daher wird es immer als Verzeichnis erstellt, da mein Docker-Host dies nicht hat
$(pwd)/config.py
.Auch wenn ich config.py im Docker-Host erstelle.
$(pwd)/config.py
nur verdrahtet/root/app/config.py
nicht exportieren/root/app/config.py
.quelle
touch path/to/file
in hinzugefügt,Dockerfile
so dass es beim Mounten immer noch eine Datei ist (kein erstelltes:
muss voller Pfad sein. Es funktioniert sotouch
war die Antwort: Tun Sie dies in Dockerfile, dann funktioniert Ihr Docker-Compose-Volume-Mount ordnungsgemäß, ohne ein Verzeichnis zu erstellenVerwenden Sie mount (
--mount
) anstelle von volume (-v
)Weitere Informationen: https://docs.docker.com/storage/bind-mounts/
Beispiel:
Stellen Sie sicher, dass /tmp/a.txt auf dem Docker-Host vorhanden ist
quelle
--mount
und-v
ist das Verhalten, wenn der Host-Teil des Volumes noch nicht vorhanden ist. Gemäß Ihrem Link:> Wenn Sie -v oder --volume verwenden, um eine Datei oder ein Verzeichnis, das noch nicht auf dem Docker-Host vorhanden ist, zu binden und zu mounten, erstellt -v den Endpunkt für Sie. Es wird immer als Verzeichnis erstellt.Wenn Sie einen Windows-Container wie mich verwenden, sollten Sie wissen, dass Sie einzelne Dateien mit dem Windows-Container NICHT binden oder bereitstellen können.
Es ist schwer zu erkennen, aber es ist da
Link zum Github-Problem bezüglich der Zuordnung von Dateien zum Windows-Container
quelle
Die Art und Weise, wie es für mich funktioniert hat, ist die Verwendung eines
bind
ReittiersVielen Dank an Mike Breed für die Antwort unter: Mounten Sie eine einzelne Datei mit Docker-Compose vom Volume
Sie müssen die "lange Syntax" verwenden, um einen
bind
Mount auszudrücken : https://docs.docker.com/compose/compose-file/#long-syntaxquelle
Ab Docker-Compose-Datei Version 3.2 können Sie einen Volume-Mount vom Typ "bind" (anstelle des Standardtyps "volume") angeben , mit dem Sie eine einzelne Datei in den Container einbinden können. Suchen Sie in den Docker-Compose-Volume-Dokumenten nach "bind mount": https://docs.docker.com/compose/compose-file/#volumes
In meinem Fall habe ich versucht, eine einzelne ".secrets" -Datei in meine Anwendung einzubinden, die nur Geheimnisse für die lokale Entwicklung und das Testen enthielt. In der Produktion holt meine Anwendung stattdessen diese Geheimnisse von AWS.
Wenn ich diese Datei als Volume mit der Kurzsyntax gemountet habe:
Docker würde ein „.secrets“ erstellen Verzeichnis im Innern des Behälters statt Abbildung auf die Datei außerhalb des Behälters. Mein Code würde dann einen Fehler wie "IsADirectoryError: [Errno 21] Ist ein Verzeichnis: '.secrets'" auslösen.
Ich habe dies behoben, indem ich stattdessen die Langhandsyntax verwendet habe und meine Geheimdatei mit einem schreibgeschützten "Bind" -Volume-Mount angegeben habe:
Jetzt hängt Docker meine .secrets-Datei korrekt in den Container ein und erstellt eine Datei im Container anstelle eines Verzeichnisses. Hoffe, andere finden dieses Beispiel hilfreich!
quelle
Sie können auch einen relativen Pfad zu Ihrer
docker-compose.yml
Datei wie folgt verwenden (getestet auf Windows-Host, Linux-Container):quelle
version: '3.7'
in derdocker-compose.yml
Datei angegebenen Docker-Compose-Version 1.24.1, Build 4667896b, getestet und es hat funktioniert.Für mich war das Problem, dass ich einen fehlerhaften symbolischen Link in der Datei hatte, die ich in den Container einbinden wollte
quelle
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-Einstellungsfeld und alles funktionierte wieder.
quelle
Wenn Sie in Windows die Umgebungsvariable $ {PWD} in Ihrer Datei docker-compose.yml benötigen, können Sie eine ENV-Datei im selben Verzeichnis wie Ihre Datei docker-compose.yml erstellen und dann manuell den Speicherort Ihres Ordners einfügen.
CMD (pwd_var.bat):
Powershell (pwd_var.ps1):
Es gibt weitere gute Funktionen für Docker-Compose-ENV-Variablen: https://docs.docker.com/compose/reference/envvars/, insbesondere für die
COMPOSE_CONVERT_WINDOWS_PATHS
Env-Variable, mit der Docker Compose Windows-Pfade mit Baskslash akzeptieren kann"\"
.Wenn Sie eine Datei unter Windows freigeben möchten, muss die Datei vorhanden sein, bevor Sie sie für den Container freigeben können.
quelle
Vielleicht hilft das jemandem.
Ich hatte dieses Problem und habe alles versucht. Datenträgerbindungen sahen gut aus und selbst wenn ich ein Verzeichnis (keine Dateien) gemountet hatte, hatte ich die Dateinamen im gemounteten Verzeichnis korrekt, aber als Verzeichnisse gemountet.
Ich habe versucht, freigegebene Laufwerke wieder zu aktivieren, und Docker hat sich beschwert, dass die Firewall aktiv ist.
Nach dem Deaktivieren der Firewall funktionierte alles einwandfrei.
quelle
Sie können Dateien oder Verzeichnisse / Ordner bereitstellen, die von der Quelldatei oder dem Quellverzeichnis abhängen. Außerdem müssen Sie den vollständigen Pfad angeben oder wenn Sie nicht sicher sind, ob Sie PWD verwenden können. Hier ist ein einfaches Arbeitsbeispiel.
In diesem Beispiel mounte ich eine env-Befehlsdatei, die bereits in meinem Arbeitsverzeichnis vorhanden ist
quelle
Ich habe das gleiche Problem unter Windows 8.1
Es stellte sich heraus, dass dies auf die Groß- und Kleinschreibung des Pfades zurückzuführen war. Ich habe
docker-compose up
aus dem Verzeichnis aufgerufencd /c/users/alex/
und im Container wurde eine Datei in ein Verzeichnis umgewandelt.Aber als ich es tat
cd /c/Users/alex/
(nicht Benutzer groß geschrieben) unddocker-compose up
von dort aus anrief, funktionierte es.In meinem System werden sowohl Users dir als auch Alex dir großgeschrieben, obwohl es so aussieht, als ob nur Users dir eine Rolle spielt.
quelle