Docker - 在执行容器时挂载卷

时间:2021-03-02 12:57:21

标签: docker

我使用了一个 docker 容器,我想在其中动态地挂载一个卷。所以我希望每次调用“exec”来安装不同的主机路径。这目前是不可能的。

我目前的方法(静态):

# First Time
docker run -dit -v <from1>:/<to> --name <NAME> <IMAGE>
docker exec <NAME> bash -c "<my-bash-command>"

# Any following time:
docker stop <NAME>
docker rm <NAME>
docker run -dit -v <from2>:/<to> --name <NAME> <IMAGE>
docker exec <NAME> bash -c "<my-bash-command>"

所以目前我必须停止、删除并重新创建整个容器,因为我有一个不同的“from”路径。

我希望有一种方法可以创建并已经在后台启动容器,并且只是在命令执行期间挂载卷。

示例(伪代码,这行不通)

# First Time
docker run -dit --name <NAME> <IMAGE>
docker exec -v <from1>:/<to> <NAME> bash -c "<my-bash-command>"

# Any following time:
docker exec -v <from2>:/<to> <NAME> bash -c "<my-bash-command>"
docker exec -v <from3>:/<to> <NAME> bash -c "<my-bash-command>"
...

有没有办法解决这个问题?因为我需要保持相同的容器,并且我不想每次运行命令时都创建一个新容器(因为我将在容器内使用持久数据,如果我删除容器,这些数据会被丢弃)

1 个答案:

答案 0 :(得分:0)

容器背后的整个想法是封装可重用的小任务。容器应该是暂时的,这意味着我应该能够删除容器并创建新容器而不会丢失数据(所有数据都应该在容器之外)

如果您的容器遵循这种方法,则可以按以下方式运行。

docker run -v <from2>:/<to> <NAME> bash -c "<my-bash-command>"
docker run -v <from3>:/<to> <NAME> bash -c "<my-bash-command>"

从问题的性质和您要执行的操作来看,我可以理解容器具有依赖于后续命令的内部状态,这就是问题的根本原因。

从共享的命令中,我没有看到任何依赖于容器的东西(例如卷、端口等),因此没有什么可以阻止您按如下方式运行容器:

# First Time
docker run -dit -v <from1>:/<to> --name <NAME> <IMAGE>
docker exec <NAME> bash -c "<my-bash-command>"

# Any following time:
docker run -dit -v <from2>:/<to> --name <NAME2> <IMAGE>
docker exec <NAME2> bash -c "<my-bash-command>"

如果你有依赖,也许依赖应该在另一个容器中,然后运行的容器和新的容器都可以链接到依赖容器并消耗所需的信息。您可以使用文件系统、网络服务等来链接容器。