Docker构建Flutter APK遇Gradle域名解析网络问题求助
问题描述
使用Docker构建Flutter应用APK时,执行flutter build apk --release步骤抛出java.net.UnknownHostException: objects.githubusercontent.com异常,尝试添加--network=host参数构建后问题仍未解决。
错误详情
> [17/17] RUN flutter build apk --release: 1.420 1.496 Running Gradle task 'assembleRelease'... 12.76 Exception in thread "main" java.net.UnknownHostException: objects.githubusercontent.com 12.76 at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:572) 12.76 at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) 12.76 at java.base/java.net.Socket.connect(Socket.java:633) 12.76 at java.base/sun.security.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:304) 12.76 at java.base/sun.security.ssl.BaseSSLSocketImpl.connect(BaseSSLSocketImpl.java:174) 12.76 at java.base/sun.net.NetworkClient.doConnect(NetworkClient.java:183) 12.76 at java.base/sun.net.www.http.HttpClient.openServer(HttpClient.java:533) 12.76 at java.base/sun.net.www.http.HttpClient.openServer(HttpClient.java:638) 12.76 at java.base/sun.net.www.protocol.https.HttpsClient.<init>(HttpsClient.java:266) 12.76 at java.base/sun.net.www.protocol.https.HttpsClient.New(HttpsClient.java:380) 12.76 at java.base/sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(AbstractDelegateHttpsURLConnection.java:193) 12.76 at java.base/sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1241) 12.76 at java.base/sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1127) 12.76 at java.base/sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:179) 12.76 at java.base/sun.net.www.protocol.http.HttpURLConnection.followRedirect0(HttpURLConnection.java:2943) 12.76 at java.base/sun.net.www.protocol.http.HttpURLConnection.followRedirect(HttpURLConnection.java:2852) 12.76 at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1948) 12.76 at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1610) 12.76 at java.base/sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:224) 12.76 at org.gradle.wrapper.Download.downloadInternal(Download.java:58) 12.76 at org.gradle.wrapper.Download.download(Download.java:44) 12.76 at org.gradle.wrapper.Install$1.call(Install.java:61) 12.76 at org.gradle.wrapper.Install$1.call(Install.java:48) 12.76 at org.gradle.wrapper.ExclusiveFileAccessManager.access(ExclusiveFileAccessManager.java:65) 12.76 at org.gradle.wrapper.Install.createDist(Install.java:48) 12.77 at org.gradle.wrapper.WrapperExecutor.execute(WrapperExecutor.java:128) 12.77 at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:61) 12.77 Running Gradle task 'assembleRelease'... 11.3s 12.83 Gradle task assembleRelease failed with exit code 1
Dockerfile内容
# 使用包含Flutter构建所需工具的基础镜像 FROM ubuntu:22.04 # 安装Flutter、Android和Linux开发所需依赖 RUN apt-get update && apt-get install -y \ git \ wget \ unzip \ curl \ cmake \ clang \ ninja-build \ pkg-config \ libgtk-3-dev \ liblzma-dev \ openjdk-17-jdk \ build-essential \ libgl1-mesa-dev \ && rm -rf /var/lib/apt/lists/* # 安装Android SDK和命令行工具 RUN mkdir -p /opt/android-sdk-linux/cmdline-tools/latest && \ cd /opt/android-sdk-linux/cmdline-tools/latest && \ wget https://dl.google.com/android/repository/commandlinetools-linux-8512546_latest.zip && \ unzip commandlinetools-linux-8512546_latest.zip && \ mv cmdline-tools/* . && \ rm -rf cmdline-tools commandlinetools-linux-8512546_latest.zip # 设置Android SDK和Flutter的环境变量 ENV ANDROID_HOME=/opt/android-sdk-linux ENV PATH=$ANDROID_HOME/cmdline-tools/latest/bin:$ANDROID_HOME/platform-tools:$PATH # 确保sdkmanager可执行 RUN chmod +x /opt/android-sdk-linux/cmdline-tools/latest/bin/sdkmanager RUN sdkmanager --version # 接受许可证并使用sdkmanager安装SDK组件 RUN yes | sdkmanager --licenses && \ sdkmanager "platform-tools" "platforms;android-33" "build-tools;33.0.0" # 克隆Flutter前创建非root用户 RUN useradd -m -s /bin/bash flutteruser # 创建/opt/flutter目录并修改所有权为非root用户 RUN mkdir -p /opt/flutter && chown -R flutteruser:flutteruser /opt/flutter /opt/android-sdk-linux # 切换到非root用户并克隆Flutter到/opt/flutter USER flutteruser RUN git clone https://github.com/flutter/flutter.git /opt/flutter # 为非root用户设置Flutter的PATH ENV PATH="/opt/flutter/bin:$ANDROID_HOME/cmdline-tools/latest/bin:$ANDROID_HOME/platform-tools:$PATH" # 设置工作目录 WORKDIR /app # 设置Flutter通道为stable并升级 RUN flutter channel stable && flutter upgrade # 接受Android SDK许可证 RUN yes | flutter doctor --android-licenses # 切换回root用户以复制项目文件并修改所有权 USER root # 复制Flutter项目文件到容器内 COPY . . # 修改项目文件所有权为flutteruser RUN chown -R flutteruser:flutteruser /app # 切换回非root用户执行后续命令 USER flutteruser # 安装依赖 RUN flutter pub get # 检查Flutter安装状态 RUN flutter doctor -v # 构建发布版APK RUN flutter build apk --release # APK将位于/app/build/app/outputs/flutter-apk/目录下
构建命令
docker build -t my-flutter-app .
解决方案
针对域名解析失败导致的构建错误,可尝试以下几种方法:
指定容器DNS服务器
构建容器时手动指定可靠的DNS服务器,比如谷歌的8.8.8.8或Cloudflare的1.1.1.1:docker build --dns 8.8.8.8 --dns 1.1.1.1 -t my-flutter-app .也可以在Dockerfile的基础镜像之后添加配置:
FROM ubuntu:22.04 # 添加DNS配置 RUN echo "nameserver 8.8.8.8" > /etc/resolv.conf && echo "nameserver 1.1.1.1" >> /etc/resolv.conf替换Gradle镜像源
修改项目android/build.gradle中的仓库地址为国内镜像,避免访问GitHub时的网络问题:buildscript { repositories { maven { url 'https://maven.aliyun.com/repository/google' } maven { url 'https://maven.aliyun.com/repository/jcenter' } maven { url 'https://maven.aliyun.com/nexus/content/groups/public' } } // 保留原有的dependencies等内容 } allprojects { repositories { maven { url 'https://maven.aliyun.com/repository/google' } maven { url 'https://maven.aliyun.com/repository/jcenter' } maven { url 'https://maven.aliyun.com/nexus/content/groups/public' } } }提前安装Gradle到容器
避免构建时动态下载Gradle,直接在Dockerfile中添加安装步骤(替换版本号为项目使用的Gradle版本,可从gradle/wrapper/gradle-wrapper.properties的distributionUrl获取):USER root RUN wget https://services.gradle.org/distributions/gradle-7.5-bin.zip -P /tmp && \ unzip /tmp/gradle-7.5-bin.zip -d /opt && \ rm /tmp/gradle-7.5-bin.zip && \ ln -s /opt/gradle-7.5/bin/gradle /usr/bin/gradle USER flutteruser ENV GRADLE_HOME=/opt/gradle-7.5 ENV PATH=$GRADLE_HOME/bin:$PATH配置Gradle离线模式
提前下载项目所需的Gradle版本到本地,修改gradle/wrapper/gradle-wrapper.properties中的distributionUrl为本地文件路径,再将Gradle压缩包复制到容器内:- 下载对应版本的Gradle压缩包到项目目录
- 修改
gradle-wrapper.properties:distributionUrl=file:///app/gradle-7.5-bin.zip - 在Dockerfile的
COPY . .步骤中会将压缩包复制到容器内,Gradle将直接使用本地文件。
内容的提问来源于stack exchange,提问作者Bastian8ify
相关产品推荐
相关产品推荐

