週末の間、私は特に Go (Golang) アプリケーションで使用する Docker イメージについていくつかの調査を行っていました。そこで、技術プロジェクトで同じことを研究している人にとって役立つかもしれないので、興味深い発見を共有することを考えました。
ここでは、Golang 用のイメージを構築するいくつかの異なる方法について詳しく説明し、選択する際に考慮する必要があるセキュリティ上の考慮事項のいくつかについても強調します。
この演習では、Gin フレームワークを使用して Go (Golang) を使用して開発された単純な Rest API を使用しました。
Gin フレームワーク は、高速で使いやすく、効率性が高いように設計された Go (Golang) 用の人気のある Web フレームワークです。
主な機能と特徴を簡単にまとめます。
主な機能
パフォーマンス: ジンはその高いパフォーマンスで知られています。これは最速の Go Web フレームワークの 1 つであり、他のフレームワークと比較してオーバーヘッドが最小限に抑えられます。
高速 HTTP ルーター: Gin は高速 HTTP ルーターを使用し、GET、POST、PUT、DELETE などのメソッドによるルーティングをサポートします。また、ミドルウェアとルート グループ化もサポートします。
ミドルウェアのサポート:gin は、ミドルウェアを使用してログ記録、認証、その他のリクエストの前処理または後処理などのタスクを処理する方法を提供します。
JSON 検証: このフレームワークは、JSON 検証の組み込みサポートと Go 構造体へのリクエスト データのバインドを提供し、JSON ペイロードの操作を容易にします。
エラー処理:gin には構造化されたエラー処理方法があり、集中エラー管理システムを提供しているため、エラーを適切に処理できます。
テンプレート レンダリング: Gin は主に API 開発用に設計されていますが、必要に応じて HTML テンプレート レンダリングをサポートします。
リクエスト処理: フォーム データ、JSON ペイロード、URL パラメーターなどのリクエスト処理のさまざまなメソッドをサポートします。
組み込みデバッグ:gin は、開発中に役立つ詳細なエラー メッセージとデバッグ情報を提供します。
ルーター: 適切なハンドラーへの HTTP リクエストのルーティングを処理するコア コンポーネント。
コンテキスト: リクエストとレスポンスのデータを運ぶ構造体、および
それらを処理するメソッドを提供します。これはハンドラー内で広く使用されます。
エンジン: ルート、ミドルウェア、その他の設定で構成される、Gin アプリケーションのプライマリ インスタンス。
ミドルウェア: リクエストのライフサイクル中に実行され、ロギング、認証などのタスクを実行できる関数
Gin フレームワークについては十分です :) 次に、本題に移り、実行されたテストについて話しましょう。
このテストでは、公式の標準/通常の Go ベース イメージを使用します
# Official Go Base Image FROM golang:1.21.0 # Create The Application Working Directory WORKDIR /app # Copy and Download Dependencies COPY go.mod go.sum . RUN go mod download # Copy Source and Build The Application COPY . . RUN go build -o main . # Expose The Port EXPOSE 8081 CMD ["./main"]
画像サイズ
このテストでは、少し軽量な Go Base Image の Alpine バージョンを使用します
# Official Go Apline Base Image FROM golang:1.21.0-alpine as builder # Create The Application Directory WORKDIR /app # Copy and Download Dependencies COPY go.mod go.sum . RUN go mod download # Copy The Application Source & Build COPY . . RUN go build -o main . # Final Image Creation Stage FROM alpine:3.19 WORKDIR /root/ # Copy The Built Binary COPY --from=builder /app/main . # Expose the port EXPOSE 8081 CMD ["./main"]
画像サイズ
ここでは、多段階ビルドによりイメージ サイズが大幅に削減されることがわかります。
このテストでは、Google の Distroless Go ベース イメージを使用します。 Distroless イメージは、必要な最小限のファイルのみを含む軽量かつ安全であることで知られています。これにより、これらのデバッグ シェルと不要なパッケージが削除されました。したがって、パッケージ マネージャーとシェルの柔軟性が犠牲になります。
# Build Stage FROM golang:1.21.0 as builder # Set The Application Directory WORKDIR /app # Copy and Download Dependencies COPY go.mod go.sum . RUN go mod download # Copy The Application Source and Build the application COPY . . RUN CGO_ENABLED=0 go build -o main . # Final Image Creation Stage FROM gcr.io/distroless/static-debian12 # Copy the built binary COPY --from=builder /app/main / CMD ["/main"]
画像サイズ
CGO_ENABLED=0: これは、CGO (C-Go) を無効にする環境変数設定です。 CGO は、Go パッケージで C コードを呼び出すことを可能にする Go の機能です。 CGO_ENABLED=0 を設定すると、ビルドが C ライブラリに依存せず、完全に静的なバイナリが生成されます。これは、追加の依存関係を必要とせずに、任意のシステム上で実行できる軽量でポータブルな Go バイナリを作成する場合に役立ちます。
すべてをまとめると、RUN CGO_ENABLED=0 go build -o main . は、Docker が現在のディレクトリに Go アプリケーションをビルドするコマンドを実行し、main という名前の静的バイナリを生成することを意味します。 C ライブラリに依存します。
画像サイズ
Distroless イメージは Alpine イメージよりわずかに大きいですが、セキュリティの脅威/脆弱性を考慮すると、Distroless! を選択せざるを得なくなる場合があります。したがって、これらすべての事実を考慮して、要件に一致するものを選択してください
Alpine with Multi-Stage Builds は、ビルド プロセスをさらに制御する必要があり、musl libc との互換性の問題が問題にならない場合に適しています。懸念。柔軟性があり、他の多くの基本イメージよりも小さいですが、潜在的なセキュリティの脆弱性/脅威につながる可能性がある Distroless イメージよりも多くのコンポーネントが含まれています。
Google Distroless イメージ は、セキュリティを最大化し、攻撃対象領域を最小限に抑えるのに最適です。これらは非常に最小限のランタイム環境を提供するため、セキュリティが優先される実稼働システムにとって有益です。ただし、パッケージ マネージャーとシェルの柔軟性が犠牲になります。
musl libc との互換性の問題が問題にならない場合は、Alpine を使用してください。
セキュリティと攻撃対象領域の最小化が最優先事項であり、アプリケーションのすべての依存関係が適切にバンドルされていることを確認できる場合は、Google Distroless を使用します。
面白かったと思います。お時間をいただきありがとうございました!
以上がGo (Golang) 用の Docker イメージ 小型で高速な Docker イメージとセキュリティの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。