尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
如何用 /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

相关推荐

ARM optimized-routines底层性能原理与工程实践

ARM optimized-routines底层性能原理与工程实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/9/10 20:06:53
freeCodeCamp 每日编码挑战解析:Challenge 179 Pocket Change 零钱统计与美元格式化

freeCodeCamp 每日编码挑战解析:Challenge 179 Pocket Change 零钱统计与美元格式化

freeCodeCamp 每日编码挑战解析:Challenge 179 Pocket Change 零钱统计与美元格式化 【免费下载链接】freeCodeCamp freeCodeCamp.orgs open-source codebase and curriculum. Learn math, programming, and computer science for free. 项目地址: https://gitcod…

📅 2026/9/10 20:06:53
Detectron2 中的 DeepLabV3 / DeepLabV3+ 语义分割实战指南:Cityscapes 训练、评估与源码解析

Detectron2 中的 DeepLabV3 / DeepLabV3+ 语义分割实战指南:Cityscapes 训练、评估与源码解析

Detectron2 中的 DeepLabV3 / DeepLabV3 语义分割实战指南:Cityscapes 训练、评估与源码解析 【免费下载链接】detectron2 Detectron2 is a platform for object detection, segmentation and other visual recognition tasks. 项目地址: https://gitcode.com/Git…

📅 2026/9/10 20:06:53
MORE NEWS

更多资讯

📰

打造带长期记忆的 AI Agent:Zep 记忆后端 + AutoGen 编排 + Ollama/Qwen 3 本地模型实战(Zep Memory Assistant)

打造带长期记忆的 AI Agent:Zep 记忆后端 AutoGen 编排 Ollama/Qwen 3 本地模型实战(Zep Memory Assistant) 【免费下载链接】ai-engineering-hub In-depth tutorials on LLMs, RAGs and real-world AI agent applications. 项目地址: ht…

📰

Spring @Async异步编程实战:线程池、事务与异常处理全解析

去年给一个电商团队做性能治理,他们在排查一笔下单接口偶发超时的时候,发现耗时大户竟然是同步调用的短信发送和邮件通知。后来把这两个动作改成Async,接口响应直接从 900ms 降到 120ms。当时团队成员说了一句话:原来 Spring 异步…

📰

CANN/GE CreateVector函数API文档

CreateVector 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、TensorFlow 前…

📰

Spring Boot构建食品安全管理系统的技术实践

1. 项目概述:食品安全信息管理系统的技术选型与价值去年帮学弟调试毕业设计时,发现用Spring Boot构建的食品安全管理系统在高校选题中热度居高不下。这类系统本质上是通过信息化手段解决食品生产、流通环节的溯源难题,而Spring Boot的快速开发…

📰

Reflex Build 应用通用设置指南:名称、ID、可见性、复用导出与删除

Reflex Build 应用通用设置指南:名称、ID、可见性、复用导出与删除 【免费下载链接】reflex 🕸️ Web apps in pure Python 🐍 项目地址: https://gitcode.com/GitHub_Trending/re/reflex 导读 在 Reflex Build(Reflex 的…

📰

daisyUI Status 组件完全指南:用纯 CSS 圆点优雅展示元素在线状态

daisyUI Status 组件完全指南:用纯 CSS 圆点优雅展示元素在线状态 【免费下载链接】daisyui 🌼 🌼 🌼 🌼 🌼  The most popular, free and open-source Tailwind CSS component library 项目地址: https…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