J'essaye de dockerize une application php. Dans le fichier docker, je télécharge l'archive, l'extrais, etc.
Tout fonctionne bien, cependant si une nouvelle version est publiée et que je mets à jour le fichier de dock, je dois réinstaller l'application, car le fichier config.php est écrasé.
J'ai donc pensé que je pouvais monter le fichier en tant que volume, comme je le fais avec la base de données.
Je l'ai essayé de deux manières, avec un volume et un chemin direct.
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:
Ce qui entraîne l'erreur:
Et je l'ai essayé avec un chemin donné, en tant que volume monté.
/src/docker/myapp/upload:/var/www/html/upload
/src/docker/myapp/upload:/var/www/html/config.php
Cependant les deux voies ne fonctionnent pas. Avec le volume monté, je vois que le téléchargement est créé.
Mais alors échoue avec
/var/www/html/config.php \\ "causé \\" pas un répertoire \\ "\" "
Si je l’essaye avec /src/docker/myapp/upload/config.php:/var/www/html/config.php
Docker crée le dossier de téléchargement, puis un dossier config.php. Pas un fichier.
Ou existe-t-il un autre moyen de conserver la configuration?
Les volumes de fichiers se font de cette manière dans docker (exemple de chemin absolu (peut utiliser des variables env), et vous devez mentionner le nom du fichier):
volumes:
- /src/docker/myapp/upload:/var/www/html/upload
- /src/docker/myapp/upload/config.php:/var/www/html/config.php
Vous pouvez aussi faire:
volumes:
- ${PWD}/upload:/var/www/html/upload
- ${PWD}/upload/config.php:/var/www/html/config.php
Si vous lancez le dossier docker-compose from /src/docker/myapp
Je souffrais d'un problème similaire. J'essayais d'importer mon fichier de configuration dans mon conteneur afin de pouvoir le réparer chaque fois que nécessaire sans reconstruire l'image.
Je veux dire que je pensais que la commande ci-dessous mapperait $(pwd)/config.py
de Docker Host vers /root/app/config.py
dans le conteneur sous forme de fichier.
docker run -v $(pwd)/config.py:/root/app/config.py my_docker_image
Cependant, il a toujours créé un répertoire nommé config.py
, pas un fichier.
en cherchant un indice, j'ai trouvé la raison (de ici )
Si vous utilisez -v ou --volume pour lier-monter un fichier ou un répertoire contenant n'existe pas encore sur l'hôte Docker, -v créera le noeud final pour vous . Il est toujours créé sous forme de répertoire.
Par conséquent, il est toujours créé en tant que répertoire car mon hôte de docker n'a pas $(pwd)/config.py
.
Même si je crée config.py dans l'hôte Docker. $(pwd)/config.py
vient de surcharger /root/app/config.py
sans exporter /root/app/config.py
.
Vous pouvez également utiliser un chemin relatif vers votre fichier docker-compose.yml
comme ceci (testé sur un hôte Windows, un conteneur Linux):
volumes:
- ./test.conf:/fluentd/etc/test.conf
Pour moi, le problème était que j'avais un lien symbolique brisé sur le fichier que j'essayais de monter dans le conteneur.
Utilisez mount au lieu de volume (-v) Plus d'infos: https://docs.docker.com/storage/bind-mounts/
Exemple: Assurez-vous que /tmp/a.txt existe sur l'hôte docker Docker run -it --mount type = bind, source =/tmp/a.txt, target =/root/a.txt
J'ai eu le même problème sous Windows, Docker 18.06.1-ce-win73 (19507)
.
Supprimer et rajouter le lecteur partagé via le panneau de configuration de Docker et tout a fonctionné à nouveau.
Si vous utilisez un conteneur Windows comme moi, sachez que vous NE POUVEZ PAS lier ou monter des fichiers uniques à l'aide d'un conteneur Windows.
Les exemples suivants échoueront lors de l'utilisation de conteneurs Windows, car la destination d'un volume ou d'un montage de liaison dans le conteneur doit être l'un des suivants: un répertoire non existant ou vide; ou un lecteur autre que C :. De plus, la source d'un montage de liaison doit être un répertoire local, pas un fichier.
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 ...
C'est difficile à repérer mais c'est là
Lien vers le problème Github concernant le mappage de fichiers dans un conteneur Windows