【QA】docker-compose-部署django-如何设置自动启动

文章目录

本文概述

使用docker-compose部署django项目,通常做法是:

  • 构建docker镜像
  • 运行容器
  • 进入容器里面启动django项目

但是这样不够自动化。

尝试通过配置脚本的方式,让容器启动的时候就启动django项目,但这样往往使得容器一直处于重启状态,容器无法运行,本文主要解决这个问题

部署django项目

相关配置文件

docker-compose.yml中的相关配置

仅关注django部分配置即可

dockerfile 复制代码
# /icwp_docker_compose/project/

version: '1'
services:
   mysql:
      build: ./mysql_env
      image: mysql-5.7:compose
      container_name: mysql-icwp-compose
      environment:
         - MYSQL_ROOT_PASSWORD=123456
         - TZ=Asia/Shanghai
      volumes:
         - /mysql_env/conf:/etc/mysql/conf.d                   # 挂载配置文件
         - ./mysql_env/init:/docker-entrypoint-initdb.d/       # 挂载初始化文件
         - ../data/mysql:/var/lib/mysql                        # 挂载数据库数据
         - ../log/mysql:/var/log/mysql                         # 挂载日志
      ports:
         - "3306:3306"
      restart: always

      networks:
         - net-icwp

   django:
      build: ./python_env
      image: django-icwp:compose
      container_name: django-icwp-compose
      ports:
         - "8000:8000"
      volumes:
         - ../log/icwp:/icwp/Log   # 挂载项目生成的log文件
         
      stdin_open: true
      tty: true
      restart: always

      networks:
         - net-icwp

      depends_on:
         - mysql

   nginx:
      build: ./nginx_env
      image: nginx-icwp:compose
      container_name: nginx-icwp-compose
      ports:
         - "80:80"
         - "8081:8081"
         - "9000:9000"

      volumes:
         - ./nginx_env/conf/nginx.conf:/etc/nginx/nginx.conf      # 挂载默认配置文件
         - ./nginx_env/conf/conf.d:/etc/nginx/conf.d              # 挂载自定义配置文件
         - ./nginx_env/html:/usr/share/nginx/html                 # 挂载静态文件
         - ../log/nginx:/var/log/nginx                            # 挂载日志

      restart: always

      networks:
         - net-icwp

      depends_on:
         - django

networks:
   net-icwp:
      name: net-icwp-compose

django镜像的dockerfile文件内容

dockerfile 复制代码
# 指定操作的镜像
FROM django-fixed:centos
# 指定语言,防止中文日志乱码
ENV LANG en_US.UTF-8  
ENV LANGUAGE en_US:en  
ENV LC_ALL en_US.UTF-8
# 创建文件夹
# 项目存放路径
RUN mkdir -p /icwp/code/Django_ICWP_v3

# 存放mysqlclient的安装包
RUN mkdir -p /icwp/code/mysqlclient

# 拷贝Django项目到指定地址
# 注意:只拷贝内容,不拷贝Django_ICWP_v3这个文件夹本身
COPY Django_ICWP_v3 /icwp/code/Django_ICWP_v3


# 传入mysqlclient的whl包,这玩意命令行安装简直折磨
COPY mysqlclient-2.2.1-cp38-cp38-linux_x86_64.whl /icwp/code/mysqlclient

# 更新pip:注意这里的python3.8,以及后续的pip3.8
# 这样写是因为创建这个镜像的时候python3:centos,通过软连接加入系统变量的是python3.8
# 更新pip操作视情况给出,若安装顺利,则无需更新pip
# RUN python3.8 -m pip install --upgrade pip

WORKDIR /icwp/code/mysqlclient
RUN pip3.8 install mysqlclient-2.2.1-cp38-cp38-linux_x86_64.whl


#这句指令相当与:cd django项目
WORKDIR /icwp/code/Django_ICWP_v3

# 这句话意思是排除掉requirements.txt文件中关于Django和mysqlclient的安装信息,并将剩余内容存入到requirements_new.txt
# 虽然可以在txt文件中注释掉Django和mysqlclient的,但是为了体现自动化的思想,多了这样一行命令
RUN grep -v '^ *#\|^Django\|^mysqlclient' requirements.txt | grep . > requirements_new.txt

