久しぶりに Heroku を使ってみたら、いつの間にかコンテナも使えるようになっていた。

というくらいに全然 Heroku を使っていなかった。

正確に言うと、 Heroku で動かしているアプリはあるけど、ずっと動かしたままだったので、ダッシュボードを見ることがなかった、という感じ。

検索していると2年半くらい前の記事が多くて、時代に追いついてないのを感じる。

今回頑張ったこと

Dockerfile を書く時、これまでユーザーを意識していなかったので、今回は、 root 以外のユーザーで実行するようにした。

USER を指定すると、その後の COPY とかもユーザーで実行するのかと思ったら、そうでもなかったようだ。

調べてみると、最近追加された機能で、ファイルのオーナーを変更できるようになったらしい。

Dockerfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
FROM perl:5.20.3-threaded

RUN useradd -m -s /bin/bash appuser \
&& cpanm Carton

USER appuser
RUN mkdir -p /home/appuser/webapp
WORKDIR /home/appuser/webapp

COPY --chown=appuser:appuser webapp/cpanfile /home/appuser/webapp
RUN carton install

COPY --chown=appuser:appuser webapp /home/appuser/webapp

CMD carton exec -- /home/appuser/webapp/myapp.pl daemon -l http://0.0.0.0:$PORT

最後の CMD はとりあえず Mojolicious で動かしたいので適当に書きました。

ローカルでの開発はあまり意識していないのですが、やるとしたらこんな感じで起動するのかなと。

1
2
docker build -t nqounet/serene-lake-43934 .
docker run --rm -p 3000:3000 nqounet/serene-lake-43934 carton exec -- morbo myapp.pl

…面倒くさそうですね。

デプロイ方法

コンテナを使う時は、 Container Registry にログインする必要があるようです。

1
2
3
4
5
6
7
8
# 必要なら作成
heroku create

# Container Registry にログイン
heroku container:login

# デプロイ
heroku container:push web

感想

buildpack を使う方法よりは真っ当な方法な気がします。

というか、コンテナがそのまま公開できるって凄い。

参考