La copie a échoué: stat / var / lib / docker / tmp / docker-xxx: aucun fichier ou répertoire de ce type

Aug 18 2020

J'ai un workflow d'actions github pour créer une image docker:

name: Backend-Demo Docker Image CI
on:
  push:
    branches: [ master ]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Login to Azure Container Registry
        run: echo ${{ secrets.REGISTRY_PASSWORD }} | docker login ${{ secrets.LOGIN_SERVER_URL }} -u ${{ secrets.REGISTRY_USERNAME }} --password-stdin - name: Get the version id: vars run: echo ::set-output name=tag::$(echo ${GITHUB_REF:10})
      - name: Build the tagged Docker image
        run: docker build . --file backend/Dockerfile --tag backend-demo/spring-boot:v1.0

Le Dockerfile est:

FROM openjdk:14-alpine
MAINTAINER example.com
RUN mkdir -p /opt/demo-0.0.1/lib
# Setting application source code working directory
WORKDIR /opt/demo-0.0.1/
COPY target/demo-0.0.1-SNAPSHOT.jar /opt/demo-0.0.1/lib/demo-0.0.1-SNAPSHOT.jar
# ADD target/demo-0.0.1-SNAPSHOT.jar /opt/demo-0.0.1/lib/

RUN sh -c 'touch demo-0.0.1-SNAPSHOT.jar'
ENTRYPOINT ["java"]
CMD ["-jar", "/opt/demo-0.0.1/lib/demo-0.0.1-SNAPSHOT.jar"]

Mais lorsque j'exécute ce flux de travail, j'ai cette erreur à l' COPYinstruction:

Step 5/8 : COPY target/demo-0.0.1-SNAPSHOT.jar /opt/demo-0.0.1/lib/demo-0.0.1-SNAPSHOT.jar
COPY failed: stat /var/lib/docker/tmp/docker-builder851513197/target/demo-0.0.1-SNAPSHOT.jar: no such file or directory
##[error]Process completed with exit code 1.

J'ai vérifié et cela ressemble à une erreur typique lorsque le fichier que nous avons Dockerfiledans un répertoire différent comme mon instruction:

docker build . --file backend/Dockerfile --tag backend-demo/spring-boot:v1.0

Je n'ai pas non plus de .dockerignorefichier et mon Dockerfile est appelé Dockerfileavec précision.

Le target/demo-0.0.1-SNAPSHOT.jarfichier que j'essaie de copier est présent dans mon référentiel github Vous ne savez pas ce qui pourrait se passer avec le contexte, mais cette réponse pourrait probablement être un bon indice?

Réponses

4 DavidMaze Aug 18 2020 at 07:46

Quand tu cours

docker build . --file backend/Dockerfile ...

L'argument chemin .devient le répertoire de contexte . (Docker s'envoie en fait une copie de cette arborescence de répertoires, d'où /var/lib/docker/tmp/...provient le chemin.) Les arguments source COPYet les ADDinstructions sont relatifs au répertoire de contexte et non au Dockerfile.

Si votre arbre source ressemble à

.
+-- backend
| \-- Dockerfile
\-- target
  \-- demo-0.0.1-SNAPSHOT.jar

qui correspond au Dockerfile que vous affichez. Mais si à la place tu as

.
+-- backend
  +-- Dockerfile
  \-- target
    \-- demo-0.0.1-SNAPSHOT.jar

vous obtiendrez l'erreur que vous voyez.

Si vous n'avez pas besoin de faire référence à quoi que ce soit en dehors du répertoire contextuel, vous pouvez simplement changer le répertoire auquel vous passez docker build

COPY target/demo-0.0.1-SNAPSHOT.jar /opt/demo-0.0.1/lib/demo-0.0.1-SNAPSHOT.jar
docker build backend ...

Ou, si vous avez un autre contenu que vous devez copier, vous devez modifier les COPYchemins pour qu'ils soient relatifs au répertoire supérieur.

COPY backend/target/demo-0.0.1-SNAPSHOT.jar /opt/demo-0.0.1/lib/demo-0.0.1-SNAPSHOT.jar
COPY common/config/demo.yml /opt/demo-0.0.1/etc/demo.yml
docker build . -f backend/Dockerfile ...
1 serialkiller Aug 18 2020 at 00:58

WORKDIR vous indique simplement d'où les autres commandes seront exécutées.Un point important est que WORKDIR fonctionne dans le répertoire docker, pas dans le répertoire local / git.Comme dans votre exemple, WORDIR ne prend pas le contexte dans /opt/demo-0.0.1/ , mais crée simplement un répertoire vide comme /opt/demo-0.0.1/ dans le menu fixe . Pour que dockerfile fonctionne, vous devez donner le chemin complet dans la commande COPY comme COPY /opt/demo-0.0.1/target/demo-0.0.1-SNAPSHOT.jar /opt/demo-0.0.1/lib/demo- 0.0.1-SNAPSHOT.jar. Assurez-vous que Dockerfile est au même niveau que le répertoire / opt.