新闻详情

新闻详情

首页 / 资讯中心 / 详情

如何用 /etc/machine/create-user.sh 自定义 container machine 的首次启动用户初始化?

发布时间:2026/9/10 20:12:01来源:尧图网络
如何用 /etc/machine/create-user.sh 自定义 container machine 的首次启动用户初始化?
如何用 /etc/machine/create-user.sh 自定义 container machine 的首次启动用户初始化【免费下载链接】containerA tool for creating and running Linux containers using lightweight virtual machines on a Mac. It is written in Swift, and optimized for Apple silicon.项目地址: https://gitcode.com/GitHub_Trending/container30/container用 container 在 Mac 上创建 container machine 时首次启动会自动创建一个与你 macOS 主机账号对应的 Linux 用户主机用户名被映射进去Mac 的$HOME挂载到/Users/username仓库和 dotfiles 在两边可见。这套默认行为由内置的用户初始化脚本完成。如果你需要在首次启动时做不同的用户配置——例如修改 shell、追加初始文件、调整权限规则——可以把自定义脚本以可执行文件的形式放进镜像的/etc/machine/create-user.sh它会取代内置脚本执行。本文的任务就是这条路径写出自定义脚本 → 打进自建镜像 → 用该镜像创建 machine → 验证首次启动用户初始化结果。依据是 docs/container-machine.md 的 “Bring your own container machine image” 一节以及仓库中 init 与内置脚本的实现init、create-user.sh。先弄清首次启动初始化是怎么触发的container machine 镜像启动时init 脚本先于系统/sbin/init运行。它处理-u首次用户设置时的逻辑是用id ${CONTAINER_USER}检查用户是否已存在若不存在镜像内存在/etc/machine/create-user.sh时执行它否则执行内置的/sbin.machine/create-user.sh无论是否执行了用户创建都写入/etc/.machine.initialized标记初始化完成。也就是说自定义脚本在首次启动、以 root 身份、只运行一次docs/container-machine.md 的表述且优先级高于内置脚本。内置脚本本身做的事可以参考 create-user.sh直接写/etc/group、/etc/passwd、/etc/shadow创建用户不依赖 useradd/adduser 等镜像特定工具创建CONTAINER_HOME并从/etc/skel填充初始文件最后写入一条免密 sudo 规则到/etc/sudoers.d/。脚本里可用的环境变量自定义脚本运行时以下变量由启动环境提供docs/container-machine.md 列出了前五项变量内容CONTAINER_USER你的主机用户名CONTAINER_UID对应用户的 UIDCONTAINER_GID对应用户的 GIDCONTAINER_HOME用户家目录形如/home/usernameCONTAINER_MACHINE_IDmachine 的 IDCONTAINER_SHELLinit 脚本导出从镜像解析出的系统默认 shell。Debian/Ubuntu 读取/etc/adduser.conf的DSHELL其他镜像读取/etc/default/useradd的SHELL找不到时分别回退到/bin/bash或/bin/sh这些变量在 MachineConfiguration.swift 的processEnvironment中注入CONTAINER_SHELL由 init 在调用脚本前export。编写镜像把自定义脚本打进 image镜像的前提是包含/sbin/initdocs/container-machine.md“Any Linux image that includes/sbin/initworks as a container machine”。下面以文档中的 Ubuntu 24.04 machine 镜像为例仅追加自定义脚本部分。脚本内容取自仓库内置脚本的写法用单引号 heredoc 防止构建期展开变量FROM ubuntu:24.04 ENV container container RUN apt-get update \ apt-get install -y \ dbus systemd openssh-server net-tools iproute2 iputils-ping curl wget vim-tiny man sudo \ apt-get clean \ rm -rf /var/lib/apt/lists/* \ yes | unminimize RUN /etc/machine-id RUN /var/lib/dbus/machine-id RUN systemctl set-default multi-user.target RUN systemctl mask \ dev-hugepages.mount \ sys-fs-fuse-connections.mount \ systemd-update-utmp.service \ systemd-tmpfiles-setup.service \ console-getty.service RUN systemctl disable \ networkd-dispatcher.service RUN sed -i -e s/^AcceptEnv LANG LC_\*$/#AcceptEnv LANG LC_*/ /etc/ssh/sshd_config # 自定义首次启动用户初始化脚本必须可执行 RUN mkdir -p /etc/machine \ cat /etc/machine/create-user.sh EOF #!/bin/sh set -e if ! getent group ${CONTAINER_GID} /dev/null 21; then echo ${CONTAINER_USER}:x:${CONTAINER_GID}: /etc/group fi if ! getent passwd ${CONTAINER_UID} /dev/null 21; then echo ${CONTAINER_USER}:x:${CONTAINER_UID}:${CONTAINER_GID}::${CONTAINER_HOME}:${CONTAINER_SHELL} /etc/passwd echo ${CONTAINER_USER}:!:19000:0:99999:7::: /etc/shadow fi mkdir -p ${CONTAINER_HOME} if [ -d /etc/skel ]; then cp -a /etc/skel/. ${CONTAINER_HOME} fi # 在这里追加你自己的初始化步骤写初始文件、配置组等 # 放在 chown 之前确保新文件的所有权随后被正确设置 chown -R ${CONTAINER_UID}:${CONTAINER_GID} ${CONTAINER_HOME} mkdir -p /etc/sudoers.d sudoers_file$(echo ${CONTAINER_USER} | tr . _) echo ${CONTAINER_USER} ALL(ALL) NOPASSWD:ALL /etc/sudoers.d/${sudoers_file} chmod 440 /etc/sudoers.d/${sudoers_file} EOF chmod x /etc/machine/create-user.sh上面脚本主体与仓库内置脚本行为一致直接改/etc/group、/etc/passwd、/etc/shadow填充/etc/skel配置免密 sudo保证 machine 的基本约定不被破坏你的自定义逻辑加在注释标记的位置即可。文档只要求该文件是可执行脚本不限制脚本内容。构建镜像并创建 machinecontainer build -t local/ubuntu-machine:latest . container machine create local/ubuntu-machine:latest --name ubuntucontainer machine create之后machine 尚未启动过用户初始化还没发生。接下来第一次run会先启动 machinecontainer machine run -n ubuntu whoami container machine run -n ubuntu pwd验证首次启动初始化结果按 docs/container-machine.md Quickstart 的判断标准上面两条命令的输出应为whoami输出你的主机用户名而不是 rootpwd输出/home/you你的 Mac 家目录挂载点文档示例表述。再核对用户记录与初始化标记# 确认自定义脚本写入的 /etc/passwd 条目shell 应为 CONTAINER_SHELL 解析结果 container machine run -n ubuntu -- cat /etc/passwd # 免密 sudo 规则文件文件名中用户名里的点号会替换为下划线 container machine run -n ubuntu -- ls /etc/sudoers.d # init 在用户设置完成后写入的标记文件 container machine run -n ubuntu -- ls -l /etc/.machine.initialized/etc/.machine.initialized由 init 写入存在即表示首次初始化流程已经走过一遍。限制与重新测试的注意事项只运行一次init 用id ${CONTAINER_USER}判断用户是否已存在已存在则跳过用户创建脚本。如果你改完脚本想重新观察首次启动行为需要删除 machine 再重建——container machine rm ubuntu会连同其持久化存储一起删除docs/container-machine.md “List, inspect, stop, delete” 一节操作前确认数据无需保留。脚本必须在镜像里且可执行/etc/machine/create-user.sh是随镜像文件系统分发的只对创建时使用的镜像生效之后换脚本必须重建 machine。脚本以 root 运行脚本内不需要再提权但要保证set -e下的任何一步失败不会留下半初始化的用户状态——内置脚本用getent做了幂等检查自定义步骤建议同样考虑重复执行安全。验证命令如cat /etc/passwd输出内容随你的主机用户名不同而不同文档没有固定预期值按上述判断标准核对即可。完成验证后这台 machine 就可以按 docs/container-machine.md 的常规用法使用了container machine run -n ubuntu进入交互 shellcontainer machine set -n ubuntu cpus4 memory8G等修改需 stop 后重新 run 才生效。【免费下载链接】containerA tool for creating and running Linux containers using lightweight virtual machines on a Mac. It is written in Swift, and optimized for Apple silicon.项目地址: https://gitcode.com/GitHub_Trending/container30/container创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

