108
votes

Docker - Échec de la clé de cache: non trouvé - s'exécute bien dans Visual Studio

J'ai généré un dockerfile avec Visual Studio. Il s'exécute très bien dans Visual Studio et maintenant j'essaie de le construire à partir de Windows lui-même ( docker build. , et j'ai essayé de nombreuses combinaisons). Pourtant, j'obtiens l'erreur suivante:

 Code d'erreur

Lorsque je modifie la copie en ./ client.csproj , cela continue et ensuite j'obtiens:

 Deuxième erreur avec le chemin de copie modifié

Qu'est-ce que je fais de mal? J'ai changé Docker Linux en Windows, changé wsl , et redémarré tout.

client dockerfile


2 commentaires

C'est du travail pour moi stackoverflow.com/a/63257667/15203500


Veuillez ne pas publier de photos, de code de format à l'aide de la fonction "Code".


15 Réponses :


11
votes

En demandant un répertoire qui n'existe pas lance cette erreur.

Dans mon cas, j'ai essayé

 > [stage-1  7/14] COPY /.ssh/id_rsa.pub /.ssh/:
------
failed to compute cache key: "/.ssh/id_rsa.pub" not found: not found

j'avais oublié d'ajouter le /. dossier ssh dans le répertoire du projet. Dans votre cas, vous devez vérifier si / client est vraiment un sous-dossier de votre contexte de construction dockerfile.


1 commentaires

Idem ici, fait une faute de frappe



4
votes

Dans mon cas, j'ai constaté que Docker Build est sensible à la casse dans le nom du répertoire, donc j'écrivais /bin/release/net5.0/publish dans l'instruction de copie et j'ai échoué avec la même erreur, je viens de passer à / bac / version / net5.0 / publier et cela a fonctionné


1 commentaires

C'était la réponse pour moi. Les fenêtres ne sont pas sensibles à la casse sur le chemin rend parfois le travail avec Docker.



191
votes

Vérifiez votre fichier .dockaignore . Possible qu'il ignore les fichiers nécessaires pour la commande de copie et vous n'êtes pas en train de calculer l'erreur de clé de cache.


1 commentaires

Pour moi, ce n'était pas la réponse (voir la réponse acceptée), merci!



105
votes

La façon dont Visual Studio le fait est un peu étrange.

Au lieu de lancer docker build dans le dossier avec le dockerfile, il se lance dans le dossier parent et spécifie le dockerfile avec le -f option.

J'utilisais le projet de démonstration (essayant de créer une solution minimale pour une autre question) et j'ai frappé la même situation.

Le projet de démonstration est

cd \Workerservice2
docker build -f WorkerService2\Dockerfile --force-rm -t worker2/try7 .

docker run -it worker2/try7    

donc je serais attendre que aille

 => ERROR [build 3/7] COPY [WorkerService2/WorkerService2.csproj, WorkerService2/]                                                                                                                        0.0s
------
 > [build 3/7] COPY [WorkerService2/WorkerService2.csproj, WorkerService2/]:
------
failed to compute cache key: "/WorkerService2/WorkerService2.csproj" not found: not found

mais j'obtiens votre Message d'erreur.

cd \Workerservice2\WorkerService2
docker build .

Au lieu de cela, accédez au répertoire parent, avec le fichier .sln et utilisez le docker -f code > Option pour spécifier le dockerfile à utiliser dans le sous-dossier:

\WorkerService2  ("solution" folder)
   +- WorkerService2.sln
   +- WorkserService2  ("project" folder)
       +- DockerFile
       +- WorkerService2.csproj
       +- ... other program files

modifier (Merci Mike Loux, Tblev & Goku):

Notez le point final sur la commande docker build .

Pour docker, la partie finale de la commande est l'emplacement des fichiers avec lesquels Docker travaillera. Habituellement c'est le dossier avec le dockerfile, mais c'est ce qui est différent dans la façon dont VS fait. Dans ce cas, le dockerfile est spécifié avec le -f . Tous les chemins (comme avec l'instruction Copy dans le dockerfile) sont relatifs à l'emplacement spécifié. Le . signifie "répertoire actuel", qui dans mon exemple est \ WorkerService2 .

