【问题标题】:Installing python pip for docker container doesnt work为 docker 容器安装 python pip 不起作用
【发布时间】:2019-01-05 16:29:33
【问题描述】:

我正在尝试为我的 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 吗?

【问题讨论】:

  • 您通常不会在正在运行的容器中安装软件:一旦容器退出,这将丢失,您将不得不重复它。将这样的安装步骤放在 Dockerfile 中,然后构建包含您的软件的自定义映像。
  • 如何修改 docker 镜像?

标签: docker pip


【解决方案1】:

我认为您应该重新考虑使用 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 exec -u root ...docker exec 时间的用户设置为root。但是你不应该真的需要这样做——所有的设置都应该在 Dockerfile 中完成,你应该发布一个新的 dockerfile 来更改版本。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-28
    • 2022-06-15
    • 2016-12-09
    • 1970-01-01
    • 2014-08-29
    • 2020-12-11
    • 2021-04-28
    相关资源
    最近更新 更多