はじめに
環境作成をしていると権限関係でエラーが生じることがたまにあります。
権限関係のエラーは解決が難しいイメージがあります。
本日は、JupyterNotebook (JupyterLab)で権限関係のエラーがでて、解決しましたのでまとめたいと思います。
環境
- windows 10
- Docker Desktop 3.3.0
- 利用したDockerfileはこちら
問題
Dockerを利用して、JupyterNotebook (JupyterLab)の環境を作成して、アクセスしました。
そして新規ファイル(.ipynb)を作成したところ以下のようなエラーが出ました。
permission denied
とあるとおり権限が付与されていないことによるエラーです。
また、このエラーはDocker imageをdocker run
して起動したときに起きるもので、docker-compose up
でコンテナを起動したときには出ませんでした。
調査
まずはDockerのコンテナの中に入り、以下のコマンドを入れます。
$ ls -la
このコマンドについてはこちらを確認してください。
すると、以下のように表示されます。
今回、JupyterNotebook (JupyterLab)を利用しているディレクトリは、最後から2行目のdata
というところですが、権限がroot
になっています。
Jupyterを利用する場合、jovyan
にする必要があります。これがエラーの原因でした。
解決方法
方法1. Dockerfileの見直し
Dockerfileで./dataというディレクトリを作成しているところを確認すると、
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に関してはこちらのリポジトリで確認できます。
方法2. コマンドで権限を変更する
まず、コンテナの中に入ります。
$ docker exec -it [コンテナ名] sh
そのあと、権限を変更します。
# sudo chown -R [変更するユーザー名] [変更するディレクトリorファイル]
$ sudo chown -R jovyan data
このコマンドはこちらを参考にしました。
パスワードが求められるのでいれてください。
私の場合は、Dockerfile
でパスワードを設定しています。
FROM jupyter/datascience-notebook
# Setting jupyter notebook environment.
RUN rmdir work
ARG password=not_password
(省略)
パスワードはnot_password
といれました。
password: (not_password ただし表示はされない)
user
からjovyan
に変更されました。
ただしこの方法ではdocker run
するたびに変更が必要になるので、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
これでファイルが作成できるようになりました。
おわりに
今回は権限の対処をしました。最近権限で同じようなことをしていたのでうまく対処ができました。
動かなかったらとりあえず確認してみるのは大切です。