Dockerを使ってDiscord Botを常設する

<!-- Dockerを使ってDiscord Botを常設する -->

## はじめに

こんにちは。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を動かすディレクトリは以下のような構成になっています。

```bash
.
├── .env
├── docker-compose.yml
├── Dockerfile
├── requirements.txt
└── bot
    └── main.py
```

## Docker環境のセットアップ

以下のファイルを作成し、Docker環境をセットアップします。

### .env

```bash
TOKEN="YOUR_DISCORD_BOT_TOKEN"
```

このファイルには、Discord Botのトークンを記述します。場合によっては他の環境変数も記述することがあります。

このファイルを作っておく利点として、Dockerfileやdocker-compose.ymlで環境変数を使うことができるという点があります。また、環境変数を使うことで、セキュリティを向上させることができます。一括で環境変数を管理することができるので、環境変数を漏洩させるリスクを減らすことができます。

### Dockerfile

```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

```bash
py-cord == 2.2.2
discord.py == 2.4.0
```

このファイルには、Discord Botを動かすために必要なパッケージを記述します。この例では、py-cordとdiscord.pyを使っています。他に必要なものがあれば適宜追加することとなります。

### docker-compose.yml

```yaml
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にもたくさん記事があるので、そちらを参考にしてください。

自分は[この記事](https://qiita.com/1ntegrale9/items/9d570ef8175cf178468f)などを参考にしました。

## コンテナの起動

では、コンテナを起動します。以下のコマンドにより、まずはビルドします。

```bash
docker-compose build
```

ビルド出来たら、以下のコマンドでコンテナを起動します。

```bash
docker-compose up
```

これで、Discord Botが起動されました。Discord Botが起動しているかどうかは、Discordのサーバーに入って確認してください。

こうしてしまえば、サーバーからログアウトしてもDiscord Botは常時起動されているので、いつでも使える状態になります。

## コンテナの停止

コンテナを停止する場合は、以下のコマンドを実行します。

```bash
docker-compose down
```

## おわりに

結構簡単にDockerを使ってDiscord Botを常設することができました。これで、いつでもDiscord Botを使える状態になりました。便利ですね。

コンテナを永続化させることで、いつでもBotを使える状態にすることができました。やはりサービスを常設させておくには、Dockerが便利ですね。使えるサーバーがあるなら積極的に利用しておくといいかと思います。

ではまた。

## 参考文献

[【Docker】.envの環境変数をDockerfileで使用する #docker-compose - Qiita](https://qiita.com/P-man_Brown/items/6e2e6e98b19be33306e3)

[「そのコンテナのデータ、消えるよ……」とさせないための、イメージ図＋実践で理解するDockerストレージ【Dockerコンテナ・グレートジャーニー③】 #container - Qiita](https://qiita.com/Toyo_m/items/95a2543c07dc5b126208)

[コンテナを永続化させる方法 – SAT Staff Blog](https://blog.sat.ne.jp/2020/05/19/%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%82%92%E6%B0%B8%E7%B6%9A%E5%8C%96%E3%81%95%E3%81%9B%E3%82%8B%E6%96%B9%E6%B3%95/)

[docker-compose up したコンテナを起動させ続ける方法 #Docker - Qiita](https://qiita.com/sekitaka_1214/items/2af73d5dc56c6af8a167)

[Dockerコンテナをずっと起動しておく - WEB開発ノート](https://utouto97.hatenablog.com/entry/2022/03/15/092924)

[Dockerのコンテナを起動したままにする #Docker - Qiita](https://qiita.com/reflet/items/dd65f9ffef2a2fcfcf30)