Articles>Quickstart to Working with Docker and Odoo

Quickstart to Working with Docker and Odoo

Practical quickstart steps for running Odoo within a Docker environment.

Written by
Holden Rehg
Posted on
June 3, 2021

I've been asked a handful of times about my Dockerized Odoo article. Even today 8 years after the release of Docker there's hesitation around developing with it. I completely understand that because Docker can be complex.

Originally I wanted to cover the major topics, features, and pain points that I noticed as a developer working with Docker. That's where the Dockerized Odoo article came from. Now I think I can help a certain type of developer by putting out a quickstart guide with simpler steps. This is targeted towards that developer who might not need every detail.

So that's what I'm aiming to do here. Here's the most pragmatic quickstart guide to working with Odoo and Docker that I can come up with:

Installing Docker

For detailed instructions on getting setup in a specific environment, take a look at At the end of the day we need access to the docker command line tool. This is what we'll use to work with, control, and manipulate our containers.


Using Docker's docker-install script is the easiest way to install Docker on Linux.

$ curl -fsSL -o
$ sh


On a Mac you need to download the Docker Desktop .dmg to install the application from


Now to be honest I have very little experience with Docker on Windows, but I have set it up a handful of times. Using downloading the Docker Desktop application was pretty straight forward.

I would make sure you have access to docker from powershell once it's installed.

Local Development

As Odoo developers, there is a handful of tasks that we do over and over and over while building Odoo modules or applications. I'm going to show you how to handle the basic tasks to get your work done day to day.

For this section we are just going to stick with standard docker commands.

Starting an Odoo instance

When starting a brand new instance, there are two steps:

1. Start up a Postgres database container. Use a name unique to your project. For example, you'll see below that I am using myodoo_db since I am working in a sample project calledmyodoo.

$ docker run -d \
    -e POSTGRES_USER=odoo \
    -e POSTGRES_DB=postgres \
    --name myodoo_db postgres:13

2. Start up the Odoo container. Similarly, try to use a unique name. I'm again prefixing the name with myodoo_ to keep the container names unique.

$ docker run -p 8069:8069 --name myodoo_odoo --link myodoo_db:db -t odoo

In this example we've opened up the Odoo instance to http://localhost:8069.

Stopping an Odoo instance

Containers can either be run in the foreground or background. So far we are running the postgres container in the background (using the -d flag) and the Odoo instance in the foreground.

To stop the Odoo container you can just use ctrl+c.

To stop a container running in the background, you can use docker stop {container-name}. It's helpful to first run docker ps to see what's actually running right now.

$ docker ps
CONTAINER ID   IMAGE         COMMAND                  CREATED             STATUS             PORTS      NAMES
f5231fb8d19b   postgres:13   "docker-entrypoint.s…"   About an hour ago   Up About an hour   5432/tcp   myodoo_db

$ docker stop myodoo_db

$ docker ps
CONTAINER ID   IMAGE         COMMAND                  CREATED             STATUS             PORTS      NAMES

Restarting an Odoo instance

To bring containers back up that are currently off, use docker start.

$ docker start myodoo_db
$ docker start myodoo_odoo

Or to restart containers that are already running, use docker restart. For example, when coding a new module you'll probably use docker restartoften.

$ docker restart myodoo_odoo

Configuring Odoo

The configurations for the Odoo instance can be set by either passing inline argument or providing a new odoo.conf file.

It's important to keep in mind that certain parts of containers cannot be modified once they are created. They are meant to be easily destroyed and recreated. So first we need to get rid of our original Odoo container:

$ docker stop myodoo_odoo  # running containers cannot be removed
$ docker rm myodoo_odoo

To create a new container with inline arguments, it's possible to pass them in via the -- keyword:

$ docker run -p 8069:8069 --name myodoo_odoo --link myodoo_db:db -t odoo -- list_db=False

To create a new container with a new conf file all together we are going to use the -v which defines a new volume. A volume is essentially a way to share data between your host computer and the container. In this example, it's assuming that you have a file called /my/odoo/odoo.conf on your computer.

$ docker run -p 8069:8069 --name myodoo_odoo --link myodoo_db:db -v /my/odoo:/etc/odoo -t odoo

Adding custom addons

Now we may want to load in some of our own modules that we're working on. I have a sample directory under /odoo/myodoo for this sample project and it looks like:

└── addons
    ├── event_mail
    ├── event_project
    └── partner_event

To mount these addons into the Odoo container, we need to link a volume to a designated directory that the Odoo container has built in for extra addons at /mnt/extra_addons:

$ docker run \
    -p 8069:8069 \
    --name myodoo_odoo \
    --link myodoo_db:db \
    -v /odoo/myodoo:/mnt/extra_addons \
    -t odoo

Once started up, you will have access to your addons via the Apps menu as usual. As your developing your addons you can docker restart myodoo_odoo to reload your python code.

Connecting to the database

Running any command "inside" of the container can be done via docker exec. This is helpful also to access the database. When first creating the database container we passed in environment variables for the credentials (user is odoo, password isodoo, default database is postgres).

To open up the connection to the database we use docker exec to run psqlinside of the container.

$ docker exec -it myodoo_db psql -U odoo -W postgres

Tailing or reading log

The simplest way to monitor logs while working locally is through the docker logscommand. You can list, grep, and tail logs for a specific container. Here is an example of tailing logs on one of the Odoo container's we've created:

$ docker logs -f myodoo_odoo

A Note on Docker Compose

In Dockerizing Odoo I utilized docker-compose and I still recommend using it if you really start to depend on Docker for your development. It feels like a must-have utility for the sake of efficiency.

But I'm thinking about the total beginners here. The Odoo developers who are just playing around with Docker for the first time and using Docker directly helps you learn more because of how explicit the API is and it's also simpler on a small scale (one or two containers).

As you learn more and get more comfortable with docker I recommend going back to look at my original article and to start reading through the Docker Compose documentation.

Wrapping Up

That's the basics for simple local Odoo development techniques using Docker. Try them out and let me know what you think. I hope it's able to simplify your workflow or your team's workflow!

Best of luck coding.

- Holden

Thanks For Reading

I appreciate you taking the time to read any of my articles. If you're looking for more ramblings, take a look at theentire catalog of articles I've written. Or feel free to give me a follow on Twitter, Instagram, or Github to see what else I've got going on. Or see my contact info below if you want to get in touch with me.


Holden Rehg, Author

Posted June 3, 2021

Other articles you might like