187 votes

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?

248voto

BlackStork Points 1497

TL;DR/Avis:

Si vous rencontrez un répertoire créé à la place du fichier que vous essayez de monter, vous avez probablement n'a pas pu fournir un valide et absolue chemin. C'est une erreur commune avec un silencieux et déroutant mode de défaillance.

Les volumes de fichiers sont faites de cette façon dans docker (chemin absolu exemple (vous pouvez utiliser des variables d'environnement), et vous devez mentionner le nom de fichier) :

    volumes:
      - /src/docker/myapp/upload:/var/www/html/upload
      - /src/docker/myapp/upload/config.php:/var/www/html/config.php

Vous pouvez également le faire:

    volumes:
      - ${PWD}/upload:/var/www/html/upload
      - ${PWD}/upload/config.php:/var/www/html/config.php

Si vous lancez le menu fixe-composer à partir d' /src/docker/myapp le dossier

69voto

SangminKim Points 2531

Je souffrais 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 carte en $(pwd)/config.py depuis le Panneau d'accueil à l' /root/app/config.py dans le conteneur comme un fichier.

docker run -v $(pwd)/config.py:/root/app/config.py my_docker_image

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 d' ici)

Si vous utilisez-v ou --volume à lier-monter un fichier ou d'un répertoire qui n' existe pas encore sur le Panneau d'accueil, -v va créer le point de terminaison pour vous. Il est toujours créé dans un répertoire.

Par conséquent, il est toujours créé un répertoire parce que mon panneau d'accueil ne dispose pas d' $(pwd)/config.py.

Même si je créer config.py dans le panneau d'accueil. $(pwd)/config.py seulement overwirte /root/app/config.py ne pas exporter /root/app/config.py.

8voto

Subbu M Points 21

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 le docker hôte Docker, exécutez -it --mount type = bind, source = / tmp / a.txt, target = / root / a.txt sh alpine

7voto

Justin Lessard Points 891

Pour toute personne utilisant Windows conteneur comme moi, sachez que vous NE pouvez pas lier ou de monter des fichiers à l'aide de windows conteneur.

Les exemples suivants vont échouer lors de l'utilisation de Windows conteneurs, en tant que destination d'un volume ou un montage lié à l'intérieur du conteneur doit être: un non-existant ou répertoire vide; ou un lecteur autre que C:. En outre, la source d'un montage lié 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 ...

Il est difficile à repérer, mais il est là

Lien vers le Github question concernant la cartographie des fichiers dans Windows conteneur

0voto

jla Points 1

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X