Docker et symlinks

j'ai un repo comme ça:

/config
   config.json
/worker-a
   Dockerfile
   <symlink to config.json>
   /code
/worker-b
   Dockerfile
   <symlink to config.json>
   /code

cependant, la construction des images échoue, parce que Docker ne peut pas gérer les liens symboliques. Je dois mentionner que mon projet est beaucoup plus compliqué que cela, donc la restructuration des répertoires n'est pas une bonne option. Comment puis-je faire face à cette situation?

16
demandé sur Chris B. 2016-09-07 21:22:58

3 réponses

Docker ne supporte pas de créer des liens symboliques vers les fichiers à l'extérieur de la construire contexte .

quelques méthodes différentes pour utiliser un fichier partagé dans un conteneur.

Partager une image de base

créer une Dockerfile pour l'image de base worker-config qui inclut la config/les fichiers partagés.

COPY config.json /config.json

Construisez et marquez l'image comme worker-config

docker build -t worker-config:latest .

Source de la base worker-config image pour toutes vos travailleurs Dockerfile s

FROM worker-config:latest

script de construction

utilisez un script pour pousser la configuration commune à chacun de vos conteneurs de travail.

./build worker-n

#!/bin/sh
set -uex 
rundir=$(readlink -f "${0%/*}")
container=$(shift)
cd "$rundir/$container"
cp ../config/config.json ./config-docker.json
docker build "$@" .

construire à partir de L'URL

tirez la config à partir d'une URL commune pour toutes les constructions worker-n .

ADD http://somehost/config.json /

augmentation la portée de l'image de construire contexte

inclut les fichiers cibles symlink dans le contexte de construction en construisant à partir d'un répertoire parent qui inclut à la fois les fichiers partagés et les fichiers contenant spécifiques.

cd ..
docker build -f worker-a/Dockerfile .

tous les chemins sources auxquels vous faites référence dans un Dockerfile doivent aussi être modifiés pour correspondre au nouveau contexte de construction:

COPY workerathing /app

devient

COPY worker-a/workerathing /app

en utilisant cette méthode peut faire tous construisez des contextes de grande taille si vous avez un seul contexte de grande taille, car ils deviennent tous partagés. Il peut ralentir les constructions, en particulier pour les serveurs de construction de Dockers à distance.

monter un répertoire de configuration à partir d'un volume nommé

Volumes comme celui-ci ne fonctionnent que comme des répertoires, donc vous ne pouvez pas spécifier un fichier comme vous pourriez lors du montage d'un fichier de l'hôte au conteneur.

docker volume create --name=worker-cfg-vol
docker run -v worker-cfg-vol:/config worker-config cp config.json /config

docker run -v worker-cfg-vol:/config:/config worker-a

Monter une config à partir de conteneur de données

encore une fois, les annuaires seulement car il est fondamentalement le même que ci-dessus. Cela permettra de copier automatiquement les fichiers du répertoire de destination dans le volume partagé nouvellement créé.

docker create --name wcc -v /config worker-config /bin/true
docker run --volumes-from wcc worker-a

Mount fichier de configuration de l'hôte

docker run -v /app/config/config.json:/config.json worker-a
27
répondu Matt 2018-02-22 00:21:12

la commande docker build CLI envoie le répertoire spécifié (typiquement . ) comme "contexte de construction" au moteur Docker (démon). Au lieu de spécifier le contexte de compilation comme /worker-a , spécifiez le contexte de compilation comme le répertoire racine, et utilisez l'argument -f pour spécifier le chemin vers le Dockerfile dans un des répertoires enfants.

docker build -f worker-a/Dockerfile .
docker build -f worker-b/Dockerfile .

vous devrez retravailler légèrement vos fichiers Dockerfiles, pour les pointer vers ../config/config.json , mais c'est assez simple à résoudre.

vérifiez aussi cette question/réponse, qui je pense aborde le même problème que vous rencontrez.

comment inclure des fichiers en dehors du contexte de construction de Docker?

Espérons que cette aide! Cheers

1
répondu Trevor Sullivan 2017-05-23 11:47:23

une solution alternative est de mettre à jour tous vos liens mous en liens durs.

1
répondu Benjamin Pastel 2018-07-19 23:36:11