我的最终目标是启动一个 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 终端命令。但是如何在脚本中复制此操作?
答案1
我认为你缺少的是-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