qemu-x86_64: Could not open '/lib64/ld-linux-x86-64.so.2' エラーの解決
Apple Silicon(M1/M2)MacでDockerを利用している際に、qemu-x86_64: Could not open '/lib64/ld-linux-x86-64.so.2': No such file or directory
というエラーに遭遇することがあります。これは、ARM64アーキテクチャのMacでx86_64(AMD64)アーキテクチャのコンテナを実行しようとした際に発生する一般的な問題です。
問題の原因
このエラーは、以下の状況で発生します:
- Apple Silicon Mac(ARM64アーキテクチャ)でDockerを実行している
- x86_64用にコンパイルされたバイナリやライブラリを実行しようとしている
- ベースイメージや依存関係が正しいアーキテクチャに対応していない
エラーメッセージにある /lib64/ld-linux-x86-64.so.2
は、x86_64アーキテクチャのLinuxシステムで共有ライブラリをロードするためのダイナミックリンカーです。ARM64環境ではこのファイルが存在しないため、エラーが発生します。
解決方法
方法1: Dockerビルド時にプラットフォームを指定(推奨)
Dockerビルドコマンドに --platform
フラグを追加して、明示的にターゲットプラットフォームを指定します:
docker build --platform linux/amd64 -t te-grafana-dashboards-toolchain --no-cache .
この方法では、Dockerfileを変更する必要がなく、コマンド実行時のオプションで解決できます。
方法2: Dockerfile内でプラットフォームを指定
Dockerfileの FROM
命令でプラットフォームを明示的に指定します:
FROM --platform=linux/amd64 ubuntu:focal
これにより、ビルドプロセス全体がx86_64アーキテクチャ用として実行されます。
方法3: 環境変数でデフォルトプラットフォームを設定
システム全体のデフォルトプラットフォームを環境変数で設定することもできます:
export DOCKER_DEFAULT_PLATFORM=linux/amd64
この設定後、すべてのDockerコマンドで指定したプラットフォームが使用されます。
方法4: マルチアーキテクチャ対応のDockerfileを作成
長期的な解決策として、マルチアーキテクチャに対応したDockerfileを作成する方法があります:
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
# TARGETARCHに基づいて適切なGoバイナリをダウンロード
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
この方法では、Dockerのビルクシット引数 TARGETARCH
を使用して、実行環境のアーキテクチャに応じた適切なバイナリを選択します。
注意
Goのバージョンによっては、アーキテクチャ名が異なる場合があります(例:ARM64の場合 arm64
または aarch64
)。使用するバイナリの命名規則を確認してください。
方法5: ARM64ネイティブの環境を構築
可能であれば、ARM64用にコンパイルされたバイナリを使用することを検討してください:
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
# ARM64用のGoバイナリを使用
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
パフォーマンスについて
ARM64ネイティブの環境を構築すると、Apple Silicon Macではエミュレーションオーバーヘッドがなくなるため、パフォーマンスが向上します。
まとめ
Apple Silicon MacでDockerを使用する際のアーキテクチャ問題は、以下のいずれかの方法で解決できます:
- 明示的なプラットフォーム指定(ビルド時またはDockerfile内)
- 環境変数でのデフォルト設定
- マルチアーキテクチャ対応のDockerfile作成
- ARM64ネイティブ環境の構築
状況に応じて最適な方法を選択してください。特にチームで開発している場合は、マルチアーキテクチャ対応のDockerfileを作成することが長期的な解決策となります。