第5次实践作业
hello world
根据官网文档的提示,可以将hello world程序很容易地转换为如下Dockerfile:
FROM python
RUN touch /usr/src/helloworld.py \
&& echo "print(\"hello world\")" >> /usr/src/helloworld.py
WORKDIR /usr/src
ENTRYPOINT ["python"]
CMD ["./helloworld.py"]
使用docker build -t helloworld .
命令构建镜像后,使用docker run --rm helloword
命令就能运行hello world程序:
日历输出
首先,编写日历输出程序。日历输出程序源代码仅比hello world程序源代码多出3行:
import calendar
yy = int(input("输入年份: "))
mm = int(input("输入月份: "))
print(calendar.month(yy, mm))
同样地,简单构建Dockerfile文件:
FROM python
COPY shcalendar.py /usr/src/
WORKDIR /usr/src
ENTRYPOINT ["python"]
CMD ["./shcalendar.py"]
然后使用docker build -t showcalendar .
命令构建镜像并使用docker run -it --rm showcalendar
启动容器,根据提示输入年份与月份后,在控制台上就能输出对应于年份与月份的日历信息:
mysql数据库操作
由于使用python对MySQL进行操作需要下载PyMySQL依赖,所以先换源。换源只需要将pip.conf
文件输入如下内容:
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
[install]
trusted-host = https://pypi.tuna.tsinghua.edu.cn
# trusted-host 此参数是为了避免麻烦,否则使用的时候可能会提示不受信任
然后,将pip.conf
文件放到~/.pip/
目录中即可。这次实验使用的是上一次实验的数据库,数据库中有个times
基本表,用于记录访问基本表的次数。根据基本表的结构,编写了如下对数据库操作的代码:
import pymysql
# 打开数据库连接
db = pymysql.connect("mydb", "root", "123456", "logintimes")
# 使用 cursor() 方法创建一个游标对象 cursor
cursor = db.cursor()
for i in range(10):
try:
# 执行SQL语句
cursor.execute("UPDATE times SET times = times + 1 WHERE id = 1")
# 提交到数据库执行
db.commit()
except:
# 发生错误时回滚
db.rollback()
try:
# 执行SQL语句
cursor.execute("SELECT times FROM times WHERE id = 1")
# 获取所有记录列表
results = cursor.fetchone()
print("The table has been logged in %d times" % (results))
except:
print("Error: unable to fetch data")
# 关闭数据库连接
db.close()
程序对times
基本表连续地进行10次的更新与读出操作。接下来就是在已编程完毕的基础上构建运行该程序的镜像,当然也是使用Dockerfile:
FROM python
RUN mkdir /usr/src/mysqlexam \
&& mkdir ~/.pip
COPY pip.conf ~/.pip/
COPY showLoginTimes.py /usr/src/mysqlexam/
WORKDIR /usr/src/mysqlexam
RUN touch requirements.txt \
&& echo "PyMySQL" >> requirements.txt \
&& pip install --no-cache-dir -r requirements.txt
ENTRYPOINT [ "python" ]
CMD [ "./showLoginTimes.py" ]
使用docker build -t pymysql.
命令构建完成镜像后,先不着急启动该容器,而是先启动需要使用到的数据库容器:
在数据库准备完成后,使用docker run --rm --link mydb pymysql
命令运行python程序:
在标准控制台中输出了已访问基本表的次数,使用Navicat软件连接到数据库并查看对应的基本表情况如下:
到此,使用python对MySQL数据库进行操作正确完成。
opencv
类似地,首先编写python程序。实验程序完成的功能是将图片转换会灰度图片并保存,程序源代码比较简单:
import cv2
# 转换为灰度图片
grayimage = cv2.imread("./test.jpg",cv2.IMREAD_GRAYSCALE)
# 保存图片
cv2.imwrite("./test-gray.jpg",grayimage)
print("Picture has been converted to gray.")
然后编写Dockerfile,与之前不同的只是依赖与实验过程中所需要的文件不同罢了。
FROM python
RUN mkdir /usr/src/myopencv \
&& mkdir ~/.pip
COPY pip.conf ~/.pip/
VOLUME /usr/src/myopencv
WORKDIR /usr/src/myopencv
RUN touch requirements.txt \
&& echo "opencv-python" >> requirements.txt \
&& pip install --no-cache-dir -r requirements.txt
ENTRYPOINT [ "python" ]
CMD [ "convertToGray.py" ]
然后使用docker build -t myopencv .
构建镜像并使用
docker run -v /var/lib/myopencvlib:/usr/src/myopencv myopencv
启动容器:
查看转换前后的图片:
从以上两图可见,成功将图片转为灰度图片。
问题与解决办法
实践过程还是很顺利地,基本没遇到什么问题。
时间开销
实践整个过程花费3小时,报告0.5小时,共花费3.5小时
参考资料
[3]灰度图像 保存图像