web-dev-qa-db-ja.com

スクリプトから「docker run」の後にdockerコマンドを実行するにはどうすればよいですか?

私の最終目標は、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端末コマンドを再度入力できるようになります。しかし、このアクションをスクリプトでどのように複製するのでしょうか?

2
dimpol

あなたが不足しているのは、バックグラウンドで実行する-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
2
AwokeKnowing