skip to Main Content

I’m trying to run a hello word java application in docker. The application is produced by gradle init. I use gradle installDist to generate runnable file. I can run the runnable locally without any problem. But I got the error when I try to run from docker. Here is the docker file content:

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"]

The docker file is placed in the same folder with build.gradle and the docker build command is ran from that folder. Build runs successfully. But as long as I click run in the docker GUI, the container fails immediately with error message "xargs is not available"

2

Answers


  1. As the error describes, xargs is not available.

    Looking at your Dockerfile, the jdk image you use, is based on Oracle Linux

    So you need to add the following line, which installs the required package

    RUN microdnf install findutils
    

    For the Alpine based images the command would be:

    RUN apk update && apk add findutils
    

    Your Dockerfile should be

    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"]
    
    Login or Signup to reply.
  2. Since Gradle version 7.5, an explicit check for xargs presence has been added to solve this issue, which is why you’re seeing the message xargs is not available when running either the Gradle wrapper script itself, or a start script for an application that was built using the Gradle Distribution Plugin.

    Note that it is quite rare that xargs is not present, because it’s part of the POSIX standard. See this part of xargs doc in POSIX.1-2017 (emphasis mine):

    The xargs utility was usually found only in System V-based systems; BSD systems included an apply utility that provided functionality similar to xargs -n number. The SVID lists xargs as a software development extension. This volume of POSIX.1-2017 does not share the view that it is used only for development, and therefore it is not optional.

    However openjdk Docker images version >= 14 don’t include xargs. That said, those images are deprecated and should not be used anymore. I tested many alternative JDK images and compiled a list of the ones that do have xargs installed in this comment on the issue. At the time of writing, apart from the deprecated openjdk images, only ubi9-minimal variants of Eclipse Temurin images don’t have xargs. All other images I tested are OK.

    If you really want to use an image that doesn’t have xargs by default, you may of course install xargs as part of the findutils package using the package manager of the image, as described in the other answer.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search