1

您好 docker 专家,我开始 dockerize 我的 python3 应用程序。简单的 Dockerfile 包含

FROM python:3
WORKDIR /usr/src/app
COPY requirements.txt ./
RUN python -m pip install --upgrade pip
RUN pip install --no-cache-dir -r requirements.txt
RUN mkdir ./src ./setup ./logfiles 
COPY src ./src

requirements.txt 文件只包含一行simplekml。在构建过程docker build -t my_container_name .中安装了 simplekml 模块(在用户根上下文中)。如果我使用我的容器

MY_DOCKER_DATA_PATH=/SomewhereOnMyHost/docker_data
docker run  -v $MY_DOCKER_DATA_PATH/setup:/usr/src/app/setup \
            -v $MY_DOCKER_DATA_PATH/logfiles:/usr/src/app/logfiles \
            -e TIMESTAMP_FOLDER='../logfiles/12345678-123456' \
            -e SETUP_FILE='../setup/setup.json' \
            -it my_container_name bash

如果我启动 myApplication.py 我收到以下错误消息:

root@70f12323172c:/usr/src/app/src# ./myApplication.py
Traceback (most recent call last):
  File "/usr/src/app/src/./myApplication.py", line 12, in <module>
    import Google_KML
  File "./Modules/Google_KML.py", line 5, in <module>
    import simplekml
ModuleNotFoundError: No module named 'simplekml'

第一行import Google_KML是我自己的模块,它包装了所有与 simplekml 相关的任务。此模块导入 simplekml,但找不到。 为什么我的应用程序找不到 simplekml 模块? 我尝试重新创建 docker 映像以记录构建过程。但是 docker 使用缓存,这是我无法阻止的。如果您能提供一些有用的解决方案,那就太好了。

4

1 回答 1

0

我发现了问题 :-) 我的应用程序和我自己的所有模块都在第一行中使用#!/usr/bin/python3。在开发机器上,这是指/usr/bin/python3 -> python3.8(那里使用python 3.8.8)。在容器中,链接指向旧版本/usr/bin/python3 -> python3.7which python3显示/usr/local/bin/python3. 所以我的应用程序使用 Python3.7 而不是 3.8。现在我稍微改变一下 Dockerfile

FROM python:3
WORKDIR /usr/src/app
RUN python -m pip install --upgrade pip \
    && rm /usr/bin/python3 \
    && ln -s /usr/local/bin/python3 /usr/bin/python3
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
RUN mkdir ./src ./setup ./logfiles 
COPY src ./src

重要的线是ln -s /usr/local/bin/python3 /usr/bin/python3. 现在我可以让我的 python 脚本保持不变,它们使用/usr/bin/python3,但实际上它们使用/usr/local/bin/python3并且一切都很好。

于 2022-03-04T12:18:11.823 回答