傷の画像には何も含まれていません。ファイルはありません。しかし実際には、それはあなたの利点に働くことができます。 CGO_ENABLED=0
で構築されたGoバイナリは、使用するもの以外には何も必要ありません。いくつかのことを覚えておいてください。
CGO_ENABLED=0
では、Cコードを使用できません。実際はあまりにも難しくありません。
CGO_ENABLED=0
で、あなたのアプリはシステムDNSリゾルバを使用しません。私はそれがブロッキングでGoのネイティブDNSリゾルバが非ブロッキングであるため、デフォルトでは、とにかくとは思えません。
- アプリが存在しないいくつかのものに依存してもよい:HTTPS呼び出しを行う
- アプリ(他のサービスに、のように、すなわちアマゾンS3、またはストライプAPI)が順番にへのCA-certsのが必要になりますHTTPS証明書の信頼性を確認します。これはまた、時間とともに更新されなければならない。これは、HTTPSコンテンツの配信には必要ありません。
- タイムゾーンの認識が必要なアプリケーションには、タイムゾーン情報ファイルが必要です。
FROM scratch
の素敵な代替は、ベースアルパイン画像が含まれる、FROM alpine
ある - (私は信じている5つのMIB)の非常に小さなで、ゴーと互換性のあるMUSLのlibcのを、含まれており、あなたにできるようになりますCライブラリにリンクするだけでなく、CGO_ENABLED=0
を設定せずにコンパイルします。また、tzinfoとca-certsを使用してアルプスが定期的に更新されているという事実を利用することもできます。
(DockerレイヤのオーバーヘッドはDockerの重複排除のために少しずつ償却されますが、基本的なイメージが更新される頻度は否定されますが、それでもかなり小さいアルプスの画像)
tzinfoやca-certsは今必要ないかもしれませんが、残念ながら安全である方が良いでしょう。誤って依存関係を追加すると、ビルドが中断されていることを認識せずに済みます。だからalpine
をあなたの拠点に使うことをお勧めします。 alpine:latest
は問題ありません。
ボーナス:Docker内で再現可能なビルドの利点を望むが、画像サイズが小さい場合は、Docker 17.06+で提供されている新しいDockerマルチステージビルドを使用できます。
それは少し、このように動作します:
FROM golang:alpine
ADD . /go/src/github.com/some/gorepo # may need some go getting if you don't vendor
RUN go build -o /app github.com/some/gorepo
FROM scratch # or alpine
COPY --from=0 /app /app
ENTRYPOINT ["/app"]
(私は間違いを作った場合、私はメモリからそのを入力していお詫び申し上げます。シェルフォームが動作しませんので、あなたは、ENTRYPOINT
のexecのフォームを使用しなければならないFROM scratch
を使用している場合(これはこれはアルパインで正常に動作しますそれはないでしょう。)、/bin/sh
を持つドッカーの画像に依存していること)
注意。
ありがとう、ジョン!良い説明、特に証明書に関するあなたのヒントは、私が将来彼らを必要とすると確信しています。 –