Docker + VSCodeで気軽に遊びのElixir環境をつくる

:::note alert
遊び専用ですセキュリティーは無視してます
:::

:::note warn
ソースはコンテナを改良をしないと外部に保存できません
技術的には可能ですが、今回は書きません
:::

# 前提
下記がインストール済みであること
 - Docker
 - VSCode

# 環境作成

Elixir  + sshd環境のイメージ作成
```dockerfile:Dockerfile
FROM elixir:1.17.2-otp-26 as exec
RUN apt update -y && apt install -y build-essential inotify-tools npm git openssh-server
RUN mix do local.hex --force, local.rebar --force, archive.install --force hex phx_new
RUN mkdir /var/run/sshd; \
  echo 'root:hoge' | chpasswd; \ 
  echo 'PasswordAuthentication yes' >> /etc/ssh/sshd_config; \
  echo 'PermitRootLogin yes' >> /etc/ssh/sshd_config

CMD ["/usr/sbin/sshd", "-D"]
```

上記Elixirイメージとdb起動の為のdocker-composeファイル
```yaml:docker-compose.yml
version: '3'
services:
  web:
    build:
      context: .
      target: exec
      dockerfile: Dockerfile
    tty: true
    links:
      - db
    ports:
      - 4000:4000
      - 2222:22
  db:
    image: postgres:15.3-alpine
    environment:
      POSTGRES_PASSWORD: postgres
    ports:
      - 5432:5432
```
# 起動

```bash
$ docker compose up -d
```

# VSCodeでコンテナにアクセス方法

前提下記の拡張機能がインストール済みであること
- Remote - SSH: Editing Configuration Files
- Remote - SSH

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/b61e34d7-0529-e07b-abce-55bf13ee43fb.png)

## sshでコンテナに接続

左下の青い`リモートウインドを開く`アイコンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/90584493-bbed-eb41-dc0b-7899c2baf954.png)

`ホストに接続する`をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/c7d70d3f-0f64-20e6-7488-d79c95908432.png)

`新規SSHホストを追加する`をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/b5d86cbb-082c-d778-270f-e484e9f13a13.png)

`ssh root@localhost -p 2222`を入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/63c22914-f3aa-ffdf-2fb2-444289f9d8bb.png)

一番上を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/9349ed68-cf9a-eb9b-4c43-68c566036199.png)

右下に表示している`接続`をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/13e3276f-9dc8-52f0-0bc8-ca03fe198c46.png)


VSCodeがもう一つ開くのでパスワードを入力
今回は`hege`です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/904bf046-d8b2-47c8-eb0f-3f4bedd8ef2a.png)

ターミナルからworkフォルダーを作る

:::note info
ターミナルが無い場合
`メニュー`の`ターミナル`→`新しいターミナル`で表示できます
:::

```bash
# mkdir work
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/7fd76c06-ca41-0a21-4240-a9e37df56779.png)

`フォルダーを開く`からworkフォルダーを開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/133fd3bc-bbf7-fcf2-3e3b-d71db936e0c9.png)

`/root/work`を指定してOKをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/0e5d242f-e921-9f5a-6634-73f5ef761f0a.png)

# Elixirのプロジェクトを作る

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/1ebe5860-f50a-0958-0081-a92cc24fe4b6.png)

```bash
~/work# mix new hoge
```

下記の画面になります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/8c2a6fb5-757c-b03e-b363-198150bcf2c6.png)

# testを実行（動作確認）

```bash
~/work# cd hoge
~/work/hoge# mix test
```
下記の画面になります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/2f227265-4b90-a321-b1f0-858b535a3f20.png)

# ソースを開く
エクスプローラーから 
`hoge/lib/hoge.ex` をクリックしてください
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/b11d24ea-95cc-a727-8072-8c7f605bfbfd.png)


:::note info
エクスプローラーが表示してない場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/bee01c73-232d-9daf-b40a-2ee9183b7bc3.png)このアイコンクリックで表示できます
:::

#　ElixirLSのインストール
拡張機能から`ElixirLS`をインストールする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/07086f49-1060-471c-a6bd-2be9e4a30250.png)

インストールが成功すると先ほどの`hoge/lib/hoge.ex`がカラフルになります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/e5ce2f13-4758-7415-58bc-cb8948460908.png)

ElixirLSはElixirの構文が見やすくなります


# ソースを変更してみる

下記の2行を追加します
```diff_elixir:hoge/lib/hoge.ex
#　省略
  def hello do
+    Enum.sum(1..5)
+    |> IO.inspect()
    :world
  end
#　省略
```

## 実行

```bash
~/work/hoge# mix test
```
実行結果
1〜5の合計で15になりました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/3a96ad1c-ad03-a989-2fcb-34ce3626e609.png)