docker-11-命令docker logs实时输出脚本打印的内容便于调试

1 镜像制作flask应用阿里pip加速

(1)需求
自定义python镜像。要求:【运行python flask程序】

(2)实现步骤
(2-1)定义父镜像:FROM python:3.6
(2-2)定义作者信息:MAINTAINER bingbing <[email protected]>
(2-3)更新pip至最新:RUN pip3 install pip -U
(2-4)配置阿里源:RUN pip3 config set global.index-url http://mirrors.aliyun.com/pypi/simple
(2-4)配置阿里源:RUN pip3 config set install.trusted-host mirrors.aliyun.com
(2-5)安装依赖包:RUN pip3 install flask
(2-6)将代码添加到容器:ADD myflask.py app.py
(2-7)定义容器启动执行的命令:CMD python app.py

1.1 文件myflask.py和dockerfile

#mkdir docker-files
#cd /root/docker-files/

# vi myflask.py

from flask import Flask
app = Flask(__name__)

@app.route("/")
def test_link():
    return "the link is Good11"

if __name__=="__main__":
    app.run(host="0.0.0.0",port=5000,debug=False)

# vi myflask_dockerfile

FROM python:3.6
MAINTAINER bingbing <[email protected]>
#RUN pip3 install pip -U
RUN pip3 config set global.index-url http://mirrors.aliyun.com/pypi/simple
RUN pip3 config set install.trusted-host mirrors.aliyun.com
RUN pip3 install flask
ADD myflask.py app.py
CMD python app.py

升级pip会因为网络的原因变得比较慢。

1.2 制作镜像并运行容器

(1)基于dockerfile创建镜像
#docker build -f myflask_dockerfile -t myflask:1.0 .
(2)启动容器,注意不要加 /bin/bash
#docker run -id --name=f1 -p 5000:5000 myflask:1.0
#docker stop f1停止容器
#docker start f1启动容器

(3)映射文件,在宿主机更改后容器内随之而变
#docker run -id --name=f1 -p 5000:5000 -v /root/docker-files/myflask.py:/app.py myflask:1.0
#vi myflask.py修改宿主机中的文件
#docker restart f1注意更改后需要重启容器

(4)映射目录,目录中有内容
映射时,宿主机目录有什么,容器对应目录中也有什么。
#mkdir /root/myflasktest
#cd /root/myflasktest
#cp /root/docker-files/myflask.py ./app.py
#docker run -id --name=f1 -p 5000:5000 -v /root/myflasktest/app.py:/app.py -v /root/myflasktest:/root/myflasktest myflask:1.0
#docker exec -it f1 /bin/bash

2 docker logs实时输出脚本打印的内容

2.1 分析python命令的-u参数

#python -u xx.py
python中标准错误(std.err)和标准输出(std.out)的输出规则:
标准输出默认需要缓存后再输出到屏幕。
标准错误则直接打印到屏幕。
文件test.py

import sys

sys.stdout.write("a")
sys.stderr.write("b")
sys.stdout.write("a")
sys.stderr.write("b")

无论运行多少次都是输出
CMD>python test.py
bbaa

原因是python缓存机制,虽然stderr和stdout默认都是指向屏幕的,但是stderr是无缓存的,程序往stderr输出一个字符,就会在屏幕上显示一个。而stdout是有缓存的,只有遇到换行或者积累到一定的大小,才会显示出来。

其实python中的print语句就是调用了sys.stdout.write()。

python命令加上-u(unbuffered)参数后会强制其标准输出也同标准错误一样不通过缓存直接打印到屏幕。

但是在python3下进行了测试,python3下即便加上-u或者加上环境变量UNBUFFERED=1 运行起来stdout依旧写缓存

2.2 解决docker logs查看脚本输出的内容

通过docker logs -f 命令来查看日志时,发现py脚本里通过print打印出来的东西并不会实时显示出来,而是程序执行完了才会显示出来,这并不是想要的结果。

但如果进入container手动执行python脚本,就可以实时打印出来。

解决方案:
查找资料之后发现,在这种情况下,python会默认缓冲其输出,所以想要无缓冲输出,那么加一个“-u” 参数即可:

command: python -u test.py

这个时候再通过docker logs -f 来查看日志时,你就会看到实时打印出来的结果。
新的dockerfile文件

FROM python:3.6
MAINTAINER bingbing <[email protected]>
#RUN pip3 install pip -U
RUN pip3 config set global.index-url http://mirrors.aliyun.com/pypi/simple
RUN pip3 config set install.trusted-host mirrors.aliyun.com
RUN pip3 install flask
ADD myflask.py app.py
CMD python -u app.py

新的myflask.py程序文件

from flask import Flask
app = Flask(__name__)
import sys
@app.route("/")
def test_link():    
    print("I give you the message")
    return "the link is Good12"

if __name__=="__main__":
    app.run(host="0.0.0.0",port=5000,debug=False)

3 docker logs查看日志方式

每次刷新页面
#docker logs f1
查看实时日志
#docker logs -f -t --since=“2017-05-31” --tail=10 edu_web_1

--since : 此参数指定了输出日志开始日期,即只输出指定日期之后的日志。
-f : 查看实时日志
-t : 查看日志产生的日期
-tail=10 : 查看最后的10条日志。
edu_web_1 : 容器名称

你可能感兴趣的:(Docker)