Conditionnel COPIER/AJOUTER dans le Dockerfile?
À l'intérieur de mon Dockerfiles je voudrais COPIER un fichier dans mon image, si elle existe, la requirements.txt fichier pip semble être un bon candidat, mais comment cela peut-il être atteint?
COPY (requirements.txt if test -e requirements.txt; fi) /destination
...
RUN if test -e requirements.txt; then pip install -r requirements.txt; fi
ou
if test -e requirements.txt; then
COPY requiements.txt /destination;
fi
RUN if test -e requirements.txt; then pip install -r requirements.txt; fi
- Veuillez voir ici: docs.docker.com/reference/builder
- Qu'est-ce spécifiquement à ce lien permet de faire cela?
Vous devez vous connecter pour publier un commentaire.
Ce n'est pas actuellement pris en charge (comme je pense qu'elle mènera à la non-reproductible de l'image, depuis la même Dockerfile copie de ce fichier, en fonction de son existence).
C'est toujours requis, dans question 13045, à l'aide de caractères génériques: "
COPY foo/* bar/" not work if no file in foo
" (Mai 2015).Il ne sera pas mis en œuvre pour l'instant (juillet 2015) dans le Panneau, mais d'un autre outil de construction comme bocker pourrait appuyer cette démarche.
dev
environnement s'exécute avec un webpack serveur de dev, et l'équivalentprod
environnement travaille avec un/dist
statique dossier? C'est le cas dans la plupart des front-end configurations d'aujourd'hui, et évidemmentdev
etprod
ne peut pas être la même chose ici. Alors, comment gérer cela?Voici une solution simple:
Assurez-vous que
foo
existe, depuisCOPY
besoin d'au moins une source valide.Si
file-which-may-exist
est présent, il sera également copié.NOTE:
Vous devez prendre soin de s'assurer que votre générique ne prenez pas d'autres fichiers dont vous n'avez pas l'intention de copier. Pour être plus prudent, vous pouvez utiliser
file-which-may-exist?
à la place (?
correspond à un seul caractère).Ou mieux encore, utiliser une classe de caractères de ce genre pour s'assurer qu'un seul fichier peut être mis en correspondance:
COPY --from=docker /usr/bin/docker /usr/lib/libltdl.so* /tmp/docker/
RUN mv /tmp/docker/docker /usr/bin/docker
RUN mv /tmp/docker/libltdl.so.7 /usr/lib/libltdl.so.7 || true
(où la bibliothèque partagée est l'entité inconnue.)requirements.txt
.Comme l'a déclaré ce commentaire, Santhosh Hirekerur la réponse de copie toujours le fichier d'archive d'un vrai conditionnelle de copie, vous pouvez utiliser cette méthode.
La
ONBUILD
instructions assure que le fichier n'est copié si la "branche" est sélectionné par leBUILD_ENV
. Définissez cette variable à l'aide d'un petit script avant d'appelerdocker build
Travail autour de la Solution
J'avais exigence sur copier le DOSSIER de serveur basé sur des Variables d'environnement. J'ai pris le serveur vide de l'image. créé nécessaire de déploiement de la structure de dossier dans le dossier local. ensuite ajoutée en dessous de la ligne de DockerFile copiez le dossier dans le récipient. Jen de la dernière ligne ajoutée point d'entrée pour exécuter init file.sh avant de docker démarrer le serveur.
Ensuite créer le custom-init.sh fichier en local avec un script quelque chose comme ci-dessous
Dans docker-composer fichier ci-dessous des lignes.
de l'environnement:
- BUILD_EVN=TEST
Ces changements copier le dossier dans le récipient pendant docker construire. lorsque nous exécutons docker-composer jusqu' il copie ou de les déployer requis dossier de serveur avant de serveur démarre.
Copier tous les fichiers sur un jetable dir, a part choisir celui que vous voulez, jetez le reste.
Peut-être vous n'avez pas besoin! Nous allons voir votre nouveau code:
Peut-être vous pouvez simplement passer à:
Maintenant, vous avez ceci: