私の最終目標は、Dockerコンテナーを起動し、そのdockerコンテナー内でいくつかのファイルを移動することです。これにはいくつかのコマンドが必要なので、これを自動的に行うスクリプトを作成したいと思います(これらのコマンドを毎回手動で作成するのではなく)。ここでの私の計画は、このためのbashスクリプトを作成することです。
問題は最初のコマンドの直後から始まります。
nvidia-docker run -it --name "Test" gcr.io/tensorflow/tensorflow:latest-gpu
これにより、次の出力が画面に表示されます(コマンドを記述したUbuntuターミナルと同じGUIで)。
[I 14:42:36.484 NotebookApp] Writing notebook server cookie secret to /root/.local/share/jupyter/runtime/notebook_cookie_secret
[W 14:42:36.509 NotebookApp] WARNING: The notebook server is listening on all IP addresses and not using encryption. This is not recommended.
[I 14:42:36.513 NotebookApp] Serving notebooks from local directory: /notebooks
[I 14:42:36.513 NotebookApp] 0 active kernels
[I 14:42:36.513 NotebookApp] The Jupyter Notebook is running at: http://[all ip addresses on your system]:8888/?token=6731bf8e21c987cd142076cbeb77ed3cf0f97275bcdb7bce
[I 14:42:36.513 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[C 14:42:36.513 NotebookApp]
これで、ctrl + Cを入力してこれを「終了」できます。これにより、元の端末(まだ同じGUI)に「戻り」、Ubuntu端末コマンドを再度入力できるようになります。しかし、このアクションをスクリプトでどのように複製するのでしょうか?
あなたが不足しているのは、バックグラウンドで実行する-d
パラメータだと思います
docker run -d --name "Test" gcr.io/tensorflow/tensorflow:latest-gpu
これを行うと、コンテナを転送せずに起動します。そのため、スクリプトは他のコマンドを引き続き実行できます。
コンテナ内で実際に「いくつかのファイルを移動する」必要がある場合、できることは、スクリプトをボリュームとしてマウントして実行することです。
docker run -d -v$(pwd):/my --name Test gcr.io/tensorflow/tensorflow:latest-gpu bash
docker exec -d Test bash /my/script.sh
そのため、プリセットの作業ディレクトリをコンテナにマウントし、コンテナ内でそのスクリプトを実行しながら、元のスクリプトを続行します。それで追加します
docker exec -it Test bash
これで、スクリプトを実行した後、コンテナにいます。
または、フォルダーをマウントする代わりに、いくつかのdocker execコマンドを実行するだけです。
#!/bin/bash
docker run -d --name Test gcr.io/tensorflow/tensorflow:latest-gpu bash
docker exec -d Test bash cp /x /y
docker exec -d Test bash cp /y /z
docker exec -it Test bash