docker 运行Django项目

发布时间:2020-02-19 19:39:06编辑:admin阅读(2031)

    一、概述

    已经写好了一个Django项目,需要将这个项目用docker封装一个镜像,使用k8s发布!

    在封装并运行的过程中,发现了很多问题,这里会一一介绍!

     

    二、时区问题

    采用的是镜像是 ubuntu:16.04 默认的时区是UTC,比中国时间,晚了8个小时!

    那么因此,需要将默认的时区给覆盖掉!

     

    默认是没有安装 tzdata,因此没有 /usr/share/zoneinfo 目录!

    安装tzdata,使用命令

    apt-get install -y tzdata

     设置时区为 上海,使用以下命令

    TZ=Asia/Shanghai
    ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

    三、中文乱码问题

    默认的系统编码是ascii,因此不支持中文!

    需要安装 locales 软件包

    apt-get install -y locales

     

    设置utf-8编码

    locale-gen en_US.UTF-8

    设置全局变量

    LANG en_US.UTF-8
    LANGUAGE en_US:en
    LC_ALL en_US.UTF-8

    设置utf-8编码之后,那么在python的print命令,就可以输出中文了,而不会提示

    'ascii' codec can't encode characters in position 8-50: ordinal not in range(128)

    在python文件头部,记得增加一行代码,指定utf-8编码

    # coding: utf-8

    四、任务计划问题

    启动问题

    在ubuntu:16.04 的镜像中,默认是没有cron包的,所以需要手动安装

    apt-get install -y cron

    那么启动任务计划时,不能使用命令 /etc/init.d/cron start 以及 service cron start

    在dockerfile中,会启动不成功的。

    必须使用 /usr/sbin/cron 命令,才能启动成功!

     

    添加问题

    一般来讲,添加任务计划,直接修改 /etc/crontab 文件即可。

    在dockerfile 中,不能使用echo EOF 等命令修改/etc/crontab文件

    必须使用 sed 命令修改/etc/crontab文件,才能成功!

    如果需要在最后一行添加任务计划,可以使用以下命令:

    语法:

    sed -i '$a需要添加的内容' 文件名


    比如:

    sed -i '$a* * * * * root python3 /messagecenter/cron/voc_receipt.py' /etc/crontab

    五、封装Django项目镜像

     新建空目录

    mkdir /opt/messagecenter

    目录结构如下:

    ./
    ├── dockerfile
    ├── messagecenter.tar
    ├── run.sh
    └── sources.list

    dockerfile

    FROM ubuntu:16.04
    # 修改更新源为阿里云
    ADD sources.list /etc/apt/sources.list
    ADD messagecenter.tar /
    # 时区为上海
    ENV TZ Asia/Shanghai
    
    # 设置时区,设置utf-8编码,安装django,添加任务计划
    RUN apt-get update && apt-get install -y tzdata locales python3-pip cron && apt-get clean all && \
        ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone && \
        locale-gen en_US.UTF-8 && \
        pip3 install django requests
    
    # 解决中文乱码问题
    #RUN locale-gen en_US.UTF-8
    ENV LANG en_US.UTF-8
    ENV LANGUAGE en_US:en
    ENV LC_ALL en_US.UTF-8
    
    EXPOSE 8000
    # 添加启动脚本
    ADD run.sh .
    RUN chmod 755 run.sh
    ENTRYPOINT [ "/run.sh"]

    messagecenter.tar  这个是Django项目,已经打成tar包了。在dockerfile中,执行ADD命令时,会自动解压tar包

     

    run.sh

    #!/bin/bash
    
    # 启动任务计划
    /usr/sbin/cron
    
    # 最后一行增加任务计划
    sed -i '$a* * * * * root python3 /messagecenter/cron/voc_receipt.py' /etc/crontab
    
    # 启动django项目
    cd /messagecenter/
    python3 manage.py runserver 0.0.0.0:8000

    在Django项目中,有一个python脚本,需要每分钟执行一次!

     

    sources.list

    deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted
    deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted
    deb http://mirrors.aliyun.com/ubuntu/ xenial universe
    deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
    deb http://mirrors.aliyun.com/ubuntu/ xenial multiverse
    deb http://mirrors.aliyun.com/ubuntu/ xenial-updates multiverse
    deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu xenial-security main restricted
    deb http://mirrors.aliyun.com/ubuntu xenial-security universe
    deb http://mirrors.aliyun.com/ubuntu xenial-security multiverse

    生成镜像

    docker build -t messagecenter /opt/messagecenter

    启动镜像

    docker run -d -it -p 8000:8000 messagecenter

    访问页面:

    http://192.168.0.162:8000

    就可以访问Django的默认页面了!

     


关键字