docker - 为 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 吗?
解决方案
以下是我认为您应该重新考虑使用 Docker 并确保充分利用容器的 3 个原因。
你有一个名为
...-node-10
. 您不需要特定节点的特定图像。它们都应该在同一个映像上运行,并且在必要的范围内,在运行时进行配置(这应该保持在最低限度,通常是发现或动态配置之类的东西)。如果10
是一个版本,您应该使用标签对其进行版本控制,而不是图像 ID 本身。有一个有效的用例通过
exec
一次性软件包安装在正在运行的容器中一次性执行安装(知道当容器停止时安装将消失),但docker run ... apt-get install
对我来说真的没有意义。正如@DavidMaze 在问题评论中指出的那样,安装应该始终是 Dockerfile 的一部分。如果您将软件包安装到长期存在的容器中 - 不要,也不要。使用 docker 的人遇到的最糟糕的事情是他们试图将容器视为长期存在的虚拟机,而他们应该将它们视为短暂的运行时环境保持最小状态,本质上是不可变的(因此很容易被下一个版本替换),它们的映像包含所有安装时依赖项,并将任何长期数据存储在单独的 docker 卷上(希望它本身是备份的)。您可能正在将您的应用程序的用户配置为在 Dockerfile 中以 USER 身份运行,但您正在尝试运行特权命令而不将 USER 设置为其他内容。然后您尝试运行
sudo
. 但是sudo
在容器的上下文中没有多大意义,并且通常没有安装(如果是的话,这意味着你必须以某种方式设置一个用户到 sudo,所以它不会让你的生活变得任何更容易,只是更难)。您可以将用户设置docker exec
为root
withdocker exec -u root ...
。但是你不应该真的需要这样做——所有的设置都应该在 Dockerfile 中完成,你应该发布一个新的 dockerfile 来更改版本。
我自己是 docker 的重度用户,几乎所有的应用程序都在其中构建,因为它极大地简化了表达它们的运行时要求,所以我想我是从这里的经验之声说的。如果您的容器不是不可变的,您将无法获得 docker 的任何价值;您将遇到与没有容器时相同的问题,但使用较少的管理工具。Docker 消除了运行时的大部分管理——利用这一点,不要与之抗争。
推荐阅读
- google-search - 谷歌搜索域属性获得更少的流量
- javascript - 错误:无效的挂钩调用。钩子只能在函数组件的主体内部调用。在使用 React.js 时
- javascript - 我正在尝试使用 javaScript 验证移动设备,但它不起作用
- mysql - 如何减少mysql中的查询执行时间
- c# - 在 React JS/Dot net core Single Page 应用程序中上传大文件时请求超时 502 错误
- azure-monitoring - Azure Monitor 日志:AppServiceHTTPLogs 表缺少 CsUriQuery 字段?
- git - 无法在存储库中添加带有减号红色符号的文件。视觉工作室 17/TFS/Git
- html - 如何正确定位我的元素 CSS(滑块)?
- ios - 如何在 Alamofire 重试方法中获取失败的请求数据
- css - 第一列的交替颜色