COPY gagal: stat / var / lib / docker / tmp / docker-xxx: tidak ada file atau direktori seperti itu
Saya memiliki alur kerja tindakan github untuk membuat gambar buruh pelabuhan:
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
Dockerfile adalah:
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"]
Tetapi ketika saya menjalankan alur kerja ini, saya mendapat kesalahan ini pada COPY
instruksi:
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.
Saya telah memeriksa dan itu terlihat kesalahan khas ketika file yang kita miliki Dockerfile
di direktori yang berbeda seperti instruksi saya:
docker build . --file backend/Dockerfile --tag backend-demo/spring-boot:v1.0
Saya juga tidak memiliki .dockerignore
file dan Dockerfile saya dipanggil dengan Dockerfile
tepat.
The target/demo-0.0.1-SNAPSHOT.jar
File Saya mencoba untuk copy hadir dalam repositori github saya Tidak yakin apa yang bisa terjadi dengan konteks, tapi mungkin jawaban ini bisa menjadi petunjuk yang baik?
Jawaban
Saat kamu lari
docker build . --file backend/Dockerfile ...
Argumen jalur .
menjadi direktori konteks . (Docker sebenarnya mengirimkan sendiri salinan dari pohon direktori ini, yang merupakan tempat asal /var/lib/docker/tmp/...
jalur.) Argumen sumber COPY
dan ADD
instruksi relatif terhadap direktori konteks, bukan relatif terhadap Dockerfile.
Jika pohon sumber Anda terlihat seperti
.
+-- backend
| \-- Dockerfile
\-- target
\-- demo-0.0.1-SNAPSHOT.jar
yang cocok dengan Dockerfile yang Anda tampilkan. Tetapi jika sebaliknya Anda punya
.
+-- backend
+-- Dockerfile
\-- target
\-- demo-0.0.1-SNAPSHOT.jar
Anda akan mendapatkan kesalahan yang Anda lihat.
Jika Anda tidak perlu merujuk ke apa pun di luar direktori konteks, Anda dapat mengubah direktori yang Anda teruskan 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 ...
Atau, jika Anda memiliki konten lain yang perlu Anda salin, Anda perlu mengubah COPY
jalur agar relatif ke direktori paling atas.
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 hanya memberi tahu Anda dari mana perintah lain akan dieksekusi. Poin pentingnya adalah WORKDIR bekerja dengan direktori docker, bukan ke direktori lokal / git. Sesuai contoh Anda, WORDIR tidak mengambil konteks ke /opt/demo-0.0.1/ , tetapi hanya membuat direktori kosong sebagai /opt/demo-0.0.1/ di dalam buruh pelabuhan. Agar dockerfile berfungsi, Anda harus memberikan path lengkap dalam perintah COPY sebagai 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 . Pastikan Dockerfile berada pada level yang sama dengan direktori / opt.