如何在 docker 中运行 venv?

Posted

技术标签:

【中文标题】如何在 docker 中运行 venv?【英文标题】:How to run a venv in the docker? 【发布时间】:2021-12-26 23:33:42 【问题描述】:

我的 Dockerfile

FROM python:3.7 AS builder
RUN python3 -m venv /venv

COPY requirements.txt .

RUN /venv/bin/pip3 install -r requirements.txt
FROM python:3.7

WORKDIR /home/sokov_admin/www/bot-telegram

COPY . .

CMD ["/venv/bin/python", "./bot.py"]

当我运行 docker 镜像时,我遇到了这个错误:

docker:来自守护程序的错误响应:OCI 运行时创建失败: container_linux.go:380:启动容器进程导致:exec: “/venv/bin/python”:stat /venv/bin/python:没有这样的文件或目录: 未知。

我应该对我的代码进行哪些更改?

【问题讨论】:

容器内不需要 virtualenv。 你也不需要一个“builder”容器,除非你有一些正在编译的 C 代码 但是如果我不使用 virtualenv 我的 python 脚本看不到依赖项。 @OneCricketeer 但是如果我不使用 virtualenv 我的 python 脚本看不到依赖项。 Traceback (most recent call last): File "./bot.py", line 5, in <module> import telebot ModuleNotFoundError: No module named 'telebot' 你仍然需要运行pip3 install -r requirements.txt,只是不使用venv/bin 【参考方案1】:

您展示的示例不需要任何操作系统级别的依赖项来构建 Python 依赖项。这大大简化了事情:您可以在单个 Docker 构建阶段完成工作,无需虚拟环境,拆分它不会有任何特别的好处。

FROM python:3.7
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["./bot.py"]

如果您需要完整的 C 工具链来构建 Python 库,那么使用虚拟环境进行多阶段构建会有所帮助。在这种情况下,在第一阶段,您安装 C 工具链并设置虚拟环境。在第二阶段你需要COPY --from=...整个虚拟环境到最终的镜像。

# Builder stage:
FROM python:3.7 AS builder

# Install OS-level dependencies
RUN apt-get update \
 && DEBIAN_FRONTEND=noninteractive \
    apt-get install --no-install-recommends --assume-yes \
      build-essential
    # libmysql-client-dev, for example

# Create the virtual environment
RUN python3 -m venv /venv
ENV PATH=/venv/bin:$PATH

# Install Python dependencies
WORKDIR /app
COPY requirements.txt .
RUN pip3 install -r requirements.txt

# If your setup.py/setup.cfg has a console script entry point,
# install the application too
# COPY . .
# RUN pip3 install .

# Final stage:
FROM python:3.7 # must be _exactly_ the same image as the builder

# Install OS-level dependencies if needed (libmysqlclient, not ...-dev)
# RUN apt-get update && apt-get install ...

# Copy the virtual environment; must be _exactly_ the same path
COPY --from=builder /venv /venv
ENV PATH=/venv/bin:$PATH

# Copy in the application (if it wasn't `pip install`ed into the venv)
WORKDIR /app
COPY . .

# Say how to run it
EXPOSE 8000
CMD ["./bot.py"]

【讨论】:

它是否可执行(您可能需要在 Docker 之外运行chmod +x bot.py)?它是否以“shebang”行开头,#!/usr/bin/env python3

以上是关于如何在 docker 中运行 venv?的主要内容,如果未能解决你的问题,请参考以下文章

如何查看终端的pycharm中使用了哪个venv?

如何使用不同的python版本创建一个venv

如何在 Visual Studio Code 中为 Python 设置虚拟环境?

如何指定哪个python版本的诗歌应该创建venv?

如何在docker中运行electron

如何从 venv 中删除无效的需求? (pycharm?)[重复]