报错如下:解决方案很简单,但是容易让大家忽视的问题。
=> 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文件中的规则来判断哪些文件和目录应该被忽略,然后在构建镜像时将其排除在外。