Python 在docker run上生成CMD效果,但在docker start中不生成CMD效果 背景:
我正在使用docker部署PythonWeb(django)环境 我想制作一个干净的docker映像,只包含运行时环境,而不包含源代码,然后将代码卷入 我的docker映像存储库: 因此,我现在使用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 ];
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
在脚本中,我将执行以下操作:
requirements.txt
中安装PyPI需求李>
问题: 现在,因为我将对源代码进行卷处理,包括
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 .