Apple Silicon环境下基于micromamba的Docker构建卡在Transaction starting步骤
Apple Silicon(M2 MacBook Pro)构建VEBA Docker镜像问题
问题背景
我用M2处理器的MacBook Pro构建Docker镜像,之前在Intel Mac上多次成功构建。目前试过两种方式:
- 通过Rosetta模拟Intel运行iTerm2(
arch命令显示i386) - 直接用原生arm64环境(
arch命令显示arm64)
构建命令:
docker build --build-arg ENV_NAME=${ENV_NAME} -t ${TAG} -f Dockerfile ../../
Dockerfile内容:
# v2024.3.10 # ================================= FROM --platform=linux/amd64 mambaorg/micromamba:latest ARG ENV_NAME SHELL ["/usr/local/bin/_dockerfile_shell.sh"] WORKDIR /tmp/ # Data USER root RUN mkdir -p /volumes/ RUN mkdir -p /volumes/input RUN mkdir -p /volumes/output RUN mkdir -p /volumes/database # Retrieve VEBA repository RUN mkdir -p veba/ USER $MAMBA_USER COPY --chown=$MAMBA_USER:$MAMBA_USER ./install/ veba/install/ COPY --chown=$MAMBA_USER:$MAMBA_USER ./bin/ veba/bin/ COPY --chown=$MAMBA_USER:$MAMBA_USER ./VERSION veba/VERSION COPY --chown=$MAMBA_USER:$MAMBA_USER ./LICENSE veba/LICENSE # Fix: # critical libmamba Download error (28) Timeout was reached # [https://conda.anaconda.org/bioconda/linux-64/blast-2.13.0-hf3cf87c_0.tar.bz2] # Operation too slow. Less than 30 bytes/sec transferred the last 60 seconds ARG MAMBA_NO_LOW_SPEED_LIMIT=1 # Build .condarc RUN echo "channel_priority: flexible" >> ~/.condarc RUN echo "channels:" >> ~/.condarc RUN echo " - conda-forge" >> ~/.condarc RUN echo " - bioconda" >> ~/.condarc RUN echo " - jolespin" >> ~/.condarc # Install dependencies RUN micromamba install -y -n base -f veba/install/environments/${ENV_NAME}.yml && \ micromamba clean -a -y -f # Add environment scripts to environment bin RUN cp -rf veba/bin/* /opt/conda/bin/ && \ ln -sf /opt/conda/bin/scripts/*.py /opt/conda/bin/ && \ ln -sf /opt/conda/bin/scripts/*.r /opt/conda/bin/ ENTRYPOINT ["/usr/local/bin/_entrypoint.sh"]
奇怪的是昨晚还能成功构建对应VEBA-annotate_env.yml的镜像,现在不行了。需要构建的镜像依赖的yaml文件都在VEBA项目的install/environments目录下。
求问:如何在Apple Silicon上成功构建这些Docker镜像?
解决方案
1. 开启Docker跨平台构建支持
Apple Silicon上构建amd64镜像需要Docker的BuildKit和Rosetta模拟支持:
- 打开Docker Desktop设置,勾选"Use the new Virtualization framework"和"Enable Rosetta for x86/amd64 emulation on Apple Silicon"
- 启用buildx工具:
docker buildx create --use
2. 调整构建命令
用buildx显式指定平台构建,替换原来的命令:
docker buildx build --platform=linux/amd64 --build-arg ENV_NAME=${ENV_NAME} -t ${TAG} -f Dockerfile ../../ --load
--load参数会把构建好的amd64镜像加载到本地Docker仓库,方便直接运行。
3. 解决conda下载超时问题
大概率是源的网络问题,试试这些调整:
- 在Dockerfile的.condarc配置中添加超时参数:
RUN echo "remote_read_timeout_secs: 120" >> ~/.condarc RUN echo "remote_connect_timeout_secs: 30" >> ~/.condarc - 切换到国内镜像源(比如清华),替换原来的channels配置:
RUN echo "channel_priority: flexible" >> ~/.condarc RUN echo "channels:" >> ~/.condarc RUN echo " - https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/" >> ~/.condarc RUN echo " - https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/" >> ~/.condarc RUN echo " - jolespin" >> ~/.condarc RUN echo "default_channels:" >> ~/.condarc RUN echo " - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/" >> ~/.condarc RUN echo " - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r/" >> ~/.condarc RUN echo " - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2/" >> ~/.condarc - 清理Docker缓存,避免之前失败的缓存干扰:
docker builder prune -af
4. 检查Dockerfile权限与路径
- 确认
$MAMBA_USER在基础镜像中存在,避免复制文件时的权限错误 - 验证构建命令中的
../../是否正确指向VEBA项目根目录,确保COPY的文件能被找到
5. 尝试原生arm64构建(可选)
如果VEBA的依赖有arm64版本,可以去掉Dockerfile中--platform=linux/amd64,构建原生arm64镜像:
FROM mambaorg/micromamba:latest
但如果部分依赖只有amd64版本,还是得回到amd64模拟构建。
内容的提问来源于stack exchange,提问作者O.rka
相关产品推荐
相关产品推荐

