LoginSignup
3
3

More than 1 year has passed since last update.

Dockerコンテナからjupyter notebookに入るまでのコマンド長すぎて面倒だからBashスクリプトですっきりさせてみた

Last updated at Posted at 2022-08-26

頻繁に使うのにくそ長くて、尚且つフラグ等が変化しないDocker関連のコマンドにうんざりしている方におすすめ。
既にいろんな人がやっているが、起こりうるエラーをすべて通ったんじゃないかと思うほど、エラーに見舞われた。
誰かの役に立ってくれたらうれしい。

(修正後)
この記事を8/27の早朝に公開したところ、瞬時にTwitterの心優しい方がDocker-composeで行ったほうが、ポート等の管理のしやすさの観点でおすすめということを教えていただきましたので、それも追加し、大幅修正を加えました。(私はDocker-composeを、複数のコンテナがある場合にのみ使うものだとばかり固い考えをしていました…ありがとうございます。)

まずDocker-composeではなく、Dockerを使っている方へ

何ができるようになるのか

ホームディレクトリで

bash bin/example.sh

とするだけで、設定しておいたコンテナに入れる!
(ポートとかを指定する人はDocker-composeを使ったほうが管理が楽で、打つ文字数も減っていいですが、こっちはそれほど魅力はないかも。(ロマン重視)

方法

  • ホームディレクトリであるC:\Users\ユーザ名\に、binディレクトリを作成したうえで、example.shを作る。

  • example.shの中身を以下のように編集する
    ※中身に普段使うdocker runコマンドを書くだけです。あくまでこれは例です。(1行目を忘れないでください)

#!/bin/bash
docker run --rm -it IMAGE


さて、ここからが本番。

Docker-composeを使う方へ

これまで

開発を再開する度に、

  • docker-compose up -d
  • docker-compose exec app bash
  • jupyter notebook --port=8888 --ip=0.0.0.0 --allow-root
    を手打ちしていました。
    開発を一時中断する際には、少なくとも、
  • jupyter notebookを閉じる
  • exit(コンテナからでる)
  • docker-compose down
    の動作が必要でした。(一回だけならまだしも、何回も必要となると、プログラマーの血が騒ぎました。)

結果

docker-compose.ymlファイルがあるディレクトリに移動した後に、

bash bin/crun.sh

と打つだけで、jupyter notebookを自動で起動させ、jupyter notebookを出たときは自動でdocker-compose downまでしてくれる。
実質コマンドラインで実行したコマンドはこれだけ。気持ちいい~

方法

docker-compose.yml

  • まず、docker-compose.ymlファイルを作成・編集します。
docker-compose.yml
#Composeのバージョンを指定
version: '3'
services:
  app:
    image: image-name
    ports:
      - "8888:8888"
    volumes:
      - /c/users/...:/app
    tty: true

このサイトを参考にしたところ、exited with code 0の問題に直面しました。(厳密にはエラーではない)
必要に応じて最後のtty: trueを付け足してください。

Bashスクリプト

  • 次に、一つ目に紹介した方法とは異なり、docker-compose.ymlがあるディレクトリにbinディレクトリを作り、example.shを作る。
  • example.shを以下のように編集します。(念のため、それぞれの行の解説を書いておきますが、基本的に人によって多かれ少なかれ変化するものだと思います。)
example.sh
#!/bin/bash
#コンテナを作成して開始する
docker-compose up -d
#コンテナに入るのとコンテナ内で""内のコマンドを実行するように引数を渡している
winpty docker-compose exec cell-pj bash -c "jupyter notebook --port=8888 --ip=0.0.0.0 --allow-root --NotebookApp.token=''"
#exit codeを受け取る
EXIT_CODE=$?
#コンテナおよび、ネットワーク関連をすべて破棄
docker-compose down
#終了
exit EXIT_CODE

EXIT_CODE=$?$?このWebサイトによると

You can use special shell variable called $? to get the exit status of the previously executed command.
(直前に実行されたコマンドの終了ステータスを取得するために呼び出される特別なシェル変数$?を使用できます。)

  • あとはdocker-compose.ymlがあるディレクトリで
bash example.sh

とするだけで、結果に述べたように一部の挙動が自動化される。

エラー集

command not found

問題

最初、コマンドプロンプト上でvimを用いて編集しましたが、バックスペースが使えなくなったり、bash example.shとコマンドを叩いてもcommand not foundと返されました。

Bashスクリプトを実行するとこのようなエラー文が返ってくる。

The command 'docker' could not be found in this WSL 2 distro.
We recommend to activate the WSL integration in Docker Desktop settings.

For details about using Docker Desktop with WSL 2, visit:

https://docs.docker.com/go/wsl2/

どうやらとっても人気のissueらしい。即諦めました。
解決したいと思う方はこちらを参考にしてみるといいかもしれません。

解決法

解決法として、Git Bashで編集して、bash example.shで実行するとなんの問題もなくいけました。
(厳密には解決してないけど…ヨシ)

exite with status 0

問題

Dockerコンテナが立ち上がってもすぐに閉じてしまう。

解決法

docker-compose.yml
version: '3'
services:
  app:
    image: image-name
    ports:
      - "8888:8888"
    volumes:
      - /c/users/...:/app
    tty: true #<-----appの中にこいつを書き込む

その他の解決法はこのサイト「docker-composeでexit with status 0の解決法」にまとめらているので、参考までに。

参考にした記事

謝辞

  • インターンシップ先のインフラつよつよの方
    Bashスクリプトを使う大きなきっかけを与えてくださって本当にありがとうございます。
  • TwitterにてDocker-composeでの改善策を教えてくださった@hpp_ricecakeさん
    管理のしやすさが爆上がりしました。ありがとうございます。
3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3