使用自定义数据创建 Oracle Docker 映像

New*_*kai 10 oracle docker

我正在尝试创建一个包含一些预定义数据的 Oracle DB Docker 映像。该图像将在 docker-compose 文件中使用,以自动运行连接到 Oracle DB 的模块的一些单元测试。

我已经准备好了一个 MySQL 和一个 SQL Server 映像。运行这些我有提供一些简单的、预定义的数据库和表的数据库服务器。

使用 MySQL,这就像一个魅力,因为图像已经提供了/docker-entrypoint-initdb.d目录。我COPY那里的脚本在启动时执行,我很好。

对于 SQL Server,它有点复杂。我正在使用/opt/mssql/bin/sqlservr在构建映像时启动 SQL Server。当 SQL Server 启动时,一个 shell 脚本调用/opt/mssql-tools/bin/sqlcmd运行一些脚本来创建我想要提供的数据库和表。也很好。

使用 Oracle DB 似乎不可能创建一个已经包含一些数据的图像。

这是我目前正在尝试的:

FROM store/oracle/database-enterprise:12.2.0.1-slim

ENV ORACLE_SYS_USER=sys
ENV ORACLE_SYS_PASSWORD=Oradoc_db1
ENV ORACLE_PDB=ORCLPDB1
ENV ORACLE_DATABASE=test
ENV ORACLE_USER=test
ENV ORACLE_PASSWORD=test

USER root

RUN mkdir -p /usr/local/src/oracle

WORKDIR /usr/local/src/oracle

COPY ./docker/wait-for-it.sh /usr/local/src/oracle
COPY ./docker/oracle/start-import.sh /usr/local/src/oracle
COPY ./docker/oracle/import-data.sh /usr/local/src/oracle
COPY ./docker/oracle/create-database.sql /usr/local/src/oracle
COPY ./docker/oracle/testdata.sql /usr/local/src/oracle

RUN chmod +x /usr/local/src/oracle/wait-for-it.sh
RUN chmod +x /usr/local/src/oracle/prepare-import.sh
RUN chmod +x /usr/local/src/oracle/start-import.sh
RUN chmod +x /usr/local/src/oracle/import-data.sh

RUN chown -R oracle:dba /usr/local/src/oracle

USER oracle

RUN ./start-import.sh

ENTRYPOINT /home/oracle/setup/dockerInit.sh
Run Code Online (Sandbox Code Playgroud)

开始import.sh:

FROM store/oracle/database-enterprise:12.2.0.1-slim

ENV ORACLE_SYS_USER=sys
ENV ORACLE_SYS_PASSWORD=Oradoc_db1
ENV ORACLE_PDB=ORCLPDB1
ENV ORACLE_DATABASE=test
ENV ORACLE_USER=test
ENV ORACLE_PASSWORD=test

USER root

RUN mkdir -p /usr/local/src/oracle

WORKDIR /usr/local/src/oracle

COPY ./docker/wait-for-it.sh /usr/local/src/oracle
COPY ./docker/oracle/start-import.sh /usr/local/src/oracle
COPY ./docker/oracle/import-data.sh /usr/local/src/oracle
COPY ./docker/oracle/create-database.sql /usr/local/src/oracle
COPY ./docker/oracle/testdata.sql /usr/local/src/oracle

RUN chmod +x /usr/local/src/oracle/wait-for-it.sh
RUN chmod +x /usr/local/src/oracle/prepare-import.sh
RUN chmod +x /usr/local/src/oracle/start-import.sh
RUN chmod +x /usr/local/src/oracle/import-data.sh

RUN chown -R oracle:dba /usr/local/src/oracle

USER oracle

RUN ./start-import.sh

ENTRYPOINT /home/oracle/setup/dockerInit.sh
Run Code Online (Sandbox Code Playgroud)

导入-data.sh:

#!/bin/sh

# Start the server. From its source it seems that Oracle prefers bash.
/bin/bash /home/oracle/setup/dockerInit.sh &

./wait-for-it.sh "localhost:1521" -t 300 -- ./import-data.sh

kill %1
wait
Run Code Online (Sandbox Code Playgroud)

我在这里跳过了两个 SQL 文件。在普通的 Oracle DB Docker 映像中运行它们运行良好。关于 的调用sqlplus,我已经尝试了其他一些调用,例如sqlplus ... @script.sql,但都没有奏效。

