COPY falló: stat / var / lib / docker / tmp / docker-xxx: no existe tal archivo o directorio

Aug 18 2020

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 COPYinstrucció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 Dockerfileen un directorio diferente como mi instrucción:

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

Tampoco tengo .dockerignorearchivo y mi Dockerfile se llama con Dockerfileprecisión.

El target/demo-0.0.1-SNAPSHOT.jararchivo 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

4 DavidMaze Aug 18 2020 at 07:46

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 COPYy las ADDinstrucciones 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 COPYrutas 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 ...
1 serialkiller Aug 18 2020 at 00:58

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.