构建python连接oracle的docker镜像

简介

本文讲解如何构建一个能用python连接Oracle的docker镜像

  • 资源下载地址
资源地址
oracle linux客户端链接:https://pan.baidu.com/s/1t77ayXK7NS_V9UaCv2cmHw 提取码:be7x

前置条件

  • 已有Docker&Oracle环境
    本次构造在linux虚拟机(IP:192.168.1.14)中构建,没有可以参照Docker安装oracle学习环境 进行环境准备

下载oracle客户端

因python连接oracle需要oracle客户端支持,而我们构建的镜像是linux环境,因此需要下载linux64位oracle客户端,
官方下载地址:
https://www.oracle.com/database/technologies/instant-client/linux-x86-64-downloads.html
本文安装选择了11.2.0.4.0这个版本,可以根据自己的情况进行选择(未对该版本之外的版本进行测试)
在这里插入图片描述
下载时需要提供oracle账号和密码,也可以通过文章开头提供的百度云链接进行下载(只包含1.2.0.4.0这个版本)

目录及相关文件准备

# 1. 使用root账号登入虚拟机,并在/root下创建docker/python-o
mkdir -vp /root/docker/python-o
# 2. 将下载的oracle-linux64客户端上传到/root/docker/python-o下
# 2.1 安装上传文件用的软件包lrzsz,如果使用sftp进行上传可以不安装
yum install -y lrzsz
# 2.2进入目录python-o
cd /root/docker/python-o
# 2.3 使用rz命令上传instantclient-basic-linux.x64-11.2.0.4.0.zip文件
rz (然后选择文件进行上传)

# 3. 进入python-o,将客户端解压
yum install -y unzip
unzip instantclient-basic-linux.x64-11.2.0.4.0.zip
 

进行构建

需要/root/docker/python-o目录下创建3个文件

  • sources.list(可选)
  • Dockerfile(必须)
  • build.sh(可选)

sources.list

# 在/root/docker/python-o创建sources.list文件,用于解决apt-get update缓慢
# 可以如果觉得网络很好可以忽略这个步骤

sources.list内容

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

Dockerfile

# 在/root/docker/python-o创建Dockerfile文件
vim /root/docker/python-o/Dockerfile

Dockerfile 内容

# 基于的基础镜像
FROM python:3.7

# 将oracle客户端添加到镜像中
ADD ./instantclient_11_2 /oracle/instantclient_11_2

# 设置oracle相关的环境变量
ENV ORACLE_HOME=/oracle/instantclient_11_2
ENV PATH=$ORACLE_HOME:$PATH
ENV TNS_ADMIN=$ORACLE_HOME/network/admin
ENV LD_LIBRARY_PATH=$ORACLE_HOME:$LD_LIBRARY_PATH
ENV NLS_LANGE="SIMPLIFIED CHINESE_CHINA.ZHS16GBK"

# 如果apt-get update 耗时很长,可以去下面两句的#解决
#RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 40976EAF437D05B5
#ADD sources.list /etc/apt/sources.list
# 解决 cx_Oracle.DatabaseError: DPI-1047: Cannot locate a 64-bit Oracle Client library:
# "libclntsh.so: cannot open shared object file: No such file or directory".
RUN apt-get update && apt-get install -y libaio1

# 安装python访问oracle的包cx_Oracle
RUN pip install cx_Oracle -i  https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple/

build.sh

# 在/root/docker/python-o创建build.sh文件
vim /root/docker/python-o/build.sh

build.sh内容如下

# -t 后面为tag名称,格式 docker账号/镜像名称:版本
# 此处docker账号:huanqingdong ,镜像名称:python-o ,版本:3.7 
# 最后面一个 . 表示基于当前目录内容构建
docker build -t huanqingdong/python-o:3.7 .

构建

# 执行build.sh进行构建
sh build.sh

构建完整日志

[root@server01 python-o]# sh build.sh 
Sending build context to Docker daemon 248.6 MB
Step 1/11 : FROM python:3.7
 ---> 02d2bb146b3b
Step 2/11 : ADD ./instantclient_11_2 /oracle/instantclient_11_2
 ---> 11c6beeba169
Removing intermediate container c92196047bdb
Step 3/11 : ENV ORACLE_HOME /oracle/instantclient_11_2
 ---> Running in 13199f9c71ab
 ---> ff03b843225d
Removing intermediate container 13199f9c71ab
Step 4/11 : ENV PATH $ORACLE_HOME:$PATH
 ---> Running in 92953d4a013b
 ---> 0b62ad6c2f98
