背景
用户只能在非root用户下使用podman部署Clickhouse
部署命令:
podman run
--name clickhouse \
-v /home/demo/clickhouse/fs/volumes/config.d:/etc/clickhouse-server/config.d \
-d clickhouse/clickhouse-server:latest
问题以及解决
部署后报以下错误:
Cannot print extra info for Poco::Exception (version 25.9.3.48 (official build))
std::exception. Code: 1001, type: std::__1::filesystem::filesystem_error, e.what() = filesystem error: in posix_stat: failed to determine attributes for the specified path: Permission denied ["/etc/clickhouse-server/config.d/config.xml"]
Cannot print extra info for Poco::Exception (version 25.9.3.48 (official build))
std::exception. Code: 1001, type: std::__1::filesystem::filesystem_error, e.what() = filesystem error: in posix_stat: failed to determine attributes for the specified path: Permission denied ["/etc/clickhouse-server/config.d/config.xml"]
解决“/home/demo/clickhouse/fs/volumes/config.d”权限问题后发现问题还在
临时关闭 SELinux(快速验证)
临时关闭 SELinux 以确认是否为其导致的问题:
sudo setenforce 0 # 临时切换为Permissive模式(不强制执行策略)
# 重新测试临时容器
podman run -it --rm \
--name temp-clickhouse \
--userns=host \
-v /home/demo/clickhouse/fs/volumes/config.d:/etc/clickhouse-server/config.d \
clickhouse/clickhouse-server:latest \
bash
# 容器内执行以下命令验证是否能访问
ls -l /etc/clickhouse-server/config.d
验证发现可以正常启动,容器内的“/etc/clickhouse-server/config.d”文件权限也是正常的
永久配置 SELinux 上下文(推荐)
为挂载目录添加容器可访问的 SELinux 标签(container_file_t
或svirt_sandbox_file_t
):
# 递归设置整个fs目录的SELinux上下文(包含所有子目录和文件)
sudo chcon -Rt container_file_t /home/demo/clickhouse/fs
# 验证上下文是否生效(应显示标签为container_file_t)
ls -Z /home/demo/clickhouse/fs/volumes/clickhouse-01/etc/clickhouse-server/config.d
container_file_t
是 Podman 容器默认允许访问的标签,适用于大多数场景。
若仍有问题,可尝试svirt_sandbox_file_t
标签(旧版本 Podman 常用):
sudo chcon -Rt svirt_sandbox_file_t /home/demo/clickhouse/fs
重新部署并验证
# 恢复SELinux为Enforcing模式(若之前临时关闭)
sudo setenforce 1
# 重新部署所有服务
podman run
--name clickhouse \
-v /home/demo/clickhouse/fs/volumes/config.d:/etc/clickhouse-server/config.d \
-d clickhouse/clickhouse-server:latest
总结说明
目录权限后的.符号:在ls -l输出中,drwxrwxrwx.的.表示该文件受 SELinux 保护,权限不仅由 rwx 控制,还受 SELinux 策略限制。