尝试运行 docker 映像时出现错误“xargs 不可用”

Xin*_*der 11 gradle docker

我正在尝试在 docker 中运行 hello word java 应用程序。该应用程序由 gradle init 生成。我使用 gradle installDist 生成可运行文件。我可以在本地运行可运行程序,没有任何问题。但是当我尝试从 docker 运行时出现错误。这是 docker 文件内容:

FROM gradle:7.1.0-jdk11 AS builder
WORKDIR /home/gradle/src
COPY --chown=gradle:gradle . /home/gradle/src
RUN gradle installDist

FROM openjdk:17-oracle
COPY --from=builder /home/gradle/src/build/install/app/ /app/
WORKDIR /app

CMD ["bin/app"]
Run Code Online (Sandbox Code Playgroud)

docker 文件与 build.gradle 放置在同一文件夹中,并且从该文件夹运行 docker build 命令。构建运行成功。但是只要我在 docker GUI 中单击“运行”,容器就会立即失败,并显示错误消息“xargs 不可用”

Tol*_*mos 19

正如错误所描述的,xargs不可用。

查看你的Dockerfile,你使用的jdk镜像是基于Oracle Linux的

因此,您需要添加以下行来安装所需的包

RUN microdnf install findutils
Run Code Online (Sandbox Code Playgroud)

对于基于 Alpine 的图像,命令为:

RUN apk update && apk add findutils
Run Code Online (Sandbox Code Playgroud)

你的 Dockerfile 应该是

FROM gradle:7.1.0-jdk11 AS builder
WORKDIR /home/gradle/src
COPY --chown=gradle:gradle . /home/gradle/src
RUN gradle installDist

FROM openjdk:17-oracle
RUN microdnf install findutils
COPY --from=builder /home/gradle/src/build/install/app/ /app/
WORKDIR /app

CMD ["bin/app"]
Run Code Online (Sandbox Code Playgroud)


Jof*_*rey 6

xargs从 Gradle 版本 7.5 开始,添加了对存在的显式检查来解决此问题,这就是为什么您在运行 Gradle 包装器脚本本身或使用Gradle 分发xargs is not available构建的应用程序的启动脚本时看到该消息的原因插入

请注意,不存在的情况非常罕见xargs,因为它是 POSIX 标准的一部分。请参阅POSIX.1-2017 中 xargs 文档的这一部分(重点是我的):

xargs 实用程序通常仅在基于 System V 的系统中找到;BSD 系统包含一个 apply 实用程序,提供类似于 xargs -n number 的功能。SVID 将 xargs 列为软件开发扩展。POSIX.1-2017 的这卷不同意它仅用于开发的观点,因此它不是可选的。

但是openjdkDocker 镜像版本 >= 14 不包含xargs. 也就是说,这些图像已被弃用,不应再使用。xargs我测试了许多替代的 JDK 映像,并编译了在该问题的评论中已安装的映像的列表。在撰写本文时,除了已弃用的openjdk映像之外,只有ubi9-minimalEclipse Temurin 映像的变体没有xargs. 我测试的所有其他图像都正常。

如果您确实想使用默认情况下没有的映像xargs,您当然可以使用映像的包管理器xargs作为包的一部分进行安装,如另一个答案中所述。findutils