diff --git a/OracleDatabase/SingleInstance/dockerfiles/18.4.0/Dockerfile.slim b/OracleDatabase/SingleInstance/dockerfiles/18.4.0/Dockerfile.slim new file mode 100644 index 0000000000..d0fe364997 --- /dev/null +++ b/OracleDatabase/SingleInstance/dockerfiles/18.4.0/Dockerfile.slim @@ -0,0 +1,101 @@ +# LICENSE UPL 1.0 +# +# Copyright (c) 1982-2018 Oracle and/or its affiliates. All rights reserved. +# +# ORACLE DOCKERFILES PROJECT +# -------------------------- +# This is the Dockerfile for Oracle Database 18c Express Edition +# +# REQUIRED FILES TO BUILD THIS IMAGE +# ---------------------------------- +# None +# +# HOW TO BUILD THIS IMAGE +# ----------------------- +# Put the downloaded file in the same directory as this Dockerfile +# Run: +# $ docker build -t oracle/database:18.4.0-xe-slim -f Dockerfile.slim . +# Sample usage with init-db directory having an RMAN full backup: +# $ docker run -ti --rm --name testdb -v /home/init-db:/opt/oracle/scripts/setup -v /run/shm:/dev/shm oracle/database:18.4.0-xe-slim +# passing init-db.tar.gz with a full RMAN backup initial db +# $ docker run -ti --rm --name testdb -v /home/init-db.tar.gz:/opt/oracle/scripts/setup/init-db.tar.gz -v /run/shm:/dev/shm oracle/database:18.4.0-xe-slim +# +# Pull base image +# --------------- +FROM oraclelinux:7-slim AS baseOS + +# Maintainer +# ---------- +MAINTAINER Gerald Venzl + +# Environment variables required for this build (do NOT change) +# ------------------------------------------------------------- +ENV ORACLE_BASE=/opt/oracle \ + ORACLE_HOME=/opt/oracle/product/18c/dbhomeXE \ + ORACLE_SID=XE \ + INSTALL_FILE_1="https://download.oracle.com/otn-pub/otn_software/db-express/oracle-database-xe-18c-1.0-1.x86_64.rpm" \ + RUN_FILE="runOracle-slim.sh" \ + PWD_FILE="setPassword.sh" \ + CLR_FILE="cleanup.sh" \ + CONF_FILE="oracle-xe-18c.conf" \ + CHECK_SPACE_FILE="checkSpace.sh" \ + CHECK_DB_FILE="checkDBStatus.sh" \ + INSTALL_DIR="$HOME/install" \ + ORACLE_DOCKER_INSTALL="true" + +# Use second ENV so that variable get substituted +ENV PATH=$ORACLE_HOME/bin:$PATH + +RUN yum -y install openssl file oracle-database-preinstall-18c && \ + rm -rf /var/cache/yum + +FROM baseOS AS baseInstall +# Copy binaries +# ------------- +COPY $CHECK_SPACE_FILE $RUN_FILE $PWD_FILE $CLR_FILE $CHECK_DB_FILE $CONF_FILE $INSTALL_DIR/ + +RUN chmod ug+x $INSTALL_DIR/*.sh && \ + sync && \ + $INSTALL_DIR/$CHECK_SPACE_FILE && \ + cd $INSTALL_DIR && \ + yum -y localinstall $INSTALL_FILE_1 && \ + $INSTALL_DIR/$CLR_FILE && \ + rm -rf /var/cache/yum && \ + mkdir -p $ORACLE_BASE/scripts/setup && \ + mkdir $ORACLE_BASE/scripts/startup && \ + ln -s $ORACLE_BASE/scripts /docker-entrypoint-initdb.d && \ + mkdir -p $ORACLE_BASE/oradata /home/oracle && \ + chown -R oracle:oinstall $ORACLE_BASE /home/oracle && \ + mv $INSTALL_DIR/$RUN_FILE $ORACLE_BASE/ && \ + mv $INSTALL_DIR/$PWD_FILE $ORACLE_BASE/ && \ + mv $INSTALL_DIR/$CHECK_DB_FILE $ORACLE_BASE/ && \ + mv $INSTALL_DIR/$CONF_FILE /etc/sysconfig/ && \ + ln -s $ORACLE_BASE/$PWD_FILE / && \ + cd $HOME && \ + rm -rf $INSTALL_DIR && \ + chmod ug+x $ORACLE_BASE/*.sh + +FROM baseOS + +COPY --from=baseInstall $ORACLE_BASE/ $ORACLE_BASE/ +COPY --from=baseInstall /etc/oratab /etc/oratab +COPY --from=baseInstall /etc/init.d/oracle-xe-18c /etc/init.d/oracle-xe-18c +COPY --from=baseInstall /etc/sysconfig/$CONF_FILE /etc/sysconfig/$CONF_FILE + +RUN mkdir -p /home/oracle && \ + chown -R oracle:oinstall /home/oracle && \ + chown oracle:oinstall $ORACLE_BASE && \ + sed -i -r 's/^(session\s+required\s+pam_limits.so)/#\1/' /etc/pam.d/* && \ + ln -s $ORACLE_BASE/$PWD_FILE / && \ + rm -rf /var/lib/rpm/* && \ + rm -rf /var/log/* && \ + ln -s $ORACLE_BASE/scripts /docker-entrypoint-initdb.d && \ + cd $HOME && \ + chmod ug+x $ORACLE_BASE/*.sh + +VOLUME ["$ORACLE_BASE/oradata"] +EXPOSE 1521 8080 5500 +HEALTHCHECK --interval=1m --start-period=20m \ + CMD "$ORACLE_BASE/$CHECK_DB_FILE" >/dev/null || exit 1 + +CMD exec $ORACLE_BASE/$RUN_FILE diff --git a/OracleDatabase/SingleInstance/dockerfiles/18.4.0/cleanup.sh b/OracleDatabase/SingleInstance/dockerfiles/18.4.0/cleanup.sh new file mode 100644 index 0000000000..ca7683f1f3 --- /dev/null +++ b/OracleDatabase/SingleInstance/dockerfiles/18.4.0/cleanup.sh @@ -0,0 +1,59 @@ +#!/bin/bash + +# Remove not needed components +rm -rf $ORACLE_HOME/apex +rm -rf $ORACLE_HOME/jdbc +# ZDLRA installer files +rm -rf $ORACLE_HOME/lib/ra*.zip +rm -rf $ORACLE_HOME/ords +rm -rf $ORACLE_HOME/sqldeveloper +rm -rf $ORACLE_HOME/ucp +# as we won't install patches +rm -rf $ORACLE_HOME/lib/*.a +find $ORACLE_HOME -name '*.a' -type f -delete +# OUI backup +rm -rf $ORACLE_HOME/inventory/backup/* +# Network tools help +rm -rf $ORACLE_HOME/network/tools/help/mgr/help_* +# Temp location +rm -rf /tmp/* +# Advised by Gerald Venzl +echo "Cleanup Advised by Gerald Venzl" +rm -rf $ORACLE_HOME/.patch_storage/* +rm -rf $ORACLE_HOME/R/* +rm -rf $ORACLE_HOME/assistants/* +rm -rf $ORACLE_HOME/cfgtoollogs/* +rm -rf $ORACLE_HOME/dmu/* +rm -rf $ORACLE_HOME/inventory/* +rm -rf $ORACLE_HOME/javavm/* +rm -rf $ORACLE_HOME/md/* +rm -rf $ORACLE_HOME/suptools/* +echo "Additional Cleanup by Jacek Gebal" +#additional cleanup- removes 1.2GB of DB-sources size - for small images only (no Java) +rm -rf $ORACLE_HOME/OPatch/ #OPatch --> Patching +rm -rf $ORACLE_HOME/crs/ #crs --> some clusterware single instance failover things +rm -rf $ORACLE_HOME/ctx/ #ctx --> Oracle Text (also used for JSON index) +rm -rf $ORACLE_HOME/cv/ #cv --> some patchign related stuff I think +rm -rf $ORACLE_HOME/has/ #has --> no clue +rm -rf $ORACLE_HOME/jdk/ #jdk --> Java jdk +rm -rf $ORACLE_HOME/jlib/ #jlib --> Java libraries +rm -rf $ORACLE_HOME/mgw/ #mgw --> Message gateway +rm -rf $ORACLE_HOME/odbc/ #odbc --> ODBC +rm -rf $ORACLE_HOME/olap/ #olap --> OLAP +rm -rf $ORACLE_HOME/ord/ #ord --> Multimedia I think +rm -rf $ORACLE_HOME/oui/ #oui --> Oracle Universal installer +rm -rf $ORACLE_HOME/owm/ #owm --> Workspace manger +rm -rf $ORACLE_HOME/perl/ #perl --> perl +rm -rf $ORACLE_HOME/precomp/ #precomp --> Not much clue either +rm -rf $ORACLE_HOME/sdk/ #sdk --> some more java I believe +rm -rf $ORACLE_HOME/sqlpatch/ #sqlpatch --> patching related stuff +rm -rf $ORACLE_HOME/usm/ #usm --> Universal storage management +rm -rf $ORACLE_HOME/rdbms/admin/cdb_cloud +rm -rf $ORACLE_HOME/rdbms/xml/em +rm -rf $ORACLE_HOME/relnotes +find $ORACLE_HOME -name '*.zip' -type f -delete +find $ORACLE_HOME -name '*.txt' -type f -delete +find $ORACLE_HOME -name '*O' -type f -delete +find $ORACLE_HOME -path '*/install/*' -delete +find $ORACLE_HOME -name 'install' -type d -delete + diff --git a/OracleDatabase/SingleInstance/dockerfiles/18.4.0/runOracle-slim.sh b/OracleDatabase/SingleInstance/dockerfiles/18.4.0/runOracle-slim.sh new file mode 100644 index 0000000000..0876489347 --- /dev/null +++ b/OracleDatabase/SingleInstance/dockerfiles/18.4.0/runOracle-slim.sh @@ -0,0 +1,253 @@ +#!/bin/bash + +############# Execute custom scripts ############## +function runUserScripts { + + SCRIPTS_ROOT="$1"; + + # Check whether parameter has been passed on + if [ -z "$SCRIPTS_ROOT" ]; then + echo "$0: No SCRIPTS_ROOT passed on, no scripts will be run"; + exit 1; + fi; + + # Execute custom provided files (only if directory exists and has files in it) + if [ -d "$SCRIPTS_ROOT" ] && [ -n "$(ls -A $SCRIPTS_ROOT)" ]; then + + echo ""; + echo "Executing user defined scripts" + + for f in $SCRIPTS_ROOT/*; do + case "$f" in + *.sh) echo "$0: running $f"; . "$f" ;; + *.sql) echo "$0: running $f"; echo "exit" | su -p oracle -c "$ORACLE_HOME/bin/sqlplus / as sysdba @$f"; echo ;; + *) echo "$0: ignoring $f" ;; + esac + echo ""; + done + + echo "DONE: Executing user defined scripts" + echo ""; + + fi; + +} + +########### Move DB files ############ +function moveFiles { + if [ ! -d $ORACLE_BASE/oradata/dbconfig/$ORACLE_SID ]; then + su -p oracle -c "mkdir -p $ORACLE_BASE/oradata/dbconfig/$ORACLE_SID/" + fi; + + su -p oracle -c "mv $ORACLE_HOME/dbs/spfile$ORACLE_SID.ora $ORACLE_BASE/oradata/dbconfig/$ORACLE_SID/" + su -p oracle -c "mv $ORACLE_HOME/dbs/orapw$ORACLE_SID $ORACLE_BASE/oradata/dbconfig/$ORACLE_SID/" + su -p oracle -c "mv $ORACLE_HOME/network/admin/listener.ora $ORACLE_BASE/oradata/dbconfig/$ORACLE_SID/" + su -p oracle -c "mv $ORACLE_HOME/network/admin/tnsnames.ora $ORACLE_BASE/oradata/dbconfig/$ORACLE_SID/" + + cp /etc/oratab $ORACLE_BASE/oradata/dbconfig/$ORACLE_SID/ + + symLinkFiles; +} + +########### Symbolic link DB files ############ +function symLinkFiles { + + if [ ! -L $ORACLE_HOME/dbs/spfile$ORACLE_SID.ora ]; then + ln -s $ORACLE_BASE/oradata/dbconfig/$ORACLE_SID/spfile$ORACLE_SID.ora $ORACLE_HOME/dbs/spfile$ORACLE_SID.ora + fi; + + if [ ! -L $ORACLE_HOME/dbs/orapw$ORACLE_SID ]; then + ln -s $ORACLE_BASE/oradata/dbconfig/$ORACLE_SID/orapw$ORACLE_SID $ORACLE_HOME/dbs/orapw$ORACLE_SID + fi; + + if [ ! -L $ORACLE_HOME/network/admin/listener.ora ]; then + ln -sf $ORACLE_BASE/oradata/dbconfig/$ORACLE_SID/listener.ora $ORACLE_HOME/network/admin/listener.ora + fi; + + if [ ! -L $ORACLE_HOME/network/admin/tnsnames.ora ]; then + ln -sf $ORACLE_BASE/oradata/dbconfig/$ORACLE_SID/tnsnames.ora $ORACLE_HOME/network/admin/tnsnames.ora + fi; + + cp $ORACLE_BASE/oradata/dbconfig/$ORACLE_SID/oratab /etc/oratab +} + +########### SIGTERM handler ############ +function _term() { + echo "Stopping container." + echo "SIGTERM received, shutting down database!" + /etc/init.d/oracle-xe-18c stop +} + +########### SIGKILL handler ############ +function _kill() { + echo "SIGKILL received, shutting down database!" + /etc/init.d/oracle-xe-18c stop +} + +############# Create DB ################ +function createDB { + # Auto generate ORACLE PWD if not passed on + export ORACLE_PWD=${ORACLE_PWD:-"`openssl rand -hex 8`"} + echo "ORACLE PASSWORD FOR SYS AND SYSTEM: $ORACLE_PWD"; + + # Set character set + export ORACLE_CHARACTERSET=${ORACLE_CHARACTERSET:-AL32UTF8} + sed -i -e "s|###ORACLE_CHARACTERSET###|$ORACLE_CHARACTERSET|g" /etc/sysconfig/$CONF_FILE + + + # Listener + echo "# listener.ora Network Configuration File: + + SID_LIST_LISTENER = + (SID_LIST = + (SID_DESC = + (SID_NAME = PLSExtProc) + (ORACLE_HOME = $ORACLE_HOME) + (PROGRAM = extproc) + ) + ) + + LISTENER = + (DESCRIPTION_LIST = + (DESCRIPTION = + (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC_FOR_XE)) + (ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521)) + ) + ) + + DEFAULT_SERVICE_LISTENER = (XE)" > $ORACLE_HOME/network/admin/listener.ora + +# TNS Names.ora + echo "# tnsnames.ora Network Configuration File: + +XE = + (DESCRIPTION = + (ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521)) + (CONNECT_DATA = + (SERVER = DEDICATED) + (SERVICE_NAME = XE) + ) + ) + +LISTENER_XE = + (ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521)) + +XEPDB1 = + (DESCRIPTION = + (ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521)) + (CONNECT_DATA = + (SERVER = DEDICATED) + (SERVICE_NAME = XEPDB1) + ) + ) + +EXTPROC_CONNECTION_DATA = + (DESCRIPTION = + (ADDRESS_LIST = + (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC_FOR_XE)) + ) + (CONNECT_DATA = + (SID = PLSExtProc) + (PRESENTATION = RO) + ) + ) +" > $ORACLE_HOME/network/admin/tnsnames.ora + su -p oracle -c "lsnrctl start" + + # make some required directories it not exists + su -p oracle -c "mkdir -p $ORACLE_BASE/oradata/$ORACLE_SID" + su -p oracle -c "mkdir -p $ORACLE_BASE/admin/$ORACLE_SID/adump" + su -p oracle -c "mkdir -p $ORACLE_BASE/fast_recovery_area" + + # Check init-db.tar format + if [ -f /opt/oracle/scripts/setup/init-db.tar ]; then + (cd /opt/oracle/scripts/setup;tar xf init-db.tar) + fi; + + # Check init-db.tar.gz format + if [ -f /opt/oracle/scripts/setup/init-db.tar.gz ]; then + (cd /opt/oracle/scripts/setup;tar xfz init-db.tar.gz) + fi; + + # Check whether database already exists + if [ -f /opt/oracle/scripts/setup/spfile.bks ]; then + # start process of restore from rman full backup, first spfile + su -p oracle -c "rman target /<> /etc/oratab + fi; + # Move database operational files to oradata + moveFiles; +} + +############# MAIN ################ + +# Set SIGTERM handler +trap _term SIGTERM + +# Set SIGKILL handler +trap _kill SIGKILL + +# Check whether database already exists +if [ -d $ORACLE_BASE/oradata/$ORACLE_SID ]; then + symLinkFiles; + # Make sure audit file destination exists + if [ ! -d $ORACLE_BASE/admin/$ORACLE_SID/adump ]; then + su -p oracle -c "mkdir -p $ORACLE_BASE/admin/$ORACLE_SID/adump" + fi; +fi; + +/etc/init.d/oracle-xe-18c start | grep -qc "Oracle Database is not configured" +if [ "$?" == "0" ]; then + # Create database + createDB; + + # Execute custom provided setup scripts + runUserScripts $ORACLE_BASE/scripts/setup +fi; + +# Check whether database is up and running +$ORACLE_BASE/$CHECK_DB_FILE +if [ $? -eq 0 ]; then + echo "#########################" + echo "DATABASE IS READY TO USE!" + echo "#########################" + + # Execute custom provided startup scripts + runUserScripts $ORACLE_BASE/scripts/startup + +else + echo "#####################################" + echo "########### E R R O R ###############" + echo "DATABASE SETUP WAS NOT SUCCESSFUL!" + echo "Please check output for further info!" + echo "########### E R R O R ###############" + echo "#####################################" +fi; + +echo "The following output is now a tail of the alert.log:" +tail -f $ORACLE_BASE/diag/rdbms/*/*/trace/alert*.log & +childPID=$! +wait $childPID