Removing intermediate container 92953d4a013b
Step 5/11 : ENV TNS_ADMIN $ORACLE_HOME/network/admin
 ---> Running in d6e5a3bf340b
 ---> 53848966179a
Removing intermediate container d6e5a3bf340b
Step 6/11 : ENV LD_LIBRARY_PATH $ORACLE_HOME:$LD_LIBRARY_PATH
 ---> Running in d795a7ece520
 ---> 6942e0d86ba1
Removing intermediate container d795a7ece520
Step 7/11 : ENV NLS_LANGE "SIMPLIFIED CHINESE_CHINA.ZHS16GBK"
 ---> Running in 36c64c41cdce
 ---> 8c8ce8b49285
Removing intermediate container 36c64c41cdce
Step 8/11 : RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 40976EAF437D05B5
 ---> Running in a77873da899a

Warning: apt-key output should not be parsed (stdout is not a terminal)
Executing: /tmp/apt-key-gpghome.sDj8C9FBHx/gpg.1.sh --keyserver keyserver.ubuntu.com --recv-keys 40976EAF437D05B5
gpg: key 40976EAF437D05B5: public key "Ubuntu Archive Automatic Signing Key <ftpmaster@ubuntu.com>" imported
gpg: Total number processed: 1
gpg:               imported: 1
 ---> 4ac2733a63e2
Removing intermediate container a77873da899a
Step 9/11 : ADD ./sources.list /etc/apt/sources.list
 ---> 560322705e77
Removing intermediate container 25771dedf01e
Step 10/11 : RUN apt-get update && apt-get install -y libaio1
 ---> Running in 7ed381d506c2

Ign:1 http://mirrors.aliyun.com/ubuntu trusty InRelease
Get:2 http://mirrors.aliyun.com/ubuntu trusty-security InRelease [65.9 kB]
Get:3 http://mirrors.aliyun.com/ubuntu trusty-updates InRelease [65.9 kB]
Get:4 http://mirrors.aliyun.com/ubuntu trusty-proposed InRelease [65.9 kB]
Get:5 http://mirrors.aliyun.com/ubuntu trusty-backports InRelease [65.9 kB]
Get:6 http://mirrors.aliyun.com/ubuntu trusty Release [58.5 kB]
Get:7 http://mirrors.aliyun.com/ubuntu trusty-security/main Sources [172 kB]
Get:8 http://mirrors.aliyun.com/ubuntu trusty-security/restricted Sources [4931 B]
Get:9 http://mirrors.aliyun.com/ubuntu trusty-security/multiverse Sources [3263 B]
Get:10 http://mirrors.aliyun.com/ubuntu trusty-security/universe Sources [102 kB]
Get:11 http://mirrors.aliyun.com/ubuntu trusty-security/universe amd64 Packages [294 kB]
Get:12 http://mirrors.aliyun.com/ubuntu trusty-security/main amd64 Packages [835 kB]
Get:13 http://mirrors.aliyun.com/ubuntu trusty-security/restricted amd64 Packages [14.2 kB]
Get:14 http://mirrors.aliyun.com/ubuntu trusty-security/multiverse amd64 Packages [4806 B]
Get:15 http://mirrors.aliyun.com/ubuntu trusty Release.gpg [933 B]
Get:16 http://mirrors.aliyun.com/ubuntu trusty-updates/multiverse Sources [7535 B]
Get:17 http://mirrors.aliyun.com/ubuntu trusty-updates/main Sources [431 kB]
Get:18 http://mirrors.aliyun.com/ubuntu trusty-updates/restricted Sources [6313 B]
Get:19 http://mirrors.aliyun.com/ubuntu trusty-updates/universe Sources [231 kB]
Get:20 http://mirrors.aliyun.com/ubuntu trusty-updates/multiverse amd64 Packages [14.6 kB]
Get:21 http://mirrors.aliyun.com/ubuntu trusty-updates/restricted amd64 Packages [17.2 kB]
Get:22 http://mirrors.aliyun.com/ubuntu trusty-updates/main amd64 Packages [1178 kB]
Get:23 http://mirrors.aliyun.com/ubuntu trusty-updates/universe amd64 Packages [525 kB]
Get:24 http://mirrors.aliyun.com/ubuntu trusty-proposed/main Sources [1709 B]
Get:25 http://mirrors.aliyun.com/ubuntu trusty-proposed/universe Sources [15.9 kB]
Get:26 http://mirrors.aliyun.com/ubuntu trusty-proposed/restricted Sources [783 B]
Get:27 http://mirrors.aliyun.com/ubuntu trusty-proposed/universe amd64 Packages [9365 B]
Get:28 http://mirrors.aliyun.com/ubuntu trusty-proposed/main amd64 Packages [5132 B]
Get:29 http://mirrors.aliyun.com/ubuntu trusty-proposed/restricted amd64 Packages [774 B]
Get:30 http://mirrors.aliyun.com/ubuntu trusty-backports/main Sources [9709 B]
Get:31 http://mirrors.aliyun.com/ubuntu trusty-backports/universe Sources [35.4 kB]
Get:32 http://mirrors.aliyun.com/ubuntu trusty-backports/multiverse Sources [1896 B]
Get:33 http://mirrors.aliyun.com/ubuntu trusty-backports/universe amd64 Packages [43.1 kB]
Get:34 http://mirrors.aliyun.com/ubuntu trusty-backports/multiverse amd64 Packages [1567 B]
Get:35 http://mirrors.aliyun.com/ubuntu trusty-backports/main amd64 Packages [13.3 kB]
Get:36 http://mirrors.aliyun.com/ubuntu trusty/restricted Sources [5433 B]
Get:37 http://mirrors.aliyun.com/ubuntu trusty/multiverse Sources [174 kB]
Get:38 http://mirrors.aliyun.com/ubuntu trusty/main Sources [1064 kB]
Get:39 http://mirrors.aliyun.com/ubuntu trusty/universe Sources [6399 kB]
Get:40 http://mirrors.aliyun.com/ubuntu trusty/main amd64 Packages [1350 kB]
Get:41 http://mirrors.aliyun.com/ubuntu trusty/restricted amd64 Packages [13.0 kB]
Get:42 http://mirrors.aliyun.com/ubuntu trusty/multiverse amd64 Packages [132 kB]
Get:43 http://mirrors.aliyun.com/ubuntu trusty/universe amd64 Packages [5859 kB]
Fetched 19.3 MB in 8s (2361 kB/s)
Reading package lists...
Reading package lists...
Building dependency tree...
Reading state information...
The following additional packages will be installed:
  multiarch-support
