La copie a échoué: stat / var / lib / docker / tmp / docker-xxx: aucun fichier ou répertoire de ce type
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' COPY
instruction:
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 Dockerfile
dans 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 .dockerignore
fichier et mon Dockerfile est appelé Dockerfile
avec précision.
Le target/demo-0.0.1-SNAPSHOT.jar
fichier 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
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 COPY
et les ADD
instructions 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 COPY
chemins 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 ...
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.