构建本地Docker镜像后启动容器报错:open /dev/ptmx: 无此文件或目录
问题场景
构建本地Flask项目的Docker镜像后,启动容器时触发设备节点相关错误。
Dockerfile内容
FROM ubuntu:focal WORKDIR /admin-flask COPY . /admin-flask # set environment variables # ENV PYTHONDONTWRITEBYTECODE 1 ENV PYTHONUNBUFFERED 1 ENV FLASK_APP run.py VOLUME . /var/wwww RUN apt update -y && apt upgrade -y RUN apt autoremove -y RUN apt install python3 -y && apt install python3-pip -y RUN pip install virtualenv RUN virtualenv env RUN chmod +x run.py # install python dependencies RUN /admin-flask/env/bin/pip install --no-cache-dir -r requirements.txt EXPOSE 5000 # gunicorn #CMD ["gunicorn", "--config", "gunicorn-cfg.py", "run:app"] CMD ["/admin-flask/env/bin/gunicorn","--config", "gunicorn-cfg.py", "run.py"]
报错信息
failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: open /dev/ptmx: no such file or directory: unknown.
ERRO[0004] error waiting for container:
解决办法
修复Dockerfile中的VOLUME语法错误
原VOLUME . /var/wwww写法错误,Dockerfile中VOLUME指令仅用于声明容器内的挂载点,若要绑定宿主机目录,应在docker run时用-v参数。正确的VOLUME声明应为VOLUME ["/var/www"](注意拼写修正wwww为www)。这个错误可能导致容器文件系统异常,间接引发设备节点问题。启动容器时显式挂载/dev/ptmx
运行容器时添加设备映射参数,确保容器能访问该设备节点:docker run --device=/dev/ptmx:/dev/ptmx [你的镜像名]检查宿主机设备节点状态
在宿主机执行ls -l /dev/ptmx,确认设备存在且权限为crw-rw-rw-。如果是WSL、虚拟机等环境,需确保宿主机的/dev目录挂载正常,未被权限限制。优化镜像构建逻辑
合并APT命令减少镜像层数,同时清理无用包:RUN apt update -y && apt upgrade -y && \ apt install python3 python3-pip -y && \ apt autoremove -y && apt clean && rm -rf /var/lib/apt/lists/*也可以直接使用Python官方镜像(如
FROM python:3.9-slim),省去手动安装Python的步骤,减少环境配置风险。更新Docker版本
旧版runc可能存在此bug,升级Docker到最新稳定版,runc会同步更新修复问题。
内容的提问来源于stack exchange,提问作者Atif Shafi

