You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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压缩包复制到容器内:

    1. 下载对应版本的Gradle压缩包到项目目录
    2. 修改gradle-wrapper.properties:
      distributionUrl=file:///app/gradle-7.5-bin.zip
      
    3. 在Dockerfile的COPY . .步骤中会将压缩包复制到容器内,Gradle将直接使用本地文件。

内容的提问来源于stack exchange,提问作者Bastian8ify

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 06:24:52