我在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),因为这也是我的虚拟环境。
这是否更有意义?
答案 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
,然后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
答案 2 :(得分:2)
尝试:
docker exec <container> sh -c 'source venv/bin/activate; flask <sub command>'
您的命令可以是:
CMD sh -c 'source venv/bin/activate; gunicorn...'