部署Docker镜像至Heroku时遭遇“Python3 not found”错误求助
解决Heroku部署Docker化Django应用时的"Python3 not found"错误
你的问题主要出在Dockerfile的CMD命令语法错误以及环境变量解析的问题上,咱们一步步来解决:
问题根源分析
- CMD数组语法错误:你原来的CMD写法是把整个命令作为单个字符串元素,Docker会尝试去找名为
python3 manage.py runserver 0.0.0.0:$PORT的可执行文件——这显然不存在,哪怕你用了Python3的完整路径也没用,因为整个字符串被当成了命令名,而不是python3加参数。 - 环境变量无法解析:用数组形式的CMD时,Docker不会通过shell解析环境变量
$PORT,它会被当作字面量传递,这不符合Heroku动态分配端口的要求。
修正后的Dockerfile
FROM mhart/alpine-node RUN echo "ipv6" >> /etc/modules RUN echo "http://nl.alpinelinux.org/alpine/v3.7/community" >> /etc/apk/repositories RUN apk add --no-cache python3 yarn && python3 -m ensurepip # 可选:添加这行确认Python3的实际路径,方便调试 RUN which python3 RUN mkdir /code WORKDIR /code COPY . /code RUN pip3 install -r requirements.txt RUN yarn RUN yarn build:dev EXPOSE $PORT # 用shell形式执行,既正确传递参数,又能解析环境变量$PORT CMD python3 manage.py runserver 0.0.0.0:$PORT
如果一定要用数组形式(比如需要避免shell干扰),可以改成用sh -c包裹命令,让shell帮忙解析变量:
CMD ["sh", "-c", "python3 manage.py runserver 0.0.0.0:$PORT"]
额外建议
- 虽然
runserver能临时运行,但Django的开发服务器不适合生产环境,建议后续换成gunicorn这类生产级WSGI服务器; - 如果你不需要node环境的部分功能,也可以考虑用Python官方的Alpine镜像作为基础,再安装node,这样镜像会更贴合Python应用的需求。
内容的提问来源于stack exchange,提问作者HackAfro
相关产品推荐
相关产品推荐

