やりたいこと
- GithubのRepoのmainブランチにマージされたら、Herokuにデプロイされて欲しい
- Docker上で動かしているので、ビルドなどもしてほしい
起こったことと対応
公式によると、heroku.ymlを用意する必要があるとのことだったので、サンプル通りに用意しました。
build:
docker:
web: Dockerfile
run:
web: bundle exec puma -C config/puma.rb
heroku.yml を使用して Docker イメージをビルドする | Heroku Dev Center
https://devcenter.heroku.com/ja/articles/build-docker-images-heroku-yml
これでOKと思ってデプロイしたところ、
/usr/local/bundle/gems/puma-5.6.5/lib/puma/launcher.rb:259:in
`write': No such file or directory @ rb_sysopen - tmp/pids/server.pid (Errno::ENOENT)`
というエラーがHerokuで発生。
調査の結果、tmp/pids
ディレクトリができていないとのことだったので、下記のように修正しました。
build:
docker:
web: Dockerfile
run:
web: mkdir -p tmp/pids && mkdir -p tmp/sockets && bundle exec puma -C config/puma.rb
よし、今度こそ...と思ったら、次はこちらでビルドに失敗します。
=== Fetching app code
=!= Your app does not include a heroku.yml build manifest.
To deploy your app, either create a heroku.yml: https://devcenter.heroku.com/articles/build-docker-images-heroku-yml
Or switch back to buildpack-based deploys: https://devcenter.heroku.com/articles/container-registry-and-runtime#changing-deployment-method
いや、今まさに作ったんだが?
ということでしばらく悩んだのですが、原因がわかりました。
自分のプロジェクトは下記のような構成で、フロントとバックをそれぞれ別のプラットフォームにデプロイしています。
project
├── .git
├── backend
├── docker-compose.yml
└── frontend
それで、backendだけをherokuにデプロイしているので、この中でheroku.ymlを作成していました。
これがHeroku側から参照できていないのかな...?と思い、以下のように構成を変えました。
project
├── backend
├── docker-compose.yml
├── frontend
└── heroku.yml
Dockerfileも一階層下を見にいくようにします。
build:
docker:
web: backend/Dockerfile
run:
web: mkdir -p tmp/pids && mkdir -p tmp/sockets && bundle exec puma -C config/puma.rb
これでデプロイしたら、無事ビルドされました...!
Docker側の設定で、Heroku.ymlの場所を指定するとかもあるかなと思ったのですが、見当たらなかったのでルートに配置した次第です。
誰かのためになれば幸いです。