我正在尝试让 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?
跑步
RUN . .venv/bin/activate
不会做任何有意义的事情。每个 RUN
命令都使用自己的 shell,然后退出,因此 activate
设置的所有环境变量都不会保留。最终的问题是你的 CMD ["python" ...]
没有在你的 virtualenv 中运行
有几种方法可以解决这个问题:
ENV
命令为后续 RUN
(或 CMD
/ENTRYPOINT
)指令正确设置虚拟环境:# ...
RUN python -m venv .venv
ENV PATH="/app/.venv/bin:$PATH"
RUN pip install -r requirements.txt
# ...
RUN python -m venv .venv
RUN source .venv/bin/activate && pip install -r requirements.txt
其他参考:https://pythonspeed.com/articles/activate-virtualenv-dockerfile/