web-dev-qa-db-ja.com

Docker Alpineイメージの静的Goバイナリを構築するにはどうすればよいですか?

Go 1.9.2バイナリをビルドして、DockerAlpineイメージで実行したいと思います。私が書いたGoコードはCコードを呼び出しません。また、netパッケージも使用します。残念ながら、Goが常に静的バイナリを構築しているようには見えないため、思ったほど単純ではありませんでした。バイナリを実行しようとすると、バイナリが実行されなかった理由について不可解なメッセージが表示されることがよくあります。これについてはインターネット上にかなりの情報がありますが、そのほとんどは、バイナリを機能させるためにトライアルエラーを使用する人々になってしまいます。

これまでに以下の作品を見つけましたが、なぜそれが最適なのか、単純化できるのかわかりません。

env GOOS=linux GARCH=AMD64 go install -v -a -tags netgo -installsuffix netgo -ldflags "-linkmode external -extldflags -static"

Alpine 3.7 dockerイメージで実行されるGoバイナリを構築するための標準的な方法(存在する場合)は何ですか? apkを使用して、Alpineイメージにパッケージをインストールすると、作業がより効率的/簡単になります。 (とにかくca-certificatesをインストールする必要があると思います。)

5
Dan

はい、特にAlpineのような最小限のディストリビューションを使用する場合は、証明書などのリソースファイルを追加する必要がありますが、このような小さなディストリビューションでgoアプリケーションを実行できるという事実も利点と見なされることがよくあります。

証明書を追加するために、これはスクラッチコンテナでそれを行う方法を概説する本当に良い説明です:

https://blog.codeship.com/building-minimal-docker-containers-for-go-applications/

アルパインに固執したい場合は、このパッケージをインストールして入手できます。

https://pkgs.alpinelinux.org/package/v3.7/main/x86/ca-certificates

3
Iain Duncan