在docker镜像/容器中安装和使用Gradle

TPP*_*PPZ 1 java build gradle docker dockerfile

在从以下位置创建docker镜像的过程结束时,我收到了这个奇怪的错误Dockerfile:

/bin/sh: 1: gradle: not found
INFO[0003] The command [/bin/sh -c gradle test jar] returned a non-zero code: 127
Run Code Online (Sandbox Code Playgroud)

相关部分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
[...]
Run Code Online (Sandbox Code Playgroud)

我使用的命令是: 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版

Ale*_*x V 5

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

RUN /bin/bash -c "source $HOME/.bashrc; env"
RUN env
Run Code Online (Sandbox Code Playgroud)

应该工作的是这个选项:

RUN source ~/.bashrc
Run Code Online (Sandbox Code Playgroud)

并且它在您登录时起作用的原因是因为新进程读取了 already updated ~/.bashrc


TPP*_*PPZ 5

我使用ENVdocker说明解决了这个问题(链接到文档).

ENV GRADLE_HOME=/app/gradle-2.4
ENV PATH=$PATH:$GRADLE_HOME/bin
Run Code Online (Sandbox Code Playgroud)

  • 只需替换`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"```ENV GRADLE_HOME =/app/gradle-2.4 ENV PATH = $ PATH:$ GRADLE_HOME/bin` (4认同)