【问题标题】:Docker commands succeed on running container, but fail on DockerfileDocker 命令在运行容器时成功,但在 Dockerfile 上失败
【发布时间】:2017-08-15 18:05:02
【问题描述】:

我运行了一些命令,用于在 Ubuntu 14.04 上安装 Cuda 支持。为了做到这一点,我运行了以下命令,这是一系列组合命令:

apt-get install -y software-properties-common && add-apt-repository -y ppa:graphics-drivers/ppa && apt-get --purge remove "nvidia*" && apt-get --purge remove "cuda*" && cd Downloads && dpkg -i cuda-repo-ubuntu1404-7-5-local_7.5-18_amd64.deb && apt-get -y update && apt-get -y upgrade && apt-get install -y cuda
  • 当我在正在运行的容器上执行此操作时,即我的 Dockerfile 仅包含命令 FROM ubuntu:14.04,然后我使用 docker run -it <my new image name> bash 并成功!

  • 当我从 Dockerfile 中执行此操作时,会出现很多运行时错误,例如:

    invoke-rc.d:policy-rc.d 拒绝执行强制重载。

    invoke-rc.d:policy-rc.d 拒绝执行启动。

我想澄清一下 - 当我在容器上运行 bash 并逐步按照 Dockerfile 命令执行时,它会成功,但如果我使用 docker build 在 dockerfile 中执行与 RUN 命令相同的命令,则会失败。

知道可能是什么问题以及如何解决它吗?

我想指出,我在某些地方看到有人将以下命令添加到他们的 dockerfile:

RUN echo "#!/bin/sh\nexit 0" > /usr/sbin/policy-rc.d

没有什么比这更优雅了?运行 docker builddocker run -it 时权限不同吗?

【问题讨论】:

    标签: docker dockerfile docker-build


    【解决方案1】:

    Here 是一篇很好的帖子,它试图从根本上解决您面临的问题。

    短途

    1. RUN echo "#!/bin/sh\nexit 0" > /usr/sbin/policy-rc.d 应该可以解决您的问题 或者

    2. 如果这不能解决问题,请尝试使用 privileged 选项运行 docker 容器。像这样,docker run --privileged -d -ti DOCKER_IMAGE:TAG

    理想情况下,我不建议使用 privileged 选项运行容器,除非它是一个测试台容器。运行具有特权的 docker 容器的原因为容器提供了所有功能,并且还解除了所有强制执行的限制。换句话说,容器几乎可以做主机可以做的所有事情。但这不是一个好习惯。这违背了 docker 与主机隔离的目的。

    执行此操作的理想方法是根据您想要实现的目标set capabilities 的 docker 容器。谷歌搜索这应该可以帮助您为您的 docker 容器提供适当的capability

    【讨论】:

    • 不建议以--privileged 模式运行docker。 Docker 意味着与主机隔离。
    • 我同意你的看法@chintanthakar。可能不是使用--priviledged 运行的最佳方式和推荐方式。我认为最好的办法是根据您要执行的操作在容器内设置功能
    • 应该安装哪个包包含这个 policy-rc.d 文件?这没有多大意义......
    • 哦,它在 ubuntu 20 映像中的 docker 内包含“exit 101”
    猜你喜欢
    • 2021-12-24
    • 2020-08-26
    • 2019-07-12
    • 2021-08-18
    • 2022-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多