報錯如下:解決方案很簡單,但是容易讓大家忽視的問題。
=> CACHED [stage-1 2/4] WORKDIR /work/ 0.0s=> CACHED [stage-1 3/4] RUN chown 1001 /work && chmod "g+rwX" /work && chown 1001:root /work 0.0s=> CACHED [build 2/4] WORKDIR /build/ 0.0s=> CACHED [build 3/4] COPY . . 0.0s=> ERROR [build 4/4] RUN ./mvnw -DskipTests=true clean package -Dnative -U 0.2s
------> [build 4/4] RUN ./mvnw -DskipTests=true clean package -Dnative -U:
0.164 /bin/sh: ./mvnw: No such file or directory
------
Dockerfile:44
--------------------42 | COPY . .43 | 44 | >>> RUN ./mvnw -DskipTests=true clean package -Dnative -U45 | 46 |
--------------------
文章主題已經點明解決方案:.dockerignore文件
。大家都使用過.gitignore,原理是一樣的。
我們看一下項目生成時,默認dockerignore內容是什么
*
!target/*-runner
!target/*-runner.jar
!target/lib/*
!target/quarkus-app/*
重點就是這個*
,默認將所有文件忽略啦,所以dockerfile運行命令時,無法使用./mvnw命令。之前的文章也提過,quarkus原生包鏡像需要依賴二進制文件,故target目錄下文件需要排除。下面簡單介紹一下:
.dockerignore
文件是用來指定在構建Docker鏡像時應該忽略的文件和目錄的配置文件。它的應用場景和原理如下:
- 應用場景
避免將不必要的文件和目錄復制到Docker鏡像中,減小鏡像大小。
提高構建速度,因為Docker在構建鏡像時會忽略.dockerignore中指定的文件和目錄,避免不必要的復制操作。 - 原理
在構建Docker鏡像時,Docker會讀取.dockerignore文件中列出的文件和目錄,并在構建鏡像時排除這些文件和目錄。
.dockerignore
文件的工作原理類似于.gitignore
文件,通過指定需要忽略的文件和目錄,可以在構建鏡像時過濾掉這些文件,只復制必要的文件到鏡像中。Docker會按照.dockerignore文件中的規則來判斷哪些文件和目錄應該被忽略,然后在構建鏡像時將其排除在外。