# 安装依赖包
RUN pip3.8 --default-timeout=100 install -r requirements_new.txt -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com

# 配置uwsgi的系统变量
RUN ln -s /usr/local/python38/bin/uwsgi /usr/bin/uwsgi

# 解决启动脚本的换行问题
RUN sed -i 's/\r//' start.sh

# 赋予脚本执行权限
RUN chmod +x start.sh


EXPOSE 8000

ENTRYPOINT ["/bin/bash","start.sh"]

start.sh启动脚本的内容

sh 复制代码
python3.8 manage.py collectstatic --noinput&&
python3.8 manage.py makemigrations&&
python3.8 manage.py migrate&&
uwsgi --http :8000 --ini uwsgi.ini

启动结果

  • 启动
sh 复制代码
[root@localhost project]# docker compose up -d
  • 查看状态
sh 复制代码
[root@localhost project]# docker compose ps -a
NAME                  IMAGE                 COMMAND                                          SERVICE   CREATED          STATUS                        PORTS
django-icwp-compose   django-icwp:compose   "/bin/bash start.sh"                             django    21 seconds ago   Restarting (0) 1 second ago
mysql-icwp-compose    mysql-5.7:compose     "docker-entrypoint.sh mysqld"                    mysql     21 seconds ago   Up 20 seconds                 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp
nginx-icwp-compose    nginx-icwp:compose    "/docker-entrypoint.sh nginx -g 'daemon off;'"   nginx     21 seconds ago   Up 20
seconds

可以发现django-icwp-compose这个容器,一直在重启,并没有成功启动

失败原因分析

django容器启动失败的原因是,执行完django项目的启动脚本之后,没有前台进程了,容器就自动关闭了,然后在compose中又设置了自动重启,就一直保持尝试启动的状态

要想解决这个问题,只需要在执行完启动脚本后,留一个交互式的命令,来阻塞进程,避免容器自动关闭即可

改动start.sh

以下任意一个改动,都可以使得docker-compose启动容器后,自动运行django

  • 进入python3.8的交互式命令行
sh 复制代码
python3.8 manage.py collectstatic --noinput&&
python3.8 manage.py makemigrations&&
python3.8 manage.py migrate&&
uwsgi --http :8000 --ini uwsgi.ini&&
python3.8
  • 进行/bin/bash

    python3.8 manage.py collectstatic --noinput&&
    python3.8 manage.py makemigrations&&
    python3.8 manage.py migrate&&
    uwsgi --http :8000 --ini uwsgi.ini&&
    /bin/bash

相关推荐
梦想不只是梦与想3 小时前
docker-compose.yml
docker·docker-compose·docker run
专业程序开发源5 小时前
springboot社区养老系统44071-计算机课程设计、毕业设计
vue.js·spring boot·后端·python·django·php·课程设计
星光开发者8 小时前
基于决策树随机森林算法的小说推荐系统的设计与实现-计算机毕设【课程设计】78485
vue.js·算法·微信小程序·django·php·课程设计·express
更深兼春远12 小时前
第2篇:Dify 部署保姆级教程:用 Docker跑起来
docker·容器·dify
专业程序开发源13 小时前
django新闻推荐系统70655-计算机课程设计、毕业设计
java·javascript·spring boot·后端·python·django·课程设计
言乐615 小时前
Python贪心算法实现搜索推荐
python·django·virtualenv·pygame·tornado
vx_Biye_Design15 小时前
django就业信息推荐系统61953-计算机课程设计、毕业设计
java·vue.js·spring boot·python·架构·django·课程设计
计算机毕业编程指导师16 小时前
【计算机毕设推荐】基于Hadoop+Django的LLM多维度性能评估分析系统源码 毕业设计 选题推荐 毕设选题 数据分析 机器学习 深度学习
大数据·hadoop·python·django·毕业设计·课程设计·llm性能
小白的码BUG之路16 小时前
Docker -- No space left on device
运维·docker·容器
wzq11_66617 小时前
Kubernetes集群——Service篇(详细讲解!!!)
云原生·容器·kubernetes