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

时间:2017-05-19 19:09:16

标签: python docker

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

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

所以我重建了我的docker镜像并将所有内容都移到了虚拟环境中。

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

docker exec <container> flask <sub command>

因为烧瓶安装在尚未激活的虚拟环境中。

我仍然可以这样做:

host$ docker exec -it <container> bash

container$ source venv/bin/activate
container$ flask <sub command>

此外,我无法再运行默认的Dockerfile CMD(gunicorn),因为这也是我的虚拟环境。

这是否更有意义?

3 个答案:

答案 0 :(得分:10)

作为仅使用命令内联脚本的替代方法,您可以创建一个充当ENTRYPOINT的脚本。示例entrypoint.sh类似于:

#!/bin/sh
source venv/bin/activate
exec "$@"

然后在Dockerfile中,您将复制此文件并将其设置为ENTRYPOINT

FROM myimage
COPY entrypoint.sh /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]

现在您可以像docker run mynewimage flask <sub command>docker run mynewimage gunicorn一样运行它。

答案 1 :(得分:4)

您不需要激活环境。将/path/to/virtualenv/bin添加到$PATH,然后pythonpip等自动指向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

答案 2 :(得分:2)

尝试:

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

您的命令可以是:

CMD sh -c 'source venv/bin/activate; gunicorn...'