Dockerfileを使ってfly .ioコンテナアプリを公開するお話
fly.ioではDockerfileを使ってコンテナアプリをデプロイする機能があるわけです。昔の記事で作ったアプリケーションはそうやって作っています。まぁわたしはこの方法以外でデプロイしたこと無いんですけどね
このDockerfieによるデプロイ、Dockerfile内でコマンドを打てるので多分なんでもできるんじゃないかしら?なんて思っている
万能っぽいしいいじゃん、なんて思ったのだけど、Dockerfileからのデプロイ方法をまとめた記事はなかった(たぶん)ので書き残しておく。そういう記事
配置ファイル
Dockerfileを使う方法でflaskアプリをデプロイする場合、わたしが作るとこんな感じのファイル構造になります
root
├ Dokerfile
├ fly.toml
├ requirements.txt
└ source
└ app.py
fly.toml
は自動生成されるので、設定ファイルとして記述するものはDockerfile
のみという形になります
source
内にはアプリケーションのソースコードを入れるわけですが、この記事ではflyへのデプロイ方法まとめなのでそこはできている体で行きます
Dockerfileとしてはsourceディレクトリをまるごとコンテナにコピーしてapp.py
を実行する。そんな感じ
- ファイル(ディレクトリ)コピー
- 使うライブラリのインストール
- 環境変数の設定
- サーバーとして待機するためのコードの実行
の動作を行います
ほんとに最小限で短いのでここで全文載せます。基本的にこんな感じ
FROM python:3.9.2
COPY requirements.txt /root/
RUN pip install -r /root/requirements.txt
COPY source/ /root/
ENV EVALUE=“environment value”
CMD ["flask", "run", "--port=80", "--host=0.0.0.0"]
pythonのバージョン指定したら、ライブラリとソースコードを準備してからFlaskを実行するだけの簡単なDockerfile。でもCMDで任意のコマンド打てるからまだまだいろいろできそう
ここではrootにrequirements.txtを置いておいて、その内容でpipインストール。
sourceディレクトリに配置したコードをまるごとコンテナにコピーしてapp.py
を実行する。そんな感じ
flyctlのインストール
さてソースコードと設定ファイルを用意したが、デプロイするための道具がなくっちゃ始まらない。flyに関する操作をコマンドライン上で行うためのツールを入れます
Linuxだったらターミナル開いてこのコマンドを打ちます
curl -L https://fly.io/install.sh | sh
他のOSだったら公式ドキュメントを参照のこと
これ以降はflyctl
のコマンドを打つわけですが、flyctl
はfly
にエイリアスが自動でつくらしい(わたしのGoogleCloudShell環境だとそうならなかったのでエイリアス設定した)ので、flyctl
のコマンドを打つときはfly
で書いていきます。あしからず
flyへのサインアップ・ログイン
fly.ioにサインアップするのですが、わたしはgithubアカウントでサインアップしました。新しくアカウント作るのめんどくさかったので
現状だとアプリケーションのデプロイにはクレジットカード情報の入力が必要なので、ダッシュボードのBilling>Account StatusのManage Billingから支払い情報を設定しておきましょう
アカウント準備ができたら、ターミナルに戻ってログインするコマンドを打ちます
fly auth login
このコマンドを打つと、ブラウザが開いてブラウザでログインするというパターンです
一応ブラウザの起動に失敗した場合でもログイン用URLが出力されているのでそれをコピーしてブラウザに貼り付け、その先でログインします
flyアプリのローンチ
アカウントへのログインもできたことだし、アプリケーションを作成していきましょう
fly launch
コマンドを打つと、対話形式で以下の順に設定を聞かれます
- アプリの名前を決めます。空白だと勝手に生成されます
- リージョン。特に気にしないならTokyo, Japan (nrt)でいいんじゃないかしら
- postgresqlのデータベースを今すぐ設定するかどうか(y/N)。ここでyにすると後でpostgresqlの接続情報が出てくるのでメモしておく。わたしは基本的に(DBは別のサービス使ってデータベース用マシンを普通にpythonサーバーとして動かしたいので)Nにしてる
- Redisのデータベースを今すぐに設定するかどうか(y/N)。Redisデータベースは今度別の機会で使ってみたいと思う
- いますぐデプロイしますか(y/N)?yにするとすぐにデプロイが始まる
デプロイが始まると別アプリとして生成されたビルダーがDockerレイヤーを順次生成、構築したコンテナのアップロードを行ってくれます
あとヘルスチェックがされます。設定を変更しなかった場合はトップページにアクセスできないとアプリが落ちたりします。注意
5の段階でデプロイしなかった場合や、ソースコードを編集したものをデプロイしたい場合は、
fly deploy
でデプロイできる。かんたん
今回はDockerfileでのデプロイ覚書程度の内容なのでここでおしまい
そのうち、気力があれば、どこまでのコマンドが許可されているかの確認もしてみたい。なんて思っている。かも
Discussion