Skip to content

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 フラグを追加して、明示的にターゲットプラットフォームを指定します:

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

この方法では、Dockerfileを変更する必要がなく、コマンド実行時のオプションで解決できます。

方法2: Dockerfile内でプラットフォームを指定

Dockerfileの FROM 命令でプラットフォームを明示的に指定します:

dockerfile
FROM --platform=linux/amd64 ubuntu:focal

これにより、ビルドプロセス全体がx86_64アーキテクチャ用として実行されます。

方法3: 環境変数でデフォルトプラットフォームを設定

システム全体のデフォルトプラットフォームを環境変数で設定することもできます:

bash
export DOCKER_DEFAULT_PLATFORM=linux/amd64

この設定後、すべてのDockerコマンドで指定したプラットフォームが使用されます。

方法4: マルチアーキテクチャ対応のDockerfileを作成

長期的な解決策として、マルチアーキテクチャに対応した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用にコンパイルされたバイナリを使用することを検討してください:

dockerfile
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を使用する際のアーキテクチャ問題は、以下のいずれかの方法で解決できます:

  1. 明示的なプラットフォーム指定(ビルド時またはDockerfile内)
  2. 環境変数でのデフォルト設定
  3. マルチアーキテクチャ対応のDockerfile作成
  4. ARM64ネイティブ環境の構築

状況に応じて最適な方法を選択してください。特にチームで開発している場合は、マルチアーキテクチャ対応のDockerfileを作成することが長期的な解決策となります。