-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDockerfile.debug
More file actions
181 lines (163 loc) · 11.3 KB
/
Dockerfile.debug
File metadata and controls
181 lines (163 loc) · 11.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
# =============================================================================
# リモートデバッグ用Dockerfile(Remote Debug Environment)
# =============================================================================
# VSCode、GoLand等のIDEからリモートデバッグを行うための専用Dockerfile
# Delveデバッガーを統合してリアルタイムデバッグとブレークポイント制御を実現
# 開発効率とトラブルシューティング能力を大幅に向上させる開発者向け環境
# =============================================================================
# ビルドステージ(デバッグ機能付きGoアプリケーション構築)
# =============================================================================
# Go開発環境をベースとしてデバッグ対応アプリケーションをビルド
# Alpine Linuxベースで軽量性を保ちつつデバッグ機能を強化
FROM golang:1.20-alpine AS builder
# =============================================================================
# デバッグ環境の作業ディレクトリ設定
# =============================================================================
# デバッグ対応ビルドを実行する作業ディレクトリを /app に設定
# ソースコードの編集とコンパイルをこの場所で実行
WORKDIR /app
# =============================================================================
# デバッグ環境に必要なツールのインストール
# =============================================================================
# デバッグとGo Modulesに必要なパッケージをインストール
# apk add: Alpine Linuxのパッケージマネージャー
# --no-cache: パッケージキャッシュを残さずイメージサイズを削減
# git: Go Modulesが外部リポジトリから依存関係を取得する際に必要
# また、バージョン管理システムとの連携も可能にする
RUN apk add --no-cache git
# =============================================================================
# Delveデバッガーのインストール(Goアプリケーション専用デバッガー)
# =============================================================================
# Delve(dlv): Goアプリケーション専用の高機能デバッガー
# github.com/go-delve/delve/cmd/dlv: 公式のDelveコマンドラインツール
# @latest: 最新安定版を自動選択してインストール
# 機能: ブレークポイント設定、変数検査、スタックトレース、
# ステップ実行、リモートデバッグサーバー機能
# go install: Goツールチェーンを使用してバイナリをビルド・インストール
RUN go install github.com/go-delve/delve/cmd/dlv@latest
# =============================================================================
# 依存関係の管理(Go Modules)
# =============================================================================
# Go Modulesファイルを先行してコピー(Dockerレイヤーキャッシュ最適化)
# デバッグ時も本番環境と同じ依存関係を使用して一貫性を保つ
COPY go.mod go.sum ./
# Go Modulesの依存関係をダウンロード
# go mod download: go.modに記載された全ての依存関係をダウンロード
# ダウンロードされた依存関係は $GOPATH/pkg/mod にキャッシュされる
RUN go mod download
# =============================================================================
# ソースコードのコピー
# =============================================================================
# デバッグ対象となるアプリケーションの全ソースコードをコピー
# ホスト側での編集内容がデバッグセッションに即座に反映される
COPY . .
# =============================================================================
# デバッグ用最適化ビルド設定
# =============================================================================
# デバッグ情報を保持した特別なビルド設定でGoアプリケーションをコンパイル
# CGO_ENABLED=0: CGOを無効化(デバッグ時の複雑性を軽減)
# go build: Goコンパイラーでバイナリを生成
# -gcflags="all=-N -l": 重要なデバッグ用コンパイラーフラグ
# -N: 最適化を無効化(変数の値が正確に表示される)
# -l: インライン展開を無効化(関数呼び出しが正確にトレースできる)
# all=: 全てのパッケージに対してフラグを適用
# -o main: 出力バイナリファイル名を "main" に指定
# デバッグ情報が豊富に含まれるため、バイナリサイズは大きくなるが
# 詳細なデバッグが可能になる
RUN CGO_ENABLED=0 go build -gcflags="all=-N -l" -o main .
# =============================================================================
# デバッグ用実行ステージ(リモートデバッグサーバー環境)
# =============================================================================
# デバッグ機能を提供する実行専用環境
# Alpine Linuxベースで軽量性を保ちつつデバッグ機能を提供
FROM alpine:latest
# =============================================================================
# デバッグ環境に必要なパッケージのインストール
# =============================================================================
# デバッグ実行とセキュリティに必要なパッケージをインストール
# apk --no-cache add: パッケージキャッシュを残さずインストール
# ca-certificates: HTTPS通信に必要なCA証明書バンドル
# 外部APIへのデバッグリクエストで使用
# libc6-compat: GNU libc互換ライブラリ
# 一部のGoバイナリやDelveが必要とする標準Cライブラリ機能を提供
# Alpine Linuxのmuslではなくglibcベースのバイナリとの互換性を確保
RUN apk --no-cache add ca-certificates libc6-compat
# =============================================================================
# セキュリティ強化: デバッグ用非rootユーザーの作成
# =============================================================================
# デバッグ環境でもセキュリティベストプラクティスに従い非特権ユーザーを作成
# デバッグセッション中も権限昇格攻撃のリスクを軽減
# addgroup: デバッグ用システムグループ "appgroup" を作成(GID: 1001)
# -g 1001: グループIDを明示的に指定
# -S: システムグループとして作成
# adduser: デバッグ用システムユーザー "appuser" を作成(UID: 1001)
# -u 1001: ユーザーIDを明示的に指定
# -S: システムユーザーとして作成
# -G appgroup: appgroupをプライマリグループに設定
RUN addgroup -g 1001 -S appgroup && \
adduser -u 1001 -S appuser -G appgroup
# =============================================================================
# デバッグ環境の作業ディレクトリ設定
# =============================================================================
# デバッグセッション実行時の作業ディレクトリを /app に設定
# デバッグ対象アプリケーションとDelveデバッガーをこの場所で実行
WORKDIR /app
# =============================================================================
# デバッグツールとアプリケーションの配置
# =============================================================================
# ビルドステージで準備したDelveデバッガーとアプリケーションバイナリをコピー
# Delveデバッガーのコピー:
# --from=builder: ビルドステージから直接ファイルをコピー
# /go/bin/dlv: ビルドステージでインストールされたDelveバイナリの場所
# /usr/local/bin/dlv: 実行ステージでの配置先(システム全体で利用可能)
COPY --from=builder /go/bin/dlv /usr/local/bin/dlv
# デバッグ対象アプリケーションのコピー:
# /app/main: ビルドステージで作成されたデバッグ情報付きバイナリ
# .: カレントディレクトリ(/app)にコピー
COPY --from=builder /app/main .
# =============================================================================
# デバッグ環境の権限設定
# =============================================================================
# デバッグツールとアプリケーションに適切な権限を設定
# chown -R: ディレクトリとその中身全てに対して所有者を変更
# appuser:appgroup: 非rootユーザーを所有者に設定
# /app: 作業ディレクトリ全体の所有権を変更
# chmod +x: 実行権限を付与
# /usr/local/bin/dlv: Delveデバッガーを実行可能にする
# ./main: アプリケーションバイナリを実行可能にする
RUN chown -R appuser:appgroup /app && \
chmod +x /usr/local/bin/dlv && \
chmod +x ./main
# =============================================================================
# セキュリティ強化: 非rootユーザーへの切り替え
# =============================================================================
# デバッグセッション実行時も非特権ユーザー(appuser)で動作
# デバッグ中もシステム全体への影響を最小限に抑制
# rootユーザーでのデバッグは避けることでセキュリティリスクを軽減
USER appuser
# =============================================================================
# デバッグ用ネットワーク設定
# =============================================================================
# デバッグに必要なポートを公開
# 8080: アプリケーションが提供するHTTPサービスポート
# デバッグ中もアプリケーションの動作確認が可能
# 2345: Delveデバッガーのリモートデバッグサーバーポート
# IDEやデバッグクライアントからこのポートに接続してデバッグセッションを開始
# 業界標準的なDelveのデフォルトポート番号
EXPOSE 8080 2345
# =============================================================================
# リモートデバッグサーバーの起動設定
# =============================================================================
# Delveデバッガーをリモートデバッグサーバーモードで起動
# dlv: Delveデバッガーコマンド
# 重要なDelveオプション:
# --listen=:2345: 全てのネットワークインターフェースの2345番ポートでリッスン
# --headless=true: GUI無しのヘッドレスモードで動作(サーバー環境での使用)
# --api-version=2: APIバージョン2を使用(最新のIDEと互換性)
# --accept-multiclient: 複数のデバッグクライアントからの同時接続を許可
# チーム開発での複数人同時デバッグが可能
# --continue: デバッグサーバー起動後、自動的にアプリケーションを開始
# 手動でcontinueコマンドを実行する必要がない
# exec ./main: ./main バイナリファイルをデバッグ対象として実行
# この設定により、VSCode、GoLand等のIDEから簡単にリモートデバッグが可能
CMD ["dlv", "--listen=:2345", "--headless=true", "--api-version=2", "--accept-multiclient", "--continue", "exec", "./main"]