Existe-t-il un moyen plus élégant de copier des fichiers spécifiques à l'aide de Docker COPY dans le répertoire de travail?

coup de tempête

Tentative de création d'un conteneur avec microsoft / dotnet: 2.1-aspnetcore-runtime. Le fichier de solution de base .net contient plusieurs projets imbriqués sous la solution, chacun avec son propre fichier .csproj. Je tente de créer une instruction COPY plus élégante pour les sous-projets

L'exemple disponible ici https://github.com/dotnet/dotnet-docker/tree/master/samples/aspnetapp a un fichier de solution avec un seul .csproj crée ainsi le Dockerfile:

COPY *.sln .
COPY aspnetapp/*.csproj ./aspnetapp/
RUN dotnet restore

Cela fonctionne de cette façon

COPY my_solution_folder/*.sln .
COPY my_solution_folder/project/*.csproj my_solution_folder/
COPY my_solution_folder/subproject_one/*.csproj subproject_one/
COPY my_solution_folder/subproject_two/*.csproj subproject_two/
COPY my_solution_folder/subproject_three/*.csproj subproject_three/

pour une structure de dossiers de solution de:

my_solution_folder\my_solution.sln
my_solution_folder\project\my_solution.csproj
my_solution_folder\subproject_one\subproject_one.csproj
my_solution_folder\subproject_two\subproject_two.csproj
my_solution_folder\subproject_three\subproject_three.csproj

mais ce n'est pas le cas (c'était une supposition aléatoire)

COPY my_solution_folder/*/*.csproj working_dir_folder/*/

Existe-t-il une solution plus élégante?

VonC

Étant donné que les caractères génériques ne sont pas bien pris en charge par COPY ( moby issue 15858 ), vous pouvez:

  • soit expérimentez avec l'ajout de fichiers .dockerignore dans le dossier que vous ne voulez pas copier (tout en excluant les dossiers que vous voulez): c'est encombrant
  • ou, comme indiqué ici , créez un tar de tous les dossiers que vous voulez

Voici un exemple, à adapter dans votre cas:

find .. -name '*.csproj' -o -name 'Finomial.InternalServicesCore.sln' -o -name 'nuget.config' \
  | sort | tar cf dotnet-restore.tar -T - 2> /dev/null

Avec un Dockerfile comprenant:

ADD docker/dotnet-restore.tar ./

L'idée est la suivante: l'archive est automatiquement étendue avec ADD.


L' OPsturmstrike mentionne dans les commentaires « Optimiser les applications ASP.NET Core dans Docker - éviter de copier manuellement des csprojfichiers (Partie 2) » d' Andrew Lock «Sock»

La solution alternative utilise en fait la technique des caractères génériques que j'ai précédemment rejetée, mais avec quelques hypothèses sur la structure de votre projet, une approche en deux étapes et un peu de travail intelligent pour contourner les limitations des caractères génériques.

Nous prenons la liste plate des fichiers csproj et les replaçons à leur emplacement correct, imbriqués dans les sous-dossiers de src.

# Copy the main source project files
COPY src/*/*.csproj ./  
RUN for file in $(ls *.csproj); do mkdir -p src/${file%.*}/ && mv $file src/${file%.*}/; done

L01nl suggère dans les commentaires une approche alternative qui ne nécessite pas de compression: " Optimiser les applications ASP.NET Core dans Docker - éviter de copier manuellement les fichiers csproj ", de Andrew Lock "Sock" .

FROM microsoft/aspnetcore-build:2.0.6-2.1.101 AS builder
WORKDIR /sln

COPY ./*.sln ./NuGet.config  ./

# Copy the main source project files
COPY src/*/*.csproj ./
RUN for file in $(ls *.csproj); do mkdir -p src/${file%.*}/ && mv $file src/${file%.*}/; done

# Copy the test project files
COPY test/*/*.csproj ./
RUN for file in $(ls *.csproj); do mkdir -p test/${file%.*}/ && mv $file test/${file%.*}/; done

RUN dotnet restore

# Remainder of build process

Cette solution est beaucoup plus propre que mon effort précédent basé sur tar, car elle ne nécessite aucun script externe, juste un docker COPYet des RUNcommandes standard.
Il contourne le problème des caractères génériques en copiant d'abord les csprojfichiers du srcrépertoire, en les déplaçant vers leur emplacement correct, puis en les copiant dans les fichiers du projet de test.

Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.

En cas d'infraction, veuillez [email protected] Supprimer.

modifier le
0

laisse moi dire quelques mots

0commentaires
connexionAprès avoir participé à la revue

Articles connexes

TOP liste

  1. 1

    comment supprimer "compte de connexion google" à des fins de développement - actions sur google

  2. 2

    J'ai besoin de savoir si ces deux phrases sont les mêmes en programmation

  3. 3

    Microsoft.WebApplication.targets

  4. 4

    Création d'un nouvel objet d'une classe avec un nouveau nom en cliquant sur un bouton dans java swing

  5. 5

    La taille de la forme n'est pas égale à la taille de la cellule du tableau et ajuste le texte à l'intérieur de la forme

  6. 6

    Javascript indiquant "impossible de définir la propriété 'innerHTML' sur null"

  7. 7

    Pourquoi utiliser Asyncio ne réduit pas le temps d'exécution global en Python et n'exécute pas les fonctions simultanément?

  8. 8

    Création d'un rappel python pour une fonction C à partir d'une DLL avec un tampon char.

  9. 9

    Trouver l'intersection et l'union de deux rectangles

  10. 10

    Comment convertir une chaîne en tuple en utilisant `reads`?

  11. 11

    Empêcher l'allocation de mémoire dans la génération de combinaison récursive

  12. 12

    Restauration de la sauvegarde de la base de données SQL Server sur la version inférieure

  13. 13

    Nextcloud avec Docker: impossible de créer ou d'écrire dans le répertoire de données

  14. 14

    Compter combien de fois un nombre apparaît dans un tableau aléatoire

  15. 15

    java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver

  16. 16

    java.lang.NoClassDefFoundError: org / springframework / data / repository / config / BootstrapMode

  17. 17

    Créer un graphique à barres avec une fréquence relative / à partir d'un objet de table dans R

  18. 18

    comment le contrôle de tableau javascript devrait-il être

  19. 19

    Importation bizarre de Google Sheets importxml - Impossible d'obtenir le chemin correct vers les éléments

  20. 20

    Injecter des éléments dans une liste existante au printemps

  21. 21

    Placez le modeBar en haut au centre à l'aide de plotly.js

chaudétiquette

Archive