Je suis arrivé à cette étape en inspectant la sortie du processus de construction , avec la verbosité réglée sur détail. Si vous choisissez des outils / options / projets et des solutions / build et exécutez, vous pouvez ajuster la verbosité de sortie de build, j'ai rendu le mien détaillé.

modifier # 2 Je pense que j'ai travaillé Pourquoi Visual Studio le fait de cette façon. Il permet aux références de projet dans la même solution d'être copiées.

S'il était configuré pour faire docker build dans le dossier du projet, Docker ne pourrait pas Copier l'un des autres projets de la solution.


4 commentaires

Gah. C'était ce dernier point qui me faisait. J'ai essayé toutes sortes de combinaisons du fichier complet ou un chemin sans le fichier, mais j'ai obtenu le fichier qui n'est pas trouvé , soit la version docker redoutée nécessite exactement 1 argument message. Je ne vais pas mentir, apprendre la plus petite chose dans Docker, c'est comme tirer les dents, FFS. Cela fonctionne très bien une fois que vous avez déterminé la syntaxe et les méthodes obscures, mais jusque-là, c'est une tête après l'autre.


Ouais, quel est le point à la fin? Vous spécifiez deux fichiers Docker.


@tblev le '.' À la fin, c'est dire à Docker d'où le répertoire s'écoule, dans ce cas, la racine de la solution plutôt que le projet. Il est prudent cependant, la commande de copie est sensible à la casse et si vous avez votre répertoire de projet nommé de manière incohérente avec la commande (Camel Case, etc.) qui confondera Docker


J'ai eu ce problème, vérifiez simplement votre chemin pour la faute



14
votes

J'ai eu le même problème, j'ai défini l'environnement Docker sur Windows lors de l'ajout de la prise en charge de Docker. Même en cours d'exécution dans Visual, Studio a jeté une erreur à cela. J'ai changé l'environnement en Linux alors que mon docker s'exécute dans le sous-système Windows pour Linux (WSL).

Ensuite, je suis revenu au terminal pour exécuter les commandes.

J'ai pu résoudre ce problème par Déplacement vers le dossier Solutions (dossier racine).

et j'ai fait docker build comme ceci:

docker run containername/tag

Ensuite, j'ai fait docker run :

docker build -t containername/tag -f ProjectFolder/Dockerfile .


2 commentaires

L'utilisation d'option -f dans le .SLN-Folder avait déjà été une réponse 10 jours avant cette réponse.


Re "Sous-système Linux pour Windows" : voulez-vous dire Sous-système Windows pour Linux (WSL)?



2
votes

J'ai eu le même problème. Dans mon cas, un mauvais répertoire était spécifié. Mon dockerfile était:

FROM mcr.microsoft.com/dotnet/sdk:5.0 AS publish
WORKDIR /app
COPY . .
RUN dotnet publish -c Release -o publish/web src/MyApp/MyApp.csproj

FROM mcr.microsoft.com/dotnet/aspnet:5.0
WORKDIR /app
COPY --from=publish app/publish/web .
EXPOSE 80
CMD ASPNETCORE_URLS=http://*:$PORT dotnet MyApp.dll

Ensuite, j'ai réalisé que dans la deuxième étape de construction, j'essaie de copier > Xxx

Mais comme je l'ai spécifié WorkDir / App dans la première étape, mes fichiers sont situés dans ce répertoire dans le système de fichiers d'image, donc en modifiant le chemin publier / web vers app / publish / web résoudre mon numéro.

donc mon docker de travail final est:

COPY --from=publish publish/web .


0 commentaires

0
votes

J'avais fait face au même problème.

La raison en était que le nom du fichier DLL dans le fichier docker est sensible à la casse.

FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
WORKDIR /src
COPY MyFirstMicroService.csproj .
RUN dotnet restore
COPY . .
RUN dotnet publish -c release -o /app

FROM mcr.microsoft.com/dotnet/aspnet:5.0
WORKDIR /app
COPY --from=build /app .
ENTRYPOINT ["dotnet", "**MyFirstMicroService.dll**"]

this . Dll Le nom doit correspondre à votre fichier .csproj.


0 commentaires

1
votes

Dans mon cas, il y avait un espace blanc de fuite sournois dans le nom du fichier.

------
 > [3/3] COPY init.sh ./:
------
failed to compute cache key: "/init.sh" not found: not found

Le fichier était donc appelé "init.sh" au lieu de "init.sh". p >


0 commentaires

0
votes

Cela se produit également lorsque vous ne fournissez pas le chemin approprié vers votre entrée de commande de copie. L'indice le plus important que j'ai eu est que la commande WorkDir ouvre un dossier pour le conteneur, pas dans l'Explorateur Windows (donc cela n'affecte pas le chemin que vous devez spécifier pour la commande Copy).


0 commentaires

3
votes

La commande suivante échoue avec Échec de la touche de cache: pas trouvé :

docker build -t tag-name:v1.5.1 -f Dockerfile .

En modifiant la commande en ce qui suit, il a été corrigé: p >

docker build -t tag-name:v1.5.1 - <Dockerfile


0 commentaires

0
votes

Dans mon cas, Je faisais une erreur dans '/' et ''. Laisse-moi expliquer Ouvrez votre dockerfile (il doit être nommé uniquement dockerfile, pas dockerfile ou dockerfile). Vous pouvez avoir quelque chose comme ça- de mcr.microsoft.com/dotnet/runtime:5.0 copier bin \ release \ net5.0 \ publish. Entrée [dotnet "," hellodocker.dll "]

remplacer copier bin \ release \ net5.0 \ publish. à copier bin / release / net5.0 / publier.


0 commentaires

4
votes

Erreur: Impossible de calculer la clé de cache: "SRC" INTORSSIBLE: Non trouvé

Dans mon cas, dossier / fichier exclu dans .dockerignore

  • Après avoir résolu le fichier de dockergnore capable de créer une image.

  • 1 commentaires

    Vous m'avez sauvé de certaines folies. MERCI!



    3
    votes

    Dans mon cas, j'avais quelque chose comme ceci:

      FROM mcr.microsoft.com/dotnet/aspnet:5.0
      COPY bin/Release/net5.0/publish/ app/
      WORKDIR /app
      ENTRYPOINT ["dotnet", "MyApi.dll"]
    

    et j'ai finalement réalisé que j'avais le dossier bin dans mon fichier .dockerignore. p >


    0 commentaires

    0
    votes

    Dans mon cas, c'était un mauvais construire avec Path Configuration par ex. Docker build context

    1. Script Docker simple
      name: Docker build and push
      
      on:
        push:
          branches: [ main ]
      
      # ...
      
      jobs:
        build:
          runs-on: ubuntu-latest
      
          # ...
      
          steps:
            - name: Checkout
              uses: actions/checkout@v2
      
           # ...
      
            - name: Build and export to Docker
              uses: docker/build-push-action@v2
              with:
                # ...
                file: src/main/docker/Dockerfile      
                context: ./build                      # path to build context
      
    2. gradle + docker
      docker {
          dependsOn build
          dependsOn dockerFilesCopy
          name "${project.name}:${project.version}"
          files "build" // path to build context
      }
      
    3. gradle + github action
      docker build . 
      


    0 commentaires

    0
    votes

    Dans mon cas, avec un projet angulaire, mon projet était dans le dossier appelé Ex: My-Folder-Project et je mettais Dockerfile Copy --From = publish app / dist / my-folder-project. Mais bien sûr, la bonne chose est de mettre le "nom" dans votre package.json comme la copie --from = publier app / dist / name-in-package.json.


    0 commentaires