J'essaie de docker une application php. Dans le dockerfile, je télécharge l'archive, l'extrait, etc.
Tout fonctionne bien, cependant, si une nouvelle version est publiée et que je mets à jour le dockerfile, je dois réinstaller l'application, car le config.php est écrasé.
J'ai donc pensé pouvoir 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é, comme un volume monté.
/src/docker/myapp/upload:/var/www/html/upload
/src/docker/myapp/upload:/var/www/html/config.php
Cependant, les deux façons ne fonctionnent pas. Avec le volume monté, je vois que le téléchargement est créé.
Mais échoue ensuite avec
/var/www/html/config.php \\ "a 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?
la source
Réponses:
Les volumes de fichiers se font de cette façon dans docker (exemple de chemin absolu (peut utiliser des variables env), et vous devez mentionner le nom du fichier):
Vous pouvez également faire:
Si vous lancez le docker-compose depuis le
/src/docker/myapp
dossierla source
Je souffrais d'un problème similaire. J'essayais d'importer mon fichier de configuration dans mon conteneur afin de pouvoir le corriger à chaque fois que je besoin sans reconstruire l'image.
Je veux dire que je pensais que la commande ci-dessous serait
$(pwd)/config.py
mappée de l'hôte Docker vers/root/app/config.py
le conteneur sous forme de fichier.Cependant, il a toujours créé un répertoire nommé
config.py
, pas un fichier.en cherchant un indice, j'ai trouvé la raison (d' ici )
Par conséquent, il est toujours créé en tant que répertoire car mon hôte docker n'en a pas
$(pwd)/config.py
.Même si je crée config.py dans l'hôte docker.
$(pwd)/config.py
juste écraser/root/app/config.py
ne pas exporter/root/app/config.py
.la source
touch path/to/file
dans leDockerfile
afin que quand je monterai ce serait toujours un fichier (pas un répertoire créé):
doit être plein chemin. Cela fonctionne de cette façontouch
était la réponse, faites - le dans Dockerfile puis monter votre volume docker-Compose fonctionnera correctement sans créer un répertoireUtilisez mount (
--mount
) au lieu de volume (-v
)Plus d'informations: https://docs.docker.com/storage/bind-mounts/
Exemple:
Assurez-vous que /tmp/a.txt existe sur l'hôte docker
la source
--mount
et-v
est le comportement lorsque la partie hôte du volume n'existe pas encore. Selon votre lien:> Si vous utilisez -v ou --volume pour lier-monter un fichier ou un répertoire qui n'existe pas encore sur l'hôte Docker, -v crée le point de terminaison pour vous. Il est toujours créé sous forme de répertoire.Pour toute personne utilisant un conteneur Windows comme moi, sachez que vous NE POUVEZ PAS lier ou monter des fichiers uniques à l'aide du conteneur Windows.
C'est difficile à repérer mais c'est là
Lien vers le problème Github concernant le mappage de fichiers dans un conteneur Windows
la source
La façon qui a fonctionné pour moi est d'utiliser une
bind
montureMerci à Mike Race d'avoir répondu à: Monter un seul fichier à partir du volume à l'aide de Docker-compose
Vous devez utiliser la "syntaxe longue" pour exprimer un
bind
montage: https://docs.docker.com/compose/compose-file/#long-syntaxla source
Depuis la version 3.2 du fichier docker-compose, vous pouvez spécifier un montage de volume de type "bind" (au lieu du type par défaut "volume") qui vous permet de monter un seul fichier dans le conteneur. Recherchez «bind mount» dans les documents de volume de docker-compose: https://docs.docker.com/compose/compose-file/#volumes
Dans mon cas, j'essayais de monter un seul fichier ".secrets" dans mon application qui contenait des secrets pour le développement local et les tests uniquement. En production, mon application récupère plutôt ces secrets auprès d'AWS.
Si j'ai monté ce fichier en tant que volume en utilisant la syntaxe abrégée:
Docker créerait un « .secrets » répertoire intérieur du conteneur au lieu de mappage au fichier extérieur du conteneur. Mon code soulèverait alors une erreur comme "IsADirectoryError: [Errno 21] Est un répertoire: '.secrets'".
J'ai corrigé cela en utilisant à la place la syntaxe à long terme, en spécifiant mon fichier secret à l'aide d'un montage de volume "bind" en lecture seule:
Docker monte maintenant correctement mon fichier .secrets dans le conteneur, créant un fichier à l'intérieur du conteneur au lieu d'un répertoire. J'espère que d'autres trouveront cet exemple utile!
la source
Vous pouvez également utiliser un chemin relatif vers votre
docker-compose.yml
fichier comme celui-ci (testé sur l'hôte Windows, conteneur Linux):la source
version: '3.7'
spécifié dans ledocker-compose.yml
fichier avec la version 1.24.1 de docker-compose, build 4667896b, et cela a fonctionné.Pour moi, le problème était que j'avais un lien symbolique brisé sur le fichier que j'essayais de monter dans le conteneur
la source
J'ai eu le même problème sur Windows,
Docker 18.06.1-ce-win73 (19507)
.Supprimer et rajouter le lecteur partagé via le panneau des paramètres Docker et tout a de nouveau fonctionné.
la source
Dans Windows, si vous avez besoin de la variable env $ {PWD} dans votre docker-compose.yml, vous pouvez créer un fichier .env dans le même répertoire que votre fichier docker-compose.yml puis insérer manuellement l'emplacement de votre dossier.
CMD (pwd_var.bat):
Powershell (pwd_var.ps1):
Il existe d'autres fonctionnalités intéressantes pour les variables .env de docker-compose: https://docs.docker.com/compose/reference/envvars/ en particulier pour la
COMPOSE_CONVERT_WINDOWS_PATHS
variable env qui permet à docker compose d'accepter le chemin Windows avec baskslash"\"
.Lorsque vous souhaitez partager un fichier sur Windows, le fichier doit exister avant de le partager avec le conteneur.
la source
Peut-être que cela aide quelqu'un.
J'ai eu ce problème et j'ai tout essayé. Les liaisons de volume semblaient bien et même si je montais le répertoire (pas les fichiers), j'avais les noms de fichiers dans le répertoire monté correctement mais montés en tant que dirs.
J'ai essayé de réactiver les lecteurs partagés et Docker s'est plaint que le pare-feu est actif.
Après avoir désactivé le pare-feu, tout fonctionnait bien.
la source
Vous pouvez monter des fichiers ou des répertoires / dossiers, tout dépend du fichier ou du répertoire source. Et vous devez également fournir un chemin d'accès complet ou si vous n'êtes pas sûr de pouvoir utiliser PWD. Voici un exemple de travail simple.
Dans cet exemple, je monte un fichier env-commandes qui existe déjà dans mon répertoire de travail
la source
J'ai le même problème sur mon Windows 8.1
Il s'est avéré que cela était dû à la sensibilité à la casse du chemin. J'ai appelé à
docker-compose up
partir du répertoirecd /c/users/alex/
et à l'intérieur du conteneur, un fichier a été transformé en répertoire.Mais quand je l'ai fait
cd /c/Users/alex/
(pas les utilisateurs capitalisés) et appelé àdocker-compose up
partir de là, cela a fonctionné.Dans mon système, le répertoire des utilisateurs et le répertoire d'Alex sont en majuscules, bien qu'il semble que seuls le répertoire des utilisateurs soit important.
la source