【问题标题】:Running an Oracle XE Docker image on a Redhat Host在 Redhat 主机上运行 Oracle XE Docker 映像
【发布时间】:2017-02-22 02:23:54
【问题描述】:

我正在尝试让 Oracle XE docker 映像在我的 Redhat 7 机器上运行,但 Oracle 在启动期间失败,我可以在其警报日志中看到以下内容:

Exception [type: SIGSEGV, Address not mapped to object] [ADDR:0x7F80083C5FF8] [PC:0x20CB441, ksmem_free()+31] [flags: 0x0, count: 1]

我可以在其他地方正常运行映像,但在 Redhat 服务器上失败。

最初我认为这可能是由于尝试在 Redhat 上运行基于 Ubuntu 的映像,但我尝试了基于 Ubuntu 14、Ubuntu 16、Centos 6 和 Centos 7 的不同映像,并且都有相同的问题。

这是 'docker version' 的输出:

Client:
 Version:      1.10.3
 API version:  1.22
 Go version:   go1.5.3
 Git commit:   20f81dd
 Built:        Thu Mar 10 21:49:11 2016
 OS/Arch:      darwin/amd64

Server:
 Version:      1.10.3
 API version:  1.22
 Go version:   go1.6.2
 Git commit:   5206701-unsupported
 Built:        Mon Aug 29 14:00:01 2016
 OS/Arch:      linux/amd64

我真的不知道接下来该去哪里。不幸的是,我别无选择,只能在我的服务器上运行 RHEL7,所以这不是一个选择。

如果有人有任何想法,我将不胜感激。

