Odoo, formerly identified as OpenERP, represents a comprehensive suite of open-source business applications engineered in Python and distributed under the LGPL license. The platform is designed to provide an all-encompassing ecosystem of business tools, ranging from front-end Website and Ecommerce capabilities to back-end operational modules such as manufacturing, inventory management, and accounting. The seamless integration of these diverse business needs within a single software editor's framework has led to Odoo becoming the most installed business software globally, serving a diverse user base of 2,000,000 users. This user base spans the entire corporate spectrum, from micro-enterprises with a single user to massive conglomerates supporting up to 300,000 concurrent users. To facilitate the deployment of such a complex architecture, the use of Docker provides a standardized, portable environment that abstracts the underlying infrastructure, ensuring that the Python runtime and its dependencies remain consistent across different hosting environments.
Core Image Specifications and Versioning
The Odoo official image is curated as part of the Docker Official Images program, ensuring a high standard of quality and security. The images are multi-architecture, supporting various CPU instruction sets to ensure compatibility across a wide range of hardware.
The following table details the image characteristics for the latest tag and specific versioning iterations based on the most recent registry data.
| Tag | Architecture | Size (Approx.) | Digest/ID | Last Updated |
|---|---|---|---|---|
latest |
linux/amd64 | 671.07 MB | 52cf57ad8346 | ~14 hours ago |
latest |
linux/arm64/v8 | 667.63 MB | 9459f14e7e97 | ~14 hours ago |
latest |
linux/ppc64le | 686.51 MB | 72af05da3503 | ~14 hours ago |
19.0-20260421 |
Multi-Arch | Variable | Variable | April 21, 2026 |
18.0-20260421 |
linux/amd64 | 652.69 MB | eb9a47a64f7d | April 21, 2026 |
18.0-20260421 |
linux/arm64/v8 | 649.28 MB | fde2177efc58 | April 21, 2026 |
18.0-20260421 |
linux/ppc64le | 668.14 MB | 9825ceb1c320 | April 21, 2026 |
17.0-20260421 |
linux/amd64 | 582.02 MB | 5220e88e8633 | April 21, 2026 |
17.0-20260421 |
linux/arm64/v8 | 577.11 MB | fc067ba7943a | April 21, 2026 |
The versioning strategy employs a combination of major version tags (e.g., 19, 19.0, 18) and date-stamped tags (e.g., 19.0-20260409). This allows administrators to lock their environments to a specific build, preventing accidental updates that could introduce breaking changes in a production environment. For example, using docker pull odoo:17.0 ensures the use of the 17th major version, while the date-specific tags provide a granular audit trail of the image's provenance.
Database Dependency and PostgreSQL Integration
Odoo cannot function in isolation; it requires a running PostgreSQL server to store all business data, configuration settings, and transaction logs. The interaction between the Odoo container and the PostgreSQL container is critical for system stability.
To initialize the database layer, the following command is utilized:
bash
docker run -d -v odoo-db:/var/lib/postgresql/data -e POSTGRES_USER=odoo -e POSTGRES_PASSWORD=odoo -e POSTGRES_DB=postgres --name db postgres:15
The technical implementation of this command involves several key components:
- The
-v odoo-db:/var/lib/postgresql/dataflag creates a named volume. This is essential because database data is persistent; without it, the entire database would be wiped if the container were removed. - The environment variables
-e POSTGRES_USER=odoo,-e POSTGRES_PASSWORD=odoo, and-e POSTGRES_DB=postgresdefine the initial administrative credentials and the default database name. - The
--name dbflag assigns a specific network identity to the container.
The link between Odoo and PostgreSQL is established via the --link flag or a shared network. In the provided examples, the alias of the container running Postgres must be exactly db for Odoo to successfully connect to the server. If the PostgreSQL server is restarted, the Odoo instances linked to it must also be restarted. This is because the server address changes upon restart, breaking the existing link and necessitating a fresh connection handshake. It is important to note that restarting the PostgreSQL server itself does not affect the integrity of the created databases, provided the data volume is correctly mounted.
Odoo Container Deployment and Configuration
Once the database is operational, the Odoo container can be deployed. A basic deployment command is as follows:
bash
docker run -p 8069:8069 --name odoo --link db:db -t odoo
This maps the internal container port 8069 to the host port 8069, allowing users to access the web interface via a browser. To manage the Odoo instance, standard Docker lifecycle commands are used:
bash
docker stop odoo
docker start -a odoo
Configuration Management
Odoo's behavior is governed by a configuration file located at /etc/odoo/odoo.conf. While the image comes with a default configuration, professional deployments typically require overrides. This can be achieved by mounting a host directory to the container's configuration path:
bash
docker run -v /path/to/config:/etc/odoo -p 8069:8069 --name odoo --link db:db -t odoo
By mapping /path/to/config to /etc/odoo, the administrator can maintain a persistent odoo.conf file on the host machine. This allows for changes to be made to the configuration without needing to rebuild the image.
Furthermore, Odoo allows the passing of arguments directly via the command line. These arguments must be placed after a double dash -- to signal the end of Docker's own arguments and the beginning of Odoo's parameters:
bash
docker run -p 8069:8069 --name odoo --link db:db -t odoo -- --db-filter=odoo_db_.*
In this example, the --db-filter argument is used to restrict the list of databases visible to the user, a critical feature for multi-tenant environments.
Persistence and the Filestore Mechanism
Odoo distinguishes between structured data (stored in PostgreSQL) and unstructured data (stored in the filestore). The filestore contains attachments, images, and other binary documents. In Odoo 16.0 and later, the filestore is located at /var/lib/odoo/filestore/.
A catastrophic failure occurs if the Odoo container is removed without a persistent volume, as the filestore is created inside the container's writable layer. If the container is deleted, all attachments are lost. To prevent this, Docker named volumes must be implemented:
bash
docker run -v odoo-data:/var/lib/odoo -d -p 8069:8069 --name odoo --link db:db -t odoo
By using -v odoo-data:/var/lib/odoo, the data is stored in a managed volume called odoo-data. This ensures that when the container is updated or replaced, the new container can attach to the same volume and retain all binary data. It is mandatory that the path /var/lib/odoo matches the data_dir specified in the odoo.conf file or passed as a CLI parameter.
Migrating and Updating the Filestore
When upgrading to a newer Odoo image, the filestore must be migrated. To ensure the new instance has access to the legacy attachments, the --volumes-from flag can be used to inherit volumes from a previous container:
bash
docker run --volumes-from old-odoo -p 8070:8069 --name new-odoo --link db:db -t odoo
This method allows for a side-by-side transition where the new image is tested against the existing data before the old container is decommissioned.
Extension of Functionality and Addons
Odoo's modular nature allows for the addition of custom modules. While the official image provides the core functionality, custom addons or Enterprise modules can be integrated by mounting an external directory to the /mnt/extra-addons path within the container.
The command to implement custom addons is:
bash
docker run -v /path/to/addons:/mnt/extra-addons -p 8069:8069 --name odoo --link db:db -t odoo
This mechanism is particularly vital for the deployment of Odoo Enterprise. Since there is no official Odoo Enterprise Docker image, the Enterprise modules must be downloaded and then mounted into the container using this volume mapping. This allows the community edition image to be extended with proprietary Enterprise features without modifying the base image.
Advanced Networking and Multi-Instance Deployment
In complex environments, multiple Odoo instances may be required on a single host. This can be achieved by mapping different host ports to the same container port 8069.
Example of running multiple instances:
bash
docker run -p 8070:8069 --name odoo2 --link db:db -t odoo
docker run -p 8071:8069 --name odoo3 --link db:db -t odoo
When the host port (e.g., 8070 or 8071) differs from the internal container port (8069), critical failures can occur with email functionality and report generation. Odoo uses the web.base.url parameter to generate absolute links for emails and reports. To resolve this, the administrator must access the Odoo interface and navigate to:
- Settings -> Parameters -> System Parameters
The web.base.url must be updated to reflect the actual external URL and port used by the container. This requires the activation of "Technical Features" in the Odoo settings menu.
Conclusion
The containerization of Odoo via Docker transforms a complex installation process into a manageable, scalable architectural pattern. By decoupling the application layer from the database layer and utilizing named volumes for both PostgreSQL data and the Odoo filestore, administrators can ensure high availability and data persistence. The flexibility to inject custom configurations via /etc/odoo and extend functionality through /mnt/extra-addons allows for a tailored deployment that can scale from a single-user instance to a massive corporate deployment. The critical dependencies, specifically the requirement for the db alias for PostgreSQL connectivity and the necessity of updating web.base.url in multi-instance setups, highlight the importance of precise configuration in a Dockerized environment. Ultimately, the use of official, multi-arch images ensures that Odoo remains portable and consistent across various hardware platforms, cementing its position as a leading global business software solution.