📝
entrypoint.shとは
この記事の背景
コードを書く作業と、マネジメントの作業を行ったりきたりすると忘れるので、自分のために
entrypoint.shの役割についてメモ
entrypoint.shとは
entrypoint.sh は、Dockerコンテナが起動したときに最初に実行されるシェルスクリプトとしてよく使われるファイルです
🧭 基本のイメージ
Dockerfile で次のように指定されていたら:
COPY entrypoint.sh /usr/local/bin/entrypoint.sh
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
このとき、コンテナが起動すると、最初に /usr/local/bin/entrypoint.sh が実行されます。
✅ 役割と使い道
- 環境設定や初期化処理
- 環境変数の展開
- コンフィグファイルの生成
- データベースのマイグレーション
- 権限の設定(例: chown、chmod)
- アプリの起動
- 最後にアプリ本体を exec で呼び出すのが定石:
#!/bin/sh
# 例: エントリポイントの中身
echo "Starting app..."
# 例えば、環境変数をテンプレートに書き込んだり
envsubst < /app/config.template > /app/config.yml
# 最後にアプリを起動する
exec "$@"
👀 なぜ exec "$@" が使われるの?
$@ は Docker の CMD で指定したコマンド・引数を展開します。
exec を使うことで、シグナル(SIGTERM など)がアプリケーションに正しく伝わります(PID 1 問題の回避)。
🔁 ENTRYPOINT vs CMD
| 指定方法 | 目的 |
|---|---|
ENTRYPOINT |
コンテナが必ず実行するメイン処理 |
CMD |
デフォルト引数(ENTRYPOINT に渡す) |
まとめ
entrypoint.sh は、
- コンテナの初期化手順を書く場所
- アプリケーションの起動ロジックを書く場所
- よく exec "$@" を使って CMD を起動
という用途で、Docker コンテナのスタート地点としてとても重要なスクリプトです。
例
entrypoint.sh
#!/bin/sh
→POSIX準拠のシェルでスクリプトを実行する宣言。
export APP_PRIVATE_KEY=${1}
export APP_ID=${2}
export APP_INSTALLATION_ID=${3}
→コンテナ起動時に渡された引数を環境変数に設定します。
/app
→/app という実行ファイルを実行。これは go build -o /app で作られた Go バイナリ。
Dockerfile
FROM golang:1.17-alpine
→ ベースイメージとして Alpine Linux 上の Go を使う
WORKDIR /build
→ 作業ディレクトリを /build に設定
COPY go.mod go.sum ./
COPY *.go ./
COPY entrypoint.sh /
→ Go モジュールとソースコードをコピー
RUN go mod download
→ 依存ライブラリをダウンロード
RUN go build -o /app
→ Go のバイナリを /app にビルド(実行可能ファイル)
ENTRYPOINT ["/entrypoint.sh"]
→ コンテナ起動時に entrypoint.sh が走る
⚠️ 注意点
entrypoint.sh の最後で exec "$@" を使っていないため、/app に引数を渡せないし、PID 1 問題に対処できていない。
これを改善するには:
exec /app
と書き換えた方がより良い実装です。
Discussion