À l'intérieur de mes Dockerfiles, je voudrais COPIER un fichier dans mon image s'il existe, le fichier requirements.txt pour pip semble être un bon candidat, mais comment cela serait-il réalisé?
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
docker
dockerfile
derrend
la source
la source
Réponses:
Ce n'est actuellement pas pris en charge (car je soupçonne que cela conduirait à une image non reproductible, car le même Dockerfile copierait ou non le fichier, en fonction de son existence).
Ceci est toujours demandé, dans le numéro 13045 , en utilisant des caractères génériques: "
COPY foo/* bar/" not work if no file in foo
" (mai 2015).Il ne sera pas implémenté pour l'instant (juillet 2015) dans Docker, mais un autre outil de construction comme bocker pourrait le supporter.
la source
dev
environnement frontal s'exécute avec un serveur de développement Webpack et que l'prod
environnement équivalent fonctionne avec un/dist
dossier statique? C'est le cas dans la plupart des configurations frontales aujourd'hui, et évidemmentdev
etprod
ne peut pas être la même chose ici. Alors, comment gérer ça?Voici une solution de contournement simple:
Assurez-vous qu'il
foo
existe, carCOPY
nécessite au moins une source valide.Si
file-which-may-exist
est présent, il sera également copié.REMARQUE: vous devez veiller à ce que votre caractère générique ne récupère pas d'autres fichiers que vous n'avez pas l'intention de copier. Pour être plus prudent, vous pouvez utiliser à la
file-which-may-exist?
place (?
correspond à un seul caractère).Ou mieux encore, utilisez une classe de caractères comme celle-ci pour vous assurer qu'un seul fichier peut être mis en correspondance:
la source
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.)Comme indiqué par ce commentaire , la réponse de Santhosh Hirekerur copie toujours le fichier, pour archiver une véritable copie conditionnelle, vous pouvez utiliser cette méthode.
Les
ONBUILD
instructions garantissent que le fichier n'est copié que si la "branche" est sélectionnée par leBUILD_ENV
. Définissez cette variable à l'aide d'un petit script avant d'appelerdocker build
la source
Solution de contournement
J'avais besoin de copier le dossier sur le serveur en fonction des variables ENV. J'ai pris l'image du serveur vide. a créé la structure de dossier de déploiement requise dans le dossier local. puis ajouté ci-dessous la ligne à DockerFile copiez le dossier dans le conteneur. I n dernière ligne a ajouté un point d'entrée pour exécuter init file.sh avant que docker ne démarre le serveur.
Ensuite, créez le fichier custom-init.sh en local avec un script comme ci-dessous
Dans le fichier docker-compose sous les lignes.
environnement: - BUILD_EVN = TEST
Ces modifications copient le dossier dans le conteneur lors de la génération du docker. lorsque nous exécutons docker-compose, copiez ou déployez le dossier requis sur le serveur avant le démarrage du serveur.
la source
Copiez tous les fichiers dans un répertoire jetable, choisissez celui que vous voulez, supprimez le reste.
Vous pouvez obtenir quelque chose de similaire en utilisant les étapes de construction, qui repose sur la même solution, en utilisant
cp
pour copier certaines conditions. En utilisant une étape de construction, votre image finale n'inclura pas tout le contenu de l'initialeCOPY
.la source
cache
et en fonction de ce que c'est le cache je choisis quoi faire dans les fichiers de script!J'ai essayé les autres idées, mais aucune ne répondait à nos exigences. L'idée est de créer une image nginx de base pour les applications Web statiques enfants. Pour des raisons de sécurité, d'optimisation et de standardisation, l'image de base doit pouvoir
RUN
exécuter des commandes sur des répertoires ajoutés par des images enfants. L'image de base ne contrôle pas les répertoires ajoutés par les images enfants. L'hypothèse est que les images enfants seront desCOPY
ressources quelque part sousCOMMON_DEST_ROOT
.Cette approche est un hack, mais l'idée est que l'image de base prendra en charge les
COPY
instructions pour 1 à N répertoires ajoutés par l'image enfant.ARG PLACEHOLDER_FILE
etENV UNPROVIDED_DEST
sont utilisés pour satisfaire<src>
et<dest>
exigences pour uneCOPY
instruction non nécessaires.Cette solution présente des lacunes évidentes telles que le nombre factice
PLACEHOLDER_FILE
et codé en dur des instructions COPY prises en charge. De plus, il n'y a aucun moyen de se débarrasser des variables ENV qui sont utilisées dans l'instruction COPY.la source