web-dev-qa-db-fra.com

Docker: ajout d'un fichier depuis un répertoire parent

Dans ma Dockerfile j'ai:

ADD ../../myapp.war /opt/Tomcat7/webapps/

Ce fichier existe en tant que ls ../../myapp.war me renvoie le fichier correct mais lorsque j'exécute Sudo docker build -t myapp .,

Step 1 : ADD ../../myapp.war /opt/Tomcat7/webapps/
2014/07/02 19:18:09 ../../myapp.war: no such file or directory

Est-ce que quelqu'un sait pourquoi et comment le faire correctement?

111
Anthony O.

Vous pouvez créer le fichier Dockerfile à partir du répertoire parent:

docker build -t <some tag> -f <dir/dir/Dockerfile> .
132
Boedy

Malheureusement, (pour des raisons pratiques et de sécurité, je suppose), si vous souhaitez ajouter/copier du contenu local, il doit se trouver sous le même chemin racine que le Dockerfile

De la documentation :

Le chemin <src> doit être dans le contexte de la construction; vous ne peut pas ajouter ../quelque chose/ quelque chose, parce que la première étape d'un docker build consiste à envoyer le répertoire de contexte (et les sous-répertoires) au démon docker.

EDIT: Il existe maintenant une option (-f) pour définir le chemin de votre fichier Docker; il peut être utilisé pour obtenir ce que vous voulez, voir la réponse de @Boedy maintenant. 

84
mbarthelemy

Avec docker-compos, vous pouvez définir un dossier de contexte: 

#docker-compose.yml
version: '3.3'    
services:
      yourservice:
        build:
          context: ./
          dockerfile: ./docker/yourservice/Dockerfile
51
Nikita Kuznetsov

La solution pour ceux qui utilisent composer consiste à utiliser un volume pointant vers le dossier parent:

#docker-composer.yml

foo:
  build: foo
  volumes:
    - ./:/src/:ro

Mais je suis sûr que vous pouvez jouer avec volumes dans Dockerfile .

5
wikier

Puisque -f a causé un autre problème, j'ai développé une autre solution.

  • Créer une image de base dans le dossier parent
  • Ajout des fichiers requis.
  • Utilisé cette image comme image de base pour le projet qui dans un dossier descendant.

Le drapeau -f ne résout pas mon problème car mon image onbuild recherche un fichier dans un dossier et doit appeler comme ceci:

-f foo/bar/Dockerfile foo/bar 

au lieu de 

-f foo/bar/Dockerfile . 

Notez également qu'il ne s'agit que d'une solution dans certains cas, comme indicateur -f

2
guneysus

Ajout de fragments de code pour prendre en charge la réponse acceptée. 

Structure du répertoire:

setup/
 |__docker/DockerFile
 |__target/scripts/<myscripts.sh>
src/
 |__<my source files>

Entrée du fichier Docker:

RUN mkdir -p /home/vagrant/dockerws/chatServerInstaller/scripts/
RUN mkdir -p /home/vagrant/dockerws/chatServerInstaller/src/
WORKDIR /home/vagrant/dockerws/chatServerInstaller

#Copy all the required files from Host's file system to the container file system.
COPY setup/target/scripts/install_x.sh scripts/
COPY setup/target/scripts/install_y.sh scripts/
COPY src/ src/

Commande utilisée pour construire l'image du menu fixe

docker build -t test:latest -f setup/docker/Dockerfile .
1
Binita Bharati