Purpose

The entrypoint.sh script is a component of the Odoo Docker setup. It is responsible for initializing the Odoo server, managing database connections, and handling signals for graceful shutdowns. This script is executed every time the Docker container starts.

It is based on a fork of the Odoo Docker repository.

Docker Compose Example

The entrypoint.sh script allows you to configure the Odoo server using environment variables. Below is an example of how to set up Odoo with Docker Compose by defining parameters directly in the environment:

services:
  web:
    environment:
      PROXY_MODE: True
      LIST_DB: False
      WORKERS: 2
      MAX_CRON_THREADS: 0
      ADMIN_PASSWD: odoo

Configuration options:

Variable Description Default Value
HOST PostgreSQL database host db
PORT PostgreSQL database port 5432
USER PostgreSQL database user odoo
PASSWORD PostgreSQL database password odoo
WORKERS Number of worker processes 0
MAX_CRON_THREADS Maximum number of cron threads 1
LIMIT_MEMORY_SOFT Soft memory limit 2147483648
LIMIT_MEMORY_HARD Hard memory limit 2684354560
LIMIT_TIME_CPU CPU time limit (seconds) 60
LIMIT_TIME_REAL Execution time limit (seconds) 120
LIMIT_REQUEST Maximum number of requests 65536
LIST_DB Allow database listing True
PROXY_MODE Enable proxy mode False
ADMIN_PASSWD Odoo administrator password N/A
SERVER_WIDE_MODULES List of globally available server modules N/A

Custom Configuration File

Alternatively, you can configure Odoo using a custom configuration file by setting the OVERRIDE_CONF_FILE environment variable. This approach provides greater flexibility for defining Odoo settings.

💡 Note: When using a custom configuration file, ensure that the addons_path and data_dir are properly defined. You can check the entrypoint.sh script for default values.

services:
  web:
    environment:
      OVERRIDE_CONF_FILE: |
        [options]
        addons_path = /opt/odoo/odoo/addons,/opt/odoo/app_addons,/opt/odoo/custom_addons
        data_dir = /var/lib/odoo
        proxy_mode = True
        list_db = False
        workers = 2
        max_cron_threads = 0
        admin_passwd = odoo

entrypoint.sh Script

💡 Note: If an Odoo parameter is missing from the script, you can add it by referring to the Odoo source code. Check the configmanager class in tools/config.py. The second argument in the add_option method will guide you on how to correctly integrate it into the launch process.

#!/bin/bash
set -e

# Check if there is no configuration conflict
if [ -n "${OVERRIDE_CONF_FILE}" ]; then
  disallowed_vars=(
    "WORKERS"
    "MAX_CRON_THREADS"
    "LIMIT_MEMORY_SOFT"
    "LIMIT_MEMORY_HARD"
    "LIMIT_TIME_CPU"
    "LIMIT_TIME_REAL"
    "LIMIT_REQUEST"
    "LIST_DB"
    "PROXY_MODE"
    "UNACCENT"
    "ADMIN_PASSWD"
    "SERVER_WIDE_MODULES"
  )

  for var in "${disallowed_vars[@]}"; do
    if [ -n "${!var}" ]; then
      echo "Error: The following environment variables cannot be set when using a custom Odoo configuration:"
      printf '       %s\n' "${disallowed_vars[@]}"
      exit 1
    fi
  done
fi

# Check if the password file is set and read the password from it
if [ -v PASSWORD_FILE ]; then
    PASSWORD="$(< $PASSWORD_FILE)"
fi

# Set the default values for the database host, port, user and password
: ${HOST:=${DB_PORT_5432_TCP_ADDR:='db'}}
: ${PORT:=${DB_PORT_5432_TCP_PORT:=5432}}
: ${USER:=${DB_ENV_POSTGRES_USER:=${POSTGRES_USER:='odoo'}}}
: ${PASSWORD:=${DB_ENV_POSTGRES_PASSWORD:=${POSTGRES_PASSWORD:='odoo'}}}

# Set Odoo configuration parameters
: ${WORKERS:=0}
: ${MAX_CRON_THREADS:=1}
: ${LIMIT_MEMORY_SOFT:=2147483648}
: ${LIMIT_MEMORY_HARD:=2684354560}
: ${LIMIT_TIME_CPU:=60}
: ${LIMIT_TIME_REAL:=120}
: ${LIMIT_REQUEST:=65536}
: ${LIST_DB:=true}
: ${PROXY_MODE:=false}
: ${UNACCENT:=false}

# Apply custom Odoo configuration if provided
if [ -n "${OVERRIDE_CONF_FILE}" ]; then
    echo "Applying custom Odoo configuration."
    echo "${OVERRIDE_CONF_FILE}" > /etc/odoo/odoo.conf
