docker - 我可以在 Dockerfile 中创建一个临时变量并在以后重用它吗?
问题描述
在我的 Dockerfile 中,我想暂时切换到 root,然后再切换回原始用户。
originalUser=`RUN whoami`
USER root
RUN apk update
RUN apk add curl
# switch back to the user before root
USER $originalUser
是否可以在 Dockerfile 中做这样的事情?
解决方案
一方面,不,没有这样的事。唯一相似的东西是ARG
(在命令行中传递)和ENV
(它们是固定字符串),它们都不能根据命令输出动态设置。
另一方面,在 Docker 映像的上下文中,作为 Dockerfile 的作者,您可以完全和绝对地控制映像中的内容。您永远不必问诸如“如果用户有不同的用户名怎么办”或“如果他们想安装到不同的路径怎么办”之类的问题:您可以为这些东西选择固定值。我会建议:
- 如果您正在安装单个二进制文件或具有“正常”安装过程的东西(它具有 Autoconf 样式
./configure --prefix=...
选项),请将其安装到系统目录中 - 如果您正在使用不进入“正常”目录的脚本语言安装某些东西,那么
/app
它是一个常见的地方 - 以 root 身份安装软件(甚至是您的应用程序);在 Dockerfile 结束时切换到非 root 用户
USER
一次 - 不要试图镜像任何特定系统的目录布局、用户名或数字用户 ID;如果您尝试在其他地方运行图像,它们将不匹配
如果您尝试扩展其他图像,您应该很好地确定它使用的用户名并将固定字符串放在USER
派生图像的 Dockerfile 末尾的目录中。
推荐阅读
- reactjs - 我想用 React 和 Django 制作一个用户到用户的私人实时聊天应用程序
- excel - 仅显示每隔一列的堆叠条形图
- firebase - 如何在 Dart 中将自定义对象写入 Firestore
- flutter - 颤振导航堆栈切片
- powerbi - Power BI 表中值的出现次数
- python - Python在字母和*之间添加空格到词尾
- python - 当任务预计永远运行时,可以不“加入”多处理吗?
- automation - 如何使用invoke-webrequest在powershell中下载msi文件
- html - 试图在 golang 模板中显示图像
- c# - 在 toolboxservice 上显示用于控件的图像