COPY falló: stat / var / lib / docker / tmp / docker-xxx: no existe tal archivo o directorio
Tengo un flujo de trabajo de acciones de github para construir una imagen de 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
El Dockerfile es:
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"]
Pero cuando ejecuto este flujo de trabajo, recibí este error en la COPY
instrucción:
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.
He estado comprobando y parece un error típico cuando el archivo que tenemos Dockerfile
en un directorio diferente como mi instrucción:
docker build . --file backend/Dockerfile --tag backend-demo/spring-boot:v1.0
Tampoco tengo .dockerignore
archivo y mi Dockerfile se llama con Dockerfile
precisión.
El target/demo-0.0.1-SNAPSHOT.jar
archivo que estoy tratando de copiar está presente en mi repositorio de github No estoy seguro de qué podría estar sucediendo con el contexto, pero probablemente esta respuesta podría ser una buena pista.
Respuestas
Cuando corres
docker build . --file backend/Dockerfile ...
El argumento de la ruta se .
convierte en el directorio de contexto . (Docker en realidad se envía a sí mismo una copia de este árbol de directorios, que es de donde /var/lib/docker/tmp/...
proviene la ruta). Los argumentos de origen COPY
y las ADD
instrucciones son relativos al directorio de contexto, no al Dockerfile.
Si su árbol de origen se parece a
.
+-- backend
| \-- Dockerfile
\-- target
\-- demo-0.0.1-SNAPSHOT.jar
que coincide con el Dockerfile que muestra. Pero si en cambio tienes
.
+-- backend
+-- Dockerfile
\-- target
\-- demo-0.0.1-SNAPSHOT.jar
obtendrá el error que ve.
Si no necesita hacer referencia a nada fuera del directorio de contexto, puede cambiar el directorio al que está pasando 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 ...
O, si tiene otro contenido que necesita copiar, necesita cambiar las COPY
rutas para que sean relativas al directorio superior.
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 simplemente le dice desde dónde se ejecutarán los otros comandos.Un punto importante es que WORKDIR funciona con el directorio docker, no con el directorio local / git.Según su ejemplo, WORDIR no toma contexto en /opt/demo-0.0.1/ , pero solo crea un directorio vacío como /opt/demo-0.0.1/ dentro de la ventana acoplable. Para hacer que el archivo docker funcione, debe proporcionar la ruta completa en el comando COPY como 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. Asegúrese de que Dockerfile esté al mismo nivel que el directorio / opt.