2

背景:

我正在使用 docker 部署 python-web(django) 环境。

我想制作一个干净的docker镜像,只包含运行时环境,不包含源代码,然后将代码卷入。

我的 docker 镜像仓库:https ://github.com/EaseCloud/docker-django

FROM python:latest
MAINTAINER huangwc@easecloud.cn

WORKDIR /var/app

ENV PROJECT=app

RUN apt-get update && apt-get upgrade -y && apt-get autoremove -y

RUN pip install --upgrade pip && \
    pip install gunicorn django greenlet eventlet

COPY ./startup.sh /var
RUN chmod +x /var/startup.sh

VOLUME ["/var/app", "/var/app/media"]

EXPOSE 8000

CMD ["/var/startup.sh"]

所以,我现在正在startup.sh使用该CMD命令运行一个脚本。

脚本内容为:

#!/bin/bash
set -e
if [ ! -e ./manage.py ]; then
    django-admin startproject $PROJECT .
fi
if [ -f ./requirements.txt ]; then
    pip install -r requirements.txt
fi
gunicorn -b 0.0.0.0:8000 -w 4 -k eventlet $PROJECT.wsgi

在脚本中,我将执行以下操作:

  1. 如果没有源卷,请尝试启动 django 项目;
  2. 在中安装 PyPI 要求requirements.txt
  3. 启动gunicorn服务;

问题:

现在,因为普通我会把源代码卷进去,包括requirements.txt,所以我可能对不同的 docker 容器实例有不同的 PyPI 要求。

我要划线:

pip install -r requirements.txt

仅在我调用时执行docker run

docker run --name myproject \
    -v /var/django/myproject:/var/app \
    -e PROJECT=myproject \
    huangwc/django

但是我不希望命令在我调用时运行:

docker start myproject

有没有一个好的解决方案来做到这一点?

4

1 回答 1

1

我将根据您的脚本对马特的评论进行一些扩展,并添加另一个想法来实现最终目标。

想法#1:设置开发环境变量

如果您将启动脚本修改为如下所示,您可以控制某些组件是否运行:

#!/bin/bash
set -e
if [ $DEVELOPMENT ]; then
  if [ -f ./requirements.txt ]; then
      pip install -r requirements.txt
  fi
  if [ ! -e ./manage.py ]; then
      exec django-admin startproject $PROJECT .
  fi
else
  exec gunicorn -b 0.0.0.0:8000 -w 4 -k eventlet $PROJECT.wsgi
fi

然后在开发环境中运行容器时将DEVELOPMENT环境变量设置为true或其他一些文本。没有它(默认情况下)容器启动 gunicorn 并假设所有依赖项都存在并且没有代码安装在镜像中构建的内容上。

想法#2:分离出行动

我非常喜欢默认运行时“正常工作”的图像。因此,如果您可以规定您的默认设置是已使用所有代码和依赖项构建映像(来自构建过程)。那么你的结果CMD应该gunicorn -b 0.0.0.0:8000 -w 4 -k eventlet $PROJECT.wsgi足以做到这一点。

CMD然后在开发方面,只需docker run使用类似pip install -r requirements.txt && django-admin startproject $PROJECT .. 如果有帮助,您可以将其设为单独的脚本dev.sh

#!/bin/bash
set -e
pip install -r requirements.txt
exec django-admin startproject $PROJECT .
于 2016-03-05T23:19:59.570 回答