Comment monter un seul fichier dans un volume
Je suis en train de dockerize d'une application php. Dans le dockerfile j'ai télécharger l'archive, extraire etc.
Tout fonctionne bien, cependant si une nouvelle version est libéré, et je l'ai mise à jour le dockerfile, je dois réinstaller l'application, parce que la config.php est écrasée.
J'ai donc pensé que je peux monter le fichier comme un volume, comme je le fais avec la base de données.
J'ai essayé de deux façons, avec un volume et un chemin direct.
docker-composer:
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:
Qui génère l'erreur:
Et je l'ai essayé avec un trajet donné, comme un volume monté.
/src/docker/myapp/upload:/var/www/html/upload
/src/docker/myapp/upload:/var/www/html/config.php
Cependant, ces moyens ne sont pas de travail. Avec le volume monté je vois que le téléchargement est créé.
Mais ne parvient pas à
/var/www/html/config.php\\" causé \\"n'est pas un répertoire\\"\""
Si je l'ai essayer avec /src/docker/myapp/upload/config.php:/var/www/html/config.php
Docker crée le dossier de téléchargement, puis un config.php dossier. Pas un fichier.
Ou est-il un autre moyen de conserver la config?
Vous devez vous connecter pour publier un commentaire.
Fichier volumes sont réalisés de cette façon, dans docker (chemin absolu exemple (vous pouvez utiliser des variables d'environnement), et vous devez mentionner le nom de fichier) :
Vous pouvez également le faire:
Si vous lancez le menu fixe-composer, de
/src/docker/myapp
dossier${CUSTOM_PATH_VAR}/file.txt
. Sinon, vous pouvez fournir.env
fichier dans le dossier où docker-composer commencé, docker-composer utilisera env vars automatiquementJ'avais été victime d'un problème similaire. J'ai essayé d'importer mon fichier de config de mon récipient de sorte que je peux corriger à chaque fois que j'ai besoin sans avoir à re-construction de l'image.
Je veux dire, je pensais que le dessous de la commande de la carte
$(pwd)/config.py
de Docker hôte à/root/app/config.py
dans le conteneur comme un fichier.Cependant, il est toujours créé un répertoire nommé
config.py
, pas un fichier.alors que la recherche de la moindre idée, j'ai trouvé la raison(à partir de ici)
Par conséquent, il est toujours créé un répertoire parce que mon menu fixe hôte n'a pas
$(pwd)/config.py
.Même si je créer config.py dans le panneau d'accueil.
$(pwd)/config.py
juste overwirte/root/app/config.py
pas l'exportation de/root/app/config.py
.touch path/to/file
dans leDockerfile
de sorte que lorsque je fais le montage, il sera encore un fichier (pas un créé dir):
doit être chemin d'accès complet. Il fonctionne de cette façonPour toute personne utilisant Windows conteneur comme moi, sachez que vous NE pouvez pas lier ou de monter des fichiers à l'aide de windows conteneur.
Il est difficile à repérer, mais il est là
Lien vers le Github question concernant la cartographie des fichiers dans Windows conteneur
Vous pouvez également utiliser un chemin d'accès relatif à votre
docker-compose.yml
fichier comme ceci (testé sur un hôte Windows, Linux conteneur):Pour moi, le problème était que j'avais cassé un lien symbolique sur le fichier que j'essayais de monter dans le récipient
J'ai eu le même problème sur Windows,
Docker 18.06.1-ce-win73 (19507)
.La suppression et re-ajout du lecteur partagé via le Panneau réglages de panneau et tout a fonctionné à nouveau.
Utilisation de monter à la place du volume (-v)
Plus d'infos: https://docs.docker.com/storage/bind-mounts/
Exemple:
Assurer /tmp/a.txt il existe sur le panneau d'accueil
docker run-elle --type de montage=lier,source=/tmp/a.txt,target=/root/a.txt alpine sh
Dans windows,
si vous avez besoin d'un ${PWD} env variable dans votre menu fixe-composer.yml, vous pouvez créer un .env fichier dans le même répertoire que votre menu fixe-composer.fichier yml puis insérez manuellement l'emplacement de votre dossier.
CMD (pwd_var.chauve-souris) :
Powershell (pwd_var.ps1) :
Il n'y a plus de bonnes caractéristiques entendre pour docker-composer .variables d'environnement:
https://docs.docker.com/compose/reference/envvars/ en particulier pour les
COMPOSE_CONVERT_WINDOWS_PATHS
env variable qui permettent de docker composer pour accepter le chemin d'accès windows avec baskslash"\"
.Si vous souhaitez partager un fichier sur windows, le fichier doit exister avant de le partager avec le conteneur.
J'ai le même problème sur mon Windows 8.1
Il s'est avéré que c'était en raison de la casse de chemin.
J'ai appelé
docker-compose up
de répertoirecd /c/users/alex/
et à l'intérieur du contenant un fichier a été tourné dans le répertoire.Mais quand je n'ai
cd /c/Users/alex/
(pas d'Utilisateurs en majuscule) et appelédocker-compose up
à partir de là, il a travaillé.Dans mon système à la fois des Utilisateurs dir et Alex dir sont capitalisés, s'il semble que seuls les Utilisateurs dir question.