使用 Ubuntu、Python 和 Weasyprint 的 Docker 文件 - venv 问题

问题描述 投票:0回答:1

我正在尝试让 docker 镜像与 Ubuntu、Python 和 Weasyprint 一起工作。 我认为对我来说错误是

requirements.txt
安装在 Python venv 中。当我尝试运行 main.py 时,它给了我一个错误
ModuleNotFoundError: No module named 'sqlalchemy'
,所以它确实安装了requirements.txt,但仅在虚拟环境中,并且这不是正在运行的环境。

Dockerfile

# Specify Python
FROM ubuntu:latest

# Upgrade Ubuntu
RUN echo Dockerfile :: Update Ubuntu
RUN apt-get update && apt-get install -y
RUN apt-get install build-essential -y

# Install Python
RUN echo Dockerfile :: Install Python
RUN apt install python3 -y
RUN python3 --version

# Install Weasyprint
RUN echo Dockerfile :: Install components
RUN apt-get install -y python3-lxml libcairo2 libgdk-pixbuf2.0-0 libffi-dev shared-mime-info
RUN apt-get install -y libpango-1.0-0
RUN apt install -y python3-dev libpq-dev

# Install PIP
RUN echo Dockerfile :: Install PIP
RUN apt-get install python3-pip -y
RUN pip --version

# Install venv
RUN echo Dockerfile :: Install Venv
RUN apt-get install python3-venv -y

# Set enviroment variables
RUN echo Dockerfile :: Set environment variables
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

# Open port
RUN echo Dockerfile :: Open port
EXPOSE 8080

# Add Python script
RUN echo Dockerfile :: Add Python script
RUN mkdir /app
WORKDIR /app
COPY . .

# Install dependencies
RUN echo Dockerfile :: Install dependencies

RUN python3 -m venv .venv
RUN . .venv/bin/activate
RUN .venv/bin/pip install -r requirements.txt

# Set Pythons path
RUN echo Dockerfile :: Set Pythons path
ENV PYTHONPATH /app

# Run script
RUN echo Dockerfile :: Run script
CMD [ "python3", "./main.py" ]

构建输出:

docker build .
2024/05/02 08:54:37 http2: server: error reading preface from client //./pipe/docker_engine: file has already been closed
[+] Building 0.0s (0/0)  docker:default
[+] Building 51.2s (33/33) FINISHED                                                                                                                                  docker:default
 => [internal] load build definition from Dockerfile                                                                                                                           0.0s
 => => transferring dockerfile: 1.42kB                                                                                                                                         0.0s 
 => [internal] load metadata for docker.io/library/ubuntu:latest                                                                                                               0.5s 
 => [internal] load .dockerignore                                                                                                                                              0.0s
 => => transferring context: 2B                                                                                                                                                0.0s 
 => [ 1/28] FROM docker.io/library/ubuntu:latest@sha256:3f85b7caad41a95462cf5b787d8a04604c8262cdcdf9a472b8c52ef83375fe15                                                       0.0s 
 => [internal] load build context                                                                                                                                              0.8s 
 => => transferring context: 973.99kB                                                                                                                                          0.8s 
 => CACHED [ 2/28] RUN echo Dockerfile :: Update Ubuntu                                                                                                                        0.0s
 => CACHED [ 3/28] RUN apt-get update && apt-get install -y                                                                                                                    0.0s
 => CACHED [ 4/28] RUN apt-get install build-essential -y                                                                                                                      0.0s 
 => CACHED [ 5/28] RUN echo Dockerfile :: Install Python                                                                                                                       0.0s 
 => CACHED [ 6/28] RUN apt install python3 -y                                                                                                                                  0.0s 
 => CACHED [ 7/28] RUN python3 --version                                                                                                                                       0.0s 
 => CACHED [ 8/28] RUN echo Dockerfile :: Install components                                                                                                                   0.0s 
 => CACHED [ 9/28] RUN apt-get install -y python3-lxml libcairo2 libgdk-pixbuf2.0-0 libffi-dev shared-mime-info                                                                0.0s 
 => CACHED [10/28] RUN apt-get install -y libpango-1.0-0                                                                                                                       0.0s 
 => CACHED [11/28] RUN apt install -y python3-dev libpq-dev                                                                                                                    0.0s 
 => CACHED [12/28] RUN echo Dockerfile :: Install PIP                                                                                                                          0.0s 
 => CACHED [13/28] RUN apt-get install python3-pip -y                                                                                                                          0.0s 
 => CACHED [14/28] RUN pip --version                                                                                                                                           0.0s 
 => CACHED [15/28] RUN echo Dockerfile :: Install Venv                                                                                                                         0.0s 
 => CACHED [16/28] RUN apt-get install python3-venv -y                                                                                                                         0.0s 
 => CACHED [17/28] RUN echo Dockerfile :: Set environment variables                                                                                                            0.0s 
 => CACHED [18/28] RUN echo Dockerfile :: Open port                                                                                                                            0.0s 
 => CACHED [19/28] RUN echo Dockerfile :: Add Python script                                                                                                                    0.0s 
 => CACHED [20/28] RUN mkdir /app                                                                                                                                              0.0s 
 => CACHED [21/28] WORKDIR /app                                                                                                                                                0.0s 
 => [22/28] COPY . .                                                                                                                                                           3.9s 
 => [23/28] RUN echo Dockerfile :: Install dependencies                                                                                                                        0.4s 
 => [24/28] RUN python3 -m venv .venv                                                                                                                                          4.0s 
 => [25/28] RUN . .venv/bin/activate                                                                                                                                           0.4s 
 => [26/28] RUN .venv/bin/pip install -r requirements.txt                                                                                                                     38.9s 
 => [27/28] RUN echo Dockerfile :: Set Pythons path                                                                                                                            0.4s 
 => [28/28] RUN echo Dockerfile :: Run script                                                                                                                                  0.5s 
 => exporting to image                                                                                                                                                         1.2s 
 => => exporting layers                                                                                                                                                        1.2s 
 => => writing image sha256:e936b6ebf44f23a8a04ec47c9ce69c33f7872249b6ee795a606d64a30e30b6a8                                                                                   0.0s 

What's Next?
  View a summary of image vulnerabilities and recommendations → docker scout quickview

运行输出:

docker run e9 
Traceback (most recent call last):
  File "/app/./main.py", line 10, in <module>
    from src.dao.db_adapter import DBAdapter
  File "/app/src/dao/db_adapter.py", line 19, in <module>
    import sqlalchemy
ModuleNotFoundError: No module named 'sqlalchemy'

如何修复以便在系统范围内安装需求或 python 使用 venv?

python docker weasyprint
1个回答
0
投票

跑步

RUN . .venv/bin/activate
不会做任何有意义的事情。每个
RUN
命令都使用自己的 shell,然后退出,因此
activate
设置的所有环境变量都不会保留。最终的问题是你的
CMD ["python" ...]
没有在你的 virtualenv 中运行

有几种方法可以解决这个问题:

  1. 您可以使用等效的
    ENV
    命令为后续
    RUN
    (或
    CMD
    /
    ENTRYPOINT
    )指令正确设置虚拟环境:
# ...
RUN python -m venv .venv
ENV PATH="/app/.venv/bin:$PATH"
RUN pip install -r requirements.txt
# ...
  1. 您可以首先为您希望激活的每个命令激活 virtualenv
RUN python -m venv .venv
RUN source .venv/bin/activate && pip install -r requirements.txt

其他参考:https://pythonspeed.com/articles/activate-virtualenv-dockerfile/

© www.soinside.com 2019 - 2024. All rights reserved.