Previously we already tried how to install Odoo on Ubuntu using the installer and using virtualenv. There is another way to run Odoo, using Docker. If you not installed docker yet, you can see this link.

You can see the official Odoo Docker image at the Docker hub. There are many versions of Odoo in the Docker hub. We will use odoo:13 for this tutorial. The default odoo:13 image use Debian Buster (ver. 10.x) and Wkhtmltopdf 0.12.5.x. See https://github.com/odoo/docker/blob/master/13.0/Dockerfile

Preparation
For development with custom addons or enterprise addons, we need to create Dockerfile, docker-compose.yml, and odoo.conf. You can follow this step:
- Create a new directory for project root. You can give any name for the directory.
- Create a new directory, ex: addons-extra. Then put all your custom addons in there.
- If you use enterprise edition, create a new directory, ex: addons-enterprise. Then put all enterprise addons in there.
- Create docker-compose.yml. Copy the code below:
version: '3' services: db: image: postgres:11 # we will use postgres:11 image from docker hub for database environment: - POSTGRES_USER=odoo # Set value of postgres credential - POSTGRES_PASSWORD=odoo - POSTGRES_DB=postgres - PGDATA=/var/lib/postgresql/data/pgdata volumes: - odoo-db-data:/var/lib/postgresql/data/pgdata # set postgresql data persistence web: image: odoo:13.0 volumes: - ./addons-enterprise:/mnt/enterprise-addons # Mount volume between host and container, host_dir:container_dir - ./addons-extra:/mnt/extra-addons - ./config:/etc/odoo - odoo-web-data:/var/lib/odoo ports: - "9069:8069" # this will create connection port between host and container, this means host_port:container_port depends_on: - db # set depends on postgresql db volumes: odoo-web-data: odoo-db-data:
- Create a new directory config/ and a new file odoo.conf inside the config directory. Copy the code below:
[options] addons_path = /mnt/enterprise-addons,/mnt/extra-addons data_dir = /var/lib/odoo ; admin_passwd = admin ; csv_internal_sep = , ; db_maxconn = 64 ; db_name = False ; db_template = template1 ; dbfilter = .* ; debug_mode = False ; email_from = False ; limit_memory_hard = 2684354560 ; limit_memory_soft = 2147483648 ; limit_request = 8192 ; limit_time_cpu = 60 ; limit_time_real = 120 ; list_db = True ; log_db = False ; log_handler = [':INFO'] ; log_level = info ; logfile = None ; longpolling_port = 8072 ; max_cron_threads = 2 ; osv_memory_age_limit = 1.0 ; osv_memory_count_limit = False ; smtp_password = False ; smtp_port = 25 ; smtp_server = localhost ; smtp_ssl = False ; smtp_user = False ; workers = 0 ; xmlrpc = True ; xmlrpc_interface = ; xmlrpc_port = 8069 ; xmlrpcs = True ; xmlrpcs_interface = ; xmlrpcs_port = 8071
- Optional, we can create a .dockerignore file used for ignoring some files to processed with docker such as .git file. Copy the code below:
LICENSE VERSION README.md Changelog.md Makefile docker-compose.yml __pycache__ *.pyc *.pyo *.pyd .Python env pip-log.txt pip-delete-this-directory.txt .tox .coverage .coverage.* .cache nosetests.xml coverage.xml *,cover *.log .git .gitignore .gitkeep # IDE .idea .vscode
- And this is the tree result of the project directory.

Build and Run
After setup, we need to build an image and run the container.
- Make sure that pointer in the project root directory.
- Then
docker-compose run --service-ports web
to run Odoo web & DB container. - For shortcut commands we can use
docker-compose up
to build image & start the container. - Open your browser and type
localhost:9069
in the address bar. - When we run the container, it will automatically create docker volume
odoo-db-data
andodoo-web-data
directory. All odoo data like attachment will be placed inodoo-web-data
and all Postgres data will be placed inodoo-db-data
.
That’s it. Thanks for reading.