Docker のイメージをビルドする際、通常はローカルにあるスクリプト・ファイルを COPY
でイメージにコピーするのが基本です。
しかし、Dockerfile 内でスクリプトを作成したいことが、まれによくあります。
「dockerfile内 スクリプト 作成」でググっても、ドンピシャのタイトルの記事がなかったので、自分のググラビリティとして。
TL; DR (今北産業)
-
COPY
指示子で、ヒアドキュメント(heredoc)を使ってファイルを作成する -
使用例:
Dockerfile# ============================================================================= # ビルド ステージ # ============================================================================= FROM alpine WORKDIR /app RUN apt upgrade --no-cache COPY --chmod=755 <<EOL /app/entrypoint.sh #!/bin/sh set -e echo "Hello, world" EOL ENTRYPOINT [ "/app/entrypoint.sh" ]
【注意】上記の場合、PID1 は /app/entrypoint.sh
になり echo
はサブ・プロセス(子プロセス)になります。
つまり、この場合、コンテナを終了しても SIGINT などの終了シグナルは echo
に渡されません。
この例では、すぐに実行終了するので特に問題はないのですが echo
の代わりに Web サーバーなどサービス系の常駐するアプリの場合には特に注意が必要です。
Ctrl+C
しても graceful shutdown
(後処理を済ませて安全にアプリを停止)してくれません。
docker run --init myimage:latest
と --init
オプションを付けて実行するか、シェルのスクリプト内で exec
を使います。
- echo "Hello, world"
+ exec /bin/echo "Hello, world"
参考文献/あわせて読みたい
- ヒアドキュメント とは @ Qiita
- 知ると便利なヒアドキュメント @ Qiita
- 3分でわかる,Shell Script/Dockerfileの可読性を上げるヒアドキュメントの使い方 @ Qiita
- bashのヒアドキュメントを活用する @ Qiita
- Bourne/Ash shell(shシェル)で複数行をヒアドキュメントで変数に代入する @ Qiita
- Specify an init process | Reference @ docs.docker.com
- Dockerの--initフラグについて | Carpe Diem @ Hatena Blog