辰溪AI短视频:地方品牌推广新方式 2026/9/10 22:27:18

辰溪AI短视频:地方品牌推广新方式

来源:唐sirAI(www.tangsir.cc) | 电话:18874530691━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━怀化辰溪的企业和商家们,您是否还在为高昂的短视频制作费用而烦恼?是…

阅读更多 →
Wayve与高通合作解析:端到端自动驾驶技术突破 2026/9/10 22:27:18

Wayve与高通合作解析:端到端自动驾驶技术突破

1. 行业背景与事件解读今天凌晨,英国自动驾驶初创公司Wayve与美国芯片巨头高通突然官宣达成战略合作,这则消息在自动驾驶圈引发强烈震动。作为深耕ADAS领域多年的从业者,我第一时间拿到了双方的技术白皮书。简单来说,Wayve的端到端…

阅读更多 →
Spring框架核心原理与微服务实践指南 2026/9/10 22:27:18

Spring框架核心原理与微服务实践指南

1. Spring框架概述:Java开发的基石2003年,当Rod Johnson在《Expert One-on-One J2EE Development without EJB》一书中首次提出Spring框架的概念时,恐怕连他自己也没想到这个轻量级的解决方案会成为Java企业级开发的行业标准。作为Java生态中…

阅读更多 →
Taichi 字段高级内存布局指南:从 shape 到 ti.root、AoS/SoA 与手动内存管理 2026/9/10 22:27:18

Taichi 字段高级内存布局指南:从 shape 到 ti.root、AoS/SoA 与手动内存管理

Taichi 字段高级内存布局指南:从 shape 到 ti.root、AoS/SoA 与手动内存管理 【免费下载链接】taichi Productive, portable, and performant GPU programming in Python. 项目地址: https://gitcode.com/GitHub_Trending/ta/taichi 导读 在 Taichi 中&…

阅读更多 →
心电AI域泛化:从数据预处理到模型落地的关键技术 2026/9/10 22:27:18

心电AI域泛化:从数据预处理到模型落地的关键技术

1. 心电域泛化研究入门指南:从复现到可靠结果的进阶之路作为一名长期从事医疗AI研究的从业者,我经常遇到同行们提出的困惑:"为什么论文里的模型效果那么好,自己复现时却总是差强人意?"特别是在心电信号分析这…

阅读更多 →
15个实战项目推荐:作品集从选题做到上线的完整方案 2026/9/10 22:24:18

15个实战项目推荐:作品集从选题做到上线的完整方案

15个实战项目推荐:作品集从选题做到上线的完整方案 【免费下载链接】Project-Ideas-And-Resources A Collection of application ideas that can be used to improve your coding skills ❤. 项目地址: https://gitcode.com/GitHub_Trending/pr/Project-Ideas-And…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