Docker容器内安装cmdline-tools遇KeyError错误求助
解决Docker容器中安装cmdline-tools的KeyError问题
问题重现
执行RUN sdkmanager --install "cmdline-tools;latest"时触发以下错误:
=> ERROR [dev_container_auto_added_stage_label 12/16] RUN sdkmanager --i 3.7s ------ > [dev_container_auto_added_stage_label 12/16] RUN sdkmanager --install "cmdline-tools;latest": #0 3.680 Traceback (most recent call last): #0 3.680 File "/usr/bin/sdkmanager", line 33, in <module> #0 3.680 Downloading https://fdroid.gitlab.io/android-sdk-transparency-log/checksums.json.asc into /root/.cache/sdkmanager/checksums.json.asc #0 3.680 sys.exit(load_entry_point('sdkmanager==0.5.1', 'console_scripts', 'sdkmanager')()) #0 3.680 File "/usr/lib/python3/dist-packages/sdkmanager.py", line 1077, in main #0 3.680 method(args.packages) #0 3.680 File "/usr/lib/python3/dist-packages/sdkmanager.py", line 891, in install #0 3.681 url = packages[key] #0 3.681 KeyError: ('cmdline-tools','latest') ------
问题原因
你通过apt install sdkmanager -y安装的是第三方工具(来自fdroid),它和Google官方Android SDK自带的sdkmanager不是同一工具,不支持cmdline-tools;latest这种官方包名格式,因此抛出KeyError。
解决方案
1. 移除第三方sdkmanager
删除Dockerfile中的RUN apt install sdkmanager -y行,避免和官方工具冲突。
2. 使用官方SDK的sdkmanager安装组件
在已下载的官方Android SDK工具目录下,调用自带的sdkmanager安装cmdline-tools;latest。
3. 统一环境变量路径
修正ANDROID_HOME路径大小写不一致的问题(原Dockerfile中同时出现/Android/sdk和/Android/Sdk),确保路径统一。
修改后的完整Dockerfile
FROM ubuntu:22.04 # Clear the cache RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* # Prerequisites RUN apt update && apt install -y curl git unzip xz-utils zip libglu1-mesa openjdk-8-jdk wget # Prepare Android directories and system variables RUN mkdir -p /Android/sdk ENV ANDROID_SDK_ROOT /Android/sdk ENV ANDROID_HOME /Android/sdk RUN mkdir -p ~/.android && touch ~/.android/repositories.cfg # Set up Android SDK RUN wget -O sdk-tools.zip https://dl.google.com/android/repository/sdk-tools-linux-4333796.zip RUN unzip sdk-tools.zip && rm sdk-tools.zip RUN mv tools /Android/sdk/tools # Accept all licenses RUN cd /Android/sdk/tools/bin && yes | ./sdkmanager --licenses # Install SDK components including cmdline-tools RUN cd /Android/sdk/tools/bin && ./sdkmanager \ "build-tools;29.0.2" \ "patcher;v4" \ "platform-tools" \ "platforms;android-29" \ "sources;android-29" \ "cmdline-tools;latest" # Add SDK tools to PATH ENV PATH=$PATH:$ANDROID_HOME/cmdline-tools/latest/bin:$ANDROID_HOME/platform-tools # Set up new user RUN useradd -ms /bin/bash developer USER developer # Download Flutter SDK RUN git clone https://github.com/flutter/flutter.git /home/developer/flutter # Set Flutter environment path ENV PATH="/home/developer/flutter/bin:/home/developer/flutter/bin/cache/dart-sdk/bin:${PATH}" # Verify setup with Flutter doctor RUN flutter doctor WORKDIR /home/developer
关键调整说明
- 统一
ANDROID_HOME与ANDROID_SDK_ROOT路径,避免大小写导致的路径错误 - 直接调用官方SDK自带的
sdkmanager安装cmdline-tools;latest - 提前将
platform-tools加入PATH,确保切换用户后可正常使用adb等工具 - 移除第三方
sdkmanager安装命令,彻底消除工具冲突
内容的提问来源于stack exchange,提问作者Alyana Mahesh
相关产品推荐
相关产品推荐

