【问题标题】:How to execute a shell script that has mount command inside dockerfile如何在dockerfile中执行具有mount命令的shell脚本
【发布时间】:2021-01-09 06:39:03
【问题描述】:

我有一个 Dockerfile 和 additional_req.sh 文件。从 dockerfile 构建 docker 后,我以特权模式运行 docker 并执行这个 shell 脚本,因为它包含挂载命令。现在我出于某种原因需要在 dockerfile 中执行这个过程。有什么办法可以做到这一点?我想在 dockerfile 本身中运行所有指令。我不应该运行额外的命令。

我尝试了以下但失败了

使用EXECUTE 命令 - 但需要额外的 docker run 步骤

使用了RUN 命令 - 挂载命令时出现权限被拒绝错误而失败

使用了CMD 命令 - 失败并出现与 RUN 命令相同的错误。

【问题讨论】:

  • 请在additional_req.sh文件中描述挂载命令
  • mount binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_misc/ mount proc <chroot_dir>/proc -t proc 他们就是这样的
  • 顺便说一句,如果您将问题标题更改为更准确地反映您正在尝试做的事情,那就太好了。您已经成功地在 Dockerfile 中运行了一个 shell 脚本。您只是没有设法在 dockerfile 中运行 mount 命令。这样,无法在 dockerfile 中运行任意 shell 脚本的人不会被问题标题误导。

标签: docker dockerfile


【解决方案1】:

您根本无法在 Dockerfile 中挂载文件系统。一般来说,您无法在 Docker 中运行 mount(8)。

Docker 镜像只保留文件系统和一些描述如何从它运行容器的元数据。它不包括任何挂载的文件系统或内核级设置。如果您能够RUN mount,则该更改不会持续到当前RUN 命令的末尾。在/proc 中的系统级设置的特殊情况下,这些设置有可能泄漏到 Docker 空间之外(因为内核在主机和所有容器之间共享)并且无法在重新启动或被复制的映像中存活到另一个系统。

更一般地说,Docker 使用 Linux capabilities 来阻止许多系统级操作。有docker run options to add capabilities to a container,但需要这些的非常少见,而且它们不能添加到构建步骤中。如果你真的需要挂载一些东西,你必须在你的容器启动中进行,并且你必须使用非常广泛的docker run --cap-add SYS_ADMINdocker run --privileged 选项来运行容器。

您在评论中谈到更改/proc/sys/fs 中的系统级设置。由于 Docker 不提供内核级隔离,您最好在虚拟机中运行此任务,此时您可以使用某种初始化脚本或将此设置放入 VM 的 /proc/mounts 文件中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-22
    • 2012-12-22
    • 1970-01-01
    • 1970-01-01
    • 2011-10-04
    • 1970-01-01
    相关资源
    最近更新 更多