Podman运行SQL Server 2019容器报error101可否自定义运行用户
问题说明
非root用户使用Podman启动SQL Server 2019容器时触发报错:
/opt/mssql/bin/sqlservr: Unable to start the process, with error 101.
初步判断问题和容器默认使用宿主机不存在的mssql用户运行有关,目标是修改容器运行身份,使用当前登录的、具备特定权限的工作账户运行容器。测试多组命令参数组合后未找到有效配置项。
带卷挂载、端口映射的完整运行命令及输出日志:
[{username}@{server} ~]$ podman run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=A_Str0ng_Required_Password" -v /apps/home/{username}/var/mssql/data:/var/mssql/data:Z -p 1433:1433 mcr.microsoft.com/mssql/server:2019-latest SQL Server 2019 will run as non-root by default. This container is running as user mssql. To learn more visit https://go.microsoft.com/fwlink/?linkid=2099216. /opt/mssql/bin/sqlservr: Unable to start the process, with error 101.
补充验证:移除卷挂载、端口映射参数,使用最简命令运行仍然触发相同报错:
[{username}@{server} ~]$ podman run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=A_Str0ng_Required_Password" mcr.microsoft.com/mssql/server:2019-latest SQL Server 2019 will run as non-root by default. This container is running as user mssql. To learn more visit https://go.microsoft.com/fwlink/?linkid=2099216. /opt/mssql/bin/sqlservr: Unable to start the process, with error 101.
解决方法
报错101的核心原因是rootless Podman的用户命名空间映射规则,和容器内置mssql用户的权限校验不匹配,不需要额外修改镜像,通过启动参数即可解决,提供两种可落地的方案:
方案1:使用容器内置mssql用户运行(兼容性最高,推荐)
SQL Server 2019官方镜像内的mssql用户固定UID/GID为10001,直接通过--user参数指定数字形式的UID/GID启动即可,不需要修改容器内部结构:
- 如果使用数据卷挂载,先在宿主机给挂载目录设置对应属主权限:
chown -R 10001:10001 /apps/home/{username}/var/mssql/data - 启动命令添加
--user 10001:10001参数,示例:podman run --user 10001:10001 \ -e "ACCEPT_EULA=Y" \ -e "SA_PASSWORD=A_Str0ng_Required_Password" \ -v /apps/home/{username}/var/mssql/data:/var/mssql/data:Z \ -p 1433:1433 \ mcr.microsoft.com/mssql/server:2019-latest
方案2:使用当前宿主机工作账户运行
如果必须使用当前登录的宿主机用户身份运行,需要传入当前用户的数字UID/GID(不要直接传用户名,Podman不会自动在容器内创建同名用户),同时在启动时修正容器内mssql相关目录的权限:
- 先查询当前用户的UID和GID:
id -u # 输出当前用户UID,示例输出1000 id -g # 输出当前用户GID,示例输出1000 - 执行带权限修正的启动命令:
podman run --user $(id -u):$(id -g) \ -e "ACCEPT_EULA=Y" \ -e "SA_PASSWORD=A_Str0ng_Required_Password" \ -v /apps/home/{username}/var/mssql/data:/var/mssql/data:Z \ -p 1433:1433 \ --entrypoint bash mcr.microsoft.com/mssql/server:2019-latest \ -c "chown -R $(id -u):$(id -g) /var/opt/mssql && exec /opt/mssql/bin/sqlservr"
注意事项
- 所有传给
--user参数的身份标识必须是数字格式的UID/GID,传入用户名会因为容器内不存在对应用户触发权限错误 - rootless Podman环境下,方案1不需要修改容器内的文件权限结构,稳定性比方案2更高,优先选用
内容的提问来源于stack exchange,提问作者DHaeflinger
相关产品推荐
相关产品推荐

