Python 在docker run上生成CMD效果,但在docker start中不生成CMD效果 背景:

Python 在docker run上生成CMD效果,但在docker start中不生成CMD效果 背景:,python,django,docker,requirements.txt,docker-image,Python,Django,Docker,Requirements.txt,Docker Image,我正在使用docker部署PythonWeb(django)环境 我想制作一个干净的docker映像,只包含运行时环境,而不包含源代码,然后将代码卷入 我的docker映像存储库: 因此,我现在使用CMD命令运行一个脚本startup.sh 脚本内容为: #!/bin/bash set -e if [ ! -e ./manage.py ]; then django-admin startproject $PROJECT . fi if [ -f ./requirements.txt ];

我正在使用docker部署PythonWeb(django)环境

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

我的docker映像存储库:

因此,我现在使用
CMD
命令运行一个脚本
startup.sh

脚本内容为:

#!/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
在脚本中,我将执行以下操作:

  • 如果中没有源卷,请尝试启动django项目
  • requirements.txt
    中安装PyPI需求
  • 启动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
    

    有一个好的解决方案吗?

    我将对Matt的评论进行一点扩展,并添加另一个想法来实现最终目标,因为我根据您的脚本理解它

    想法#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:分开行动 我非常喜欢在默认情况下运行时“正常工作”的图像。因此,如果您可以规定默认设置是使用所有代码和依赖项(从构建过程)构建映像。那么您的
    gunicorn-b0.0.0:8000-w4-keventlet$PROJECT.wsgi
    CMD
    就足以完成这项工作

    然后,在开发端,只需使用类似于
    pip install-r requirements.txt和&django admin startproject$PROJECT的命令手动覆盖
    docker run
    处的
    CMD
    。如果有帮助,您可以将其作为单独的脚本
    dev.sh

    #!/bin/bash
    set -e
    pip install -r requirements.txt
    exec django-admin startproject $PROJECT .
    

    当您使用
    docker run
    而不是依赖图像
    CMD
    时,是否有任何原因不能运行单独的脚本?e、 g.
    docker run huangwc/django/prep_script.sh
    @Matt,这听起来是一个相当不错的解决方案,所以你能给出一个详细的答案吗?但是对于#2,因为我是docker的新手,我能问一下:在同一个容器上调用多个
    docker run
    吗?我如何在docker compose中保存这些指令?如果您使用的是
    --name myproject
    ,那么您可以运行多个命令,下一次
    docker运行将在上次
    运行停止的地方进行。如果要在已经运行的容器中运行某些内容,也可以使用
    docker exec
    。我不相信您可以将这种行为添加到您的
    compose.yml
    #!/bin/bash
    set -e
    pip install -r requirements.txt
    exec django-admin startproject $PROJECT .