web-dev-qa-db-fra.com

Comment monter un seul fichier dans un volume

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?

96
Jakub Juszczak

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

126
BlackStork

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.

51
SangminKim

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
1
Daniel

Pour moi, le problème était que j'avais un lien symbolique brisé sur le fichier que j'essayais de monter dans le conteneur.

0
jla

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

0
Subbu M

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.

0
Pool

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

0
Justin Lessard