🦉

Dockerfileを使ってfly .ioコンテナアプリを公開するお話

2023/08/07に公開

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を実行する。そんな感じ

  1. ファイル(ディレクトリ)コピー
  2. 使うライブラリのインストール
  3. 環境変数の設定
  4. サーバーとして待機するためのコードの実行
    の動作を行います

ほんとに最小限で短いのでここで全文載せます。基本的にこんな感じ

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のコマンドを打つわけですが、flyctlflyにエイリアスが自動でつくらしい(わたしのGoogleCloudShell環境だとそうならなかったのでエイリアス設定した)ので、flyctlのコマンドを打つときはflyで書いていきます。あしからず

flyへのサインアップ・ログイン

fly.ioにサインアップするのですが、わたしはgithubアカウントでサインアップしました。新しくアカウント作るのめんどくさかったので
現状だとアプリケーションのデプロイにはクレジットカード情報の入力が必要なので、ダッシュボードのBilling>Account StatusのManage Billingから支払い情報を設定しておきましょう

アカウント準備ができたら、ターミナルに戻ってログインするコマンドを打ちます

fly auth login

このコマンドを打つと、ブラウザが開いてブラウザでログインするというパターンです
一応ブラウザの起動に失敗した場合でもログイン用URLが出力されているのでそれをコピーしてブラウザに貼り付け、その先でログインします

flyアプリのローンチ

アカウントへのログインもできたことだし、アプリケーションを作成していきましょう

fly launch

コマンドを打つと、対話形式で以下の順に設定を聞かれます

  1. アプリの名前を決めます。空白だと勝手に生成されます
  2. リージョン。特に気にしないならTokyo, Japan (nrt)でいいんじゃないかしら
  3. postgresqlのデータベースを今すぐ設定するかどうか(y/N)。ここでyにすると後でpostgresqlの接続情報が出てくるのでメモしておく。わたしは基本的に(DBは別のサービス使ってデータベース用マシンを普通にpythonサーバーとして動かしたいので)Nにしてる
  4. Redisのデータベースを今すぐに設定するかどうか(y/N)。Redisデータベースは今度別の機会で使ってみたいと思う
  5. いますぐデプロイしますか(y/N)?yにするとすぐにデプロイが始まる

デプロイが始まると別アプリとして生成されたビルダーがDockerレイヤーを順次生成、構築したコンテナのアップロードを行ってくれます
あとヘルスチェックがされます。設定を変更しなかった場合はトップページにアクセスできないとアプリが落ちたりします。注意

5の段階でデプロイしなかった場合や、ソースコードを編集したものをデプロイしたい場合は、

fly deploy

でデプロイできる。かんたん

今回はDockerfileでのデプロイ覚書程度の内容なのでここでおしまい
そのうち、気力があれば、どこまでのコマンドが許可されているかの確認もしてみたい。なんて思っている。かも

Discussion