はじめに
こんにちは。Udonです。
最近やっと本格的にDockerを使い始めました。なんとなく、Dockerを使わないといけない状況になかったんですよね。そんなとき、Discordをよく使うイベントがあったので、Discord Botを常設できたら便利だなと感じました。しかし、ローカルからいちいちBotを起動するのは面倒です。そこで、Dockerを使ってDiscord Botを常設することにしました。
というわけで、ここではDockerを使ってDiscord Botを常設する方法を紹介します。注意ですが、この記事のテーマはあくまでDockerを使ってDiscord Botを常設することです。Discord Botの作成方法については、他の記事を参考にしてください。そのため、Discord Botのファイルはブラックボックスとします。
想定環境
- Docker:最新版
- Docker Compose:最新版
- Discord Bot:作成済み
- Dockerを動かせるサーバー
完成イメージ
実際にDockerを動かすディレクトリは以下のような構成になっています。
.
├── .env
├── docker-compose.yml
├── Dockerfile
├── requirements.txt
└── bot
└── main.py
Docker環境のセットアップ
以下のファイルを作成し、Docker環境をセットアップします。
.env
TOKEN="YOUR_DISCORD_BOT_TOKEN"
このファイルには、Discord Botのトークンを記述します。場合によっては他の環境変数も記述することがあります。
このファイルを作っておく利点として、Dockerfileやdocker-compose.ymlで環境変数を使うことができるという点があります。また、環境変数を使うことで、セキュリティを向上させることができます。一括で環境変数を管理することができるので、環境変数を漏洩させるリスクを減らすことができます。
Dockerfile
FROM python:3.10.5-alpine3.16
WORKDIR /usr/src/app
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
このDockerfileはPythonの環境をセットアップする際に使います。Pythonのバージョンは3.10.5を使っています。また、Alpine Linuxを使っているので、軽量なイメージを使うことができます。そして、requirements.txtをコピーして、必要なパッケージをインストールします。
また、Docker-Composeを使えない場合はDockerfileのみでビルドすることとなります。
requirements.txt
py-cord == 2.2.2
discord.py == 2.4.0
このファイルには、Discord Botを動かすために必要なパッケージを記述します。この例では、py-cordとdiscord.pyを使っています。他に必要なものがあれば適宜追加することとなります。
docker-compose.yml
version: '3.8'
services:
bot:
build: .
volumes:
- ./bot:/usr/src/app:rw
environment:
- TOKEN=${TOKEN}
command: ["python3", "main.py"]
tty: true
このファイルには、Docker Composeの設定を記述します。botというサービスを作成しています。このbotサービスは、Dockerfileを使ってビルドします。また、botディレクトリをコンテナ内の/usr/src/appにマウントします。そして、環境変数としてTOKENを渡します。最後に、main.pyを実行します。
tty: trueをつけておくことで、プロセスを実行されっぱなしにすることができるようです。
Discord Botの作成
Discord Botの本体はmain.pyでプログラミングしていくこととなります。
この辺は、Qiitaにもたくさん記事があるので、そちらを参考にしてください。
自分はこの記事などを参考にしました。
コンテナの起動
では、コンテナを起動します。以下のコマンドにより、まずはビルドします。
docker-compose build
ビルド出来たら、以下のコマンドでコンテナを起動します。
docker-compose up
これで、Discord Botが起動されました。Discord Botが起動しているかどうかは、Discordのサーバーに入って確認してください。
こうしてしまえば、サーバーからログアウトしてもDiscord Botは常時起動されているので、いつでも使える状態になります。
コンテナの停止
コンテナを停止する場合は、以下のコマンドを実行します。
docker-compose down
おわりに
結構簡単にDockerを使ってDiscord Botを常設することができました。これで、いつでもDiscord Botを使える状態になりました。便利ですね。
コンテナを永続化させることで、いつでもBotを使える状態にすることができました。やはりサービスを常設させておくには、Dockerが便利ですね。使えるサーバーがあるなら積極的に利用しておくといいかと思います。
ではまた。
参考文献
【Docker】.envの環境変数をDockerfileで使用する #docker-compose - Qiita
「そのコンテナのデータ、消えるよ……」とさせないための、イメージ図+実践で理解するDockerストレージ【Dockerコンテナ・グレートジャーニー③】 #container - Qiita
コンテナを永続化させる方法 – SAT Staff Blog
docker-compose up したコンテナを起動させ続ける方法 #Docker - Qiita