The following NEW packages will be installed:
  libaio1 multiarch-support
0 upgraded, 2 newly installed, 0 to remove and 2 not upgraded.
Need to get 10.9 kB of archives.
After this operation, 262 kB of additional disk space will be used.
Get:1 http://mirrors.aliyun.com/ubuntu trusty-security/main amd64 multiarch-support amd64 2.19-0ubuntu6.15 [4490 B]
Get:2 http://mirrors.aliyun.com/ubuntu trusty/main amd64 libaio1 amd64 0.3.109-4 [6364 B]
debconf: delaying package configuration, since apt-utils is not installed
Fetched 10.9 kB in 1s (12.4 kB/s)
Selecting previously unselected package multiarch-support.
(Reading database ... 24525 files and directories currently installed.)
Preparing to unpack .../multiarch-support_2.19-0ubuntu6.15_amd64.deb ...
Unpacking multiarch-support (2.19-0ubuntu6.15) ...
Setting up multiarch-support (2.19-0ubuntu6.15) ...
Selecting previously unselected package libaio1:amd64.
(Reading database ... 24528 files and directories currently installed.)
Preparing to unpack .../libaio1_0.3.109-4_amd64.deb ...
Unpacking libaio1:amd64 (0.3.109-4) ...
Setting up libaio1:amd64 (0.3.109-4) ...
 ---> c2d03ab84236
Removing intermediate container 7ed381d506c2
Step 11/11 : RUN pip install cx_Oracle -i  https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple/
 ---> Running in 6f8174b8c7c6

Looking in indexes: https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple/
Collecting cx_Oracle
  Downloading https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/5c/a4/00413ba0d027749d2ea1eef41387c37a8a538da29d9c2c741f0f25d2a2a4/cx_Oracle-7.2.3-cp37-cp37m-manylinux1_x86_64.whl (737kB)
Installing collected packages: cx-Oracle
Successfully installed cx-Oracle-7.2.3
 ---> 07bac690439f
Removing intermediate container 6f8174b8c7c6
Successfully built 07bac690439f

# 查看构建的镜像
docker images |grep python-o
# 返回内容
huanqingdong/python-o                       3.7                 07bac690439f        About a minute ago   1.15 GB

验证镜像

测试脚本创建

