你好,码头专家,我开始对接我的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模块?,我尝试重新创建对接者映像来记录构建过程。但码头使用的缓存,我无法阻止。如果你能提供一些有用的解决方案,那就太好了。
发布于 2022-03-04 12:18:11
我发现了问题:-)我的应用程序和我自己的所有模块都在第一行#!/usr/bin/python3
中使用。在开发机器上,这是指/usr/bin/python3 -> python3.8
(这里使用python3.8.8)。在容器中,链接引用一个旧版本的/usr/bin/python3 -> python3.7
,which 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
,一切都很好。
https://stackoverflow.com/questions/71333657
复制相似问题