Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Redhat主机上运行Oracle XE Docker映像_Docker_Redhat_Oracle Xe - Fatal编程技术网

在Redhat主机上运行Oracle XE Docker映像

在Redhat主机上运行Oracle XE Docker映像,docker,redhat,oracle-xe,Docker,Redhat,Oracle Xe,我正在尝试让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服务器上失败 起初我认为这可能

我正在尝试让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版本”的输出:

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,所以这不是一个选项


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

我通过卸载Redhat提供的docker(版本1.10)并安装docker自己提供的最新1.12 RPM,成功地完成了工作


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

我没有使用RHEL完成此操作,但我可以使用直接安装在主机上的CentOS 7 minimal(足够近)完成此操作。然后为ssh、更新和升级、vsftp ftp/tls、selinux、docker等设置了主机。在我了解到需要主机支持的事情后,我使用mkimage-yum.sh()创建了一个基本映像。这就是生成下面Dockerfile中引用的图像的原因(centos基本图像:7.3.1611)

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

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

我遇到了一些障碍:

  • Docker的/dev/shm默认值64MB对于运行oracle配置来说太小了。
    • 解决方案:
    • 使用--shm size=2g执行构建和运行命令
  • selinux策略出现问题,导致
    /etc/init.d/oracle-xe configure
    无法成功执行。
    • 解决方案:
    • 很遗憾:setEnforce0然后运行build命令
  • RPM-h(散列)选项中断配置进程。
    • 解决方案:
    • rpm-i oracle-xe-11.2.0-1.0.x86_64.rpm
  • 在执行CMD中的所有内容后,容器趋于停止。
    • 解决方案:
    • 将tailf/dev/null添加到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资产/oracle-xe-11.2.0-1.0x86_64

    drwxr-xr--. 4 xxx xxx ... Disk1
    
    ls-la资产/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之外没有任何内容(如果文件中留下注释,则情况会发生变化)

    vi assets/exportoracleev.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)在运行容器时,确保-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 OracleDB监视有关ecdsa密钥丢失的ssh输出。注意:当您的构建一次又一次地修复问题时,在您从客户端接受ssh证书并发出新的docker build命令后,您需要删除旧的证书
    rm:remove regular file'/root/.ssh/known_hosts'?是
    。密码在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的配置过程,那么最终解决这个问题将是非常棒的

    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 -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).
    
    [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