簡體   English   中英

為什么使用 Docker RUN 時會出現“ModuleNotFoundError: No module named 'pyodbc'”?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM