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的默認頁面了!