Python 有没有办法自动激活virtualenv作为docker入口点?

Python 有没有办法自动激活virtualenv作为docker入口点?,python,docker,Python,Docker,我在docker容器中有一个烧瓶应用程序。我想使用python包zappa将该应用程序部署到AmazonWeb服务 不幸的是,zappa要求它和我的所有应用依赖项都安装在python虚拟环境中 因此,我重建了我的docker映像,并将所有内容移动到其中的虚拟环境中 问题是,现在我无法运行以下命令: docker exec <container> flask <sub command> docker exec flask 因为flask安装在尚未激活的虚拟环境中 我仍然

我在docker容器中有一个烧瓶应用程序。我想使用python包zappa将该应用程序部署到AmazonWeb服务

不幸的是,zappa要求它和我的所有应用依赖项都安装在python虚拟环境中

因此,我重建了我的docker映像,并将所有内容移动到其中的虚拟环境中

问题是,现在我无法运行以下命令:

docker exec <container> flask <sub command>
docker exec flask
因为flask安装在尚未激活的虚拟环境中

我仍然可以这样做:

host$ docker exec -it <container> bash

container$ source venv/bin/activate
container$ flask <sub command>
host$docker exec-it bash
容器$source venv/bin/激活
容器$flask
此外,我不能再运行默认的Dockerfile CMD(gunicorn),因为这也是我的虚拟环境

这更有意义吗?

试试:

docker exec <container> sh -c 'source venv/bin/activate; flask <sub command>'

作为与命令内联的脚本来源的替代方法,您可以创建一个充当
入口点的脚本。示例
entrypoint.sh
如下所示:

#!/bin/bash
source venv/bin/activate
exec "$@"
然后在
Dockerfile
中复制此文件并将其设置为
入口点

FROM myimage
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]

现在您可以像
docker run mynewimage flask
docker run mynewimage gunicorn

那样运行它,而无需激活环境。将
/path/to/virtualenv/bin
前置到
$path
,然后
python
pip
等。自动指向virtualenv中的命令

FROM python:3.4-alpine
WORKDIR /deps
ENV PATH=/virtualenv/bin:$PATH
RUN pip install virtualenv && \
    mkdir virtualenv && \
    virtualenv /virtualenv
COPY . /deps
工作示例:

#Build dockerfile
docker build . -t="venv_example"
#Run all python commands in virtualenv w/ no hassle
docker run --rm venv_example which python
>/virtualenv/bin/python
docker run --rm venv_example which pip
>/virtualenv/bin/pip

您的容器不应该与您在主机上运行的任何环境有任何连接;相反,您应该在容器中运行Python应用程序/env。我想让docker在输入时自动调用它,因此当传递CMD时,它会在virtualenv的上下文中执行。您能列出一些通常用于执行此操作的命令吗?听起来您只需要一个简单的shell脚本,其中包含用作
Dockerfile
中的
ENTRYPOINT
的命令。这是我们可以帮助的,但是你没有提供太多关于需要发生什么的信息。好吧,我试着确切地说我的问题是什么。谢谢,太棒了!我必须在入口点之前添加
运行chmod 700 entrypoint.sh
。谢谢是的,好主意。稍微挑剔一下,shebang行应该是
bash
而不是
sh
,因为
sh
没有
源代码
它使用点
谢谢你指出这一点!我为自己没有想到这一点而感到愚蠢。在我看来,这是最好的方法,比其他答案所建议的要好得多。多年来,我花了很多时间试图找到一些干净的东西,让我对venv运行命令。真的很优雅!我想这应该是可以接受的解决方案,因为使用环境变量可以使它非常干净。
#Build dockerfile
docker build . -t="venv_example"
#Run all python commands in virtualenv w/ no hassle
docker run --rm venv_example which python
>/virtualenv/bin/python
docker run --rm venv_example which pip
>/virtualenv/bin/pip