else
    echo "Restoring default Odoo configuration."
    cat <<EOL > /etc/odoo/odoo.conf
[options]
addons_path = /opt/odoo/odoo/addons,/opt/odoo/app_addons,/opt/odoo/custom_addons
data_dir = /var/lib/odoo
EOL
    chown odoo:odoo /etc/odoo/odoo.conf
fi

# Set the databse configuration parameters
DB_ARGS=()
function check_config() {
    param="$1"
    value="$2"
    if grep -q -E "^\s*\b${param}\b\s*=" "$ODOO_RC" ; then
        value=$(grep -E "^\s*\b${param}\b\s*=" "$ODOO_RC" |cut -d " " -f3|sed 's/["\n\r]//g')
    fi;
    DB_ARGS+=("--${param}")
    DB_ARGS+=("${value}")
}
check_config "db_host" "$HOST"
check_config "db_port" "$PORT"
check_config "db_user" "$USER"
check_config "db_password" "$PASSWORD"

# Set Odoo configuration parameters if not using a custom configuration
ODOO_ARGS=("${DB_ARGS[@]}")

if [ -z "${OVERRIDE_CONF_FILE}" ]; then
    # Update the Odoo configuration file
    if [ -n "${ADMIN_PASSWD}" ]; then
        if grep -q -E "^\s*admin_passwd\s*=" "$ODOO_RC" ; then
            sed -i "s/^\s*admin_passwd\s*=.*/admin_passwd = ${ADMIN_PASSWD}/" "$ODOO_RC"
        else
            echo "admin_passwd = ${ADMIN_PASSWD}" >> "$ODOO_RC"
        fi
    else
        sed -i "/^\s*admin_passwd\s*=/d" "$ODOO_RC"
    fi
    if [ -n "${SERVER_WIDE_MODULES}" ]; then
        if grep -q -E "^\s*server_wide_modules\s*=" "$ODOO_RC" ; then
            sed -i "s/^\s*server_wide_modules\s*=.*/server_wide_modules = ${SERVER_WIDE_MODULES}/" "$ODOO_RC"
        else
            echo "server_wide_modules = ${SERVER_WIDE_MODULES}" >> "$ODOO_RC"
        fi
    else
        sed -i "/^\s*server_wide_modules\s*=/d" "$ODOO_RC"
    fi

    # Update the Odoo configuration parameters
    ODOO_ARGS+=("--workers=${WORKERS}")
    ODOO_ARGS+=("--max-cron-threads=${MAX_CRON_THREADS}")
    ODOO_ARGS+=("--limit-memory-soft=${LIMIT_MEMORY_SOFT}")
    ODOO_ARGS+=("--limit-memory-hard=${LIMIT_MEMORY_HARD}")
    ODOO_ARGS+=("--limit-time-cpu=${LIMIT_TIME_CPU}")
    ODOO_ARGS+=("--limit-time-real=${LIMIT_TIME_REAL}")
    ODOO_ARGS+=("--limit-request=${LIMIT_REQUEST}")
    if [ -n "${LIST_DB}" ] && { [ "${LIST_DB}" = "False" ] || [ "${LIST_DB}" = "false" ] || [ "${LIST_DB}" = false ]; }; then
        ODOO_ARGS+=("--no-database-list")
    fi
    if [ -n "${PROXY_MODE}" ] && { [ "${PROXY_MODE}" = "True" ] || [ "${PROXY_MODE}" = "true" ] || [ "${PROXY_MODE}" = true ]; }; then
        ODOO_ARGS+=("--proxy-mode")
    fi
    if [ -n "${UNACCENT}" ] && { [ "${UNACCENT}" = "True" ] || [ "${UNACCENT}" = "true" ] || [ "${UNACCENT}" = true ]; }; then
        ODOO_ARGS+=("--unaccent")
    fi
fi

if [ -n "${UPDATE}" ]; then
    ODOO_ARGS+=("--update=${UPDATE}")
fi

# Launch Odoo server
case "$1" in
    -- | odoo)
        shift
        wait-for-psql.py ${DB_ARGS[@]} --timeout=30
        echo "Executing: odoo $@ ${ODOO_ARGS[@]}"
        exec odoo "$@" "${ODOO_ARGS[@]}"
        ;;
    -*)
        wait-for-psql.py ${DB_ARGS[@]} --timeout=30
        echo "Executing: odoo $@ ${ODOO_ARGS[@]}"
        exec odoo "$@" "${ODOO_ARGS[@]}"
        ;;
esac

exit 1