Dockerでcode-serverを立てる


# はじめに
[TDU_データ科学・機械学習研究室AdventCalendar](https://qiita.com/advent-calendar/2021/dsml-tdu
)1日目

普段は深層学習を用いた伝統文様の画像解析をしています．
普段研究ではDockerを用いてGPUサーバ上で作業をしています．

GPUマシン上にDockerを立てて，その中にPythonやら機械学習の環境を構築しています．メインとするGPUマシンにローカルマシン(MacBook)からvscodeのRemoteDevlopementを利用してアクセスしています．しかし，Dockerを利用しているためvscodeのAutoCompletionを利用するには特殊な設定が必要です．
https://code.visualstudio.com/docs/remote/containers

Dockerの環境を用いて開発するのはとても便利ですが，vscodeの補完機能が利用できないのはやはりコーディングが難しいです．また，vscodeのデバッガーが起動できないため基本pdbやプリントデバッグを利用してデバッグするためコードの理解に時間がかかります．

そこで，code-serverを普段利用してるDockerfileに追記をすることで起動させ，デスクトップ版のvscodeっぽく利用してしまおうという魂胆です．

デスクトップ版のcode-serverを利用するメリットは下記のようなものがあります．
## code-server利用のメリット
- 開発がマシンによらない．
    - Desktop版のvscodeと違い，リモートマシンにアクセスできればどこから(PC, タブレット，スマホ)でも開発が可能です．
- エディタがコードベースで管理可能
    - code-serverの起動やvscodeの拡張機能含め，Dockerfileに記述をするので，GitHubでの管理可能です．


https://code.visualstudio.com/docs/editor/vscode-web



# 手順
ここからはDockerfileを作りながら最終的にcode-serverを起動できるようにする手順を書きます．


## 1. DockerHubより手ごろなイメージを探す．
下記サイトよりpytorchのDockerイメージを探します．
https://hub.docker.com/r/pytorch/pytorch/tags
`1.8.0-cuda11.1-cudnn8-runtime`
ハイフンでつながれているのがそれぞれpytorch, CUDA, cudnnのバージョンです．
適宜自分の環境に合うように利用してください．
研究で利用しているプログラムもあるので私はpytorch1.8.0のバージョンを使います．


## 2. ベースとなるイメージからDockerfile作成
ここからはDockerfileをいじります．

Dockerfileの一行目には下記のようにベースとなるイメージを指定します．

```Dockerfile:Dockerfile
FROM pytorch/pytorch:1.8.0-cuda11.1-cudnn8-devel
```

それ以降は環境構築に必要なコマンド等を記述します．
僕のファイルは以下のようになります．

```dockerfile:Dockerfile
FROM pytorch/pytorch:1.8.0-cuda11.1-cudnn8-devel

# Install vim
RUN apt-get update && apt-get install -y vim


WORKDIR /workspace
ADD requirements.txt /workspace

# install git
RUN apt-get update &&  apt-get install -y git

# install python modules
RUN pip install -r requirements.txt

# install hydra
RUN pip install hydra-core --upgrade

# 日本語化
RUN apt-get update \
  && apt-get install -y locales \
  && locale-gen ja_JP.UTF-8 \
  && echo "export LANG=ja_JP.UTF-8" >> ~/.bashrc
```

## 3. code-server構築手順をDockerfileに記述

Dockerfileの最終行には下記を追加してください．

```Dockerfile
~~~~~途中~~~~~

RUN apt-get update && apt-get install -y curl
RUN curl -fsSL https://code-server.dev/install.sh | sh
RUN code-server \
  --install-extension ms-python.python \
  --install-extension ms-ceintl.vscode-language-pack-ja
```

## 3. docker-compose.yml作成

docker起動コマンドをすっきりさせたいのと，複数コンテナ利用するための拡張性のためにdocker-compose.ymlを作成します．

```yaml:docker-compose.yml
version: '2.3'
services:
  pytorch-docker:
    build:
      context: ./Docker
      dockerfile: Dockerfile
    shm_size: '2gb'
    container_name: torch-docker 
    user: "${UID}:${GID}"
    runtime: nvidia
#     command: /bin/bash
#    command: jupyter lab --port 9999 --ip=0.0.0.0  --allow-root --NotebookApp.token='' --NotebookApp.password=''
    command: code-server --port 8080 --bind-addr=0.0.0.0:8080 /home/shuzo --log debug
    ports:
      - "7000:7000"
      - "9999:9999"
      - "8501:8501"
      - "0.0.0.0:8080:8080"
      - "0.0.0.0:8443:8443"
    environment:
      - TZ=$TZ
      - LANG=$LANG
      - PASSWORD=$PASSWORD
    tty: true
    volumes:
      - ./:/workspace
      - /etc/passwd:/etc/passwd:ro
      - /etc/group:/etc/group:ro
```


## 4. .envファイルに記述

Dockerfileと同じ階層に.envファイルを用意します．

```text:.env
UID=xxx
GID=xxx
TZ=Asia/Tokyo
PASSWORD=xxxxx
```
.envファイルに記述してしまってますが，多分よくありません．
何かいい方法あれば教えてください．

## 5. 起動&アクセス

```shell
sudo docker-compose up --build
```
で起動できます．

無事起動ができたら，
ブラウザで<起動したサーバのIP>:8080にアクセスしてください．

## 6. 補完機能を有効化

Docker内にあるAnacondaのPathを通します．これをすることでcode-server上で補完機能が利用できます．
1. まず，pythonの拡張機能をインストールしてください．
2. 設定で，interpreterを検索
3. Python Pathに`/opt/conda/bin/python3`を追加

# おわりに
今回紹介する内容はGitHubで公開しています．逐次アップデート予定


https://github.com/yusukekyokawa/pytorch-docker

# 参考
https://qiita.com/cognitom/items/6d8af8a71552ec9c6212