I'm trying to create a Oracle DB Docker image containing some predefined data. The image is to be used in a docker-compose file to automatically run some unit tests of a module connecting to Oracle DB.
I already have a MySQL and a SQL Server image prepared. Running these I've database servers providing some simple, predefined databases and tables.
With MySQL this worked like a charm since the image already provides the /docker-entrypoint-initdb.d
directory. The scripts I COPY
there are executed on startup and I'm fine.
With SQL Server it was a bit more complex. I'm using /opt/mssql/bin/sqlservr
to start the SQL Server while building the image. When the SQL Server is up, a shell script calls /opt/mssql-tools/bin/sqlcmd
to run some scripts creating the database and tables I want to provide. Also owrks fine.
With Oracle DB it seems impossible to create an image which already contains some data.
This is what I'm currently trying:
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
start-import.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
import-data.sh:
#!/bin/bash
/u01/app/oracle/product/12.2.0/dbhome_1/bin/sqlplus -s $ORACLE_SYS_USER/$ORACLE_SYS_PASSWORD AS SYSDBA << SQL
@/usr/local/src/oracle/create-database.sql
exit;
SQL
/u01/app/oracle/product/12.2.0/dbhome_1/bin/sqlplus -s $ORACLE_USER/$ORACLE_PASSWORD << SQL
@/usr/local/src/oracle/testdata.sql
exit;
SQL
I'm skipping the two SQL files here. Running them inside a plain Oracle DB Docker image runs fine. And regarding the call of sqlplus
, I already tried some other calls like sqlplus ... @script.sql
, but none worked.
Reading the scripts I would expect that during the image creation the Oracle DB server is started and once it's up, the sqlplus
calls create the database structure I would like to have. But instead I get either
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
Would be great if someone had an idea. And yes, I'm going to try to run the slim image using a volume. Then create the tables and use the resulting volume in my docker-compose environment.
Didn't get that approach to work. I decided to run a official image, modify the database and create an own image out of that modified container.
UPDATE: The official Dockerfiles are available on GitHub, I used the one for a single instance DB installation. Well, Dockerfile might be some kind of misleading. You will get a Dockerfile bundled with some scripts. Once you downloaded an official setup file from the Oracle (these seem to be correct) and put it in the right place, you can
docker run --name ora -e ORACLE_PWD=<yourpw> <image name/id, e. g. oracle/database:18.4.0-xe>
)docker exec -it ora bash
bash-4.2# sqlplus sys/<yourpw>@localhost:1521/XEPDB1 as sysdba
exit
"sqlplus" and the "bash"docker stop ora
)docker commit -m "Oracle XE + custom changes" -a "<Your name>" ora <registry>/<nameForTheChangedImage>
)If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With