首页 > 解决方案 > 为 docker 容器安装 python pip 不起作用

问题描述

我正在尝试为我的 docker 容器配置 python-pip。但这给了我我没有权限的错误。在我使用 sudo 之后,它给了我另一个错误。

我尝试使用 sudo 获得 root 权限。我还尝试了命令 exec 并运行。

sudo docker container run davidrazd/discord-node-10 sudo apt-get install python-pip
sudo docker container exec davidrazd/discord-node-10 sudo apt-get install python-pip

docker:来自守护进程的错误响应:OCI 运行时创建失败:container_linux.go:348:启动容器进程导致“exec:\”sudo\”:在 $PATH 中找不到可执行文件”:未知。

并且没有 sudo:

E: 无法打开锁定文件 /var/lib/dpkg/lock-frontend - open (13: Permission denied)

E: 无法获取 dpkg 前端锁 (/var/lib/dpkg/lock-frontend),你是 root 吗?

标签: dockerpip

解决方案


以下是我认为您应该重新考虑使用 Docker 并确保充分利用容器的 3 个原因。

  1. 你有一个名为...-node-10. 您不需要特定节点的特定图像。它们都应该在同一个映像上运行,并且在必要的范围内,在运行时进行配置(这应该保持在最低限度,通常是发现或动态配置之类的东西)。如果10是一个版本,您应该使用标签对其进行版本控制,而不是图像 ID 本身。

  2. 有一个有效的用例通过exec一次性软件包安装在正在运行的容器中一次性执行安装(知道当容器停止时安装将消失),但docker run ... apt-get install对我来说真的没有意义。正如@DavidMaze 在问题评论中指出的那样,安装应该始终是 Dockerfile 的一部分。如果您将软件包安装到长期存在的容器中 - 不要,也不要。使用 docker 的人遇到的最糟糕的事情是他们试图将容器视为长期存在的虚拟机,而他们应该将它们视为短暂的运行时环境保持最小状态,本质上是不可变的(因此很容易被下一个版本替换),它们的映像包含所有安装时依赖项,并将任何长期数据存储在单独的 docker 卷上(希望它本身是备份的)。

  3. 您可能正在将您的应用程序的用户配置为在 Dockerfile 中以 USER 身份运行,但您正在尝试运行特权命令而不将 USER 设置为其他内容。然后您尝试运行sudo. 但是sudo在容器的上下文中没有多大意义,并且通常没有安装(如果是的话,这意味着你必须以某种方式设置一个用户到 sudo,所以它不会让你的生活变得任何更容易,只是更难)。您可以将用户设置docker execrootwith docker exec -u root ...。但是你不应该真的需要这样做——所有的设置都应该在 Dockerfile 中完成,你应该发布一个新的 dockerfile 来更改版本。

我自己是 docker 的重度用户,几乎所有的应用程序都在其中构建,因为它极大地简化了表达它们的运行时要求,所以我想我是从这里的经验之声说的。如果您的容器不是不可变的,您将无法获得 docker 的任何价值;您将遇到与没有容器时相同的问题,但使用较少的管理工具。Docker 消除了运行时的大部分管理——利用这一点,不要与之抗争。


推荐阅读