我正在尝试在我的Redhat 7计算机上运行Oracle XE docker镜像,但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的不同图像,并且都有同样的问题。< / p>
这是#docker version&#39;:
的输出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,因此这不是一个选项。
如果有人有任何想法,我将不胜感激。
答案 0 :(得分:1)
我设法通过卸载Redhat提供的docker(版本1.10)并安装Docker自己提供的最新1.12 RPM来解决问题。
我不知道修复是由于运行后来的Docker还是因为Redhat对它们提供的Docker二进制文件做了一些更改。
答案 1 :(得分:1)
我没有用RHEL做过这个,但我能够使用直接安装在主机上的CentOS 7 minimal(足够接近)。然后主机被设置为ssh,update&amp;升级,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和一个资源目录,它们在文件系统上相邻。在资产目录中,我解压缩了一份适用于Linux x64的Oracle Database Express Edition 11g第2版,并创建了一个setOracleEvn.sh文件,该文件将设置一些环境变量。既然未压缩xe tar的内容,请更新Disk1 / response / xe.rsp文件以配置默认端口和密码。
此时你应该能够创建一个Dockerfile,其中 ADD s断言容器的目录并调用rpm并安装XE。我使用解压缩的Disk1 / response / xe.rsp文件来配置默认端口和密码,因为这是最简单的解决方案(避免使用sed命令)。如果你想要一个纯脚本安装,你可以在yum安装阶段添加你想要的任何zip软件并执行操作。
我遇到了几个障碍:
/etc/init.d/oracle-xe configure < response/xe.rsp
成功执行的问题。
以下是目录结构和文件信息:
来自父目录的ls -la
drwxr-xr--. 3 user group ... assets
-rwxr-xr--. 1 xxx xxx ... 1 11:22 Dockerfile
ls -la assets /
-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之外的其他任何内容都无法启动(如果文件中留有注释,则会中断)。
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来监视关于缺少的ecdsa密钥的ssh输出。注意:当您的建筑物反复修复时,在您从客户端接受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,以系统登录: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停止配置过程,那么终于解决了这个问题真是太棒了。