【问题标题】:Docker image does not run with specified Python versionDocker 映像无法使用指定的 Python 版本运行
【发布时间】:2021-10-07 19:39:37
【问题描述】:

我有一个 Dockerfile

FROM python:3.7.12-slim-buster
FROM aaftio/face_recognition
RUN pip install redis
RUN pip3 install glob2

RUN pip install face_recognition
COPY ./worker.py /worker.py
COPY ./rediswq.py /rediswq.py

CMD  python3 worker.py

我使用docker run -it {image_id} 构建映像并运行我的映像, 但我看到来自 python 应用程序的错误 - 它抱怨 f-strings 语法,因为它自 python 3.6 起受支持我解决它使用一些较旧的 python。

我调试并获得了它打印 1.19.0 的 python 版本

错误:

      File "worker.py", line 14
    for filename in glob.iglob(f"/root/divisions/{division_number}/" + '**/*.*', recursive=True):
                                                                   ^
SyntaxError: invalid syntax

我调试并执行了whereis python3,输出为

python3: /usr/bin/python3.5m-config /usr/bin/python3.5 /usr/bin/python3 /usr/bin/python3.5-config /usr/bin/python3.5m /usr/lib/python3 /usr/lib/python3.5 /etc/python3.5 /etc/python3 /usr/local/bin/python3.4m-config /usr/local/bin/python3.4m /usr/local/bin/python3.4 /usr/local/bin/python3 /usr/local/bin/python3.4-config /usr/local/lib/python3.4 /usr/local/lib/python3.5 /usr/include/python3.5 /usr/include/python3.5m /usr/share/python3

【问题讨论】:

  • 实际的错误信息是什么?使用 python 3.7.12(通过 pyenv?)进行测试时,是否会遇到相同的错误?
  • 不,当我在没有 Docker 的情况下运行我的 python 应用程序时,我没有收到任何错误。当我像上面那样对我的 python 应用程序进行 dockerize 并尝试运行它时,它会抱怨 f-string 语法。我调试了它,在代码的开头我放了简单的 f-string,它在那里抱怨。
  • 要解决这个问题,请在 docker 映像中启动一个 shell(我不记得我脑海中的确切语法,但你应该可以用谷歌搜索它)。然后在那个 shell 中运行python3 -v。输出是否符合您的预期?如果你在 docker shell 中执行python3 worker.py,它会给出同样的错误吗?
  • @Code-Apprentice 我做了,它显示 Python 3.4.9 :/
  • @memoricab 问题在于您定义 dockerfile 并尝试创建多阶段构建的方式。您的最终 docker 容器将始终基于您在 Dockerfile 中为您使用的最后一个 docker 容器,它是使用 Python 3.4.9aaftio/face_recognition 而不是使用 Python 3.7.12python:3.7.12-slim-buster。多阶段 docker 构建的参考 - 此处

标签: python python-3.x docker dockerfile


【解决方案1】:

错误在于您定义 Dockerfile 的方式

在创建 docker 多阶段构建时,您的最终容器将始终基于您引用的最后一个 docker 容器

所以在你的情况下,aaftio/face_recognition 使用 Python 3.4.9 而不是 python:3.7.12-slim-buster 使用 Python 3.7.12

docker 多阶段构建参考 - here

你可以试试这样的

FROM aaftio/face_recognition as intermediate
RUN pip install face_recognition


FROM python:3.7.12-slim-buster

#Copy the python installed libraries from intermediate container
#COPY --from=intermediate face_recognition

RUN pip install redis
RUN pip3 install glob2
COPY ./worker.py /worker.py
COPY ./rediswq.py /rediswq.py

CMD  python3 worker.py

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-24
    • 1970-01-01
    • 2021-01-21
    • 2021-11-27
    • 1970-01-01
    • 2021-01-01
    • 1970-01-01
    相关资源
    最近更新 更多