基本上,我正在安装一个带有 pip 的 python 包,运行时,它将在主目录中搜索配置文件,并使用其中的信息来生成和发送日志。
我已经在我的 Macbook 和 VirtualBox 中的 Ubuntu VM 上进行了设置并运行。
问题:我尝试使用 Ubuntu Docker 映像执行相同的操作,但它无法找到配置文件。
- 目录路径和 echo $PATH 结果在容器和虚拟机中是相同的。
- 配置文件位于/home/user/
- 当我启动 Docker 容器时没有用户,所以我在 w/“useradd -m USERNAME”上创建并给它 sudo。
- 我以配置所在的用户身份执行命令
虚拟机和容器之间是否存在一些根本性的差异可能导致这种情况?我是否设置了错误的用户?
答案1
在容器中,工作目录不是由运行进程的用户定义的。这是因为没有发生登录。
既然你问的是差价。虚拟机模拟裸机计算机,您可以在其中运行具有内核和许多进程的操作系统。其中一些负责身份验证和设置用户环境,例如初始工作目录。
另一方面,容器包含1 个或多个进程和文件,但通常不运行内核或系统管理器(如 systemd)。它更像是一个美化的 chroot 环境,其中提供了一组文件(以可执行文件、库和配置的形式)供使用。在容器内运行任何内容仍然取决于主机的内核,但它在另一个上下文中运行。 (谷歌cgroups如果你有兴趣)。
长话短说,容器中的工作目录并不是您想象的那样,因为没有任何东西为您设置它。所以你有一些选择:
- 设置
WORKDIR
Dockerfile 中的指令; - 做一件令人讨厌的事
cd /home/user && <command>
- 对容器中需要的任何内容使用绝对路径。大多数程序都采用命令行选项作为配置文件的路径。
如果您为一项任务使用 1 个容器,那么容器是最有用的(我猜这是一种约定)。因此,您可以放弃需要将文件组织到/home
并且都不运行的整个想法useradd
。你不需要须藤。容器中的逻辑是相反的。它以 root 身份启动,以便您可以构建映像并进行设置。稍后,在最后一个命令之前,您可以在容器的剩余生命周期中将权限放弃给普通用户,通常直到命令终止。
只需将您的配置转储到根目录 ( /
) 中,该目录也是默认的工作目录。使用USER
指令让 Docker 以该用户身份运行程序。
*上段中的两个链接都链接到同一页面的不同部分“编写 Dockerfile 的最佳实践”。这是一个很好的起点。
**如果您需要知道容器中的当前工作路径,请RUN pwd
在 Dockerfile 中的命令之前的任意位置插入 。
编辑:docker 还有一个关于如何构建 python/pip 图像的示例: https://docs.docker.com/language/python/build-images/