QAdocker-compose-部署django-如何设置自动启动

文章目录

  • 本文概述
  • 部署django项目
    • 相关配置文件
      • docker-compose.yml中的相关配置
      • django镜像的dockerfile文件内容
      • start.sh启动脚本的内容
    • 启动结果
    • 失败原因分析
      • 改动start.sh

本文概述

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

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

但是这样不够自动化。

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

部署django项目

相关配置文件

docker-compose.yml中的相关配置

仅关注django部分配置即可

# /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文件内容

# 指定操作的镜像
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/
//' start.sh

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


EXPOSE 8000

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

start.sh启动脚本的内容

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

启动结果

  • 启动
[root@localhost project]# docker compose up -d
  • 查看状态
[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的交互式命令行
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