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

Dockerfile创buildDockerfile镜像的过程结束时,我收到了这个奇怪的错误:

 /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
  • 然后我login到该容器(命令: docker exec -it java_c bash ),
  • 然后我手动检查发现它们的gradle环境variables,
  • 然后我从运行的容器( gradle test jar )中手动运行那个注释掉的命令:

我最终得到预期的输出(编译的Java代码在生成文件夹中)。

我正在使用Docker版本1.6.2

我使用ENVdocker指令解决了这个问题( 链接到文档 )。

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

这个命令/bin/bash -c "source $HOME/.bashrc"意味着你创build一个新的非交互式进程,并在其中运行一个命令来设置环境variables。 这不影响父进程。 一旦variables设置,进程退出。 你可以通过运行这样的东西来检查:

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

应该是什么工作是这个选项:

 RUN source ~/.bashrc 

而它login的原因是因为新进程读取已经更新的~/.bashrc