71949


WSL2上のUbuntu18.04で

[code]

    docker run  --runtime=nvidia -v $PWD:/tmp/working -v     /data:/tmp/working/data -w=/tmp/working -p 8888:8888 --rm -it kaggle/python-gpu-build bash -c "export LD_LIBRARY_PATH=/usr/local/cuda/lib64; pip install jupyter_contrib_nbextensions; pip install jupyter_nbextensions_configurator; jupyter contrib nbextension install --user; jupyter notebook --notebook-dir=/tmp/working --ip='*' --port=8888 --no-browser --allow-root"
    
[/code]

を実行していますが、

[code]

    jupyter notebook --notebook-dir=/tmp/working --ip='*' --port=8888 --no-browser --allow-root"
    
[/code]

を取り除いても、コンテナ内でとどまらずに抜けてしまいます。  
docker run に`bash`コマンドをつけていればコンテナ内にとどまったままという認識なのですが。

どのようにすればコンテナから抜けずに、コマンドを手打ちで実行できますでしょうか。  
よろしくお願いいたします。


CC BY-SA 4.0
2020-11-14T09:28:01.617
71948
2020-11-24T22:18:53.457
2020-11-24T22:18:53.457
32986
12457
question
python docker jupyter-notebook kaggle
Dockerでコンテナ内に入ったままにする方法


おそらくやりたいことは次のとおりかと思います。

  1. jupyter notebookのコンテナをデーモン化したい（起動状態のままにする）
  2. その上で、起動中のコンテナに対して標準入力(`-it`)を行いたい。（おそらくbashを使いたい）

だと思います。1と2をワンライナーで書く必要は無いので分割してシェルを叩いてください。  
また、実行したいコマンドはDockerfileに定義してイメージを作成したほうが良いでしょう。

## やりたいことの再現（Docker ImageをPython 3とした例）

Dockerのイメージ`kaggle/python-gpu-
build`が手元でpullできなかったので、代わりに`python:3`のイメージを使ってやりたいことを達成します。

適当なディレクトリ（ここでは`sample`としましょう）に`Dockerfile`以下の内容で設置します。

[code]

    FROM python:3
    
    ENV LD_LIBRARY_PATH=/usr/local/cuda/lib64
    RUN pip install jupyter_contrib_nbextensions && \
        pip install jupyter_nbextensions_configurator && \
        jupyter contrib nbextension install --user
    
    CMD ["jupyter", "notebook", "--notebook-dir=/tmp/working", "--ip='*'", "--port=8888", "--no-browser", "--allow-root"]
    
[/code]

ターミナルで`sample`ディレクトリに移動し、次のコマンドを実行してきます。

my-jupyter-notebookというDockerイメージを作成する

[code]

    docker build . -t my-jupyter-notebook
    
[/code]

buildが完了したら(my-jupyter-notebook)存在するか確認

[code]

    docker images
    
    # 表示例
    REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
    my-jupyter-notebook     latest              5c7c15c617c5        5 seconds ago       1.08GB
    
[/code]

my-jupyter-notebookのイメージからjupyter-notebookという名前のコンテナをデーモン化して起動

[code]

    docker run --name jupyter-notebook -v $PWD:/tmp/working -w=/tmp/working -p 8888:8888 --rm -d my-jupyter-notebook
    
[/code]

起動したコンテナを`docker ps`コマンドで確認します。

[code]

    docker ps
    
    # 表示例
    CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                    NAMES
    72efca091ad5        my-jupyter-notebook   "jupyter notebook --…"   5 seconds ago       Up 4 seconds        0.0.0.0:8888->8888/tcp   jupyter-notebook
    
[/code]

起動したコンテナ`jupyter-notebook`の起動ログを確認します。

[code]

    docker logs jupyter-notebook
    # 連続で監視し続けるなら -f オプションをつけます
    docker logs -f jupyter-notebook
    
[/code]

起動したコンテナ`jupyter-notebook`に対してbashのセッションを作成します、

[code]

    docker exec -it jupyter-notebook bash
    
[/code]

これで起動中のjupyter notebookのコンテナ内部で作業できます。  
`jupyter notebook list`が実行できるか確認してみてください。

## `kaggle/python-gpu-build`のイメージでやる場合

`kaggle/python-gpu-build`は手元になかったので、動作確認は保証しかねますがおそらく次のようになると思います。

### Dockerfile

[code]

    FROM kaggle/python-gpu-build
    
    ENV LD_LIBRARY_PATH=/usr/local/cuda/lib64
    RUN pip install jupyter_contrib_nbextensions && \
        pip install jupyter_nbextensions_configurator && \
        jupyter contrib nbextension install --user
    
    CMD ["jupyter", "notebook", "--notebook-dir=/tmp/working", "--ip='*'", "--port=8888", "--no-browser", "--allow-root"]
    
[/code]

[code]

    docker build . -t kaggle-jupyter-notebook
    
    docker run \
           --name jupyter-notebook \
           --runtime=nvidia \
           -v $PWD:/tmp/working \
           -v /data:/tmp/working/data \
           -w=/tmp/working \
           -p 8888:8888 \
           --rm -d kaggle-jupyter-notebook
    
    docker exec -it kaggle-jupyter-notebook bash
    # これでコンテナに接続してbashが使えます
    
[/code]

コマンドの内容は例と同じなので省略します。

## 参考

日本語の参考文献

  * <https://docs.docker.jp/engine/reference/commandline/ps.html>
  * <https://docs.docker.jp/engine/reference/commandline/build.html>
  * <https://docs.docker.jp/engine/reference/commandline/exec.html>

英語の参考文献

  * <https://docs.docker.com/engine/reference/commandline/ps/>
  * <https://docs.docker.com/engine/reference/commandline/build/>
  * <https://docs.docker.com/engine/reference/commandline/exec/>


CC BY-SA 4.0
2020-11-14T11:42:07.127
71949
2020-11-14T11:42:07.127
7997
71948
answer