Python 有没有办法自动激活virtualenv作为docker入口点?
我在docker容器中有一个烧瓶应用程序。我想使用python包zappa将该应用程序部署到AmazonWeb服务 不幸的是,zappa要求它和我的所有应用依赖项都安装在python虚拟环境中 因此,我重建了我的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 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