herokuへのdockerコンテナ送付
Herokuですが、通常のソースをgitであげる以外にも、Dockerのコンテナをアップロードすることが可能です。
herokuにはProcfileという設定ファイルがあり、PHPだと、
web: vendor/bin/heroku-php-apache2
のように書きます。(書かなくてもdefaultで決まっています。)
これはheroku上のdyno(heroku上で動くプラットフォームみたいなもの。コンテナ?とほぼ同義)を書いています。
通常はgitでソースをpushして、dynoの上に展開しますが、これをherokuで用意するのではなく、Dockerのコンテナをあげることができます。
ファイル構成
Dockerfile
↑これだけが最低限必須(あとは後述する必要な設定ファイルなどあれば置いておきましょう。)
コマンド
1 2 3 4 |
heroku login heroku container:login heroku container:push web -a [herokuのアプリ名] heroku container:release web -a [herokuのアプリ名] |
注意点
- Dockerfileが必須。docker-composeでやっていると、 image:〜 などでDockerfile書かなくてもいけるので要注意
- docker-compose.ymlの情報は伝達されない。docker-composeでよく行うPORTのbindや設定ファイルの同期ができない
- PORT→環境変数を使う必要あり(要調査)
- 設定ファイル→Dockerfile内の記述で COPY conf.yml /etc/conf.ymlなどと書いておき、コンテナに直接設置
- 基本的に上記のコマンドでできるのはwebアプリ側だけ、DBはaddonなどに別途インスタンスを付与する必要がある。
Dockerで作成したRailsアプリをHerokuにデプロイ
docker volumeの記述
dockerのコンテナとローカルPCのファイルの同期などは
1 2 3 4 5 |
services: web: container_name: "wms" volumes: - .:/var/www/html |
と書けばOKです。一般的にwebアプリなどは開発ソースを同期させる必要があるので上記のように書くと思います。
DBも /var/lib/mysql 直下のバイナリデータを同期しておかないと、コンテナ起動のたびに、初期化されてしまいます。そのため、実データを同期する時に今まで、
1 2 3 |
db: volumes: - "./docker/data:/var/lib/mysql" |
のように書いていました。一応これで動いていたので、間違いにきづかなかったのですがdataフォルダが初期化できない・・などのエラーが別端末で出てこれがまずいと発覚しました。
よく調べてみるとデータベースのバイナリデータなどは下記のように書くことが正解のようです。
docker側の設定でローカルと同期する領域などを内部で自動的に決めているようですね。
1 2 3 4 5 6 |
volumes: - mysql_data:/var/lib/mysql (ymlのトップの階層に書きます) volumes: mysql_data: |