やりたかったこと
- DjangoアプリをFargateサービスで起動するために、以下のようなDockerfileでbuildしたimageをECRにpushしてある。
Dockerfile
~ 略 ~
CMD python manage.py runserver--noreload 0.0.0.0:8000
- 本番用のDB(RDS/postgres)に対して、makemigrations/migrate/createsuperuserを実行したい。
- DBセットアップのために、CMDだけ書き換えたimageを用意するのは何となく納得いかない。
こんな風にしたい
~ 略 ~
CMD python manage.py makemigrations && \
python manage.py migrate && \
python createsuperuser --noinput
※createsuperuser
は--noinput
オプションを利用して宣言的に行う。
※また、2回目以降は重複ユーザでタスクがエラーになるが、特に問題はない。
- ECSのタスク定義のコンテナ追加オプションで、ENTRYPOINTとCMDを上書きできるらしいのでやってみよう・・・とするが、コマンドを複数実行(makemigrations/migrate/createsuperuser)しようとするとうまくいかない。(migrateだけ等、単一のコマンドなら成功するが、&&で繋いで複数コマンドを実行すると失敗する)
解決方法
- 以下の記法で、コンテナのCMDを上書きし、複数コマンドを実行できるようになった。(CDK/python)
cdk_stack.py
task_definition.add_container(
~ 中略 ~
entry_point=[
"sh",
"-c",
],
command=[
'/bin/sh -c "python manage.py makemigrations && python manage.py migrate && python manage.py createsuperuser --noinput"',
],
)