Dockerfile中的COPY或ADD命令未能找到Springboot应用程序的Jar文件

4

当我尝试将生成的JAR文件从目标文件夹复制到Docker镜像中的/usr/share/文件夹时,出现了以下错误。我已经搜索过Docker论坛网站,发现其他人也遇到了完全相同的问题,但没有明确的解决方案。

Step 9/10 : COPY target/${JAR_FILE} /usr/share/${JAR_FILE}
ERROR: Service 'myservice' failed to build: COPY failed: stat /var/lib/docker/tmp/docker-builder558103764/target/myservice.jar: no such file or directory

这是我的Dockerfile:

----------------------- 开始 ---------
FROM adoptopenjdk/openjdk11:alpine
MAINTAINER XXX XXX <ramil.xxxxx@xxxx.ai>

# Add the service itself
ARG JAR_FILE="myservice-1.0.0.jar"
RUN apk add maven
WORKDIR /app
COPY . /app/
RUN mvn -f /app/pom.xml clean install -DskipTests
WORKDIR /app
COPY target/${JAR_FILE} /usr/share/${JAR_FILE}

ENTRYPOINT ["java", "-jar", "/usr/share/myservice-1.0.0.jar"]
------ end snip -------

以下是我在我的Mac基础文件夹中如何运行此命令的方法。
docker build -t service-image .

在您的主机系统上,是否存在 ./target/myservice.jar 这个文件,其中 . 是包含 Dockerfile 的目录? - David Maze
你可以查看 https://github.com/palantir/gradle-docker - Arun P Johny
4个回答

5

我想你正在尝试将src移动到image,并运行mvn构建,然后将构建文件从目标位置复制到共享文件夹。

如果是这样,一切都很好,除了这行代码:

COPY target/${JAR_FILE} /usr/share/${JAR_FILE}
命令需要指定源和目标。它只允许将本地文件或目录从构建 Docker 镜像的主机(即计算机)复制到 Docker 镜像中。

我认为您的意图是将容器内的文件从 /target 复制到 /usr/share 文件夹。可以尝试以下命令:

RUN cp target/${JAR_FILE} /usr/share/${JAR_FILE}

关于你看到的错误是由于使用 COPY 命令,Docker 将尝试从主机的 Docker 默认路径获取文件引起的。即 /var/lib/docker/tmp/docker-builder558103764/,其中 /target 文件夹不存在。

MyTwoCents,你的解决方案很有效!非常感谢你的帮助。你的解释清晰简明。现在我完全理解了。 - ram mil

2

我遇到了类似的问题,因为我的.dockerignore文件有以下的排除:

target

可能的解决方案如下:
  • 不要忽略目标

  • 定义忽略异常

    !target/*.jar


0

在浏览Docker论坛后,另一个有效的方法是使用多阶段构建。多阶段构建不仅强制您使用指定工作目录的文件夹进行构建阶段,而且还显著减少了基础镜像的大小,比如只使用上面展示的单阶段构建,可以减少5-6倍。以下是我找到这个jar文件并将其用于我的较小基础镜像所指定的文件夹的解决方案。初始解决方案中的单阶段构建生成560 MB的镜像。下面的多阶段Dockerfile构建的镜像仅为108 MB

FROM adoptopenjdk/openjdk11:alpine as compile
MAINTAINER XXXX <ramil.xxxx@xxxx.ai>

# Build the jar using maven 
RUN apk add maven
WORKDIR /app
COPY . /app/
RUN mvn -f pom.xml clean package -DskipTests

FROM adoptopenjdk/openjdk11:alpine-jre
# Copy the packaged jar app file to a smaller JRE base image
COPY --from=compile "/app/target/service-1.0.0.jar" /usr/share/

ENTRYPOINT ["java", "-jar", "/usr/share/service-1.0.0.jar"]

0
原来我使用的 Dockerfile 希望在与 Dockerfile 不同的文件夹中执行。
所以,假设有一个 build_config_folder/Dockerfile...
因此,不是
docker build --build-arg SOME_ARG=value build_config_folder

# or 

cd build_config_folder
docker build --build-arg SOME_ARG=value .

它需要被这样做

docker build --build-arg SOME_ARG=value -f build_config_folder/Dockerfile .

这是因为最后一个路径位置参数决定了COPY命令将在哪里查找文件和文件夹。

希望能对某些人有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接