From b868b60c5b197525991a0a515db252abd928703b Mon Sep 17 00:00:00 2001 From: Nathan C <1849077+thelateperseus@users.noreply.github.com> Date: Mon, 20 Mar 2023 17:02:24 +1100 Subject: [PATCH 1/3] Install DB and apply patches in a single layer The oracle-docker-images repository allows patches to be applied, but the resulting image size is doubled (see https://github.com/oracle/docker-images/issues/1990). Instead, we would like to apply the patches in the same layer where the database binaries are installed. I have applied this only to the 19c and 21c Dockerfiles since the other versions are either at or rapidly approaching end of life. Changes: - Set SLIMMING to false to ensure that all files required for patching are present. - Copied patchDBBinaries.sh, runDatapatch.sh and savePatchSummary.sh from the extensions/patch directory. - Modified patchDBBinaries.sh to delete temporary files to reduce image size. - Added steps to builder stage in Dockerfile to copy the patches to the container and run the patchDBBinaries.sh script. - Added steps to Dockerfile to copy datapatch and lspatches scripts under $ORACLE_BASE. --- .../dockerfiles/19.3.0/Dockerfile | 28 +++++- .../dockerfiles/19.3.0/patchDBBinaries.sh | 99 +++++++++++++++++++ .../dockerfiles/19.3.0/patches/one_offs/.keep | 0 .../19.3.0/patches/release_update/.keep | 0 .../dockerfiles/19.3.0/runDatapatch.sh | 38 +++++++ .../dockerfiles/19.3.0/savePatchSummary.sh | 16 +++ .../dockerfiles/21.3.0/Dockerfile | 28 +++++- .../dockerfiles/21.3.0/patchDBBinaries.sh | 99 +++++++++++++++++++ .../dockerfiles/21.3.0/patches/one_offs/.keep | 0 .../21.3.0/patches/release_update/.keep | 0 .../dockerfiles/21.3.0/runDatapatch.sh | 38 +++++++ .../dockerfiles/21.3.0/savePatchSummary.sh | 16 +++ 12 files changed, 360 insertions(+), 2 deletions(-) create mode 100644 OracleDatabase/SingleInstance/dockerfiles/19.3.0/patchDBBinaries.sh create mode 100644 OracleDatabase/SingleInstance/dockerfiles/19.3.0/patches/one_offs/.keep create mode 100644 OracleDatabase/SingleInstance/dockerfiles/19.3.0/patches/release_update/.keep create mode 100644 OracleDatabase/SingleInstance/dockerfiles/19.3.0/runDatapatch.sh create mode 100644 OracleDatabase/SingleInstance/dockerfiles/19.3.0/savePatchSummary.sh create mode 100644 OracleDatabase/SingleInstance/dockerfiles/21.3.0/patchDBBinaries.sh create mode 100644 OracleDatabase/SingleInstance/dockerfiles/21.3.0/patches/one_offs/.keep create mode 100644 OracleDatabase/SingleInstance/dockerfiles/21.3.0/patches/release_update/.keep create mode 100644 OracleDatabase/SingleInstance/dockerfiles/21.3.0/runDatapatch.sh create mode 100644 OracleDatabase/SingleInstance/dockerfiles/21.3.0/savePatchSummary.sh diff --git a/OracleDatabase/SingleInstance/dockerfiles/19.3.0/Dockerfile b/OracleDatabase/SingleInstance/dockerfiles/19.3.0/Dockerfile index 1c9427faae..121b431731 100644 --- a/OracleDatabase/SingleInstance/dockerfiles/19.3.0/Dockerfile +++ b/OracleDatabase/SingleInstance/dockerfiles/19.3.0/Dockerfile @@ -35,7 +35,7 @@ LABEL "provider"="Oracle" \ "port.oemexpress"="5500" # Argument to control removal of components not needed after db software installation -ARG SLIMMING=true +ARG SLIMMING=false ARG INSTALL_FILE_1="LINUX.X64_193000_db_home.zip" # Environment variables required for this build (do NOT change) @@ -79,6 +79,11 @@ ENV PATH=$ORACLE_HOME/bin:$ORACLE_HOME/OPatch/:/usr/sbin:$PATH \ LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib \ CLASSPATH=$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib +# Environment variables for patching +ENV HOST_PATCH_DIR="patches" \ + PATCH_DIR=/opt/install/patches \ + PATCH_DB_BINARIES_FILE="patchDBBinaries.sh" + # Copy files needed during both installation and runtime # ------------- COPY $SETUP_LINUX_FILE $CHECK_SPACE_FILE $INSTALL_DIR/ @@ -111,6 +116,14 @@ RUN chmod ug+x $INSTALL_DIR/*.sh && \ sync && \ $INSTALL_DIR/$INSTALL_DB_BINARIES_FILE $DB_EDITION +# Copy DB patches +COPY --chown=oracle:dba $HOST_PATCH_DIR $PATCH_DB_BINARIES_FILE $PATCH_DIR/ + +# Apply DB Patches +RUN chmod ug+x $PATCH_DIR/*.sh && \ + sync && \ + $PATCH_DIR/$PATCH_DB_BINARIES_FILE + ############################################# @@ -134,6 +147,19 @@ WORKDIR /home/oracle # Add a bashrc file to capitalize ORACLE_SID in the environment RUN echo 'ORACLE_SID=${ORACLE_SID:-ORCLCDB}; export ORACLE_SID=${ORACLE_SID^^}' > .bashrc +# Environment variables for patching +ENV DATAPATCH_FILE="runDatapatch.sh" \ + LSPATCHES_FILE="savePatchSummary.sh" \ + SKIP_DATAPATCH=false + +# Copy script to run datapatch +COPY --chown=oracle:dba $DATAPATCH_FILE $ORACLE_BASE/scripts/extensions/startup/ +RUN chmod ug+x $ORACLE_BASE/scripts/extensions/startup/*.sh && sync + +# Copy script to run lspatches +COPY --chown=oracle:dba $LSPATCHES_FILE $ORACLE_BASE/scripts/extensions/setup/ +RUN chmod ug+x $ORACLE_BASE/scripts/extensions/setup/*.sh && sync + HEALTHCHECK --interval=1m --start-period=5m --timeout=30s \ CMD "$ORACLE_BASE/$CHECK_DB_FILE" >/dev/null || exit 1 diff --git a/OracleDatabase/SingleInstance/dockerfiles/19.3.0/patchDBBinaries.sh b/OracleDatabase/SingleInstance/dockerfiles/19.3.0/patchDBBinaries.sh new file mode 100644 index 0000000000..5abad4b14e --- /dev/null +++ b/OracleDatabase/SingleInstance/dockerfiles/19.3.0/patchDBBinaries.sh @@ -0,0 +1,99 @@ +#!/bin/bash +# LICENSE UPL 1.0 +# +# Copyright (c) 2020 Oracle and/or its affiliates. All rights reserved. +# +# Since: March, 2020 +# Author: rishabh.y.gupta@oracle.com +# Description: Applies the patches provided by the user on the oracle home. +# +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. +# + +RU_DIR="${PATCH_DIR}/release_update" +ONE_OFFS_DIR="${PATCH_DIR}/one_offs" + +ru_count=$(ls $RU_DIR/*.zip 2> /dev/null | wc -l) +if [ $ru_count -ge 2 ]; then + echo "Error: Only 1 Release Update can be applied." + exit 1; +elif [ $ru_count == 1 ]; then + ru_patch="$(ls $RU_DIR/*.zip)" + echo "Unzipping $ru_patch"; + unzip -qo $ru_patch -d $PATCH_DIR; + ru_patch=$(echo ${ru_patch##*/} | cut -d_ -f1 | cut -dp -f2) +else + echo "No Release Update to be installed." +fi + +ONE_OFFS_LIST=() + +if ls $ONE_OFFS_DIR/*.zip 2> /dev/null; then + for patch_zip in $ONE_OFFS_DIR/*.zip; do + patch_no=$(echo ${patch_zip##*/} | cut -d_ -f1 | cut -dp -f2) + if [ $patch_no == "6880880" ]; then + echo "Removing directory ${ORACLE_HOME}/OPatch"; + rm -rf ${ORACLE_HOME}/OPatch; + echo "Unzipping OPatch archive $patch_zip to ${ORACLE_HOME}"; + unzip -qo $patch_zip -d $ORACLE_HOME; + else + ONE_OFFS_LIST+=($patch_no); + echo "Unzipping $patch_zip"; + unzip -qo $patch_zip -d $PATCH_DIR; + fi + done +else + echo "No one-offs to be installed." +fi + +export PATH=${ORACLE_HOME}/perl/bin:$PATH; + +if [ ! -z $ru_patch ]; then + echo "Applying Release Update: $ru_patch"; + cmd="${ORACLE_HOME}/OPatch/opatchauto apply -binary -oh $ORACLE_HOME ${PATCH_DIR}/${ru_patch} -target_type rac_database"; + echo "Running: $cmd"; + $cmd || { + echo "RU application failed for patchset: ${ru_patch}"; + exit 1; + } +fi + +for patch in ${ONE_OFFS_LIST[@]}; do + echo "Applying patch: $patch"; + cmd="${ORACLE_HOME}/OPatch/opatchauto apply -binary -oh $ORACLE_HOME ${PATCH_DIR}/${patch} -target_type rac_database"; + echo "Running: $cmd"; + $cmd || { + echo "Patch application failed for ${patch}"; + exit 1; + } +done + +# Remove not needed components +# APEX +rm -rf "$ORACLE_HOME"/apex && \ +# ORDS +rm -rf "$ORACLE_HOME"/ords && \ +# SQL Developer +rm -rf "$ORACLE_HOME"/sqldeveloper && \ +# UCP connection pool +rm -rf "$ORACLE_HOME"/ucp && \ +# All installer files +rm -rf "$ORACLE_HOME"/lib/*.zip && \ +# OUI backup +rm -rf "$ORACLE_HOME"/inventory/backup/* && \ +# Network tools help +rm -rf "$ORACLE_HOME"/network/tools/help && \ +# Database upgrade assistant +rm -rf "$ORACLE_HOME"/assistants/dbua && \ +# Database migration assistant +rm -rf "$ORACLE_HOME"/dmu && \ +# Remove pilot workflow installer +rm -rf "$ORACLE_HOME"/install/pilot && \ +# Support tools +rm -rf "$ORACLE_HOME"/suptools && \ +# Temp location +rm -rf /tmp/* && \ +# Database files directory +rm -rf "$INSTALL_DIR"/database +# Database patch directories +rm -rf $PATCH_DIR/* $ORACLE_HOME/.patch_storage diff --git a/OracleDatabase/SingleInstance/dockerfiles/19.3.0/patches/one_offs/.keep b/OracleDatabase/SingleInstance/dockerfiles/19.3.0/patches/one_offs/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/OracleDatabase/SingleInstance/dockerfiles/19.3.0/patches/release_update/.keep b/OracleDatabase/SingleInstance/dockerfiles/19.3.0/patches/release_update/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/OracleDatabase/SingleInstance/dockerfiles/19.3.0/runDatapatch.sh b/OracleDatabase/SingleInstance/dockerfiles/19.3.0/runDatapatch.sh new file mode 100644 index 0000000000..697afef29f --- /dev/null +++ b/OracleDatabase/SingleInstance/dockerfiles/19.3.0/runDatapatch.sh @@ -0,0 +1,38 @@ +#!/bin/bash +# LICENSE UPL 1.0 +# +# Copyright (c) 2020 Oracle and/or its affiliates. All rights reserved. +# +# Since: March, 2020 +# Author: rishabh.y.gupta@oracle.com +# Description: Runs datapatch in a container while using existing datafiles if container is at different RU level +# than the container which created the datafiles +# +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. +# + +if [ "${SKIP_DATAPATCH}" = "true" ]; then + echo "Skipping Datapatch" + exit 0; +fi + +# LSPATCHES_FILE will have the patch summary of the datafiles. +DBCONFIG_DIR="${ORACLE_BASE}/oradata/dbconfig/${ORACLE_SID}" +LSPATCHES_FILE="${DBCONFIG_DIR}/${ORACLE_SID}.lspatches" + +# tmp.lspatches will have the patch summary of the oracle home. +temp_lspatches_file="/tmp/tmp.lspatches" +$ORACLE_HOME/OPatch/opatch lspatches > ${temp_lspatches_file}; + +if diff ${LSPATCHES_FILE} ${temp_lspatches_file} 2> /dev/null; then + echo "Datafiles are already patched. Skipping datapatch run." +else + echo "Running datapatch..."; + if ! $ORACLE_HOME/OPatch/datapatch -skip_upgrade_check; then + echo "Datapatch execution has failed."; + exit 1; + else + echo "DONE: Datapatch execution." + cp ${temp_lspatches_file} ${LSPATCHES_FILE}; + fi +fi diff --git a/OracleDatabase/SingleInstance/dockerfiles/19.3.0/savePatchSummary.sh b/OracleDatabase/SingleInstance/dockerfiles/19.3.0/savePatchSummary.sh new file mode 100644 index 0000000000..8eff8a9a62 --- /dev/null +++ b/OracleDatabase/SingleInstance/dockerfiles/19.3.0/savePatchSummary.sh @@ -0,0 +1,16 @@ +#!/bin/bash +# LICENSE UPL 1.0 +# +# Copyright (c) 2020 Oracle and/or its affiliates. All rights reserved. +# +# Since: March, 2020 +# Author: rishabh.y.gupta@oracle.com +# Description: Runs lspatches to save summary of installed patches just after new db is created. +# +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. +# + +LSPATCHES_FILE="${ORACLE_SID}.lspatches" +LSPATCHES_FILE_PATH="${ORACLE_BASE}/oradata/dbconfig/${ORACLE_SID}/${LSPATCHES_FILE}" + +$ORACLE_HOME/OPatch/opatch lspatches > ${LSPATCHES_FILE_PATH}; \ No newline at end of file diff --git a/OracleDatabase/SingleInstance/dockerfiles/21.3.0/Dockerfile b/OracleDatabase/SingleInstance/dockerfiles/21.3.0/Dockerfile index 0ba206efc3..d264fd34ed 100644 --- a/OracleDatabase/SingleInstance/dockerfiles/21.3.0/Dockerfile +++ b/OracleDatabase/SingleInstance/dockerfiles/21.3.0/Dockerfile @@ -35,7 +35,7 @@ LABEL "provider"="Oracle" \ "port.oemexpress"="5500" # Argument to control removal of components not needed after db software installation -ARG SLIMMING=true +ARG SLIMMING=false ARG INSTALL_FILE_1="LINUX.X64_213000_db_home.zip" # Environment variables required for this build (do NOT change) @@ -80,6 +80,11 @@ ENV PATH=$ORACLE_HOME/bin:$ORACLE_HOME/OPatch/:/usr/sbin:$PATH \ LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib \ CLASSPATH=$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib +# Environment variables for patching +ENV HOST_PATCH_DIR="patches" \ + PATCH_DIR=/opt/install/patches \ + PATCH_DB_BINARIES_FILE="patchDBBinaries.sh" + # Copy files needed during both installation and runtime # ------------- COPY $SETUP_LINUX_FILE $CHECK_SPACE_FILE $INSTALL_DIR/ @@ -112,6 +117,14 @@ RUN chmod ug+x $INSTALL_DIR/*.sh && \ sync && \ $INSTALL_DIR/$INSTALL_DB_BINARIES_FILE $DB_EDITION +# Copy DB patches +COPY --chown=oracle:dba $HOST_PATCH_DIR $PATCH_DB_BINARIES_FILE $PATCH_DIR/ + +# Apply DB Patches +RUN chmod ug+x $PATCH_DIR/*.sh && \ + sync && \ + $PATCH_DIR/$PATCH_DB_BINARIES_FILE + ############################################# @@ -135,6 +148,19 @@ WORKDIR /home/oracle # Add a bashrc file to capitalize ORACLE_SID in the environment RUN echo 'ORACLE_SID=${ORACLE_SID:-ORCLCDB}; export ORACLE_SID=${ORACLE_SID^^}' > .bashrc +# Environment variables for patching +ENV DATAPATCH_FILE="runDatapatch.sh" \ + LSPATCHES_FILE="savePatchSummary.sh" \ + SKIP_DATAPATCH=false + +# Copy script to run datapatch +COPY --chown=oracle:dba $DATAPATCH_FILE $ORACLE_BASE/scripts/extensions/startup/ +RUN chmod ug+x $ORACLE_BASE/scripts/extensions/startup/*.sh && sync + +# Copy script to run lspatches +COPY --chown=oracle:dba $LSPATCHES_FILE $ORACLE_BASE/scripts/extensions/setup/ +RUN chmod ug+x $ORACLE_BASE/scripts/extensions/setup/*.sh && sync + HEALTHCHECK --interval=1m --start-period=5m --timeout=30s \ CMD "$ORACLE_BASE/$CHECK_DB_FILE" >/dev/null || exit 1 diff --git a/OracleDatabase/SingleInstance/dockerfiles/21.3.0/patchDBBinaries.sh b/OracleDatabase/SingleInstance/dockerfiles/21.3.0/patchDBBinaries.sh new file mode 100644 index 0000000000..5abad4b14e --- /dev/null +++ b/OracleDatabase/SingleInstance/dockerfiles/21.3.0/patchDBBinaries.sh @@ -0,0 +1,99 @@ +#!/bin/bash +# LICENSE UPL 1.0 +# +# Copyright (c) 2020 Oracle and/or its affiliates. All rights reserved. +# +# Since: March, 2020 +# Author: rishabh.y.gupta@oracle.com +# Description: Applies the patches provided by the user on the oracle home. +# +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. +# + +RU_DIR="${PATCH_DIR}/release_update" +ONE_OFFS_DIR="${PATCH_DIR}/one_offs" + +ru_count=$(ls $RU_DIR/*.zip 2> /dev/null | wc -l) +if [ $ru_count -ge 2 ]; then + echo "Error: Only 1 Release Update can be applied." + exit 1; +elif [ $ru_count == 1 ]; then + ru_patch="$(ls $RU_DIR/*.zip)" + echo "Unzipping $ru_patch"; + unzip -qo $ru_patch -d $PATCH_DIR; + ru_patch=$(echo ${ru_patch##*/} | cut -d_ -f1 | cut -dp -f2) +else + echo "No Release Update to be installed." +fi + +ONE_OFFS_LIST=() + +if ls $ONE_OFFS_DIR/*.zip 2> /dev/null; then + for patch_zip in $ONE_OFFS_DIR/*.zip; do + patch_no=$(echo ${patch_zip##*/} | cut -d_ -f1 | cut -dp -f2) + if [ $patch_no == "6880880" ]; then + echo "Removing directory ${ORACLE_HOME}/OPatch"; + rm -rf ${ORACLE_HOME}/OPatch; + echo "Unzipping OPatch archive $patch_zip to ${ORACLE_HOME}"; + unzip -qo $patch_zip -d $ORACLE_HOME; + else + ONE_OFFS_LIST+=($patch_no); + echo "Unzipping $patch_zip"; + unzip -qo $patch_zip -d $PATCH_DIR; + fi + done +else + echo "No one-offs to be installed." +fi + +export PATH=${ORACLE_HOME}/perl/bin:$PATH; + +if [ ! -z $ru_patch ]; then + echo "Applying Release Update: $ru_patch"; + cmd="${ORACLE_HOME}/OPatch/opatchauto apply -binary -oh $ORACLE_HOME ${PATCH_DIR}/${ru_patch} -target_type rac_database"; + echo "Running: $cmd"; + $cmd || { + echo "RU application failed for patchset: ${ru_patch}"; + exit 1; + } +fi + +for patch in ${ONE_OFFS_LIST[@]}; do + echo "Applying patch: $patch"; + cmd="${ORACLE_HOME}/OPatch/opatchauto apply -binary -oh $ORACLE_HOME ${PATCH_DIR}/${patch} -target_type rac_database"; + echo "Running: $cmd"; + $cmd || { + echo "Patch application failed for ${patch}"; + exit 1; + } +done + +# Remove not needed components +# APEX +rm -rf "$ORACLE_HOME"/apex && \ +# ORDS +rm -rf "$ORACLE_HOME"/ords && \ +# SQL Developer +rm -rf "$ORACLE_HOME"/sqldeveloper && \ +# UCP connection pool +rm -rf "$ORACLE_HOME"/ucp && \ +# All installer files +rm -rf "$ORACLE_HOME"/lib/*.zip && \ +# OUI backup +rm -rf "$ORACLE_HOME"/inventory/backup/* && \ +# Network tools help +rm -rf "$ORACLE_HOME"/network/tools/help && \ +# Database upgrade assistant +rm -rf "$ORACLE_HOME"/assistants/dbua && \ +# Database migration assistant +rm -rf "$ORACLE_HOME"/dmu && \ +# Remove pilot workflow installer +rm -rf "$ORACLE_HOME"/install/pilot && \ +# Support tools +rm -rf "$ORACLE_HOME"/suptools && \ +# Temp location +rm -rf /tmp/* && \ +# Database files directory +rm -rf "$INSTALL_DIR"/database +# Database patch directories +rm -rf $PATCH_DIR/* $ORACLE_HOME/.patch_storage diff --git a/OracleDatabase/SingleInstance/dockerfiles/21.3.0/patches/one_offs/.keep b/OracleDatabase/SingleInstance/dockerfiles/21.3.0/patches/one_offs/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/OracleDatabase/SingleInstance/dockerfiles/21.3.0/patches/release_update/.keep b/OracleDatabase/SingleInstance/dockerfiles/21.3.0/patches/release_update/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/OracleDatabase/SingleInstance/dockerfiles/21.3.0/runDatapatch.sh b/OracleDatabase/SingleInstance/dockerfiles/21.3.0/runDatapatch.sh new file mode 100644 index 0000000000..697afef29f --- /dev/null +++ b/OracleDatabase/SingleInstance/dockerfiles/21.3.0/runDatapatch.sh @@ -0,0 +1,38 @@ +#!/bin/bash +# LICENSE UPL 1.0 +# +# Copyright (c) 2020 Oracle and/or its affiliates. All rights reserved. +# +# Since: March, 2020 +# Author: rishabh.y.gupta@oracle.com +# Description: Runs datapatch in a container while using existing datafiles if container is at different RU level +# than the container which created the datafiles +# +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. +# + +if [ "${SKIP_DATAPATCH}" = "true" ]; then + echo "Skipping Datapatch" + exit 0; +fi + +# LSPATCHES_FILE will have the patch summary of the datafiles. +DBCONFIG_DIR="${ORACLE_BASE}/oradata/dbconfig/${ORACLE_SID}" +LSPATCHES_FILE="${DBCONFIG_DIR}/${ORACLE_SID}.lspatches" + +# tmp.lspatches will have the patch summary of the oracle home. +temp_lspatches_file="/tmp/tmp.lspatches" +$ORACLE_HOME/OPatch/opatch lspatches > ${temp_lspatches_file}; + +if diff ${LSPATCHES_FILE} ${temp_lspatches_file} 2> /dev/null; then + echo "Datafiles are already patched. Skipping datapatch run." +else + echo "Running datapatch..."; + if ! $ORACLE_HOME/OPatch/datapatch -skip_upgrade_check; then + echo "Datapatch execution has failed."; + exit 1; + else + echo "DONE: Datapatch execution." + cp ${temp_lspatches_file} ${LSPATCHES_FILE}; + fi +fi diff --git a/OracleDatabase/SingleInstance/dockerfiles/21.3.0/savePatchSummary.sh b/OracleDatabase/SingleInstance/dockerfiles/21.3.0/savePatchSummary.sh new file mode 100644 index 0000000000..8eff8a9a62 --- /dev/null +++ b/OracleDatabase/SingleInstance/dockerfiles/21.3.0/savePatchSummary.sh @@ -0,0 +1,16 @@ +#!/bin/bash +# LICENSE UPL 1.0 +# +# Copyright (c) 2020 Oracle and/or its affiliates. All rights reserved. +# +# Since: March, 2020 +# Author: rishabh.y.gupta@oracle.com +# Description: Runs lspatches to save summary of installed patches just after new db is created. +# +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. +# + +LSPATCHES_FILE="${ORACLE_SID}.lspatches" +LSPATCHES_FILE_PATH="${ORACLE_BASE}/oradata/dbconfig/${ORACLE_SID}/${LSPATCHES_FILE}" + +$ORACLE_HOME/OPatch/opatch lspatches > ${LSPATCHES_FILE_PATH}; \ No newline at end of file From d9f3a510f7486bec8360d937f8cbce4e63576ffc Mon Sep 17 00:00:00 2001 From: Nathan C <1849077+thelateperseus@users.noreply.github.com> Date: Fri, 4 Aug 2023 14:06:20 +1000 Subject: [PATCH 2/3] Fixed lint issues and removed SLIMMING arg Lint issues have been fixed as requested in the PR. Also, the SLIMMING argument is no longer required, so it has been removed. Likewise, the patching extension is no longer required and has been removed. --- OracleDatabase/SingleInstance/README.md | 11 ++- .../dockerfiles/19.3.0/Dockerfile | 18 ++--- .../dockerfiles/19.3.0/installDBBinaries.sh | 34 +-------- .../dockerfiles/19.3.0/patchDBBinaries.sh | 35 ++++----- .../dockerfiles/19.3.0/runDatapatch.sh | 8 +- .../dockerfiles/19.3.0/savePatchSummary.sh | 2 +- .../dockerfiles/21.3.0/Dockerfile | 27 ++++--- .../dockerfiles/21.3.0/installDBBinaries.sh | 34 +-------- .../dockerfiles/21.3.0/patchDBBinaries.sh | 35 ++++----- .../dockerfiles/21.3.0/runDatapatch.sh | 8 +- .../dockerfiles/21.3.0/savePatchSummary.sh | 2 +- .../extensions/patching/Dockerfile | 76 ------------------- .../extensions/patching/README.md | 13 ---- .../extensions/patching/patchDBBinaries.sh | 69 ----------------- .../patching/patches/one_offs/.keep | 0 .../patching/patches/release_update/.keep | 0 .../extensions/patching/runDatapatch.sh | 38 ---------- .../extensions/patching/runOracle.sh | 11 --- .../extensions/patching/savePatchSummary.sh | 16 ---- 19 files changed, 79 insertions(+), 358 deletions(-) delete mode 100644 OracleDatabase/SingleInstance/extensions/patching/Dockerfile delete mode 100644 OracleDatabase/SingleInstance/extensions/patching/README.md delete mode 100644 OracleDatabase/SingleInstance/extensions/patching/patchDBBinaries.sh delete mode 100644 OracleDatabase/SingleInstance/extensions/patching/patches/one_offs/.keep delete mode 100644 OracleDatabase/SingleInstance/extensions/patching/patches/release_update/.keep delete mode 100644 OracleDatabase/SingleInstance/extensions/patching/runDatapatch.sh delete mode 100644 OracleDatabase/SingleInstance/extensions/patching/runOracle.sh delete mode 100644 OracleDatabase/SingleInstance/extensions/patching/savePatchSummary.sh diff --git a/OracleDatabase/SingleInstance/README.md b/OracleDatabase/SingleInstance/README.md index 40a332de61..90d6e171b9 100644 --- a/OracleDatabase/SingleInstance/README.md +++ b/OracleDatabase/SingleInstance/README.md @@ -63,10 +63,15 @@ You may extend the image with your own Dockerfile and create the users and table The character set for the database is set during creating of the database. 11gR2 Express Edition supports only UTF-8. You can set the character set for the Standard Edition 2 and Enterprise Edition during the first run of your container and may keep separate folders containing different tablespaces with different character sets. -**NOTE**: This section is intended for container images 19c or higher which has patching extension support. By default, SLIMMING is **true** to remove some components from the image with the intention of making the image slimmer. These removed components cause problems while patching after building patching extension. -So, to use patching extension one should use additional build argument `-o '--build-arg SLIMMING=false'` while building the container image. Example command for building the container image is as follows: +#### Building container images with patches - ./buildContainerImage.sh -e -v 21.3.0 -o '--build-arg SLIMMING=false' +**NOTE**: This section applies to 19c or higher. Earlier versions do not have patching extension support. + +You may apply patches when building the Oracle Database container. Multiple one-offs can be applied in a single build but only 1 RU can be applied. + +Download the release update and one-offs and place them under the `dockerfiles//patches/release_update` and `dockerfiles//patches/one_offs` directories respectively. + +Once the patches have been placed in the correct directories, use the `buildContainerImage.sh` script to build the image with patches applied. #### Building the container images using Podman diff --git a/OracleDatabase/SingleInstance/dockerfiles/19.3.0/Dockerfile b/OracleDatabase/SingleInstance/dockerfiles/19.3.0/Dockerfile index 30c1aa8812..e92ffcd0eb 100644 --- a/OracleDatabase/SingleInstance/dockerfiles/19.3.0/Dockerfile +++ b/OracleDatabase/SingleInstance/dockerfiles/19.3.0/Dockerfile @@ -5,7 +5,7 @@ # ORACLE DOCKERFILES PROJECT # -------------------------- # This is the Dockerfile for Oracle Database 19c -# +# # REQUIRED FILES TO BUILD THIS IMAGE # ---------------------------------- # (1) db_home.zip @@ -15,8 +15,8 @@ # HOW TO BUILD THIS IMAGE # ----------------------- # Put all downloaded files in the same directory as this Dockerfile -# Run: -# $ docker build -t oracle/database:19.3.0-${EDITION} . +# Run: +# $ docker build -t oracle/database:19.3.0-${EDITION} . # # Pull base image # --------------- @@ -37,7 +37,6 @@ LABEL "provider"="Oracle" \ "port.oemexpress"="5500" # Argument to control removal of components not needed after db software installation -ARG SLIMMING=false ARG INSTALL_FILE_1="LINUX.X64_193000_db_home.zip" # Environment variables required for this build (do NOT change) @@ -60,7 +59,6 @@ ENV ORACLE_BASE=/opt/oracle \ INSTALL_DB_BINARIES_FILE="installDBBinaries.sh" \ RELINK_BINARY_FILE="relinkOracleBinary.sh" \ CONFIG_TCPS_FILE="configTcps.sh" \ - SLIMMING=$SLIMMING \ ENABLE_ARCHIVELOG=false \ ARCHIVELOG_DIR_NAME=archive_logs \ # To clone a database referred by PRIMARY_DB_CONN_STR @@ -122,9 +120,9 @@ RUN chmod ug+x "$INSTALL_DIR"/*.sh && \ COPY --chown=oracle:dba $HOST_PATCH_DIR $PATCH_DB_BINARIES_FILE $PATCH_DIR/ # Apply DB Patches -RUN chmod ug+x $PATCH_DIR/*.sh && \ +RUN chmod ug+x "$PATCH_DIR"/*.sh && \ sync && \ - $PATCH_DIR/$PATCH_DB_BINARIES_FILE + "$PATCH_DIR"/"$PATCH_DB_BINARIES_FILE" @@ -157,14 +155,14 @@ ENV DATAPATCH_FILE="runDatapatch.sh" \ # Copy script to run datapatch COPY --chown=oracle:dba $DATAPATCH_FILE $ORACLE_BASE/scripts/extensions/startup/ -RUN chmod ug+x $ORACLE_BASE/scripts/extensions/startup/*.sh && sync +RUN chmod ug+x "$ORACLE_BASE"/scripts/extensions/startup/*.sh && sync # Copy script to run lspatches COPY --chown=oracle:dba $LSPATCHES_FILE $ORACLE_BASE/scripts/extensions/setup/ -RUN chmod ug+x $ORACLE_BASE/scripts/extensions/setup/*.sh && sync +RUN chmod ug+x "$ORACLE_BASE"/scripts/extensions/setup/*.sh && sync HEALTHCHECK --interval=1m --start-period=5m --timeout=30s \ CMD "$ORACLE_BASE/$CHECK_DB_FILE" >/dev/null || exit 1 -# Define default command to start Oracle Database. +# Define default command to start Oracle Database. CMD [ "/bin/bash", "-c", "exec $ORACLE_BASE/$RUN_FILE" ] diff --git a/OracleDatabase/SingleInstance/dockerfiles/19.3.0/installDBBinaries.sh b/OracleDatabase/SingleInstance/dockerfiles/19.3.0/installDBBinaries.sh index 42426f2424..9be30f12f3 100755 --- a/OracleDatabase/SingleInstance/dockerfiles/19.3.0/installDBBinaries.sh +++ b/OracleDatabase/SingleInstance/dockerfiles/19.3.0/installDBBinaries.sh @@ -6,9 +6,9 @@ # Since: December, 2016 # Author: gerald.venzl@oracle.com # Description: Sets up the unix environment for DB installation. -# +# # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. -# +# # Convert $1 into upper case via "^^" (bash version 4 onwards) EDITION=${1^^} @@ -55,33 +55,3 @@ unzip "$INSTALL_FILE_1" && \ rm "$INSTALL_FILE_1" && \ "$ORACLE_HOME"/runInstaller -silent -force -waitforcompletion -responsefile "$INSTALL_DIR"/"$INSTALL_RSP" -ignorePrereqFailure && \ cd "$HOME" - -if $SLIMMING; then - # Remove not needed components - # APEX - rm -rf "$ORACLE_HOME"/apex && \ - # ORDS - rm -rf "$ORACLE_HOME"/ords && \ - # SQL Developer - rm -rf "$ORACLE_HOME"/sqldeveloper && \ - # UCP connection pool - rm -rf "$ORACLE_HOME"/ucp && \ - # All installer files - rm -rf "$ORACLE_HOME"/lib/*.zip && \ - # OUI backup - rm -rf "$ORACLE_HOME"/inventory/backup/* && \ - # Network tools help - rm -rf "$ORACLE_HOME"/network/tools/help && \ - # Database upgrade assistant - rm -rf "$ORACLE_HOME"/assistants/dbua && \ - # Database migration assistant - rm -rf "$ORACLE_HOME"/dmu && \ - # Remove pilot workflow installer - rm -rf "$ORACLE_HOME"/install/pilot && \ - # Support tools - rm -rf "$ORACLE_HOME"/suptools && \ - # Temp location - rm -rf /tmp/* && \ - # Database files directory - rm -rf "$INSTALL_DIR"/database -fi diff --git a/OracleDatabase/SingleInstance/dockerfiles/19.3.0/patchDBBinaries.sh b/OracleDatabase/SingleInstance/dockerfiles/19.3.0/patchDBBinaries.sh index 5abad4b14e..13c8690b93 100644 --- a/OracleDatabase/SingleInstance/dockerfiles/19.3.0/patchDBBinaries.sh +++ b/OracleDatabase/SingleInstance/dockerfiles/19.3.0/patchDBBinaries.sh @@ -13,33 +13,34 @@ RU_DIR="${PATCH_DIR}/release_update" ONE_OFFS_DIR="${PATCH_DIR}/one_offs" -ru_count=$(ls $RU_DIR/*.zip 2> /dev/null | wc -l) -if [ $ru_count -ge 2 ]; then +ru_files=("$RU_DIR"/*.zip) +ru_count=${#ru_files[@]} +if [ "$ru_count" -ge 2 ]; then echo "Error: Only 1 Release Update can be applied." exit 1; -elif [ $ru_count == 1 ]; then - ru_patch="$(ls $RU_DIR/*.zip)" +elif [ "$ru_count" == 1 ]; then + ru_patch="$(ls "$RU_DIR"/*.zip)" echo "Unzipping $ru_patch"; - unzip -qo $ru_patch -d $PATCH_DIR; - ru_patch=$(echo ${ru_patch##*/} | cut -d_ -f1 | cut -dp -f2) + unzip -qo "$ru_patch" -d "$PATCH_DIR"; + ru_patch=$(echo "${ru_patch##*/}" | cut -d_ -f1 | cut -dp -f2) else echo "No Release Update to be installed." fi ONE_OFFS_LIST=() -if ls $ONE_OFFS_DIR/*.zip 2> /dev/null; then - for patch_zip in $ONE_OFFS_DIR/*.zip; do - patch_no=$(echo ${patch_zip##*/} | cut -d_ -f1 | cut -dp -f2) - if [ $patch_no == "6880880" ]; then +if ls "$ONE_OFFS_DIR"/*.zip 2> /dev/null; then + for patch_zip in "$ONE_OFFS_DIR"/*.zip; do + patch_no=$(echo "${patch_zip##*/}" | cut -d_ -f1 | cut -dp -f2) + if [ "$patch_no" == "6880880" ]; then echo "Removing directory ${ORACLE_HOME}/OPatch"; - rm -rf ${ORACLE_HOME}/OPatch; + rm -rf "${ORACLE_HOME}"/OPatch; echo "Unzipping OPatch archive $patch_zip to ${ORACLE_HOME}"; - unzip -qo $patch_zip -d $ORACLE_HOME; + unzip -qo "$patch_zip" -d "$ORACLE_HOME"; else - ONE_OFFS_LIST+=($patch_no); + ONE_OFFS_LIST+=("$patch_no"); echo "Unzipping $patch_zip"; - unzip -qo $patch_zip -d $PATCH_DIR; + unzip -qo "$patch_zip" -d "$PATCH_DIR"; fi done else @@ -48,7 +49,7 @@ fi export PATH=${ORACLE_HOME}/perl/bin:$PATH; -if [ ! -z $ru_patch ]; then +if [ -n "$ru_patch" ]; then echo "Applying Release Update: $ru_patch"; cmd="${ORACLE_HOME}/OPatch/opatchauto apply -binary -oh $ORACLE_HOME ${PATCH_DIR}/${ru_patch} -target_type rac_database"; echo "Running: $cmd"; @@ -58,7 +59,7 @@ if [ ! -z $ru_patch ]; then } fi -for patch in ${ONE_OFFS_LIST[@]}; do +for patch in "${ONE_OFFS_LIST[@]}"; do echo "Applying patch: $patch"; cmd="${ORACLE_HOME}/OPatch/opatchauto apply -binary -oh $ORACLE_HOME ${PATCH_DIR}/${patch} -target_type rac_database"; echo "Running: $cmd"; @@ -96,4 +97,4 @@ rm -rf /tmp/* && \ # Database files directory rm -rf "$INSTALL_DIR"/database # Database patch directories -rm -rf $PATCH_DIR/* $ORACLE_HOME/.patch_storage +rm -rf "${PATCH_DIR:?}/"* "$ORACLE_HOME"/.patch_storage diff --git a/OracleDatabase/SingleInstance/dockerfiles/19.3.0/runDatapatch.sh b/OracleDatabase/SingleInstance/dockerfiles/19.3.0/runDatapatch.sh index 697afef29f..1df751d0f2 100644 --- a/OracleDatabase/SingleInstance/dockerfiles/19.3.0/runDatapatch.sh +++ b/OracleDatabase/SingleInstance/dockerfiles/19.3.0/runDatapatch.sh @@ -22,17 +22,17 @@ LSPATCHES_FILE="${DBCONFIG_DIR}/${ORACLE_SID}.lspatches" # tmp.lspatches will have the patch summary of the oracle home. temp_lspatches_file="/tmp/tmp.lspatches" -$ORACLE_HOME/OPatch/opatch lspatches > ${temp_lspatches_file}; +"$ORACLE_HOME"/OPatch/opatch lspatches > ${temp_lspatches_file}; -if diff ${LSPATCHES_FILE} ${temp_lspatches_file} 2> /dev/null; then +if diff "${LSPATCHES_FILE}" ${temp_lspatches_file} 2> /dev/null; then echo "Datafiles are already patched. Skipping datapatch run." else echo "Running datapatch..."; - if ! $ORACLE_HOME/OPatch/datapatch -skip_upgrade_check; then + if ! "$ORACLE_HOME"/OPatch/datapatch -skip_upgrade_check; then echo "Datapatch execution has failed."; exit 1; else echo "DONE: Datapatch execution." - cp ${temp_lspatches_file} ${LSPATCHES_FILE}; + cp ${temp_lspatches_file} "${LSPATCHES_FILE}"; fi fi diff --git a/OracleDatabase/SingleInstance/dockerfiles/19.3.0/savePatchSummary.sh b/OracleDatabase/SingleInstance/dockerfiles/19.3.0/savePatchSummary.sh index 8eff8a9a62..da3495d3fd 100644 --- a/OracleDatabase/SingleInstance/dockerfiles/19.3.0/savePatchSummary.sh +++ b/OracleDatabase/SingleInstance/dockerfiles/19.3.0/savePatchSummary.sh @@ -13,4 +13,4 @@ LSPATCHES_FILE="${ORACLE_SID}.lspatches" LSPATCHES_FILE_PATH="${ORACLE_BASE}/oradata/dbconfig/${ORACLE_SID}/${LSPATCHES_FILE}" -$ORACLE_HOME/OPatch/opatch lspatches > ${LSPATCHES_FILE_PATH}; \ No newline at end of file +"$ORACLE_HOME"/OPatch/opatch lspatches > "${LSPATCHES_FILE_PATH}"; diff --git a/OracleDatabase/SingleInstance/dockerfiles/21.3.0/Dockerfile b/OracleDatabase/SingleInstance/dockerfiles/21.3.0/Dockerfile index d264fd34ed..267f0bf3cf 100644 --- a/OracleDatabase/SingleInstance/dockerfiles/21.3.0/Dockerfile +++ b/OracleDatabase/SingleInstance/dockerfiles/21.3.0/Dockerfile @@ -5,7 +5,7 @@ # ORACLE DOCKERFILES PROJECT # -------------------------- # This is the Dockerfile for Oracle Database 21c -# +# # REQUIRED FILES TO BUILD THIS IMAGE # ---------------------------------- # (1) LINUX.X64_213000_db_home.zip @@ -15,7 +15,7 @@ # HOW TO BUILD THIS IMAGE # ----------------------- # Put all downloaded files in the same directory as this Dockerfile -# Run: +# Run: # $ docker build -t oracle/database:21.3.0-${EDITION} . # # Pull base image @@ -35,7 +35,6 @@ LABEL "provider"="Oracle" \ "port.oemexpress"="5500" # Argument to control removal of components not needed after db software installation -ARG SLIMMING=false ARG INSTALL_FILE_1="LINUX.X64_213000_db_home.zip" # Environment variables required for this build (do NOT change) @@ -59,7 +58,6 @@ ENV ORACLE_BASE=/opt/oracle \ INSTALL_DB_BINARIES_FILE="installDBBinaries.sh" \ RELINK_BINARY_FILE="relinkOracleBinary.sh" \ CONFIG_TCPS_FILE="configTcps.sh" \ - SLIMMING=$SLIMMING \ ENABLE_ARCHIVELOG=false \ ARCHIVELOG_DIR_NAME=archive_logs \ # To clone a database referred by PRIMARY_DB_CONN_STR @@ -113,17 +111,17 @@ COPY --chown=oracle:dba $INSTALL_FILE_1 $INSTALL_RSP $INSTALL_DB_BINARIES_FILE $ # Install DB software binaries USER oracle -RUN chmod ug+x $INSTALL_DIR/*.sh && \ +RUN chmod ug+x "$INSTALL_DIR"/*.sh && \ sync && \ - $INSTALL_DIR/$INSTALL_DB_BINARIES_FILE $DB_EDITION + "$INSTALL_DIR"/"$INSTALL_DB_BINARIES_FILE" $DB_EDITION # Copy DB patches COPY --chown=oracle:dba $HOST_PATCH_DIR $PATCH_DB_BINARIES_FILE $PATCH_DIR/ # Apply DB Patches -RUN chmod ug+x $PATCH_DIR/*.sh && \ +RUN chmod ug+x "$PATCH_DIR"/*.sh && \ sync && \ - $PATCH_DIR/$PATCH_DB_BINARIES_FILE + "$PATCH_DIR"/"$PATCH_DB_BINARIES_FILE" @@ -139,13 +137,14 @@ USER oracle COPY --chown=oracle:dba --from=builder $ORACLE_BASE $ORACLE_BASE USER root -RUN $ORACLE_BASE/oraInventory/orainstRoot.sh && \ - $ORACLE_HOME/root.sh +RUN "$ORACLE_BASE"/oraInventory/orainstRoot.sh && \ + "$ORACLE_HOME"/root.sh USER oracle WORKDIR /home/oracle # Add a bashrc file to capitalize ORACLE_SID in the environment +# hadolint ignore=SC2016 RUN echo 'ORACLE_SID=${ORACLE_SID:-ORCLCDB}; export ORACLE_SID=${ORACLE_SID^^}' > .bashrc # Environment variables for patching @@ -155,14 +154,14 @@ ENV DATAPATCH_FILE="runDatapatch.sh" \ # Copy script to run datapatch COPY --chown=oracle:dba $DATAPATCH_FILE $ORACLE_BASE/scripts/extensions/startup/ -RUN chmod ug+x $ORACLE_BASE/scripts/extensions/startup/*.sh && sync +RUN chmod ug+x "$ORACLE_BASE"/scripts/extensions/startup/*.sh && sync # Copy script to run lspatches COPY --chown=oracle:dba $LSPATCHES_FILE $ORACLE_BASE/scripts/extensions/setup/ -RUN chmod ug+x $ORACLE_BASE/scripts/extensions/setup/*.sh && sync +RUN chmod ug+x "$ORACLE_BASE"/scripts/extensions/setup/*.sh && sync HEALTHCHECK --interval=1m --start-period=5m --timeout=30s \ CMD "$ORACLE_BASE/$CHECK_DB_FILE" >/dev/null || exit 1 -# Define default command to start Oracle Database. -CMD exec $ORACLE_BASE/$RUN_FILE +# Define default command to start Oracle Database. +CMD [ "/bin/bash", "-c", "exec $ORACLE_BASE/$RUN_FILE" ] diff --git a/OracleDatabase/SingleInstance/dockerfiles/21.3.0/installDBBinaries.sh b/OracleDatabase/SingleInstance/dockerfiles/21.3.0/installDBBinaries.sh index 415ee8455c..36d15df222 100644 --- a/OracleDatabase/SingleInstance/dockerfiles/21.3.0/installDBBinaries.sh +++ b/OracleDatabase/SingleInstance/dockerfiles/21.3.0/installDBBinaries.sh @@ -6,9 +6,9 @@ # Since: December, 2016 # Author: gerald.venzl@oracle.com # Description: Sets up the unix environment for DB installation. -# +# # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. -# +# # Convert $1 into upper case via "^^" (bash version 4 onwards) EDITION=${1^^} @@ -55,33 +55,3 @@ unzip "$INSTALL_FILE_1" && \ rm "$INSTALL_FILE_1" && \ "$ORACLE_HOME"/runInstaller -silent -force -waitforcompletion -responsefile "$INSTALL_DIR"/"$INSTALL_RSP" -ignorePrereqFailure && \ cd "$HOME" - -if $SLIMMING; then - # Remove not needed components - # APEX - rm -rf "$ORACLE_HOME"/apex && \ - # ORDS - rm -rf "$ORACLE_HOME"/ords && \ - # SQL Developer - rm -rf "$ORACLE_HOME"/sqldeveloper && \ - # UCP connection pool - rm -rf "$ORACLE_HOME"/ucp && \ - # All installer files - rm -rf "$ORACLE_HOME"/lib/*.zip && \ - # OUI backup - rm -rf "$ORACLE_HOME"/inventory/backup/* && \ - # Network tools help - rm -rf "$ORACLE_HOME"/network/tools/help && \ - # Database upgrade assistant - rm -rf "$ORACLE_HOME"/assistants/dbua && \ - # Database migration assistant - rm -rf "$ORACLE_HOME"/dmu && \ - # Remove pilot workflow installer - rm -rf "$ORACLE_HOME"/install/pilot && \ - # Support tools - rm -rf "$ORACLE_HOME"/suptools && \ - # Temp location - rm -rf /tmp/* && \ - # Database files directory - rm -rf "$INSTALL_DIR"/database -fi diff --git a/OracleDatabase/SingleInstance/dockerfiles/21.3.0/patchDBBinaries.sh b/OracleDatabase/SingleInstance/dockerfiles/21.3.0/patchDBBinaries.sh index 5abad4b14e..13c8690b93 100644 --- a/OracleDatabase/SingleInstance/dockerfiles/21.3.0/patchDBBinaries.sh +++ b/OracleDatabase/SingleInstance/dockerfiles/21.3.0/patchDBBinaries.sh @@ -13,33 +13,34 @@ RU_DIR="${PATCH_DIR}/release_update" ONE_OFFS_DIR="${PATCH_DIR}/one_offs" -ru_count=$(ls $RU_DIR/*.zip 2> /dev/null | wc -l) -if [ $ru_count -ge 2 ]; then +ru_files=("$RU_DIR"/*.zip) +ru_count=${#ru_files[@]} +if [ "$ru_count" -ge 2 ]; then echo "Error: Only 1 Release Update can be applied." exit 1; -elif [ $ru_count == 1 ]; then - ru_patch="$(ls $RU_DIR/*.zip)" +elif [ "$ru_count" == 1 ]; then + ru_patch="$(ls "$RU_DIR"/*.zip)" echo "Unzipping $ru_patch"; - unzip -qo $ru_patch -d $PATCH_DIR; - ru_patch=$(echo ${ru_patch##*/} | cut -d_ -f1 | cut -dp -f2) + unzip -qo "$ru_patch" -d "$PATCH_DIR"; + ru_patch=$(echo "${ru_patch##*/}" | cut -d_ -f1 | cut -dp -f2) else echo "No Release Update to be installed." fi ONE_OFFS_LIST=() -if ls $ONE_OFFS_DIR/*.zip 2> /dev/null; then - for patch_zip in $ONE_OFFS_DIR/*.zip; do - patch_no=$(echo ${patch_zip##*/} | cut -d_ -f1 | cut -dp -f2) - if [ $patch_no == "6880880" ]; then +if ls "$ONE_OFFS_DIR"/*.zip 2> /dev/null; then + for patch_zip in "$ONE_OFFS_DIR"/*.zip; do + patch_no=$(echo "${patch_zip##*/}" | cut -d_ -f1 | cut -dp -f2) + if [ "$patch_no" == "6880880" ]; then echo "Removing directory ${ORACLE_HOME}/OPatch"; - rm -rf ${ORACLE_HOME}/OPatch; + rm -rf "${ORACLE_HOME}"/OPatch; echo "Unzipping OPatch archive $patch_zip to ${ORACLE_HOME}"; - unzip -qo $patch_zip -d $ORACLE_HOME; + unzip -qo "$patch_zip" -d "$ORACLE_HOME"; else - ONE_OFFS_LIST+=($patch_no); + ONE_OFFS_LIST+=("$patch_no"); echo "Unzipping $patch_zip"; - unzip -qo $patch_zip -d $PATCH_DIR; + unzip -qo "$patch_zip" -d "$PATCH_DIR"; fi done else @@ -48,7 +49,7 @@ fi export PATH=${ORACLE_HOME}/perl/bin:$PATH; -if [ ! -z $ru_patch ]; then +if [ -n "$ru_patch" ]; then echo "Applying Release Update: $ru_patch"; cmd="${ORACLE_HOME}/OPatch/opatchauto apply -binary -oh $ORACLE_HOME ${PATCH_DIR}/${ru_patch} -target_type rac_database"; echo "Running: $cmd"; @@ -58,7 +59,7 @@ if [ ! -z $ru_patch ]; then } fi -for patch in ${ONE_OFFS_LIST[@]}; do +for patch in "${ONE_OFFS_LIST[@]}"; do echo "Applying patch: $patch"; cmd="${ORACLE_HOME}/OPatch/opatchauto apply -binary -oh $ORACLE_HOME ${PATCH_DIR}/${patch} -target_type rac_database"; echo "Running: $cmd"; @@ -96,4 +97,4 @@ rm -rf /tmp/* && \ # Database files directory rm -rf "$INSTALL_DIR"/database # Database patch directories -rm -rf $PATCH_DIR/* $ORACLE_HOME/.patch_storage +rm -rf "${PATCH_DIR:?}/"* "$ORACLE_HOME"/.patch_storage diff --git a/OracleDatabase/SingleInstance/dockerfiles/21.3.0/runDatapatch.sh b/OracleDatabase/SingleInstance/dockerfiles/21.3.0/runDatapatch.sh index 697afef29f..1df751d0f2 100644 --- a/OracleDatabase/SingleInstance/dockerfiles/21.3.0/runDatapatch.sh +++ b/OracleDatabase/SingleInstance/dockerfiles/21.3.0/runDatapatch.sh @@ -22,17 +22,17 @@ LSPATCHES_FILE="${DBCONFIG_DIR}/${ORACLE_SID}.lspatches" # tmp.lspatches will have the patch summary of the oracle home. temp_lspatches_file="/tmp/tmp.lspatches" -$ORACLE_HOME/OPatch/opatch lspatches > ${temp_lspatches_file}; +"$ORACLE_HOME"/OPatch/opatch lspatches > ${temp_lspatches_file}; -if diff ${LSPATCHES_FILE} ${temp_lspatches_file} 2> /dev/null; then +if diff "${LSPATCHES_FILE}" ${temp_lspatches_file} 2> /dev/null; then echo "Datafiles are already patched. Skipping datapatch run." else echo "Running datapatch..."; - if ! $ORACLE_HOME/OPatch/datapatch -skip_upgrade_check; then + if ! "$ORACLE_HOME"/OPatch/datapatch -skip_upgrade_check; then echo "Datapatch execution has failed."; exit 1; else echo "DONE: Datapatch execution." - cp ${temp_lspatches_file} ${LSPATCHES_FILE}; + cp ${temp_lspatches_file} "${LSPATCHES_FILE}"; fi fi diff --git a/OracleDatabase/SingleInstance/dockerfiles/21.3.0/savePatchSummary.sh b/OracleDatabase/SingleInstance/dockerfiles/21.3.0/savePatchSummary.sh index 8eff8a9a62..da3495d3fd 100644 --- a/OracleDatabase/SingleInstance/dockerfiles/21.3.0/savePatchSummary.sh +++ b/OracleDatabase/SingleInstance/dockerfiles/21.3.0/savePatchSummary.sh @@ -13,4 +13,4 @@ LSPATCHES_FILE="${ORACLE_SID}.lspatches" LSPATCHES_FILE_PATH="${ORACLE_BASE}/oradata/dbconfig/${ORACLE_SID}/${LSPATCHES_FILE}" -$ORACLE_HOME/OPatch/opatch lspatches > ${LSPATCHES_FILE_PATH}; \ No newline at end of file +"$ORACLE_HOME"/OPatch/opatch lspatches > "${LSPATCHES_FILE_PATH}"; diff --git a/OracleDatabase/SingleInstance/extensions/patching/Dockerfile b/OracleDatabase/SingleInstance/extensions/patching/Dockerfile deleted file mode 100644 index c569428625..0000000000 --- a/OracleDatabase/SingleInstance/extensions/patching/Dockerfile +++ /dev/null @@ -1,76 +0,0 @@ -# LICENSE UPL 1.0 -# -# Copyright (c) 1982-2020 Oracle and/or its affiliates. All rights reserved. -# -# ORACLE DOCKERFILES PROJECT -# -------------------------- -# This is the Dockerfile for Oracle Database with patching support -# -# REQUIREMETNS FOR THIS IMAGE -# ---------------------------------- -# -# -# HOW TO BUILD THIS IMAGE -# ----------------------- -# -# Run: -# $ docker build -t . --build-arg BASE_IMAGE=oracle/database:18.3.0-ee -# -# Pull base image -# --------------- -ARG BASE_IMAGE=oracle/database:19.3.0-ee -FROM ${BASE_IMAGE} as patching - -# Environment variables required for this build (do NOT change) -# ------------------------------------------------------------- -ENV HOST_PATCH_DIR="patches" \ - PATCH_DIR=/opt/install/patches \ - PATCH_DB_BINARIES_FILE="patchDBBinaries.sh" - -# Copy DB patches -COPY --chown=oracle:dba $HOST_PATCH_DIR $PATCH_DB_BINARIES_FILE $PATCH_DIR/ - -# Apply DB Patch -RUN chmod ug+x $PATCH_DIR/*.sh && \ - sync && \ - $PATCH_DIR/$PATCH_DB_BINARIES_FILE && \ - rm -rf $PATCH_DIR/* $ORACLE_HOME/.patch_storage - - -## New stage for minimal layer size -FROM ${BASE_IMAGE} -ENV DATAPATCH_FILE="runDatapatch.sh" \ - LSPATCHES_FILE="savePatchSummary.sh" \ - SKIP_DATAPATCH=false - -# Extn name -ARG EXTENSION_NAME="patching" - -# Copying patched oracle_base from previous layer -COPY --from=patching $ORACLE_BASE $ORACLE_BASE - -# Copy script to run datapatch -COPY --chown=oracle:dba $DATAPATCH_FILE $ORACLE_BASE/scripts/extensions/startup/ -RUN chmod ug+x $ORACLE_BASE/scripts/extensions/startup/*.sh && sync - -# Copy script to run lspatches -COPY --chown=oracle:dba $LSPATCHES_FILE $ORACLE_BASE/scripts/extensions/setup/ -RUN chmod ug+x $ORACLE_BASE/scripts/extensions/setup/*.sh && sync - -# backup origin runOracle -RUN if test -e "$ORACLE_BASE/$RUN_FILE.orig"; then EXTN='extended'; else EXTN='orig'; fi ; \ - mv "$ORACLE_BASE/$RUN_FILE" "$ORACLE_BASE/$RUN_FILE.$EXTN" - -# Copy updated runOracle.sh -COPY --chown=oracle:dba $RUN_FILE $ORACLE_BASE/ -RUN mv "$ORACLE_BASE/$RUN_FILE" "$ORACLE_BASE/$RUN_FILE.$EXTENSION_NAME" - -# Append a call to main runOracle -RUN if test -e "$ORACLE_BASE/$RUN_FILE.extended"; then \ - mv "$ORACLE_BASE/$RUN_FILE.extended" "$ORACLE_BASE/$RUN_FILE" ; \ - else echo ". $ORACLE_BASE/$RUN_FILE.orig" > "$ORACLE_BASE/$RUN_FILE" ; fi ; \ - if ! grep "$RUN_FILE.$EXTENSION_NAME" "$ORACLE_BASE/$RUN_FILE"; then \ - sed -i "1i . $ORACLE_BASE/$RUN_FILE.$EXTENSION_NAME" "$ORACLE_BASE/$RUN_FILE"; \ - fi && \ - chmod ug+x $ORACLE_BASE/*.sh && sync - diff --git a/OracleDatabase/SingleInstance/extensions/patching/README.md b/OracleDatabase/SingleInstance/extensions/patching/README.md deleted file mode 100644 index 8284aa6f7d..0000000000 --- a/OracleDatabase/SingleInstance/extensions/patching/README.md +++ /dev/null @@ -1,13 +0,0 @@ -# PATCH APPLICATION - -Applies patches on oracle home. Multiple one-offs can be applied in a single build but only 1 RU can be applied. - -Download the release update and one-offs and place them under extensions/patching/patches directory inside subfolders release_update and one_offs respectively. - -Once the patches have been placed in the correct directories, use the buildExtensions.sh script to build the extended image with patch support. - -**NOTE**: For patching to work successfully, one should build the base container image by passing one additional build argument `--build-arg SLIMMING=false`. By default, SLIMMING is true to remove some components from the image with the intention of making the image slimmer. These removed components cause problems while patching and result in unsuccessful patching operation. - -Example build command to build the container image: - - ./buildContainerImage.sh -i -e -v 19.3.0 -o '--build-arg SLIMMING=false' diff --git a/OracleDatabase/SingleInstance/extensions/patching/patchDBBinaries.sh b/OracleDatabase/SingleInstance/extensions/patching/patchDBBinaries.sh deleted file mode 100644 index 71d9d59278..0000000000 --- a/OracleDatabase/SingleInstance/extensions/patching/patchDBBinaries.sh +++ /dev/null @@ -1,69 +0,0 @@ -#!/bin/bash -# LICENSE UPL 1.0 -# -# Copyright (c) 2020 Oracle and/or its affiliates. All rights reserved. -# -# Since: March, 2020 -# Author: rishabh.y.gupta@oracle.com -# Description: Applies the patches provided by the user on the oracle home. -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. -# - -RU_DIR="${PATCH_DIR}/release_update" -ONE_OFFS_DIR="${PATCH_DIR}/one_offs" - -ru_count=$(ls $RU_DIR/*.zip 2> /dev/null | wc -l) -if [ $ru_count -ge 2 ]; then - echo "Error: Only 1 Release Update can be applied." - exit 1; -elif [ $ru_count == 1 ]; then - ru_patch="$(ls $RU_DIR/*.zip)" - echo "Unzipping $ru_patch"; - unzip -qo $ru_patch -d $PATCH_DIR; - ru_patch=$(echo ${ru_patch##*/} | cut -d_ -f1 | cut -dp -f2) -else - echo "No Release Update to be installed." -fi - -ONE_OFFS_LIST=() - -if ls $ONE_OFFS_DIR/*.zip 2> /dev/null; then - for patch_zip in $ONE_OFFS_DIR/*.zip; do - patch_no=$(echo ${patch_zip##*/} | cut -d_ -f1 | cut -dp -f2) - if [ $patch_no == "6880880" ]; then - echo "Removing directory ${ORACLE_HOME}/OPatch"; - rm -rf ${ORACLE_HOME}/OPatch; - echo "Unzipping OPatch archive $patch_zip to ${ORACLE_HOME}"; - unzip -qo $patch_zip -d $ORACLE_HOME; - else - ONE_OFFS_LIST+=($patch_no); - echo "Unzipping $patch_zip"; - unzip -qo $patch_zip -d $PATCH_DIR; - fi - done -else - echo "No one-offs to be installed." -fi - -export PATH=${ORACLE_HOME}/perl/bin:$PATH; - -if [ ! -z $ru_patch ]; then - echo "Applying Release Update: $ru_patch"; - cmd="${ORACLE_HOME}/OPatch/opatchauto apply -binary -oh $ORACLE_HOME ${PATCH_DIR}/${ru_patch} -target_type rac_database"; - echo "Running: $cmd"; - $cmd || { - echo "RU application failed for patchset: ${ru_patch}"; - exit 1; - } -fi - -for patch in ${ONE_OFFS_LIST[@]}; do - echo "Applying patch: $patch"; - cmd="${ORACLE_HOME}/OPatch/opatchauto apply -binary -oh $ORACLE_HOME ${PATCH_DIR}/${patch} -target_type rac_database"; - echo "Running: $cmd"; - $cmd || { - echo "Patch application failed for ${patch}"; - exit 1; - } -done diff --git a/OracleDatabase/SingleInstance/extensions/patching/patches/one_offs/.keep b/OracleDatabase/SingleInstance/extensions/patching/patches/one_offs/.keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/OracleDatabase/SingleInstance/extensions/patching/patches/release_update/.keep b/OracleDatabase/SingleInstance/extensions/patching/patches/release_update/.keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/OracleDatabase/SingleInstance/extensions/patching/runDatapatch.sh b/OracleDatabase/SingleInstance/extensions/patching/runDatapatch.sh deleted file mode 100644 index 697afef29f..0000000000 --- a/OracleDatabase/SingleInstance/extensions/patching/runDatapatch.sh +++ /dev/null @@ -1,38 +0,0 @@ -#!/bin/bash -# LICENSE UPL 1.0 -# -# Copyright (c) 2020 Oracle and/or its affiliates. All rights reserved. -# -# Since: March, 2020 -# Author: rishabh.y.gupta@oracle.com -# Description: Runs datapatch in a container while using existing datafiles if container is at different RU level -# than the container which created the datafiles -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. -# - -if [ "${SKIP_DATAPATCH}" = "true" ]; then - echo "Skipping Datapatch" - exit 0; -fi - -# LSPATCHES_FILE will have the patch summary of the datafiles. -DBCONFIG_DIR="${ORACLE_BASE}/oradata/dbconfig/${ORACLE_SID}" -LSPATCHES_FILE="${DBCONFIG_DIR}/${ORACLE_SID}.lspatches" - -# tmp.lspatches will have the patch summary of the oracle home. -temp_lspatches_file="/tmp/tmp.lspatches" -$ORACLE_HOME/OPatch/opatch lspatches > ${temp_lspatches_file}; - -if diff ${LSPATCHES_FILE} ${temp_lspatches_file} 2> /dev/null; then - echo "Datafiles are already patched. Skipping datapatch run." -else - echo "Running datapatch..."; - if ! $ORACLE_HOME/OPatch/datapatch -skip_upgrade_check; then - echo "Datapatch execution has failed."; - exit 1; - else - echo "DONE: Datapatch execution." - cp ${temp_lspatches_file} ${LSPATCHES_FILE}; - fi -fi diff --git a/OracleDatabase/SingleInstance/extensions/patching/runOracle.sh b/OracleDatabase/SingleInstance/extensions/patching/runOracle.sh deleted file mode 100644 index 39abf82427..0000000000 --- a/OracleDatabase/SingleInstance/extensions/patching/runOracle.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash -# LICENSE UPL 1.0 -# -# Copyright (c) 2020 Oracle and/or its affiliates. All rights reserved. -# -# Since: March, 2020 -# Author: rishabh.y.gupta@oracle.com -# Description: runOracle.sh for the patching extension -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. -# diff --git a/OracleDatabase/SingleInstance/extensions/patching/savePatchSummary.sh b/OracleDatabase/SingleInstance/extensions/patching/savePatchSummary.sh deleted file mode 100644 index 8eff8a9a62..0000000000 --- a/OracleDatabase/SingleInstance/extensions/patching/savePatchSummary.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash -# LICENSE UPL 1.0 -# -# Copyright (c) 2020 Oracle and/or its affiliates. All rights reserved. -# -# Since: March, 2020 -# Author: rishabh.y.gupta@oracle.com -# Description: Runs lspatches to save summary of installed patches just after new db is created. -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. -# - -LSPATCHES_FILE="${ORACLE_SID}.lspatches" -LSPATCHES_FILE_PATH="${ORACLE_BASE}/oradata/dbconfig/${ORACLE_SID}/${LSPATCHES_FILE}" - -$ORACLE_HOME/OPatch/opatch lspatches > ${LSPATCHES_FILE_PATH}; \ No newline at end of file From f42e045c8daf11086674a70838fa057c226d1447 Mon Sep 17 00:00:00 2001 From: Nathan C <1849077+thelateperseus@users.noreply.github.com> Date: Tue, 8 Aug 2023 14:46:53 +1000 Subject: [PATCH 3/3] Ensure `installDBBinaries.sh` completes successfully. The `runInstaller` command normally completes with exit code 6, which represents successful completion with warnings. Previously, the `runInstaller` command was not the last in the script, so the script's exit code was 0. This change adds an explicit `exit 0` to restore the previous script exit code behaviour. --- .../SingleInstance/dockerfiles/19.3.0/installDBBinaries.sh | 3 +++ .../SingleInstance/dockerfiles/21.3.0/installDBBinaries.sh | 3 +++ 2 files changed, 6 insertions(+) diff --git a/OracleDatabase/SingleInstance/dockerfiles/19.3.0/installDBBinaries.sh b/OracleDatabase/SingleInstance/dockerfiles/19.3.0/installDBBinaries.sh index 9be30f12f3..9bdab2b28c 100755 --- a/OracleDatabase/SingleInstance/dockerfiles/19.3.0/installDBBinaries.sh +++ b/OracleDatabase/SingleInstance/dockerfiles/19.3.0/installDBBinaries.sh @@ -55,3 +55,6 @@ unzip "$INSTALL_FILE_1" && \ rm "$INSTALL_FILE_1" && \ "$ORACLE_HOME"/runInstaller -silent -force -waitforcompletion -responsefile "$INSTALL_DIR"/"$INSTALL_RSP" -ignorePrereqFailure && \ cd "$HOME" + +# runInstaller will return exit code 6, but we want this script to complete successfully +exit 0; diff --git a/OracleDatabase/SingleInstance/dockerfiles/21.3.0/installDBBinaries.sh b/OracleDatabase/SingleInstance/dockerfiles/21.3.0/installDBBinaries.sh index 36d15df222..d92f28b4ae 100644 --- a/OracleDatabase/SingleInstance/dockerfiles/21.3.0/installDBBinaries.sh +++ b/OracleDatabase/SingleInstance/dockerfiles/21.3.0/installDBBinaries.sh @@ -55,3 +55,6 @@ unzip "$INSTALL_FILE_1" && \ rm "$INSTALL_FILE_1" && \ "$ORACLE_HOME"/runInstaller -silent -force -waitforcompletion -responsefile "$INSTALL_DIR"/"$INSTALL_RSP" -ignorePrereqFailure && \ cd "$HOME" + +# runInstaller will return exit code 6, but we want this script to complete successfully +exit 0;