我在M1 MacOS上有一个Rancher Deskop(dockerd),当我尝试构建dockerfile以下的文件时,我会遇到如下错误。下面是我如何尝试构建映像docker build -t te-grafana-dashboards-toolchain --no-cache .
的命令
我试着改变平台,但没有一个对我有效。我对M1的平台问题有点困惑,但任何帮助都将不胜感激,我做错了什么?什么可能是根本原因?
Removing intermediate container 70af516d5d6b
---> a69229847153
Step 5/6 : RUN GO111MODULE="on" go get github.com/jsonnet-bundler/jsonnet-bundler/cmd/jb; ln -s $(go env GOPATH)/bin/jb /usr/bin/jb
---> Running in 13545862fffe
qemu-x86_64: Could not open '/lib64/ld-linux-x86-64.so.2': No such file or directory
qemu-x86_64: Could not open '/lib64/ld-linux-x86-64.so.2': No such file or directory
Removing intermediate container 13545862fffe
停靠文件
FROM --platform=linux/amd64 ubuntu:focal
RUN apt update; apt install -y curl jq build-essential python3.8 python3-pip docker-compose jsonnet bison mercurial
RUN ln -s /usr/bin/python3.8 /usr/bin/python
RUN curl -OL https://golang.org/dl/go1.17.linux-amd64.tar.gz; mkdir /etc/golang; tar -xvzf go1.17.linux-amd64.tar.gz -C /etc/golang; ln -s /etc/golang/go/bin/go /usr/bin/go; rm -f go1.17.linux-amd64.tar.gz
RUN GO111MODULE="on" go get github.com/jsonnet-bundler/jsonnet-bundler/cmd/jb; ln -s $(go env GOPATH)/bin/jb /usr/bin/jb
WORKDIR /workspace
6条答案
按热度按时间zzwlnbp81#
顺便说一句,如果它是有帮助的另一个谁降落在这里,我有同样的问题,在M1最大的MacBook Pro笔记本电脑试图做一个
docker build
从公司回购,这应该是一个相当不错的旅行路径,但我可能是唯一一个(这是一家小公司),拥有ARM64 M1“Apple Silicon”Mac。不过,我找到了解决方案(好吧,一个解决方案)我的情况是完全相反的OP的解决方案,这是添加--platform=linux/amd64
到docker文件的FROM行。否则,它将使用ARM64映像开始,而我并不知情,但稍后在Dockerfile中,构建将尝试安装和执行针对x86_64编译的代码。通过请求基本映像为
linux/amd64
来启动构建过程,最终基本映像为/lib64/ld-linux-x86-64.so.2
。这可能意味着所有内容都将模拟为x86_64 64通过qemu-x86_64
在ARM64 CPU上运行,所以如果你可以选择从ARM64映像开始,并且可以在构建时在容器内编译任何你不能作为ARM64二进制文件安装的软件,当你稍后在基于M1的Mac上运行容器时,它可能会更快。zy1mlcev2#
修改
Dockerfile
似乎是最常见的答案,但是您也可以将DOCKER_DEFAULT_PLATFORM
环境变量设置为linux/amd64
。原因似乎在于AArch64图像。
1mrurvl13#
这解决了我的问题。
6yoyoihd4#
将以下标志作为
CPPFLAGS
传递给C预处理器解决了我的M1中的类似问题将该值作为env var和密钥
CPPFLAGS
传递给相关服务。lqfhib0f5#
假设基础映像包含目标架构,另一个可能适用于您的情况的选项是使用Docker的内置
TARGETARCH
build arg。mdfafbf16#
我不想像in this answer建议的那样编辑Dockerfile,也不想像in this answer建议的那样设置环境变量,我更喜欢将平台作为参数传递给
docker build
命令,并带有--platform
标志。