JupyterNotebookでファイルを作成しようとするとpermission deniedとなる

# はじめに

環境作成をしていると権限関係でエラーが生じることがたまにあります。
権限関係のエラーは解決が難しいイメージがあります。

本日は、JupyterNotebook (JupyterLab)で権限関係のエラーがでて、解決しましたのでまとめたいと思います。

# 環境
- windows 10
- Docker Desktop 3.3.0
- 利用したDockerfileは[こちら](https://github.com/jinwatanabe/Azure_webapp_deploy)

# 問題

Dockerを利用して、JupyterNotebook (JupyterLab)の環境を作成して、アクセスしました。
そして新規ファイル(.ipynb)を作成したところ以下のようなエラーが出ました。

`JupyterNotebook`
![bandicam 2021-06-12 14-41-03-951.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/2024c01a-ac5d-f348-7d90-4a98b00a4d7b.jpeg)


`JupyterLab`
![bandicam 2021-06-12 14-42-43-765.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/769dfb30-431b-3a8f-9c92-73049d1cb2ee.jpeg)

`permission denied`とあるとおり権限が付与されていないことによるエラーです。

また、このエラーはDocker imageを`docker run`して起動したときに起きるもので、`docker-compose up`でコンテナを起動したときには出ませんでした。

# 調査

まずはDockerのコンテナの中に入り、以下のコマンドを入れます。

```
$ ls -la
```

このコマンドについては[こちら](https://eng-entrance.com/linux_command_ls)を確認してください。

すると、以下のように表示されます。

![bandicam 2021-06-12 14-41-34-436.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/d4e083cc-518d-d89e-9a76-8a63e9a6def6.jpeg)

今回、JupyterNotebook (JupyterLab)を利用しているディレクトリは、最後から2行目の`data`というところですが、権限が`root`になっています。

Jupyterを利用する場合、`jovyan`にする必要があります。これがエラーの原因でした。

# 解決方法

## 方法1. Dockerfileの見直し

Dockerfileで./dataというディレクトリを作成しているところを確認すると、

```Dockerfile
FROM jupyter/datascience-notebook
# Setting jupyter notebook environment.
RUN rmdir work
ARG password=not_password

# install libraries
ENV GRANT_SUDO=yes
USER root

(途中省略)

RUN mkdir ./data

# jupyter config
COPY ./settings/jupyter_notebook_config.py .jupyter/
```

rootユーザーでディレクトリを作成していました。
このユーザーを`jovyan`に変更して、dataディレクトリを作成します。

```
FROM jupyter/datascience-notebook
# Setting jupyter notebook environment.
RUN rmdir work
ARG password=not_password

# install libraries
ENV GRANT_SUDO=yes
USER root

(途中省略)

# ユーザー変更
ENV GRANT_SUDO=no
USER jovya
RUN mkdir ./data

# upyter config
COPY ./settings/jupyter_notebook_config.py .jupyter/
```
すると、無事成功しました。
このDockerfileに関しては[こちら](https://github.com/jinwatanabe/Azure_webapp_deploy)のリポジトリで確認できます。

## 方法2. コマンドで権限を変更する

まず、コンテナの中に入ります。

```
$ docker exec -it [コンテナ名] sh
```

そのあと、権限を変更します。

```
# sudo chown -R [変更するユーザー名] [変更するディレクトリorファイル]
$ sudo chown -R jovyan data
```

このコマンドは[こちら](https://qiita.com/johnjohnjohnjohn/items/710c401c205371c06bc3)を参考にしました。

パスワードが求められるのでいれてください。
私の場合は、`Dockerfile`でパスワードを設定しています。

```Dockerfile
FROM jupyter/datascience-notebook
# Setting jupyter notebook environment.
RUN rmdir work
ARG password=not_password
(省略)
```
パスワードは`not_password`といれました。

```
password: (not_password ただし表示はされない)
```

![bandicam 2021-06-12 15-30-42-524.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/42d8d633-80d1-3aca-ed2c-718bf04ea10e.jpeg)

`user`から`jovyan`に変更されました。

ただしこの方法では`docker run`するたびに変更が必要になるので、Dockerfileで権限変更の処理をします。

Dockerfileを以下のように変更します。

```Dockerfile
FROM jupyter/datascience-notebook
# Setting jupyter notebook environment.
RUN rmdir work
ARG password=not_password

# install libraries
ENV GRANT_SUDO=yes
USER root

(途中省略)

RUN mkdir ./data

# jupyter config
COPY ./settings/jupyter_notebook_config.py .jupyter/

# 権限変更
RUN chown -R jovyan data
```

これでファイルが作成できるようになりました。

![bandicam 2021-06-12 15-38-26-812.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/2ee4d971-a259-5520-dd81-94a2d958d425.jpeg)

# おわりに
今回は権限の対処をしました。最近権限で同じようなことをしていたのでうまく対処ができました。
動かなかったらとりあえず確認してみるのは大切です。


# 参考記事
- [lsコマンドの使い方と覚えたい15のオプション【Linuxコマンド集】](https://eng-entrance.com/linux_command_ls)
- [Anacondaインストール後のJupyterの設定: ブラウザとパスワードの設定・nbextensionsとその他拡張機能の追加・設定](https://qiita.com/johnjohnjohnjohn/items/710c401c205371c06bc3)