![](/img/trans.png)
[英]Why do I get “ModuleNotFoundError: No module named 'YEETER'” when importing a module in python?
[英]Why do I get "ModuleNotFoundError: No module named 'pyodbc'" using Docker RUN?
我正在創建一個 Docker 容器。 要指定需要安裝的 python 包,我使用詩歌pyproject.toml
:
[tool.poetry.dev-dependencies]
pyodbc = "^4.0.32"
...some others...
一切都正確下載到venv,但我的問題是,當我在Dockerfile
中使用CMD
命令啟動 python 腳本時:
CMD ["/bin/sh", "-c", "python src/test_models.py"]
它工作正常,但如果我在CMD
中的Dockerfile
之前使用此RUN
命令:
RUN source ./venv/bin/activate && python src/test_models.py
它與CMD
執行相同的操作,但會發生錯誤:
...it is not a full output error text, just the meaningful part...
File "/project/venv/lib/python3.9/site-packages/sqlalchemy/engine/create.py", line 560, in create_engine
dbapi = dialect_cls.dbapi(**dbapi_args)
File "/project/venv/lib/python3.9/site-packages/sqlalchemy/connectors/pyodbc.py", line 43, in dbapi
return __import__("pyodbc")
ModuleNotFoundError: No module named 'pyodbc'
但最讓我困惑的是,如果我讓CMD
命令運行一個無限循環的文件,然后我 go 到RUN
容器的命令行並執行相同的命令:
source ./venv/bin/activate && python src/test_models.py
效果很好,並且不會發生pyodbc
錯誤。
我的Dockerfile
:
ARG base_image=gpython:latest
FROM ${base_image}
ARG project_root=/project
COPY entrypoint.sh /usr/bin/
RUN yum install -y gcc-c++ python3-devel unixODBC-devel
RUN chown 1001:0 /usr/bin/entrypoint.sh && chmod u+x /usr/bin/entrypoint.sh
RUN pip install \
--index-url https://artifactory..../pypi/python-remote/simple \
--trusted-host artifactory.... \
--no-cache-dir --upgrade pip poetry && \
mkdir ${project_root} && \
python -m venv ${project_root}/venv && \
chown -R 1001:0 ${project_root}/venv
COPY ./pyproject.toml ./poetry.lock ${project_root}/
WORKDIR ${project_root}
RUN source ./venv/bin/activate && pip install \
--index-url https://artifactory..../pypi/python-remote/simple \
--trusted-host artifactory... \
--no-cache-dir --upgrade pip wheel && \
export REQUESTS_CA_BUNDLE=/etc/...crt && \
poetry config certificates.arti_pypi.cert /etc/....crt && \
poetry install --no-dev --no-root
COPY src ${project_root}/src
COPY models ${project_root}/models
HEALTHCHECK --interval=10s --timeout=1s --retries=3 \
CMD curl -f http://localhost:8080/healthcheck || exit 1
USER 1001
ENTRYPOINT ["/usr/bin/entrypoint.sh"]
#RUN source ./venv/bin/activate && python src/test_models.py
CMD ["/bin/sh", "-c", "python src/test_models.py"]
同意 David Maze 的觀點,您不需要在 Docker 映像中使用虛擬環境。 嘗試以下操作:
在requirements.txt文件中,有:
pyodbc~=4.0.32
然后在您的dockerfile中包含以下內容:
FROM python
COPY . .
RUN apt-get update -y && apt-get -y install unixodbc-dev
RUN pip install -r requirements.txt
ENTRYPOINT ["python"]
CMD ["run.py"]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.