JupyterNotebook에서 파일을 만들려고하면 permission denied가됩니다.

소개



환경을 만들면 권한 관계에서 오류가 발생할 수 있습니다.
권한 관계 오류는 해결하기 어려운 이미지가 있습니다.

오늘은, JupyterNotebook (JupyterLab)로 권한 관계의 에러가 나와, 해결했으므로 정리하고 싶습니다.

환경


  • windows 10
  • Docker Desktop 3.3.0
  • 사용한 Dockerfile은 여기

  • 문제



    Docker를 사용하여 JupyterNotebook (JupyterLab) 환경을 만들고 액세스했습니다.
    그리고 신규 파일(.ipynb)을 작성한 결과 다음과 같은 에러가 나왔습니다.
    JupyterNotebook
    JupyterLab
    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/
    

    루트 사용자로 디렉토리를 작성했습니다.
    이 사용자를 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
    

    이제 파일을 만들 수 있습니다.



    결론



    이번에는 권한을 다루었습니다. 최근 권한으로 비슷한 일을 했기 때문에 잘 대처할 수 있었습니다.
    움직이지 않으면 우선 확인해 보는 것은 중요합니다.

    참고 기사


  • ls명령의 사용법과 기억하고 싶은 15의 옵션【Linux명령집】
  • Anaconda 설치 후 Jupyter 설정 : 브라우저 및 비밀번호 설정, nbextensions 및 기타 확장 프로그램 추가 및 설정
  • 좋은 웹페이지 즐겨찾기