【问题讨论】:

    标签: docker redhat oracle-xe


    【解决方案1】:

    我设法通过卸载 Redhat 提供的 docker(版本 1.10)并安装 Docker 自己提供的最新 1.12 RPM 来让事情正常工作。

    我不知道修复是由于运行了更高版本的 Docker 还是因为 Redhat 对他们提供的 Docker 二进制文件进行了一些更改。

    【讨论】:

      【解决方案2】:

      我没有使用 RHEL 完成此操作,但我能够使用直接安装在主机上的 CentOS 7 最小化(足够接近)来完成此操作。然后为 ssh、更新和升级、vsftp ftp/tls、selinux、docker 等设置了主机。在我有了一个不错的基线后,我知道我需要主机来支持我使用 mkimage-yum.sh 制作了一个基础映像(https://github.com/moby/moby/blob/master/contrib/mkimage-yum.sh)。这就是生成下面 Dockerfile 中引用的图像的原因 (centos-base-image:7.3.1611)。

      uname -a
      Linux CentOS7 3.10.0-514.16.1.el7.x86_64 #1 SMP Wed Apr 12 15:04:24 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
      
      docker version
      Client:
       Version:         1.12.6
       API version:     1.24
       Package version: docker-common-1.12.6-16.el7.centos.x86_64
       Go version:      go1.7.4
       Git commit:      3a094bd/1.12.6
       Built:           Fri Apr 14 13:46:13 2017
       OS/Arch:         linux/amd64
      
      Server:
       Version:         1.12.6
       API version:     1.24
       Pack age version: docker-common-1.12.6-16.el7.centos.x86_64
       Go version:      go1.7.4
       Git commit:      3a094bd/1.12.6
       Built:           Fri Apr 14 13:46:13 2017
       OS/Arch:         linux/amd64
      

      从这一点开始,我创建了一个 Dockerfile 和一个 assets 目录,它们在文件系统上是相邻的。在 assets 目录中,我解压缩了适用于 Linux x64 的 Oracle Database Express Edition 11g 第 2 版的副本,并创建了一个 setOracleEvn.sh 文件,该文件将设置一些环境变量。现在 xe tar 的内容已解压,更新 Disk1/response/xe.rsp 文件以配置默认端口和密码。

      此时您应该能够创建一个 Dockerfile,该文件添加将断言目录添加到容器并调用 rpm 并安装 XE。我使用提取的 Disk1/response/xe.rsp 文件来配置默认端口和密码,因为这是最简单的解决方案(避免使用 sed 命令)。如果您想要纯脚本安装,您可以在 yum 安装阶段添加您想要的任何 zip 软件并执行操作。

      我遇到了一些障碍:

      1. Docker 的 /dev/shm 默认 64MB 太小,无法运行 oracle 配置。
      2. selinux 策略阻止/etc/init.d/oracle-xe configure < response/xe.rsp 成功执行的问题。
      3. RPM -h (hash) 选项破坏了配置过程。
      4. 在 CMD 中的所有内容执行后,容器往往会停止。

      以下是目录结构和文件信息:

      ls -la 来自父目录

      drwxr-xr--. 3 user group ... assets
      -rwxr-xr--. 1 xxx xxx ...  1 11:22 Dockerfile
      

      ls -la 资产/

      -rwxr-xr--. 1 xxx xxx ... exportOracleEnv.sh
      drwxr-xr--. 3 xxx xxx ... oracle-xe-11.2.0-1.0x86_64
      

      ls -la assets/oracle-xe-11.2.0-1.0x86_64

      drwxr-xr--. 4 xxx xxx ... Disk1
      

      ls -la assets/oracle-xe-11.2.0-1.0x86_64/Disk1

      -rwxr-xr--. 1 xxx xxx ... oracle-xe-11.2.0-1.0.x86_64.rpm
      drwxr-xr--. 2 xxx xxx ... response
      drwxr-xr--. 2 xxx xxx ... upgrade
      

      vi response/xe.rsp - 确保它除了 http 端口、tns 侦听器端口、密码和启动时启动的 y/n 之外没有任何内容(如果文件中保留了 cmets,事情就会中断)。

      8080
      1521
      welcome1
      welcome1
      y
      

      vi assets/exportOracleEnv.sh - 为每个 bash 设置 oracle 变量

      #!/bin/sh
      
      echo 'export ORACLE_HOME=/u01/app/oracle/product/11.2.0/xe' >> ~/.bashrc
      echo 'export PATH=$ORACLE_HOME/bin:$PATH' >> ~/.bashrc
      echo 'export ORACLE_SID=XE' >> ~/.bashrc
      echo 'export LISTENERS_ORA=/u01/app/oracle/product/11.2.0/xe/network/admin/listener.ora' >> ~/.bashrc
      

      Dockerfile 有点忙,但这就是我能够让事情正常工作的方式。我已经使用 docker 几天了,并且使用了 linux 整整两个星期,所以请原谅我没有最优雅的解决方案。

      FROM centos-base-image:7.3.1611
      
      #do not use $ in ENV: https://github.com/moby/moby/issues/25099
      ENV _rpmLocation /assets/oracle-xe-11.2.0-1.0x86_64/Disk1
      
      #installing epel because its required to resolve net-tools, your milage may very depending on what image your starting with.
      RUN yum -y install epel-release libaio bc flex && yum -y install net-tools kernel-devel
      
      #oracle uncompressed zip file provided in assets directory, also provides preconfigured response file
      ADD assets /assets
      
      WORKDIR ${_rpmLocation}
      
      # echo $ORACLE_HOME just because I like to know the process worked as I expect. The environment variables must be in place before running configure.
      RUN rpm -i oracle-xe-11.2.0-1.0.x86_64.rpm && /assets/exportOracleEnv.sh && echo $ORACLE_HOME
      
      # execute oracle-xe configure with response file
      RUN  /etc/init.d/oracle-xe configure < response/xe.rsp
      
      WORKDIR /
      
      #clean up temp files, create ssh key and ensure known root password.
      #Finally set the final hostname to listen to all interfaces in tnsnames/listeners.ora otherwise the files will have the incorrect host name (it changes with every layer).
      RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N '' && systemctl enable sshd && echo "root:admin" | chpasswd && rm -rf ${_ASSETS} && \
          sed -i -E "s/HOST = [^)]+/HOST = 0.0.0.0/g" /u01/app/oracle/product/11.2.0/xe/network/admin/listener.ora && \
          sed -i -E "s/HOST = [^)]+/HOST = 0.0.0.0/g" /u01/app/oracle/product/11.2.0/xe/network/admin/tnsnames.ora
      
      #start sshd first (allows immediate connections via ssh) then db. leave tail running in forground
      CMD /sbin/sshd && /etc/init.d/oracle-xe start && tail -f /dev/null
      

      确保在构建时指定 --shm-size(从 Dockerfile 目录运行)

      docker build --shm-size=2g -t centos-oracle:7.3.1611 .
      

      再次(--shm-size)运行容器时,确保 -dti 选项以在 CMD 执行后保持 CentOS 7 容器运行

      docker run --shm-size=2g --name oracle-db -d -t -i -p 5022:22 -p 5080:8080 -p 1521:1521 centos-oracle:7.3.1611
      

      最后,您应该能够通过 ssh 连接,确保 ssh 已启动,您可以使用 docker logs -f oracle-db 来查看 ssh 输出有关缺少 ecdsa 密钥的信息。注意:随着您的构建一遍又一遍地修复问题,在您接受来自客户端的 ssh 证书并发出新的 docker build 命令后,您将需要删除旧证书rm: remove regular file ‘/root/.ssh/known_hosts’? yes。密码在 Dockerfile 中设置为 admin

      ssh -p 5022 root@127.0.0.1
      ...
      root@127.0.0.1's password: 
      Authenticated to 127.0.0.1 ([127.0.0.1]:5022).
      

      一旦 ssh 建立,您现在可以执行 sqlplus,以 system:welcome1 身份登录

      [root@390856ad3b30 ~]# sqlplus
      
      SQL*Plus: Release 11.2.0.2.0 Production on Mon May 1 17:22:55 2017
      
      Copyright (c) 1982, 2011, Oracle.  All rights reserved.
      
      Enter user-name: system
      Enter password: 
      
      Connected to:
      Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
      
      SQL> select * from v$version;
      
      BANNER
      --------------------------------------------------------------------------------
      Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
      PL/SQL Release 11.2.0.2.0 - Production
      CORE    11.2.0.2.0      Production
      TNS for Linux: Version 11.2.0.2.0 - Production
      NLSRTL Version 11.2.0.2.0 - Production
      

      如果有人能想出一个解决方案来解决 selinux 策略停止使用 oracle-xe 的配置过程,那么最终解决这个问题真是太棒了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-15
        • 2011-06-26
        • 2023-03-14
        相关资源
        最近更新 更多