docker 運行Django項目

  • 2020 年 2 月 24 日
  • 筆記

一、概述

已經寫好了一個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的默認頁面了!