【发布时间】:2019-02-21 21:57:16
【问题描述】:
我正在尝试构建用于开发 Android 应用程序的 Docker 映像。我有一个安装 JDK、Android SDK + NDK 的镜像。
当我运行映像并运行 gradle 包装器 (gradlew) 时,包装器会下载最新的 Gradle,然后是我的应用程序的所有依赖项,所以我看到如下消息:
Download https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle/3.1.4/gradle-3.1.4.pom
Download https://dl.google.com/dl/android/maven2/com/android/tools/build/builder/3.1.4/builder-3.1.4.pom
...
Download https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib-jre8/1.2.0/kotlin-stdlib-jre8-1.2.0.pom
Download https://jcenter.bintray.com/com/squareup/javawriter/2.5.0/javawriter-2.5.0.pom
...
Download https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle/3.1.4/gradle-3.1.4.jar
Download https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle-core/3.1.4/gradle-core-3.1.4.jar
等等
由于 Docker 容器的特性,每次我运行一个新容器时,它都必须重新下载所有这些依赖项,就好像这是第一次一样。 (我可以重复使用容器,但我希望使用此图像的每个人都不必下载这些文件;并且出于其他原因,每次都使用新容器是可取的。)所以我想让它们“烘焙”进入” Docker 映像。最好的方法是什么?
一个想法是向 Dockerfile 添加指令以复制到我的项目的源代码中并进行构建(然后从映像中删除项目文件)。然而,这似乎很棘手(我们应该忽略不被 .git 跟踪的文件)和浪费(为什么实际上要进行整个构建;我只想下载这些文件并将其放入适当的位置)。
另一种选择是进行构建,从构建输出中获取所有这些 URL,找出它们应该在磁盘上的位置(不知道如何执行此操作),然后在 Dockerfile 中添加指令以手动复制他们到位。但这似乎需要做很多工作,并且当我的应用依赖项发生变化时需要手动更新。
似乎应该有一种方法可以复制 gradle 包装器和一组最小的 gradle 构建文件并要求它“仅恢复依赖项”,但我一直无法找到这样的目标。有没有办法做到这一点?
【问题讨论】:
标签: android docker gradle android-gradle-plugin gradlew