Go语言 qemu-x86_64:无法打开“/”文件夹:无此文件或目录

mftmpeh8  于 2023-01-10  发布在  Go
关注(0)|答案(6)|浏览(619)

我在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
zzwlnbp8

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上运行容器时,它可能会更快。

zy1mlcev

zy1mlcev2#

修改Dockerfile似乎是最常见的答案,但是您也可以将DOCKER_DEFAULT_PLATFORM环境变量设置为linux/amd64

export DOCKER_DEFAULT_PLATFORM=linux/amd64

原因似乎在于AArch64图像。

1mrurvl1

1mrurvl13#

这解决了我的问题。

FROM 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-arm64.tar.gz; mkdir /etc/golang; tar -xvzf go1.17.linux-arm64.tar.gz -C /etc/golang; ln -s /etc/golang/go/bin/go /usr/bin/go; rm -f go1.17.linux-arm64.tar.gz
RUN GO111MODULE="on" go get github.com/jsonnet-bundler/jsonnet-bundler/cmd/jb@latest; ln -s /root/go/bin/jb /usr/bin/jb
WORKDIR /workspace
6yoyoihd

6yoyoihd4#

将以下标志作为CPPFLAGS传递给C预处理器解决了我的M1中的类似问题

-DPNG_ARM_NEON_OPT=0

将该值作为env var和密钥CPPFLAGS传递给相关服务。

lqfhib0f

lqfhib0f5#

假设基础映像包含目标架构,另一个可能适用于您的情况的选项是使用Docker的内置TARGETARCH build arg。

FROM ubuntu:focal
ARG TARGETARCH
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-${TARGETARCH}.tar.gz; mkdir /etc/golang; tar -xvzf go1.17.linux-${TARGETARCH}.tar.gz -C /etc/golang; ln -s /etc/golang/go/bin/go /usr/bin/go; rm -f go1.17.linux-${TARGETARCH}.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
mdfafbf1

mdfafbf16#

我不想像in this answer建议的那样编辑Dockerfile,也不想像in this answer建议的那样设置环境变量,我更喜欢将平台作为参数传递给docker build命令,并带有--platform标志。

docker build --platform linux/amd64 -t te-grafana-dashboards-toolchain --no-cache .

相关问题