在Docker中无法使用sudo命令,显示“bash:sudo:command not found”。

82

我使用以下命令安装了TensorFlow

docker run -it b.gcr.io/tensorflow/tensorflow:latest-devel

我需要在Windows机器上设置TensorFlow Serving。我按照说明进行操作,并在安装TensorFlow Serving依赖项时运行下面提到的sudo命令。
sudo apt-get update && sudo apt-get install -y \
     build-essential \
     curl \
     git \
     libfreetype6-dev \
     libpng12-dev \
     libzmq3-dev \
     pkg-config \
     python-dev \
     python-numpy \
     python-pip \
     software-properties-common \
     swig \
     zip \
     zlib1g-dev

显示以下错误:

bash: sudo: command not found

那些投票关闭为超级用户的人是怎么回事?关于编写Dockerfile的问题肯定与开发相关;但这个问题应该被关闭,因为它没有足够的信息来重现(不包含完整的Dockerfile、运行命令,甚至错误信息都只在图像链接后面),而不是因为它属于SU。 - Charles Duffy
3个回答

127

Docker默认以root用户身份运行,不需要使用sudo

顺便说一下,如果你想在docker中使用sudo,可以通过install sudo来安装。

请尝试以下操作:

apt-get update && \
      apt-get -y install sudo

现在您可以在Docker中与命令一起使用sudo...


9
即使你可以安装 sudo,也没有理由在容器中削弱安全性。请注意不改变原意,保持通俗易懂。 - Peter V. Mørch
1
@PeterV.Mørch 这对于像 sudo --user postgres psql -d template1 这样的命令有用吗? - dumbledad
1
@PeterV.Mørch - 你怎么运行chmod命令呢?我得到了“Operation not permitted”(操作不允许)的错误。所以我猜这就是为什么我需要sudo的原因。 - Darius.V
@PeterV.Mørch 如果用户已经是root,安全性会受到什么影响? - alper
2
@alper 在使用 Dockerfile 构建容器时,作为 root 用户是安全的。因为你已经是 root 用户了,所以不需要使用 sudo。但在运行容器时,作为 root 用户是不安全的。因此,你不应该需要 sudo。只需安装 sudo 就会削弱安全性。如果由于某些原因你的应用程序在运行时需要 sudo,那么从安全角度来看,你的应用程序可能存在问题。或者告诉我需要 sudo 的具体情况,我们将从那里开始。 - Peter V. Mørch
显示剩余3条评论

26
Docker镜像通常不会有sudo,您默认已经以root身份运行。尝试一下:
apt-get update && apt-get install -y build-essential curl git libfreetype6-dev libpng12-dev libzmq3-dev pkg-config python-dev python-numpy python-pip software-properties-common swig zip zlib1g-d

如果您不希望以root身份运行,请查看Docker文档中的用户命令


@sam:在运行命令“apt-get update && apt-get install -y \ build-essential \ curl \ git \ libfreetype6-dev \ libpng12-dev \ libzmq3-dev \ pkg-config \ python-dev \ python-numpy \ python-pip \ software-properties-common \ swig \ zip \ zlib1g-d”时,会显示错误“bash: apt-get: command not found”。 - Vasanti
@Vasanti,这在表面上看起来非常简单,不是吗?你要扩展的基础图像是什么? - Charles Duffy
嗯。如果这是基于 https://github.com/tensorflow/tensorflow/blob/master/tensorflow/tools/docker/Dockerfile.devel 的 Dockerfile,那么它确实是基于 Ubuntu 的,因此应该有 apt-get。有趣的是要弄清楚内部 PATH 是否错误,或者它是否真的与该 Dockerfile 匹配。不过很容易做到这一点——只需在容器内部执行 echo $PATHls -l /usr/sbin 即可。 - Charles Duffy
@CharlesDuff:在运行命令 ls -l /usr/bin/sbin 时,显示以下错误: - Vasanti
ls:无法访问 'usr/bin/sbin':没有该文件或目录。 - Vasanti
显示剩余6条评论

6
我们不想通过在容器中安装sudo来削弱其安全性。但是我们也不想改变现有的脚本,使它们适用于不需要sudo的docker环境下的正常机器。
我们可以定义一个虚拟的bash脚本来替换sudo,该脚本仅在docker镜像内部定义,执行参数时不会提升权限。
将以下内容添加到您的Dockerfile中:
# Make sudo dummy replacement, so we don't weaken docker security
RUN echo "#!/bin/bash\n\$@" > /usr/bin/sudo
RUN chmod +x /usr/bin/sudo

我无法在 Ubuntu 镜像上使其工作。我尝试从 /bin/bash 切换到 /bin/sh,但仍然收到 /bin/sh: 1: sudo: not found 的错误信息。 - crypdick
奇怪,这对我起作用了。只需一个Ubuntu镜像和上面的几行代码,您可以运行docker run -it ... bash并检查/usr/bin/sudo文件吗?也许您的镜像中没有将/usr/bin添加到PATH路径中? - TamaMcGlinn
我已经采用另一种方法解决了这个问题。实际上,我说了谎 - 我正在使用atlassian/default-image:3,他们声称它是基于Ubuntu的镜像。也许他们做了什么有趣的事情。无论如何,感谢您的帮助。 - crypdick
这似乎是针对执行调用“sudo”的脚本的情况的正确答案,所以谢谢。 - brasskazoo
1
我不得不添加“-e”:例如,RUN echo -e“#!/bin/bash\n$@”> /usr/bin/sudo - trash80

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接