启用配额的XFS磁盘上Selenium Docker容器启动失败,如何解决?
问题描述
在Ubuntu 20.04服务器上,使用Docker启动Selenium standalone-chrome 4.13.0容器时,服务器硬盘为启用配额的XFS格式,容器启动后立即停止并报错。相同命令在未启用配额的ext4硬盘上可正常运行,且其他容器(Spring Boot、Python)在XFS配额环境下也能正常启动。
背景
需要限制Docker容器的可写层存储空间,参考了Docker官方关于--storage-opt的配置文档。
启动命令
docker container run --log-driver local --detach --shm-size=1g --name selenium --env SE_NODE_OVERRIDE_MAX_SESSIONS=true --env SE_NODE_MAX_SESSIONS=10 --env SE_NODE_SESSION_TIMEOUT=180 selenium/standalone-chrome:4.13.0
容器日志
2024-04-26 10:50:46.138 Traceback (most recent call last): 2024-04-26 10:50:46.138 File "/usr/bin/supervisord", line 11, in <module> 2024-04-26 10:50:46.138 load_entry_point('supervisor==4.1.0', 'console_scripts', 'supervisord')() 2024-04-26 10:50:46.138 File "/usr/lib/python3/dist-packages/supervisor/supervisord.py", line 350, in main 2024-04-26 10:50:46.138 options = ServerOptions() 2024-04-26 10:50:46.138 File "/usr/lib/python3/dist-packages/supervisor/options.py", line 439, in __init__ 2024-04-26 10:50:46.138 existing_directory, default=tempfile.gettempdir()) 2024-04-26 10:50:46.138 File "/usr/lib/python3.8/tempfile.py", line 425, in gettempdir 2024-04-26 10:50:46.138 tempdir = _get_default_tempdir() 2024-04-26 10:50:46.138 File "/usr/lib/python3.8/tempfile.py", line 357, in _get_default_tempdir 2024-04-26 10:50:46.138 raise FileNotFoundError(_errno.ENOENT, 2024-04-26 10:50:46.138 FileNotFoundError: [Errno 2] No usable temporary directory found in ['/tmp', '/var/tmp', '/usr/tmp', '/']
主机配置
Docker daemon配置
ubuntu@my-server:~$ cat /etc/docker/daemon.json { "data-root": "/mnt/docker-data" }
挂载配置
ubuntu@my-server:~$ cat /etc/fstab LABEL=cloudimg-rootfs / ext4 defaults,discard 0 0 UUID=f37b6675-93d5-405d-a68e-aeb459872297 /mnt/docker-data xfs defaults,quota,prjquota,pquota,gquota 0 0
排查过程
- 检查磁盘使用情况,主机和容器内磁盘均有剩余空间:
# 主机磁盘 Filesystem Size Used Avail Use% Mounted on /dev/root 9.7G 6.1G 3.6G 63% / /dev/xvdc 22G 14G 8.5G 62% /mnt/docker-data # 容器内磁盘 Filesystem Size Used Avail Use% Mounted on overlay 22G 14G 8.5G 62% / - 禁用XFS配额后,问题依然存在
- 检查XFS文件系统信息,确认
ftype=1(符合OverlayFS要求):root@my-server:/home/ubuntu# xfs_info /dev/xvdc meta-data=/dev/xvdc isize=512 agcount=4, agsize=1441792 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=1, sparse=1, rmapbt=0 = reflink=1 data = bsize=4096 blocks=5767168, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0, ftype=1 log =internal log bsize=4096 blocks=2816, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 - 检查Docker存储驱动,确认使用overlay2,且支持d_type:
Storage Driver: overlay2 Backing Filesystem: xfs Supports d_type: true Native Overlay Diff: true userxattr: false - 检查inode使用情况,主机和容器内inode均充足:
# 主机inode Filesystem Inodes IUsed IFree IUse% Mounted on /dev/xvdc 11534336 202409 11331927 2% /mnt/docker-data # 容器内inode Filesystem Inodes IUsed IFree IUse% Mounted on overlay 11534336 202524 11331812 2% / - 检查磁盘挂载属性,确认是读写模式:
/dev/xvdc on /mnt/docker-data type xfs (rw,relatime,attr2,inode64,logbufs=8,logbsize=32k,usrquota,prjquota,grpquota) - 检查容器内
/tmp目录权限,发现权限为drwxr-xr-t,而原镜像中应为drwxrwxrwt
问题
如何在启用配额的XFS磁盘上启动Selenium Docker容器?
解决方案
核心问题是容器内/tmp目录权限不符合Python tempfile模块的要求(需要粘性位和其他用户可写权限),可通过以下方式解决:
方法1:启动时手动修正权限
修改启动命令,先修正/tmp权限再执行原入口点,无需重新构建镜像:
docker container run --log-driver local --detach --shm-size=1g --name selenium --env SE_NODE_OVERRIDE_MAX_SESSIONS=true --env SE_NODE_MAX_SESSIONS=10 --env SE_NODE_SESSION_TIMEOUT=180 selenium/standalone-chrome:4.13.0 /bin/bash -c "chmod 1777 /tmp && /opt/bin/entry_point.sh"
方法2:自定义镜像修正权限
创建自定义Dockerfile,修正/tmp权限后重新构建镜像:
FROM selenium/standalone-chrome:4.13.0 RUN chmod 1777 /tmp
构建并运行:
docker build -t custom-selenium-chrome . docker container run --log-driver local --detach --shm-size=1g --name selenium --env SE_NODE_OVERRIDE_MAX_SESSIONS=true --env SE_NODE_MAX_SESSIONS=10 --env SE_NODE_SESSION_TIMEOUT=180 custom-selenium-chrome
方法3:挂载主机临时目录
将主机/tmp挂载到容器内,绕过容器内权限问题:
docker container run --log-driver local --detach --shm-size=1g --name selenium --env SE_NODE_OVERRIDE_MAX_SESSIONS=true --env SE_NODE_MAX_SESSIONS=10 --env SE_NODE_SESSION_TIMEOUT=180 -v /tmp:/tmp selenium/standalone-chrome:4.13.0
内容的提问来源于stack exchange,提问作者dur
相关产品推荐
相关产品推荐

