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

spw*_*spw 9 python docker

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

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

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

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

docker exec <container> flask <sub command>
Run Code Online (Sandbox Code Playgroud)

因为flask安装在尚未激活的虚拟环境中.

我仍然可以这样做:

host$ docker exec -it <container> bash

container$ source venv/bin/activate
container$ flask <sub command>
Run Code Online (Sandbox Code Playgroud)

此外,我不能再运行我的默认Dockerfile CMD(gunicorn)因为那也是我的虚拟环境.

这有什么意义吗?

And*_*inn 12

作为仅使用命令内联脚本的替代方法,您可以创建一个充当脚本的脚本ENTRYPOINT.一个例子entrypoint.sh看起来像:

#!/bin/sh
source venv/bin/activate
exec "$@"
Run Code Online (Sandbox Code Playgroud)

然后在你的Dockerfile复制文件中将其设置为ENTRYPOINT:

FROM myimage
COPY entrypoint.sh /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
Run Code Online (Sandbox Code Playgroud)

现在你可以像docker run mynewimage flask <sub command>或那样运行它docker run mynewimage gunicorn.

  • 太棒了!我还必须在ENTRYPOINT之前添加`RUN chmod 700 entrypoint.sh`。谢谢! (2认同)
  • 是的,很棒的主意。小吹毛求疵,shebang 行应该是`bash` 而不是`sh` 因为`sh` 没有`source` 它使用点`.` (2认同)

Der*_*air 6

您不需要激活环境。添加/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
Run Code Online (Sandbox Code Playgroud)

工作示例:

#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
Run Code Online (Sandbox Code Playgroud)