Odoo
Container
Open-source business apps
Image details
Configuration
TypeContainerlinuxodoo:latest8069/tcp/var/lib/odoo/mnt/extra-addonsHOST=''USER=''PASSWORD=''Template by mikestraney
Standalone Install
Select an install method, to see config/commands for deploying Odoo
Install on Portainer
Import all app templates into your Portainer instance, for easy 1-click deploys
- Ensure both Docker and Portainer are installed, and up-to-date
- Log into your Portainer web UI
- Under Settings → App Templates, paste the below URL
- Head to Home → App Templates, and the list of apps will show up
- Select Odoo, fill in any config options, and hit Deploy
Template Import URL
https://raw.githubusercontent.com/Lissy93/portainer-templates/main/templates.json
Show Me
More install options in our documentation.
Quick reference
- Maintained by:
[Odoo](https://github.com/odoo/docker)- Where to get help:
[the Docker Community Slack](https://dockr.ly/comm-slack), [Server Fault](https://serverfault.com/help/on-topic), [Unix & Linux](https://unix.stackexchange.com/help/on-topic), or [Stack Overflow](https://stackoverflow.com/help/on-topic)Supported tags and respective Dockerfile links
Quick reference (cont.)
- Where to file issues:
[https://github.com/odoo/docker/issues](https://github.com/odoo/docker/issues?q=)- Supported architectures: (more info)
[`amd64`](https://hub.docker.com/r/amd64/odoo/), [`arm64v8`](https://hub.docker.com/r/arm64v8/odoo/), [`ppc64le`](https://hub.docker.com/r/ppc64le/odoo/)- Published image artifact details:
[repo-info repo's `repos/odoo/` directory](https://github.com/docker-library/repo-info/blob/master/repos/odoo) ([history](https://github.com/docker-library/repo-info/commits/master/repos/odoo))
(image metadata, transfer size, etc)- Image updates:
[official-images repo's `library/odoo` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fodoo)
[official-images repo's `library/odoo` file](https://github.com/docker-library/official-images/blob/master/library/odoo) ([history](https://github.com/docker-library/official-images/commits/master/library/odoo))- Source of this description:
[docs repo's `odoo/` directory](https://github.com/docker-library/docs/tree/master/odoo) ([history](https://github.com/docker-library/docs/commits/master/odoo))What is Odoo?
Odoo, formerly known as OpenERP, is a suite of open-source business apps written in Python and released under the LGPL license. This suite of applications covers all business needs, from Website/Ecommerce down to manufacturing, inventory and accounting, all seamlessly integrated. It is the first time ever a software editor managed to reach such a functional coverage. Odoo is the most installed business software in the world. Odoo is used by 2.000.000 users worldwide ranging from very small companies (1 user) to very large ones (300 000 users).www.odoo.com

How to use this image
This image requires a running PostgreSQL server.Start a PostgreSQL server
$ docker run -d -e POSTGRES_USER=odoo -e POSTGRES_PASSWORD=odoo -e POSTGRES_DB=postgres --name db postgres:15Start an Odoo instance
$ docker run -p 8069:8069 --name odoo --link db:db -t odooThe alias of the container running Postgres must be db for Odoo to be able to connect to the Postgres server.
Stop and restart an Odoo instance
$ docker stop odoo
$ docker start -a odooUse named volumes to preserve data
When the Odoo container is created like described above, the odoo filestore is created inside the container. If the container is removed, the filestore is lost. The preferred way to prevent that is by using a Docker named volume.$ docker run -v odoo-data:/var/lib/odoo -d -p 8069:8069 --name odoo --link db:db -t odooWith the above command, the volume named
odoo-data will persist even if the container is removed and can be re-used by issuing the same command.The path
/var/lib/odoo used as the mount point of the volume must match the odoo data_dir in the config file or as CLI parameters.Note that the same principle applies to the Postgresql container and a named volume can be used to preserve the database when the container is removed. So the database container could be started like this (before the odoo container):
$ 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:15Stop and restart a PostgreSQL server
When a PostgreSQL server is restarted, the Odoo instances linked to that server must be restarted as well because the server address has changed and the link is thus broken.Restarting a PostgreSQL server does not affect the created databases.
Run Odoo with a custom configuration
The default configuration file for the server (located at/etc/odoo/odoo.conf) can be overriden at startup using volumes. Suppose you have a custom configuration at /path/to/config/odoo.conf, then$ docker run -v /path/to/config:/etc/odoo -p 8069:8069 --name odoo --link db:db -t odooPlease use this configuration template to write your custom configuration as we already set some arguments for running Odoo inside a Docker container.
You can also directly specify Odoo arguments inline. Those arguments must be given after the keyword
-- in the command-line, as follows$ docker run -p 8069:8069 --name odoo --link db:db -t odoo -- --db-filter=odoo_db_.*Mount custom addons
You can mount your own Odoo addons within the Odoo container, at/mnt/extra-addons$ docker run -v /path/to/addons:/mnt/extra-addons -p 8069:8069 --name odoo --link db:db -t odooNote: Altough there is no official Odoo Enterprise Docker image, the Enterprise modules can be mounted by using the above mentionned method.
Run multiple Odoo instances
$ docker run -p 8070:8069 --name odoo2 --link db:db -t odoo
$ docker run -p 8071:8069 --name odoo3 --link db:db -t odooNote: For plain use of mails and reports functionalities, when the host and container ports differ (e.g. 8070 and 8069), one has to set, in Odoo,
Settings->Parameters->System Parameters (requires technical features), web.base.url to the container port (e.g. 127.0.0.1:8069).Environment Variables
Tweak these environment variables to easily connect to a postgres server:HOST: The address of the postgres server. If you used a postgres container, set to the name of the container. Defaults todb.PORT: The port the postgres server is listening to. Defaults to5432.USER: The postgres role with which Odoo will connect. If you used a postgres container, set to the same value asPOSTGRES_USER. Defaults toodoo.PASSWORD: The password of the postgres role with which Odoo will connect. If you used a postgres container, set to the same value asPOSTGRES_PASSWORD. Defaults toodoo.
Docker Compose examples
The simplestcompose.yaml file would be:services:
web:
image: odoo:17.0
depends_on:
- db
ports:
- "8069:8069"
db:
image: postgres:15
environment:
- POSTGRES_DB=postgres
- POSTGRES_PASSWORD=odoo
- POSTGRES_USER=odooIf the default postgres credentials does not suit you, tweak the environment variables:
services:
web:
image: odoo:17.0
depends_on:
- mydb
ports:
- "8069:8069"
environment:
- HOST=mydb
- USER=odoo
- PASSWORD=myodoo
mydb:
image: postgres:15
environment:
- POSTGRES_DB=postgres
- POSTGRES_PASSWORD=myodoo
- POSTGRES_USER=odooHere's a last example showing you how to
- mount custom addons located in
./addons - use a custom configuration file located in
.config/odoo.conf - use named volumes for the Odoo and postgres data dir
- use a
secretsfile namedodoo_pg_passthat contains the postgreql password shared by both services
services:
web:
image: odoo:17.0
depends_on:
- db
ports:
- "8069:8069"
volumes:
- odoo-web-data:/var/lib/odoo
- ./config:/etc/odoo
- ./addons:/mnt/extra-addons
environment:
- PASSWORD_FILE=/run/secrets/postgresql_password
secrets:
- postgresql_password
db:
image: postgres:15
environment:
- POSTGRES_DB=postgres
- POSTGRES_PASSWORD_FILE=/run/secrets/postgresql_password
- POSTGRES_USER=odoo
- PGDATA=/var/lib/postgresql/data/pgdata
volumes:
- odoo-db-data:/var/lib/postgresql/data/pgdata
secrets:
- postgresql_password
volumes:
odoo-web-data:
odoo-db-data:
secrets:
postgresql_password:
file: odoo_pg_passTo start your Odoo instance, go in the directory of the
compose.yaml file you created from the previous examples and type:docker compose up -dHow to upgrade this image
Odoo images are updated on a regular basis to make them use recent releases (a new release of each version of Odoo is built every night). Please be aware that what follows is about upgrading from an old release to the latest one provided of the same major version, as upgrading from a major version to another is a much more complex process requiring elaborated migration scripts (see Odoo Upgrade page or this community project which aims to write those scripts).Suppose you created a database from an Odoo instance named old-odoo, and you want to access this database from a new Odoo instance named new-odoo, e.g. because you've just downloaded a newer Odoo image.
By default, Odoo 16.0+ uses a filestore (located at
/var/lib/odoo/filestore/) for attachments. You should restore this filestore in your new Odoo instance by running$ docker run --volumes-from old-odoo -p 8070:8069 --name new-odoo --link db:db -t odooLicense
View license information for the software contained in this image.As with all Docker images, these likely also contain other software which may be under other licenses (such as Bash, etc from the base distribution, along with any direct or indirect dependencies of the primary software being contained).
Some additional license information which was able to be auto-detected might be found in the
repo-info repository's odoo/ directory.As for any pre-built image usage, it is the image user's responsibility to ensure that any use of this image complies with any relevant licenses for all software contained within.
Serve Odoo on your own domain behind Caddy, Nginx or Traefik. Fill in your domain and copy the result. It's a starting point, some apps need their own base URL or extra headers set too.
Proxying odoo.example.com to http://odoo:8069
Add this to your Caddyfile
odoo.example.com {
reverse_proxy http://odoo:8069
}Check the logs first
Nine times out of ten the logs tell you exactly what went wrong.
- In Portainer, go to Containers, click the container, then Logs. Or run
docker logs <container> - Exit codes help too:
137means killed, usually out of memory.126or127means the command inside the image is broken.
Published on a random port
This template exposes 8069/tcp without setting a host port,
so Docker picks a random free one on every deploy.
- Find it in the Ports column of Portainer's container list, or with
docker port <container>
Image won't pull
Test the pull directly on the host: docker pull odoo:latest
- "manifest unknown" means the tag no longer exists. This template uses
latest, so try pinning a specific version instead. - "toomanyrequests" is the Docker Hub rate limit. Log in with
docker loginto raise it. - "no space left on device" means a full disk. Reclaim space with
docker system prune
"exec format error"
This means the image was built for a different CPU architecture than your server.
- This image supports:
amd64, ppc64le, arm64/v8 - Check yours with
uname -m: x86_64 is amd64, aarch64 is arm64. Raspberry Pi and other ARM boards are the usual culprits.
Required settings are blank
HOST, USER, PASSWORD have no default value, and the app may crash or misbehave if left empty.
- Fill them in on the deploy screen before hitting deploy.
Raise an issue
Found something which isn't working as it should? Here's how to report it.
- Bug within the app: Open an issue within the app's repo
- Template not working: Open an issue on mikestraney/portainer-templates
- This website not working: Open an issue on lissy93/portainer-templates
A single container
Odoo runs as one container, the simplest kind of app here. Just the one image to pull and nothing else wired up alongside it.
The app image
An image is the app packed up ready to go, everything Odoo needs bundled into one download. This template pulls odoo:latest, which Docker fetches once (about 666 MB) and then starts your own copy from.
Where the image comes from
Docker pulls its images from registries, public libraries of ready-built apps. Odoo's comes from Docker Hub as one of its official, curated images.
Version tags
The bit after the colon in the image name is the version tag. Here it's latest, which always points at the newest build, so a redeploy can bump you to a newer release without you asking. Newest right now is 19.0-20260810. Pin a specific tag if you would rather stay on one version.
Which machines it runs on
Every image is built for particular CPU types. This one ships for amd64, ppc64le, arm64/v8, so it runs on both regular x86 servers and ARM boards like a Raspberry Pi.
Ports
A port is the door the app answers on. Here the app exposes a port but leaves the host side blank, so Docker picks a free one for you. It opens:
8069, published on a random host port
Volumes
A volume is where Odoo keeps its files so they survive an update or a restart. Without one, anything it saves would sit inside the container and vanish the moment it's recreated. This template mounts:
/var/lib/odooas a volume Docker manages for you/mnt/extra-addonsas a volume Docker manages for you
Environment variables
Environment variables are the settings you hand over when you deploy, things like a password or a timezone. Odoo takes 3 of them, and 3 need a value before it'll start properly:
HOST, needs a value. PostgreSQL database hostUSER, needs a value. Database userPASSWORD, needs a value. Database password
Networking
Nothing custom is set, so Odoo sits on Docker's default bridge network: its own private space that reaches the outside world only through the ports it publishes.
Platform
The platform is linux, the kind of system the container is built to run on. Docker and Portainer handle this on a normal Linux server.
Portainer app templates
Zooming out, this whole page comes from a Portainer app template: a short recipe telling Portainer how to set Odoo up. Add the template list to Portainer once, then deploying Odoo is a click rather than a wall of config.