Dockerを使用してQiita CLIを使いたい

# はじめに

アドカレ記事になりそうなネタを探そうとQiitaをいじっていたら、[Qiita CLI](https://github.com/increments/qiita-cli)というのが追加されていることに気づきました。
自分は環境はなるべく汚さないようにしたい人なので、CLI系のツールはできるだけDockerでコンテナ化してみたいと考えるので、せっかくなのでコンテナ化しました。  
（先に言うと`docker run`のところで死ぬほど時間がかかってます）

# Dockerfile

コンテナなのでqiita-cliはグローバルにインストールしちゃいます。
```Dockerfile
FROM node:20
RUN npm install @qiita/qiita-cli -g
RUN mkdir /work
WORKDIR /work
```

# 使い方
## build

```shell
docker build . -t qiita-cli
```

## （無ければ）クレデンシャル用ディレクトリ作成

```shell
mkdir ~/.config
```


## エイリアス設定

ここに死ぬほど時間かかりました。エイリアスというか`docker run`での使用方法ですね。以下npxコマンドはこのエイリアス前提です。

```shell
alias npx="docker run --rm -v /etc/group:/etc/group:ro -v /etc/passwd:/etc/passwd:ro -u $(id --user):$(id --group) -v $PWD:/work -v $HOME:$HOME -p 8888:8888 -it qiita-cli npx"
```
ボリュームマウントやユーザーなどオプションを付与しまくってます。別にオプションを付与しなくても動くのですが、sudoが利用可能なユーザやrootユーザでないと不便な使い方になります。

現在dockerがrootで実行しているので、一般ユーザでdockerを使用している場合Qiita CLIによって作成されるファイルのオーナーが全てrootになってしまい、sudoを頻繁に使用する必要がありました。そのためなるべく一般ユーザでもどうにかできないかと試行錯誤した結果があれです。一応以下にどんな意図で設定したかメモしておきます。

- `-v /etc/group:/etc/group:ro -v /etc/passwd:/etc/passwd:ro`：コンテナ内とホスト上のユーザーのUID,GIDをそろえるためマウントしました。自分の環境ではホストで使用しているユーザのuidが1000で、コンテナのuid=1000のユーザはnodeだったので、その辺をそろえるための設定です。
- `-u $(id --user):$(id --group)`：現在ホストにログインしているユーザのUID,GIDと同じコンテナ上のユーザが、Qiita CLIのコマンドを実行するようになります。
- `$PWD:/work`：Qiitaの記事やGitHub関連のファイルが作成されるディレクトリの指定です。`$PWD`を固定にしてしまった方が人によっては楽かもしれません（本格的にこれを使用するのであれば自分も固定しようと思ってます）
- ` $HOME:$HOME`：`credentials.json`をコンテナにマウントするための設定です。`~/.config/qiita-cli/credentials.json`だけマウントしたかったのですが、ユーザが`/etc/passwd`で作成しているだけなので、ユーザのディレクトリ`/home/～`がないと怒られたので丸々マウントしました。
- `-p 8888:8888`：Qiita CLIではプレビューモードが存在し、webサーバとなって作成中のQiita記事を見ることが可能です。その際のポート指定です。


## Qiita CLI初期設定
### init

```shell
$ npx qiita init

設定ファイルを生成します。

  Creating /work/.github/workflows/publish.yml
     Created!

  Creating /work/.gitignore
     Created!

  Creating /work/qiita.config.json
     Created!

Success! ✨

次のステップ:

  1. トークンを作成してログインをしてください。
    npx qiita login

  2. 記事のプレビューができるようになります。
    npx qiita preview
```


### プレビュー画面アクセス用設定

コンテナで使用するため、デフォルトのlocalhostのままではコンテナの外からアクセスできなくなります。そのため`0.0.0.0`に修正です。
```shell
sed -i s/localhost/0.0.0.0/ qiita.config.json
```


### ログイン設定

```
$ npx qiita login

以下のURLにアクセスしてトークンを発行してください。（「read_qiita」と「write_qiita」にチェックを入れてください）
  https://qiita.com/settings/tokens/new?read_qiita=1&write_qiita=1&description=qiita-cli
  
発行したトークンを入力: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Hi <user>!

ログインが完了しました 🎉
以下のコマンドを使って執筆を始めましょう！

🚀 コンテンツをブラウザでプレビューする
  npx qiita preview

🚀 新しい記事を追加する
  npx qiita new (記事のファイルのベース名)

🚀 記事を投稿、更新する
  npx qiita publish (記事のファイルのベース名)

💁 コマンドのヘルプを確認する
  npx qiita help
```

## 記事作成時メモ

あとはQiita CLIの公式ドキュメントの通り記事作成、投稿などをすればいいので詳細は省きます。
Qiita CLIを使用したことがない方向けに、作成する記事ファイルは以下のように、mdファイルの上部はyaml形式でメタデータ記入、下に記事本文といったファイルで記事を作成します。

```
---
title: Dockerを使用してQiita CLIを使いたい
tags:
  - Qiita
  - CLI
  - Docker
  - QiitaCLI
private: false
updated_at: null
id: null
organization_url_name: "microad"
slide: false
ignorePublish: false
---
# はじめに
※以下記事本文
```

# おわりに

DockerでQiita CLIが使えるようになったところまでなのでこの辺で。GitHubのワークフローについてはまだ試せてないので、その辺も試したいですね。
また今回の件を試していて、もしかしたら業務で共有したコンテナ周りのオーナーがおかしいかもしれないことに気づいたので、ちょうどよいDockerの勉強になりました。