为何基于openjdk:8的Docker容器未装SVN却能执行svn命令?
为啥没装SVN的Docker容器居然能跑
svn checkout? 哈哈,这事儿确实有点反直觉——你明明没在Dockerfile里加任何安装SVN的步骤,脚本却能顺顺当当拉代码,核心原因其实很简单:你用的openjdk:8基础镜像本身就自带Subversion(SVN)工具!
给你掰扯清楚细节:
- 官方的
openjdk:8镜像(尤其是基于Debian/Ubuntu的标准版本,不是slim轻量版)是构建在Debian Stretch这类系统镜像之上的,而OpenJDK官方在打包这个镜像时,默认预装了一些常用的系统工具,subversion刚好就在里面。 - 你自己可以验证下,跑个临时容器就能确认:
执行完这个命令,你肯定能看到SVN的版本输出,这就实锤了基础镜像本身就带了SVN。docker run --rm openjdk:8 svn --version
不过这里给你提个醒:官方镜像的内容不是一成不变的,比如后来推出的openjdk:8-slim轻量版就砍掉了这类非必需工具。如果你的构建流程依赖SVN,最稳妥的做法还是在Dockerfile里显式安装它,免得哪天基础镜像更新了,你的构建突然就挂了:
FROM openjdk:8 RUN apt-get update && apt-get install -y subversion && rm -rf /var/lib/apt/lists/* COPY . /usr/src/myapp WORKDIR /usr/src/myapp CMD ["./checkoutAndRunGradle.sh"]
另外顺带说一句:你的脚本里用sh gradlew,其实只要给gradlew加上执行权限(chmod +x gradlew),直接用./gradlew clean build会更规范哦。
内容的提问来源于stack exchange,提问作者alebo611
相关产品推荐
相关产品推荐

