2017-12-05 11 views
1

私はARM(arm32v7)コンテナをビルドしようとしていますが、x86_64ホストを使用しています。 Qemu shenanigansを使用しているResinのようなかなりクールなものがあることを知っていますが、一般的なコンテナのクロスビルディングにはMultiarchという問題があります。私が構築しようとしているコンテナはマルチarchとして始まり、 FROM命令の画像。クロスコンパイルマルチアーチコンテナ

私は、x86ホスト上のMulti-arch Rust imageからARMコンテナを構築したいと考えています。問題は、明示的に私がARMコンテナから始めて、x86コンテナではなくビルドしたいと言っているドキュメントは見つかりません。さらに、イメージ上のタグは曖昧さがないので、それらを使用して開始コンテナを選択することはできません。

{ 
    "labels": [ "os=linux", "arch=arm32v7" ], 
    "experimental": true 
} 

をそれがすべてで助けていません。

私は含まれて/etc/docker/daemon.jsonファイルを編集しようとしました。 docker pullはまだx86イメージを取得します。このすべての目的は、最終的にRaspberry Piで動作するコンテナのコンパイル時間を向上させることです。コンパイル時間は非常に遅いです。

明示的にARMイメージを使用してビルドする方法はありますか?

+1

私はその時点でそれをしていたとは思わない。私もそれに苦しんで、実際のデバイスを使って終了しました:https://blog.slucas.fr/blog/docker-multiarch-manifest-hub-2/ – seblucas

答えて

1

そのアーキテクチャーに適した基本イメージを使用することで、別のアーキテクチャー用の簡単なDockerコンテナー(クロスコンパイル)を構築することができます(クロスコンパイル)。簡単に言うと、DockerfileにRUNコマンドを組み込む必要のない画像を意味します。これは、Dockerには別のアーキテクチャのコンテナで実際にコマンドを実行する機能がないためです。これは制限的なように聞こえるが、コードをクロスコンパイルするときはmulti-stage buildsと組み合わせるとかなり強力になる。

この手順を歩みましょう。まず第一に、私たちのドッカークライアントは~/.docker/config.jsonに次のオプションを追加することでdocker manifestを有効にするための実験モードを有効にしてみましょう:

{ 
    "experimental": "enabled" 
} 
我々は、我々が望むアーキテクチャでイメージのダイジェストが含まれている fat manifestを表示する docker manifest inspect debian:stretchを使用することができます

のために構築する。たとえば、arm32v7イメージには"architecture": "arm"および"variant": "v7"platformキーの下に指定されています。 jqを使用して、我々はプログラム的にこのイメージのためにダイジェストを抽出することができます。

docker manifest inspect debian:stretch | jq -r '.manifests[] | select(.platform.architecture == "arm" and .platform.variant == "v7") | .digest'` 

を、このダイジェストは、その後DockerfileにFROMコマンドで使用することができます:

FROM [email protected]:d01d682bdbacb520a434490018bfd86d76521c740af8d8dbd02397c3415759b1 

それはその後、クロスコンパイルCOPYすることが可能ですイメージにバイナリこのバイナリは、マシン上のクロスコンパイラや、マルチステージビルドの別のコンテナから来る可能性があります。 DockerfileのFROM行にハードコードされたダイジェストを取り除くには、Docker build argument (ARG)で外部化することができます。