Docker命令在运行容器时成功,但在Dockerfile

时间:2017-03-23 09:18:20

标签: docker dockerfile docker-build

我运行了一些命令,用于在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 build vs docker run -it时不是关于不同的权限吗?

1 个答案:

答案 0 :(得分:0)

Here是一个很好的帖子,试图根源导致您面临的问题。

缩短

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

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

  3. 理想情况下,我不建议使用privileged选项运行容器,除非它是一个测试床容器。运行具有特权的docker容器的原因是为容器提供了所有功能,并且它还解除了所有强制执行的限制。换句话说,容器几乎可以完成主机可以执行的所有操作。但这不是一个好习惯。这就破坏了码头从主机隔离的目的。

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