在 docker image/container 中安装和使用 Gradle

Installing and using Gradle in a docker image/container

我在从 Dockerfile 创建 docker 图像的过程结束时收到这个奇怪的错误:

/bin/sh: 1: gradle: not found
INFO[0003] The command [/bin/sh -c gradle test jar] returned a non-zero code: 127

Dockerfile的相关部分:

FROM debian:jessie
[...]
RUN curl -L https://services.gradle.org/distributions/gradle-2.4-bin.zip -o gradle-2.4-bin.zip
RUN apt-get install -y unzip
RUN unzip gradle-2.4-bin.zip
RUN echo 'export GRADLE_HOME=/app/gradle-2.4' >> $HOME/.bashrc
RUN echo 'export PATH=$PATH:$GRADLE_HOME/bin' >> $HOME/.bashrc
RUN /bin/bash -c "source $HOME/.bashrc"
RUN gradle test jar
[...]

我使用的命令是:docker build -t java_i .

奇怪的是如果:

我最终得到了预期的输出(build 文件夹中编译的 java 代码)。

我正在使用 Docker 版本 1.6.2

这个命令/bin/bash -c "source $HOME/.bashrc"意味着你创建了一个新的非交互进程和运行其中的一个命令来在那里设置环境变量。这不会影响父进程。一旦设置了变量,进程就会退出。您可以通过 运行 宁这样的东西来检查:

RUN /bin/bash -c "source $HOME/.bashrc; env"
RUN env

这个选项应该起作用:

RUN source ~/.bashrc

它在您登录时起作用的原因是因为新进程读取已经更新~/.bashrc

我使用 ENV docker 说明 (link to the documentation) 解决了问题。

ENV GRADLE_HOME=/app/gradle-2.4
ENV PATH=$PATH:$GRADLE_HOME/bin

我试图安装与 JDK 11.0.7 相同的版本,但 gradle-2.4 不起作用。并低于错误


FAILURE: Build failed with an exception.

* What went wrong:
Could not determine java version from '11.0.7'.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

我安装了更高版本来解决安装后的上述问题。
作为答案发布可能会对其他人有所帮助。

FROM openjdk:11.0.7-jdk
RUN apt-get update && apt-get install -y unzip
WORKDIR /gradle
RUN curl -L https://services.gradle.org/distributions/gradle-6.5.1-bin.zip -o gradle-6.5.1-bin.zip
RUN unzip gradle-6.5.1-bin.zip
ENV GRADLE_HOME=/gradle/gradle-6.5.1
ENV PATH=$PATH:$GRADLE_HOME/bin
RUN gradle --version

您可以使用多阶段构建和 Gradle Docker 映像(无需安装 Gradle...)来构建应用程序,然后在运行时使用结果容器:

# Build
FROM gradle AS build

WORKDIR /appbuild
COPY . /appbuild

RUN gradle --version
# here goes your build code

Gradle 构建完成后,切换到运行时容器:

# Runtime
FROM openjdk:8-jre-alpine

# more stuff here...

COPY --from=0 appbuild/<somepath>/some.jar application.jar

# more stuff here...

COPY 命令将构建阶段的构建工件复制到运行时容器(在本例中为 jar 文件)。