【问题标题】:Installing and using Gradle in a docker image/container在 docker 镜像/容器中安装和使用 Gradle
【发布时间】:2015-07-07 22:53:30
【问题描述】:

在从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 .

奇怪的是,如果:

  • 我从上一张图片中运行一个容器,注释掉RUN gradle test jar(命令:docker run -d -p 9093:8080 -p 9094:8081 --name java_c -i -t java_i),
  • 然后我登录到该容器(命令:docker exec -it java_c bash),
  • 然后我手动检查 gradle 环境变量找到它们,
  • 然后我从正在运行的容器 (gradle test jar) 中手动运行该注释掉的命令:

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

我使用的是 Docker 版本 1.6.2

【问题讨论】:

    标签: java gradle build docker dockerfile


    【解决方案1】:

    您可以使用多阶段构建和 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 文件)。

    【讨论】:

      【解决方案2】:

      我使用ENV docker 指令 (link to the documentation) 解决了这个问题。

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

      【讨论】:

      • 你可以在更改后发布 dockerfile 吗?
      • 只需将RUN echo 'export GRADLE_HOME=/app/gradle-2.4' &gt;&gt; $HOME/.bashrc RUN echo 'export PATH=$PATH:$GRADLE_HOME/bin' &gt;&gt; $HOME/.bashrc RUN /bin/bash -c "source $HOME/.bashrc" 替换为ENV GRADLE_HOME=/app/gradle-2.4 ENV PATH=$PATH:$GRADLE_HOME/bin
      【解决方案3】:

      我试图安装与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
      

      【讨论】:

      • 确实如此,答案可以帮助人们在使用 Java 11 时安装比 gradle-2.4 更新的版本。?
      【解决方案4】:

      此命令/bin/bash -c "source $HOME/.bashrc" 表示您创建一个新的非交互进程并在其中运行命令以在其中设置环境变量。这不影响父进程。一旦设置了变量,进程就会退出。您可以通过运行以下命令来检查:

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

      这个选项应该起作用:

      RUN source ~/.bashrc
      

      而在你登录时它工作的原因,是因为新进程读取已经更新~/.bashrc

      【讨论】:

      • 感谢您的提示!但是我已经在尝试这种事情了(我忘了说抱歉),我认为source 不是普通命令而是内置的shell,我得到的错误是:/bin/sh: 1: source: not found INFO[0002] The command [/bin/sh -c source ~/.bashrc] returned a non-zero code: 127
      猜你喜欢
      • 1970-01-01
      • 2019-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-08
      相关资源
      最近更新 更多