【问题标题】:Docker exec command not using the mounted directory for /Docker exec 命令不使用 / 的挂载目录
【发布时间】:2016-01-22 12:00:58
【问题描述】:

我是 docker 容器的新手,我正在尝试解决我现在面临的问题。

这些是我基于有限知识的理解。

当我们创建一个 docker 容器时,Docker 会创建一个本地挂载并将其用作 docker 容器的根文件系统。

现在,如果我使用 docker exec 从主机服务器运行容器中的任何命令,则 docker 不会使用挂载的分区作为容器的 / 文件系统。我的意思是,它仍然会从主机服务器中获取二进制文件和环境变量。是否有任何选项/替代解决方案可以使 docker 也使用 docker exec 的原始挂载目录?

如果我使用 docker attach 或 docker run -i -t /bin/bash 访问/启动容器,我将安装目录作为我的 / 文件系统,这为我提供了一个完全独立于我的主机系统的环境。但是 docker exec 命令不会发生这种情况。

请帮忙!!

【问题讨论】:

  • 您是否使用 --volumes (-v) 标志在容器中显式挂载主机目录?如果您可以将实际命令或用例添加到您的问题中,我们或许可以为您提供更好的帮助。
  • 没有从主机到容器的挂载。测试用例:运行 docker 容器的我的主机系统安装了 java 1.8,并且是默认的 java 版本 == # java -version java version "1.8.0_60" == 现在我有一个 docker 容器正在运行,它有 1.7 = == # docker attach 3095e705ee21 root@3095e705ee21:/# root@3095e705ee21:/# java -version java version "1.7.0_91" === 现在,我在主机服务器的同一个 docker 实例上执行 docker exec。 === # docker exec 3095e705ee21 java -version java version "1.8.0_60" === 我得到的是1.8,实际上是来自主机服务器而不是containe
  • 以可读的格式将其添加到您的原始问题中
  • 还有你在用什么容器,用什么命令来运行它?
  • 某些容器可能会有所不同,不确定,但您使用的容器不太可能实际上是从主机系统中获取二进制文件,这与容器的想法背道而驰

标签: docker


【解决方案1】:

您是在误解下运作的。 docker image 只包含其中安装的内容。出于效率原因,这通常是一个非常精简的操作系统版本。

docker container 是从一个镜像启动的——这是一个正在运行的版本,可以更改和存储状态——但可能会被丢弃。

docker run 从图像启动容器。您可以多次run 同一个图像来创建完全不同的容器(它们的内容恰好具有相同的起点)。

docker exec 附加到这些容器之一以运行命令。所以你只会看到它里面的东西……在图像里面,或者在启动后添加(比如日志文件)。它没有主机文件系统的愿景,并且可能不是同一个操作系统 - 唯一的要求是它共享内核的元素......尽管它通常有一个选择常用的二进制文件。

并且当你run一个镜像创建一个容器时,你可以指定一个挂载。执行此操作时的选项之一是通过主机文件系统,例如-v /path/on/host:/path_in/container。但您不必这样做,您可以使用数据容器或使用 docker 卷挂载。例如docker run -v /mount 使用不属于父主机的 docker 文件系统在容器内创建一个挂载点。这可用于制作数据容器:docker create -v /path/to/data --name data_for_acontainer some_basic_image

然后将卷该数据容器安装到一个新容器上:

docker run -d --volumes-from data_for_acontainer some_app_image 

这会将数据容器附加到/path/to/data 挂载上。但在这两种情况下都不会直接触及“主机”文件系统——这就是 dockerising 事物的全部意义所在。

【讨论】:

  • 测试用例:运行 docker 容器的我的主机系统安装了 java 1.8 并且是默认的 java 版本 == # java -version java version "1.8.0_60" == 现在我有一个docker 容器正在运行,它有 1.7 === # docker attach 3095e705ee21 root@3095e705ee21:/# root@3095e705ee21:/# java -version java version "1.7.0_91" === 现在,我在同一个 docker 实例上执行 docker exec我的主机服务器。 === # docker exec 3095e705ee21 java -version java version "1.8.0_60" === 我得到的是1.8,实际上是来自主机服务器而不是容器。
猜你喜欢
  • 2019-08-07
  • 2020-03-08
  • 1970-01-01
  • 2018-11-17
  • 1970-01-01
  • 2019-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多