When developing custom Odoo modules, repeatedly restarting Docker containers and manually clicking Upgrade inside Odoo can significantly slow down your workflow.
If your team is building custom ERP features or providing Odoo implementation services, automating module upgrades can save hours during development.
This guide explains how to configure Docker so Odoo automatically reloads your code and upgrades one or more modules whenever the server starts.
Why Automatically Upgrade Odoo Modules?
During Odoo development, changes to:
- Python models
- XML views
- Security rules
- Access control lists
- Module manifests
- Data files
often require restarting Odoo and upgrading the affected modules before the changes take effect.
Instead of manually upgrading modules every time, you can configure Docker to do it automatically.
A typical development command looks like this:
command: >
-- --dev=all
-d smart_address
-u floo_smart_address
Understanding the Odoo Startup Flags
-d smart_address
The -d option specifies which Odoo database should be used when the server starts.
Example:
./odoo-bin -d smart_address
If you work with multiple development databases, this ensures Docker always launches the correct one.
-u floo_smart_address
The -u flag tells Odoo to automatically upgrade one or more modules during startup.
Running this command is equivalent to:
./odoo-bin -u floo_smart_address
During the upgrade process, Odoo will:
- Reload XML views
- Update security rules
- Apply ORM model changes
- Refresh access control lists
- Process manifest updates
- Execute upgrade scripts when applicable
This eliminates the need to manually open Apps → Upgrade after every restart.
Upgrading Multiple Modules
If your project consists of multiple custom modules, simply separate them with commas.
Example:
command: >
-- --dev=all
-d smart_address
-u module_sales,module_inventory,module_accounting
Odoo will upgrade each module in the order provided before becoming available.
This is particularly useful for projects where several custom modules depend on one another, such as:
- Base module
- Sales customization
- Inventory customization
- Accounting integration
Keeping all actively developed modules in the -u list ensures every restart reflects your latest changes.
Tip: Only include the modules you’re actively developing. Upgrading unnecessary modules increases startup time.
--dev=all
The --dev=all flag enables all of Odoo’s available development features.
Compared to --dev=reload, it provides a more comprehensive development environment by enabling additional debugging and developer tools alongside automatic code reloading.
For most local development environments, --dev=all is the easiest option because you don’t need to selectively enable development features.
What --dev=all Helps With
- Automatically reloads Python code when changes are detected.
- Enables developer-friendly debugging features.
- Makes frontend and backend development easier.
- Improves visibility into templates, assets, and development logs.
What Still Requires a Module Upgrade?
Even with --dev=all, Odoo does not automatically reload everything.
| File Type | Automatically Applied? |
|---|---|
Python (.py) | ✅ Yes |
| XML Views | ❌ Requires module upgrade |
| Security CSV | ❌ Requires module upgrade |
Manifest (__manifest__.py) | ❌ Requires module upgrade |
| Data Files | ❌ Requires module upgrade |
That’s why combining --dev=all with -u creates an excellent development workflow.
Recommended Odoo Docker Development Workflow
With this configuration, your daily workflow becomes:
- Edit Python or XML files.
- Save your changes.
- Odoo detects code changes and restarts automatically.
- Your specified modules are upgraded.
- Refresh your browser.
No manual container restart.
No manual module upgrade.
No repeated clicks inside the Apps menu.
This setup is especially useful for custom Odoo module development, ERP customization, and long-running Odoo implementation projects.
Example Docker Compose Configuration
services:
odoo:
image: odoo:19
ports:
- "8069:8069"
volumes:
- ./addons:/mnt/extra-addons
command: >
-- --dev=all
-d smart_address
-u module_sales,module_inventory,module_accounting
This configuration automatically:
- Starts Odoo using the selected database.
- Enables all Odoo development features.
- Detects Python code changes.
- Restarts the server when necessary.
- Upgrades all specified custom modules.
Best Practices
For the fastest development experience:
- Use
--dev=allonly in local development. - Upgrade only the custom modules you’re actively working on.
- Avoid
-u allunless you intentionally need to upgrade every installed module, as it can dramatically increase startup time. - Group related modules together in the
-ulist when they have dependencies.
Conclusion
Using --dev=all together with the -u option creates an efficient Odoo development workflow. Python code reloads automatically, while your selected modules are upgraded on every restart, ensuring XML views, security rules, and metadata remain synchronized.
If your project contains multiple custom modules, simply list them as a comma-separated value in the -u flag. This approach keeps all active modules up to date while avoiding the overhead of upgrading your entire Odoo installation on every restart.