Docker Compose构建时python3.6-minimal权限错误修复咨询
问题描述
运行docker-compose up -d构建镜像时失败,使用的Dockerfile如下:
FROM ubuntu:18.04 ARG PKGS ARG SCRIPTS ARG EXEC ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update RUN apt-get install -y openssh-server iproute2 iptables inetutils-ping vim nano net-tools dnsutils python3-scapy python3-flask traceroute $PKGS ## ssh ## RUN mkdir /var/run/sshd RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config # SSH login fix. Otherwise user is kicked off after login RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd ENV NOTVISIBLE "in users profile" RUN echo "export VISIBLE=now" >> /etc/profile # exec RUN eval ${EXEC} # bin COPY bin/level* /usr/local/bin/ COPY bashrc /root/.bashrc # entrypoint COPY entrypoint.sh /usr/local/bin/ RUN sed -i -- "s^# startup scripts^${SCRIPTS}^g" /usr/local/bin/entrypoint.sh ENTRYPOINT /usr/local/bin/entrypoint.sh
构建时出现如下错误:
Traceback (most recent call last): File "/usr/lib/python3.6/py_compile.py", line 186, in <module> sys.exit(main()) File "/usr/lib/python3.6/py_compile.py", line 178, in main compile(filename, doraise=True) File "/usr/lib/python3.6/py_compile.py", line 143, in compile importlib._bootstrap_external._write_atomic(cfile, bytecode, mode) File "<frozen importlib._bootstrap_external>", line 113, in _write_atomic PermissionError: [Errno 13] Permission denied: '/usr/lib/python3.6/__pycache__/__future__.cpython-36.pyc.140199285249616' dpkg: error processing package python3.6-minimal (--configure): installed python3.6-minimal package post-installation script subprocess returned error exit status 1 Errors were encountered while processing: python3.6-minimal E: Sub-process /usr/bin/dpkg returned an error code (1) The command '/bin/sh -c apt-get install -y openssh-server iproute2 iptables inetutils-ping vim nano net-tools dnsutils python3-scapy python3-flask traceroute $PKGS' returned a non-zero code: 100 ERROR: Service 'node1' failed to build : Build failed
已尝试更换Ubuntu版本但无效,拆分apt-get install命令后发现openssh-server、python3-flask和python3-scapy这几个包会触发该错误。
解决方案
方法一:阻止Python生成字节码文件
错误根源是Python在安装后编译字节码时无权限写入__pycache__目录,添加环境变量PYTHONDONTWRITEBYTECODE=1即可禁止生成.pyc文件,从根源避免权限问题。同时优化apt命令减少镜像层并清理缓存:
修改后的Dockerfile核心片段:
FROM ubuntu:18.04 ARG PKGS ARG SCRIPTS ARG EXEC ENV DEBIAN_FRONTEND=noninteractive ENV PYTHONDONTWRITEBYTECODE=1 # 关键:禁止生成.pyc文件 # 合并apt命令,减少镜像层并清理缓存 RUN apt-get update && \ apt-get install -y --no-install-recommends \ openssh-server iproute2 iptables inetutils-ping vim nano net-tools \ dnsutils python3-scapy python3-flask traceroute $PKGS && \ apt-get clean && \ rm -rf /var/lib/apt/lists/*
方法二:修复dpkg状态(可选)
如果仍存在dpkg配置残留问题,可在apt安装前添加修复命令:
RUN apt-get update && \ dpkg --configure -a || true && \ # 强制修复已安装包的配置 apt-get install -f -y && \ apt-get install -y --no-install-recommends \ openssh-server iproute2 iptables inetutils-ping vim nano net-tools \ dnsutils python3-scapy python3-flask traceroute $PKGS && \ apt-get clean && \ rm -rf /var/lib/apt/lists/*
说明
PYTHONDONTWRITEBYTECODE=1:彻底跳过Python编译字节码的操作,直接避免权限写入错误。- 合并
apt-get update和install:避免因缓存过期导致的安装失败,同时减少镜像层数。 --no-install-recommends:只安装必要依赖,降低出错概率和镜像体积。- 清理缓存:减小镜像大小,避免残留文件引发的未知问题。
内容的提问来源于stack exchange,提问作者Ste.02
相关产品推荐
相关产品推荐

