Azure App Serviceを使って自作のPhoenixアプリのdockerコンテナを立ち上げてみました。F1 freeプランは無料とのことなのでこちらで試しましたが、いろいろと躓いてしまいましたのでメモを残します。
- コンテナーが80以外のポートでリッスンしている場合はアプリケーション設定のWEBSITES_PORTにポート番号を指定する必要がある。
- アプリケーション設定ではコンテナ内の環境変数を設定できなさそう(参考ページ)。この設定はazure固有の環境変数のようで、コンテナ用ではなさそうです。ちなみにPORTもこの環境変数に含まれており、設定するとazure側でコンテナのリッスンポートとして使われるようです(WEBSITES_PORTとの違いは未調査)。
- 全般設定のスタートアップコマンドにスペースを含む文字列をダブルクォートで囲んだ引数をもつコマンドを入力するとエラーになる(参考ページ)。コンテナ起動時に複数のコマンドを実行する場合はsh -c “xxx && yyy”のようにする方法があるが、先述の通りエラーになってしまう。
- docker-compose.ymlをアップロードすることでもコンテナーを起動できるが、独特なお作法で記述する必要がある(参考ページ)。このお作法に従えば、環境変数の設定やコマンドの指定はできる。
最初はdocker-compose.ymlを使用せずに直接イメージを指定していましたが、上の2の制約により、dockerでコンテナを立ち上げる時に環境変数の値を指定できないのと、3の制約により複数のコマンドを起動時に実行できないため、以下のようなdocker-compose.ymlを作成してアップロードしたところ、うまく動作しました(イメージとかシークレットは仮のものです)。上述したお作法通り、commandにはJSONのリスト形式で記述し、環境変数もコロンの右で値を記述しています。また、portsの設定をしているので上述したWEBSITES_PORTは設定していないです。
version: '2'
services:
ex-chat:
image: "sample/myapp"
command: ["sh","-c","/app/bin/migrate && /app/bin/server"]
ports:
- "80:18000"
environment:
DATABASE_PATH: "/tmp/app.db"
SECRET_KEY_BASE: "mysecret"
PHX_PORT: "18000"
少しだけこのPhoenixアプリについて触れておくと、今回はデータベースシステムとしてSQLite3を使用したため、上のcommandにあるようにPhoenixのサーバを立ち上げる前にデータベースのマイグレーションを行っています。コンテナ内にデータベースのファイルを置いているのでコンテナが削除されるとデータベースも消えてしまいますが、今回はお試しなのでそこは気にしていません。また、リリース向けにビルドする手順としてはこちらの方法を参考にしています(イメージ作成用のDockerfileもこの手順の中で自動生成されたものを使用)。
以上のようにAzure App Serviceは通常のdockerと挙動が違うところがありますが、無料で自前のコンテナを起動できるのは魅力ですのでこれからも使っていきたいと思います。
ちなみにコンテナのログやdockerコンテナを起動するときのオプションはログストリームで確認できますので、うまく起動しない場合はこちらを参照すればよいと思います。