2017-08-16 6 views
2

私にはFROM scratchを使用するオプションがあります。これは、Goのコンテナを構築するための本当に魅力的な方法です。Dockerスクラッチにはデフォルトで含まれているものは何ですか?

私の質問はGoバイナリを確実に実行するためにバイナリを実行するためにネイティブに何かを追加する必要がありますか? Compiled Goバイナリは、少なくとも私のラップトップでそれを実行するようです。

私の目標は、セキュリティとインフラ管理上の理由から、画像のサイズを最小限に抑えることです。最適な状況では、私のコンテナはビルドフェーズの外でバイナリやシェルコマンドを実行することができません。

答えて

5

傷の画像には何も含まれていません。ファイルはありません。しかし実際には、それはあなたの利点に働くことができます。 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を持つドッカーの画像に依存していること)

注意。

+0

ありがとう、ジョン!良い説明、特に証明書に関するあなたのヒントは、私が将来彼らを必要とすると確信しています。 –

関連する問題