在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
我使用ENV
docker指令解决了这个问题( 链接到文档 )。
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
。