diff --git a/scripts/install-apt-packages.sh b/scripts/install-apt-packages.sh index f788301..135eb60 100644 --- a/scripts/install-apt-packages.sh +++ b/scripts/install-apt-packages.sh @@ -2,29 +2,51 @@ # Required User: root echo "Running install-apt-packages.sh" -echo " Checking for ${REPO_DIR}/childimage/..." -if [ -d "${REPO_DIR}/childimage/" ]; then - cd "${REPO_DIR}/childimage/" || exit 1 - - echo " Checking for apt.txt in ${REPO_DIR}/childimage/..." - if test -f "apt.txt"; then - # Check if the script is run as root - if [[ $(id -u) -ne 0 ]]; then - echo " Error: This script must be run as root." >&2 # Output error message to standard error - exit 1 # Exit with a non-zero status to indicate failure - fi - - echo " Running install-apt-packages.sh as root. Proceeding with installation..." - - package_list=$(grep -v '^\s*#' apt.txt | grep -v '^\s*$' | sed 's/\r//g; s/#.*//; s/^[[:space:]]*//; s/[[:space:]]*$//' | awk '{$1=$1};1') - apt-get update --fix-missing > /dev/null - apt-get install --yes --no-install-recommends $package_list - apt-get autoremove --purge - apt-get clean - rm -rf /var/lib/apt/lists/* - else - echo " No apt.txt found. Skipping package installation." - fi -else - echo " Directory ${REPO_DIR}/childimage/ does not exist. Skipping script." + +# Check that a file name is provided +if [ -z "$1" ]; then + echo "Error: install-apt-packages.sh requires a file name (a list of apt packages and typically called apt.txt)." >&2 + echo "Usage: RUN /pyrocket_scripts/install-apt-packages.sh " >&2 + exit 1 +fi + +# Check if the script is run as root +if [[ $(id -u) -ne 0 ]]; then + echo "Error: install-apt-packages.sh must be run as root. Please use 'USER root' in your Dockerfile before running this script." + echo "Remember to switch back to the non-root user with 'USER ${NB_USER}' after running this script." + exit 1 +fi + +echo "Running install-apt-packages.sh as root..." + +# Set variable for the provided file +apt_file="$1" +echo " Using packages file: ${apt_file}" + +# Check if the specified file exists +if [ ! -f "${apt_file}" ]; then + echo " Error: File '${apt_file}' not found. Ensure the file exists and try again." + exit 1 fi + +# Update package list and handle errors +echo " Updating package list..." +if ! apt-get update --fix-missing; then + echo " Error: Failed to update package list. Exiting." + exit 1 +fi + +# Install packages and handle errors +echo " Installing packages from ${apt_file}..." +package_list=$(grep -v '^\s*#' "${apt_file}" | grep -v '^\s*$' | sed 's/\r//g; s/#.*//; s/^[[:space:]]*//; s/[[:space:]]*$//' | awk '{$1=$1};1') +if ! apt-get install --yes --no-install-recommends $package_list; then + echo " Error: Installation of packages failed. Please check the package names and try again." + exit 1 +fi + +# Clean up +apt-get autoremove --purge +apt-get clean +rm -rf /var/lib/apt/lists/* + +echo " Success! install-apt-packages.sh" diff --git a/scripts/install-conda-packages.sh b/scripts/install-conda-packages.sh index e373f5b..937420f 100644 --- a/scripts/install-conda-packages.sh +++ b/scripts/install-conda-packages.sh @@ -1,44 +1,59 @@ #!/bin/bash # Required User: NB_USER -echo "Running install-conda-packages.sh" - -echo " Checking for ${REPO_DIR}/childimage/..." -if [ -d "${REPO_DIR}/childimage/" ]; then - cd "${REPO_DIR}/childimage/" || exit 1 - - echo " Checking for conda-lock.yml or environment.yml in ${REPO_DIR}/childimage/..." - if test -f "conda-lock.yml" || test -f "environment.yml"; then - # Switch to NB_USER only if the relevant files exist - if [[ $(id -u) -eq 0 ]]; then - echo " Switching to ${NB_USER} to run install-conda-packages.sh" - exec su "${NB_USER}" -c "/bin/bash $0" # Switches to NB_USER and reruns the script - fi - - if test -f "conda-lock.yml"; then - echo " Using conda-lock.yml" - ${NB_PYTHON_PREFIX}/bin/conda-lock install --name ${CONDA_ENV} - ${NB_PYTHON_PREFIX}/bin/pip install --no-deps jupyter-remote-desktop-proxy - INSTALLATION_HAPPENED=true - elif test -f "environment.yml"; then - echo " Using environment.yml" - ${CONDA_DIR}/condabin/mamba env update --name ${CONDA_ENV} -f environment.yml - ${NB_PYTHON_PREFIX}/bin/pip install --no-deps jupyter-remote-desktop-proxy - INSTALLATION_HAPPENED=true - fi - - # Only run cleanup if installation occurred - if [ "$INSTALLATION_HAPPENED" = true ]; then - ${CONDA_DIR}/condabin/mamba clean -yaf - find ${CONDA_DIR} -follow -type f -name '*.a' -delete - find ${CONDA_DIR} -follow -type f -name '*.js.map' -delete - if ls ${NB_PYTHON_PREFIX}/lib/python*/site-packages/bokeh/server/static > /dev/null 2>&1; then - find ${NB_PYTHON_PREFIX}/lib/python*/site-packages/bokeh/server/static -follow -type f -name '*.js' ! -name '*.min.js' -delete - fi - fi - else - echo " No conda-lock.yml or environment.yml found. Skipping installation." - fi +# Check if a filename argument is provided +if [ -z "$1" ]; then + echo "Error: install-conda-packages.sh requires a file name (either conda-lock.yml or environment.yml)." >&2 + echo "Usage: RUN /pyrocket_scripts/install-conda-packages.sh " >&2 + exit 1 +fi + +# Check if running as root and switch to NB_USER if needed +if [[ $(id -u) -eq 0 ]]; then + echo "Switching to ${NB_USER} to run install-conda-packages.sh" + exec su "${NB_USER}" -c "/bin/bash $0 $1" # Pass along the filename argument +fi + +# Main script execution as NB_USER +echo "Running install-conda-packages.sh as ${NB_USER}" + +# Set the file variable to the provided argument +ENV_FILE="$1" + +# Verify the file exists and is readable +if [ ! -f "$ENV_FILE" ]; then + echo " Error: File '$ENV_FILE' not found. Please provide a valid file path." >&2 + echo " Usage: RUN /pyrocket_scripts/install-conda-packages.sh " >&2 + exit 1 +fi + +echo " Found file: $ENV_FILE" + +# Determine file type based on content +if grep -q "lock_set" "$ENV_FILE"; then + echo " Detected conda-lock.yml file." + ${NB_PYTHON_PREFIX}/bin/conda-lock install --name ${CONDA_ENV} -f "$ENV_FILE" + INSTALLATION_HAPPENED=true +elif grep -q "name:" "$ENV_FILE"; then + echo " Detected environment.yml file." + ${CONDA_DIR}/condabin/mamba env update --name ${CONDA_ENV} -f "$ENV_FILE" + INSTALLATION_HAPPENED=true else - echo " Directory ${REPO_DIR}/childimage/ does not exist. Skipping script." + # If neither condition matches, output a helpful error message + echo "Error: Unrecognized file format in '${env_file}'." + echo " - For an environment.yml file, ensure it includes a 'name:' entry. Any name is acceptable." + echo " - For a conda-lock.yml file, ensure it includes a 'lock_set:' entry." + exit 1 fi + +# Run cleanup if installation occurred +if [ "$INSTALLATION_HAPPENED" = true ]; then + ${CONDA_DIR}/condabin/mamba clean -yaf + find ${CONDA_DIR} -follow -type f -name '*.a' -delete + find ${CONDA_DIR} -follow -type f -name '*.js.map' -delete + if ls ${NB_PYTHON_PREFIX}/lib/python*/site-packages/bokeh/server/static > /dev/null 2>&1; then + find ${NB_PYTHON_PREFIX}/lib/python*/site-packages/bokeh/server/static -follow -type f -name '*.js' ! -name '*.min.js' -delete + fi +fi + +echo " Success! install-conda-packages.sh" diff --git a/scripts/setup-desktop.sh b/scripts/install-desktop.sh similarity index 59% rename from scripts/setup-desktop.sh rename to scripts/install-desktop.sh index 820c6f0..5652ff6 100644 --- a/scripts/setup-desktop.sh +++ b/scripts/install-desktop.sh @@ -3,19 +3,26 @@ echo "Running setup-desktop.sh" +# Check if the script is run as root +if [[ $(id -u) -ne 0 ]]; then + echo " Error: This script must be run as root. Please use 'USER root' in your Dockerfile before running this script." + echo " Remember to switch back to the non-root user with 'USER ${NB_USER}' after running this script." + exit 1 +fi + +# Check if a filename argument is provided +if [ -n "$1" ]; then + echo " Warning: Passed-in file '$1' is ignored. Looking for Desktop files in the 'Desktop' directory in your repository." >&2 +fi + echo " Checking for ${REPO_DIR}/childimage/..." if [ -d "${REPO_DIR}/childimage/" ]; then cd "${REPO_DIR}/childimage/" || exit 1 echo " Checking for Desktop directory..." if test -d "${REPO_DIR}/childimage/Desktop"; then - # Check if the script is run as root - if [[ $(id -u) -ne 0 ]]; then - echo " Error: This script must be run as root." >&2 # Output error message to standard error - exit 1 # Exit with a non-zero status to indicate failure - fi - echo " Running setup-desktop.sh as root. Proceeding with installation..." + echo " ${REPO_DIR}/childimage/Desktop directory found. Proceeding with installation..." mkdir -p "${REPO_DIR}/Desktop" cp -r ${REPO_DIR}/childimage/Desktop/* "${REPO_DIR}/Desktop/" 2>/dev/null @@ -34,3 +41,5 @@ if [ -d "${REPO_DIR}/childimage/" ]; then else echo " Directory ${REPO_DIR}/childimage/ does not exist. Skipping script." fi + +echo " Success! install-desktop.sh" diff --git a/scripts/install-pip-packages.sh b/scripts/install-pip-packages.sh index 5b48e6c..406da46 100644 --- a/scripts/install-pip-packages.sh +++ b/scripts/install-pip-packages.sh @@ -1,25 +1,40 @@ #!/bin/bash # Required User: NB_USER -echo "Running install-pip-packages.sh" - -echo " Checking for ${REPO_DIR}/childimage/..." -if [ -d "${REPO_DIR}/childimage/" ]; then - cd "${REPO_DIR}/childimage/" || exit 1 - - echo " Checking for requirements.txt in ${REPO_DIR}/childimage/..." - if test -f "requirements.txt"; then - # Switch to NB_USER only if requirements.txt exists - if [[ $(id -u) -eq 0 ]]; then - echo "Switching to ${NB_USER} to run install-pip-packages.sh" - exec su "${NB_USER}" -c "/bin/bash $0" # Switches to NB_USER and reruns the script - fi - - echo " Installing pip packages from requirements.txt as ${NB_USER}..." - ${NB_PYTHON_PREFIX}/bin/pip install --no-cache -r requirements.txt - else - echo " No requirements.txt found. Skipping pip installation." - fi -else - echo " Directory ${REPO_DIR}/childimage/ does not exist. Skipping script." +# Check if a filename argument is provided +if [ -z "$1" ]; then + echo "Error: install-pip-packages.sh requires an input file of package names (typically called requirements.txt)." >&2 + echo "Usage: RUN /pyrocket_scripts/install-pip-packages.sh " >&2 + exit 1 fi + +# Check if running as root and switch to NB_USER if needed +if [[ $(id -u) -eq 0 ]]; then + echo "Switching to ${NB_USER} to run install-pip-packages.sh" + exec su "${NB_USER}" -c "/bin/bash $0 $1" # Pass along the filename argument +fi + +# Main script execution as NB_USER +echo "Running install-pip-packages.sh as ${NB_USER}" + + +# Set variable for the provided file +requirements_file="$1" +echo " Using packages file: ${requirements_file}" + +# Check if the specified file exists +if [ ! -f "${requirements_file}" ]; then + echo " Error: File '${requirements_file}' not found. Ensure the file exists and try again." + exit 1 +fi + +echo " Installing pip packages from ${requirements_file} as ${NB_USER}..." + +# Install pip packages and handle errors +if ! ${NB_PYTHON_PREFIX}/bin/pip install --no-cache -r "${requirements_file}"; then + echo " Error: Installation of packages from '${requirements_file}' failed. Please check the package names and try again." + exit 1 +fi + +echo " Success! install-pip-packages.sh" + diff --git a/scripts/install-r-package.sh b/scripts/install-r-package.sh deleted file mode 100644 index d78da84..0000000 --- a/scripts/install-r-package.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/bash -# Required User: NB_USER - -echo "Running install-r-packages.sh" - -echo " Checking for ${REPO_DIR}/childimage/..." -if [ -d "${REPO_DIR}/childimage/" ]; then - cd "${REPO_DIR}/childimage/" || exit 1 - - echo " Checking for install.R in ${REPO_DIR}/childimage/..." - if test -f "install.R"; then - # Switch to NB_USER only if install.R exists - if [[ $(id -u) -eq 0 ]]; then - echo "Switching to ${NB_USER} to run install-r-packages.sh" - exec su "${NB_USER}" -c "/bin/bash $0" # Switches to NB_USER and reruns the script - fi - - echo " Using install.R to install R packages as ${NB_USER}..." - Rscript install.R - else - echo " No install.R found. Skipping R package installation." - fi -else - echo " Directory ${REPO_DIR}/childimage/ does not exist. Skipping script." -fi diff --git a/scripts/install-r-packages.sh b/scripts/install-r-packages.sh new file mode 100644 index 0000000..f02de4b --- /dev/null +++ b/scripts/install-r-packages.sh @@ -0,0 +1,38 @@ +#!/bin/bash +# Required User: NB_USER + +# Check if a filename argument is provided +if [ -z "$1" ]; then + echo "Error: install-r-packages.sh requires an input file (an R script and typically called install.R)." >&2 + echo "Usage: RUN /pyrocket_scripts/install-r-packages.sh " >&2 + exit 1 +fi + +# Check if running as root and switch to NB_USER if needed +if [[ $(id -u) -eq 0 ]]; then + echo "Switching to ${NB_USER} to run install-r-packages.sh" + exec su "${NB_USER}" -c "/bin/bash $0 $1" # Pass along the filename argument +fi + +# Main script execution as NB_USER +echo "Running install-r-packages.sh as ${NB_USER}" + +# Set the file variable to the provided argument +INSTALL_FILE="$1" + +# Verify the file exists and is readable +if [ ! -f "$INSTALL_FILE" ]; then + echo " Error: File '$INSTALL_FILE' not found. Please provide a valid R script file." >&2 + echo " Usage: RUN /pyrocket_scripts/install-r-packages.sh " >&2 + exit 1 +fi + +echo " Found file: $INSTALL_FILE" + +# Install R packages using the provided R script +if ! Rscript "$INSTALL_FILE"; then + echo " Error: Installation of packages from '$INSTALL_FILE' failed. Please check the script for errors." >&2 + exit 1 +fi + +echo " Success! install-r-packages.sh" diff --git a/scripts/run-postbuild.sh b/scripts/run-postbuild.sh index b93fcaf..dbd63f2 100644 --- a/scripts/run-postbuild.sh +++ b/scripts/run-postbuild.sh @@ -2,6 +2,11 @@ echo "Running run-postbuild.sh" +# Check if a filename argument is provided +if [ -n "$1" ]; then + echo " Warning: Passed-in file '$1' to run-postbuild.sh is ignored. Looking for a file named 'postBuild' in your repository." >&2 +fi + echo " Checking for ${REPO_DIR}/childimage/..." if [ -d "${REPO_DIR}/childimage/" ]; then cd "${REPO_DIR}/childimage/" || exit 1 diff --git a/scripts/setup-start.sh b/scripts/setup-start.sh index 5068531..15d1ec5 100644 --- a/scripts/setup-start.sh +++ b/scripts/setup-start.sh @@ -1,7 +1,18 @@ #!/bin/bash # Required User: NB_USER -echo "Running setup-start.sh" +# Check if a filename argument is provided +if [ -n "$1" ]; then + echo "Warning: Passed-in file '$1' to setup-start.sh is ignored. Looking for a file named 'start' in your repository." >&2 +fi + +# Check if running as root and switch to NB_USER if needed +if [[ $(id -u) -eq 0 ]]; then + echo "Switching to ${NB_USER} to run start.sh" + exec su "${NB_USER}" -c "/bin/bash $0" # Switches to NB_USER and reruns the script +fi + +echo "Running setup-start.sh as ${NB_USER}" echo " Checking for ${REPO_DIR}/childimage/..." if [ -d "${REPO_DIR}/childimage/" ]; then @@ -10,11 +21,6 @@ if [ -d "${REPO_DIR}/childimage/" ]; then echo " Checking for start in ${REPO_DIR}/childimage/..." if test -f "start"; then echo " start found in ${REPO_DIR}/childimage/." - # Switch to NB_USER only if the start file exists - if [[ $(id -u) -eq 0 ]]; then - echo " Switching to ${NB_USER} to run setup-start.sh" - exec su "${NB_USER}" -c "/bin/bash $0" # Switches to NB_USER and reruns the script - fi chmod +x start else echo " No start file found in ${REPO_DIR}/childimage/. Skipping." @@ -22,3 +28,5 @@ if [ -d "${REPO_DIR}/childimage/" ]; then else echo " Directory ${REPO_DIR}/childimage/ does not exist. Skipping." fi + +echo " Success! setup-start.sh"