阅读脚本时,我希望在创建映像期间启动 Oracle DB 服务器,一旦启动,sqlplus调用就会创建我想要的数据库结构。但相反我得到

  • TNS 错误,如果我在连接字符串中包含主机或 SID,或者
  • 上述情况下的 EOF 错误 (ORA-03113)。
Done ! The database is ready for use .
# ===========================================================================  
# == Add below entries to your tnsnames.ora to access this database server ==  
# ====================== from external host =================================  
ORCLCDB=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=<ip-address>)(PORT=<port>))
    (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCLCDB.localdomain)))     
ORCLPDB1=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=<ip-address>)(PORT=<port>))
    (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCLPDB1.localdomain)))     
#                                                                              
#ip-address : IP address of the host where the container is running.           
#port       : Host Port that is mapped to the port 1521 of the container.      
#                                                                              
# The mapped port can be obtained from running "docker port <container-id>"  
# ===========================================================================  
ORCLPDB1(3):Database Characterset for ORCLPDB1 is WE8DEC
ORCLPDB1(3):Opatch validation is skipped for PDB ORCLPDB1 (con_id=0)
2019-04-15T12:44:22.591697+00:00
ORCLPDB1(3):Opening pdb with no Resource Manager plan active
Pluggable database ORCLPDB1 opened read write
Completed:     alter pluggable database ORCLPDB1 open
    alter pluggable database all save state
Completed:     alter pluggable database all save state
2019-04-15T12:44:22.844748+00:00
ALTER SYSTEM SET encrypt_new_tablespaces='DDL' SCOPE=BOTH;
wait-for-it.sh: localhost:1521 is available after 99 seconds
ERROR:
ORA-03113: end-of-file on communication channel
Process ID: 0
Session ID: 0 Serial number: 0


SP2-0306: Invalid option.
Usage: CONN[ECT] [{logon|/|proxy} [AS {SYSDBA|SYSOPER|SYSASM|SYSBACKUP|SYSDG|SYSKM|SYSRAC}] [edition=value]]
where <logon> ::= <username>[/<password>][@<connect_identifier>]
      <proxy> ::= <proxyuser>[<username>][/<password>][@<connect_identifier>]
SP2-0306: Invalid option.
Usage: CONN[ECT] [{logon|/|proxy} [AS {SYSDBA|SYSOPER|SYSASM|SYSBACKUP|SYSDG|SYSKM|SYSRAC}] [edition=value]]
where <logon> ::= <username>[/<password>][@<connect_identifier>]
      <proxy> ::= <proxyuser>[<username>][/<password>][@<connect_identifier>]
SP2-0157: unable to CONNECT to ORACLE after 3 attempts, exiting SQL*Plus
ERROR:
ORA-01034: ORACLE not available
ORA-27101: shared memory realm does not exist
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3701
Additional information: 1724833639

Run Code Online (Sandbox Code Playgroud)

如果有人有想法,那就太好了。是的,我将尝试使用卷来运行纤薄的图像。然后创建表并在我的 docker-compose 环境中使用生成的卷。

New*_*kai 3

没有让这种方法发挥作用。我决定运行官方映像,修改数据库并从修改后的容器中创建自己的映像。

更新:官方 Dockerfiles 可在 GitHub 上找到,我使用该文件进行单实例数据库安装。嗯,Dockerfile 可能有某种误导性。您将获得一个与一些脚本捆绑在一起的 Dockerfile。一旦你从 Oracle 下载了官方安装文件(这些似乎是正确的)并将其放在正确的位置,你就可以

  • 开始创建 Docker 映像(请参阅链接的 GitHub 页面上的自述文件)
  • 运行新创建的映像 ( docker run --name ora -e ORACLE_PWD=<yourpw> <image name/id, e. g. oracle/database:18.4.0-xe>)
  • 在容器中使用“sqlplus”来创建一些数据
    • docker exec -it ora bash
    • bash-4.2# sqlplus sys/<yourpw>@localhost:1521/XEPDB1 as sysdba
  • exit“sqlplus”和“bash”
  • 停止容器 ( docker stop ora)
  • 提交更改 ( docker commit -m "Oracle XE + custom changes" -a "<Your name>" ora <registry>/<nameForTheChangedImage>)