# 创建目录/root/docker/python-o-test
mkdir -vp /root/docker/python-o-test
# 创建python文件oracle.py,注意功能为连接oracle查询数据库时间,并每5秒输出到控制台
vim /root/docker/python-o-test/oracle.py

oracle.py内容

#!/usr/bin/python -u
# -*- coding: UTF-8 -*-
import cx_Oracle
import time
import logging
import sys

logging.basicConfig(stream=sys.stdout, format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)


def get_now():
    conn = cx_Oracle.connect("scott/tiger@//192.168.1.14:1521/xe", encoding='utf-8')
    cur = conn.cursor()
    cur.execute("select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual")  # 执行sql语句

    rs = cur.fetchall()  # 一次返回所有结果集
    if len(rs) > 0:
        logging.info("当前时间%s" % rs[0][0])

    # 关闭cursor()
    cur.close()
    # 关闭数据库连接
    conn.close()


if __name__ == '__main__':

    while True:
        get_now()
        time.sleep(5)

创建Dockerfile

# 创建Dockerfile文件
vim /root/docker/python-o-test/Dockerfile

Dockerfile内容

#基于的基础镜像
FROM huanqingdong/python-o:3.7

ADD ./oracle.py /code/
# 设置code文件夹是工作目录
WORKDIR /code

#当容器启动时,使用python3执行指定路径的py脚本
CMD ["python3", "oracle.py"]

构建测试镜像

# 进入/root/docker/python-o-test
cd /root/docker/python-o-test
# 构建镜像
[root@server01 python-o-test]# docker build -t huanqingdong/python-o-test:3.7 .
Sending build context to Docker daemon 3.584 kB
Step 1/4 : FROM huanqingdong/python-o:3.7
 ---> 07bac690439f
Step 2/4 : ADD ./oracle.py /code/
 ---> 6010b32305e9
Removing intermediate container e4ce171db3c4
Step 3/4 : WORKDIR /code
 ---> 1256e92e4643
Removing intermediate container b83dc671ba91
Step 4/4 : CMD python3 oracle.py
 ---> Running in 2e88bf4528d1
 ---> a865db7c477c
Removing intermediate container 2e88bf4528d1
Successfully built a865db7c477c

运行测试镜像

[root@server01 python-o-test]# docker run --rm huanqingdong/python-o-test:3.7
2019-10-07 14:55:27,589 : INFO : 当前时间2019-10-07 14:55:27
2019-10-07 14:55:32,624 : INFO : 当前时间2019-10-07 14:55:32
2019-10-07 14:55:37,718 : INFO : 当前时间2019-10-07 14:55:37
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Windows上构建Python项目的Docker镜像,可以按照以下步骤进行操作: 1. 首先,确保已经安装了Docker Desktop,并且已经在Windows系统中启用了Docker服务。 2. 在项目的根目录下创建一个名为Dockerfile的文件。可以使用命令`touch Dockerfile`来创建一个空的Dockerfile文件。 3. 打开Dockerfile文件,在其中编写Docker镜像构建指令。根据你的Python项目的需要,可以选择基于官方Python镜像作为基础镜像,并在其中安装所需的依赖和配置。以下是一个简单的示例: ``` # 使用官方Python镜像作为基础镜像 FROM python:3.9 # 在容器内创建一个工作目录 WORKDIR /app # 将项目文件复制到容器的工作目录中 COPY . /app # 安装项目所需的依赖 RUN pip install -r requirements.txt # 定义容器启动时运行的命令 CMD ["python", "run.py"] ``` 在上述示例中,我们使用Python 3.9作为基础镜像,并将项目文件复制到容器的工作目录中。然后,使用pip安装了项目所需的依赖。最后,定义了容器启动时运行的命令为运行`run.py`文件。 4. 保存并关闭Dockerfile文件。 5. 打开命令提示符或PowerShell,并切换到项目的根目录下。 6. 使用以下命令来构建Docker镜像: ``` docker build -t your-image-name . ``` 其中,`your-image-name`是你为镜像指定的名称,`.`表示当前目录为构建上下文。 7. 等待Docker镜像构建完成。构建过程中,Docker将会自动下载基础镜像和安装依赖。 8. 构建完成后,可以使用以下命令来查看已构建镜像列表: ``` docker images ``` 你将在列表中看到刚才构建镜像。 以上就是在Windows上构建Python项目的Docker镜像的步骤。根据你的项目需求和配置,可能需要进行一些额外的步骤和修改。希望对你有帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值