{"id":13691284,"url":"https://github.com/tecnativa/doodba","last_synced_at":"2025-07-27T14:11:48.780Z","repository":{"id":37548479,"uuid":"78112327","full_name":"Tecnativa/doodba","owner":"Tecnativa","description":"Base image for making the creation of customized Odoo environments a piece of cake","archived":false,"fork":false,"pushed_at":"2025-04-10T08:30:50.000Z","size":687,"stargazers_count":464,"open_issues_count":18,"forks_count":315,"subscribers_count":65,"default_branch":"master","last_synced_at":"2025-04-10T09:41:05.925Z","etag":null,"topics":["docker","doodba","hacktoberfest","odoo"],"latest_commit_sha":null,"homepage":"","language":"Dockerfile","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Tecnativa.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-01-05T12:46:49.000Z","updated_at":"2025-04-10T08:30:55.000Z","dependencies_parsed_at":"2023-01-24T20:15:20.803Z","dependency_job_id":"270d3213-8dbc-437e-bfce-f41c72bbc6cf","html_url":"https://github.com/Tecnativa/doodba","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tecnativa%2Fdoodba","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tecnativa%2Fdoodba/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tecnativa%2Fdoodba/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tecnativa%2Fdoodba/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Tecnativa","download_url":"https://codeload.github.com/Tecnativa/doodba/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252062864,"owners_count":21688610,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["docker","doodba","hacktoberfest","odoo"],"created_at":"2024-08-02T17:00:42.877Z","updated_at":"2025-05-02T15:31:39.457Z","avatar_url":"https://github.com/Tecnativa.png","language":"Dockerfile","funding_links":[],"categories":["Tools"],"sub_categories":[],"readme":"# [Doodba](https://hub.docker.com/r/tecnativa/doodba)\n\n![ci](https://github.com/Tecnativa/doodba/workflows/ci/badge.svg)\n[![](https://images.microbadger.com/badges/version/tecnativa/doodba:latest.svg)](https://microbadger.com/images/tecnativa/doodba:latest \"Get your own version badge on microbadger.com\")\n[![](https://images.microbadger.com/badges/image/tecnativa/doodba:latest.svg)](https://microbadger.com/images/tecnativa/doodba:latest \"Get your own image badge on microbadger.com\")\n[![](https://images.microbadger.com/badges/commit/tecnativa/doodba:latest.svg)](https://microbadger.com/images/tecnativa/doodba:latest \"Get your own commit badge on microbadger.com\")\n[![](https://images.microbadger.com/badges/license/tecnativa/doodba.svg)](https://microbadger.com/images/tecnativa/doodba \"Get your own license badge on microbadger.com\")\n\n**Doodba** stands for **Do**cker **Od**oo **Ba**se, and it is a highly opinionated image\nready to put [Odoo](https://www.odoo.com) inside it, but **without Odoo**.\n\n## What?\n\nYes, the purpose of this is to serve as a base for you to build your own Odoo project,\nbecause most of them end up requiring a big amount of custom patches, merges,\nrepositories, etc. With this image, you have a collection of good practices and tools to\nenable your team to have a standard Odoo project structure.\n\nBTW, we use [Debian][]. I hope you like that.\n\n[debian]: https://debian.org/\n\n## Why?\n\nBecause developing Odoo is hard. You need lots of customizations, dependencies, and if\nyou want to move from one version to another, it's a pain.\n\nAlso because nobody wants Odoo as it comes from upstream, you most likely will need to\nadd custom patches and addons, at least, so we need a way to put all together and make\nit work anywhere quickly.\n\n## How?\n\nYou can start working with this straight away with our [template][].\n\n\u003c!-- prettier-ignore-start --\u003e\n\u003c!-- prettier-ignore --\u003e\n\n\u003c!-- toc --\u003e\n\n- [Image usage](#image-usage)\n  - [`/opt/odoo/custom`: The important one](#optodoocustom-the-important-one)\n    - [`/opt/odoo/custom/entrypoint.d`](#optodoocustomentrypointd)\n    - [`/opt/odoo/custom/build.d`](#optodoocustombuildd)\n    - [`/opt/odoo/custom/conf.d`](#optodoocustomconfd)\n    - [`/opt/odoo/custom/ssh`](#optodoocustomssh)\n    - [`/opt/odoo/custom/src`](#optodoocustomsrc)\n      - [`/opt/odoo/custom/src/odoo`](#optodoocustomsrcodoo)\n      - [`/opt/odoo/custom/src/private`](#optodoocustomsrcprivate)\n      - [`/opt/odoo/custom/src/repos.yaml`](#optodoocustomsrcreposyaml)\n        - [Automatic download of repos](#automatic-download-of-repos)\n      - [`/opt/odoo/custom/src/addons.yaml`](#optodoocustomsrcaddonsyaml)\n      - [`/opt/odoo/custom/dependencies/*.txt`](#optodoocustomdependenciestxt)\n  - [`/opt/odoo/common`: The useful one](#optodoocommon-the-useful-one)\n  - [`/opt/odoo/auto`: The automatic one](#optodooauto-the-automatic-one)\n    - [`/opt/odoo/auto/addons`](#optodooautoaddons)\n    - [`/opt/odoo/auto/odoo.conf`](#optodooautoodooconf)\n- [The `Dockerfile`](#the-dockerfile)\n- [Bundled tools](#bundled-tools)\n  - [`addons`](#addons)\n  - [`click-odoo` and related scripts](#click-odoo-and-related-scripts)\n  - [`nano`](#nano)\n  - [`log`](#log)\n  - [`pot`](#pot)\n  - [`psql`](#psql)\n  - [`inotify`](#inotify)\n  - [`debugpy`](#debugpy)\n  - [`pudb`](#pudb)\n  - [`git-aggregator`](#git-aggregator)\n  - [`autoaggregate`](#autoaggregate)\n    - [Example `repos.yaml` file](#example-reposyaml-file)\n  - [`odoo`](#odoo)\n- [Subproject template](#subproject-template)\n- [FAQ](#faq)\n  - [Will there be not retrocompatible changes on the image?](#will-there-be-not-retrocompatible-changes-on-the-image)\n  - [This project is too opinionated, but can I question any of those opinions?](#this-project-is-too-opinionated-but-can-i-question-any-of-those-opinions)\n  - [What's this `hooks` folder here?](#whats-this-hooks-folder-here)\n  - [How can I pin an image version?](#how-can-i-pin-an-image-version)\n  - [How can I help?](#how-can-i-help)\n- [Related Projects](#related-projects)\n\n\u003c!-- tocstop --\u003e\n\n\u003c!-- prettier-ignore-end --\u003e\n\n## Image usage\n\nBasically, every directory you have to worry about is found inside `/opt/odoo`. This is\nits structure:\n\n    custom/\n        entrypoint.d/\n        build.d/\n        conf.d/\n        ssh/\n            config\n            known_hosts\n            id_rsa\n            id_rsa.pub\n        dependencies/\n            apt_build.txt\n            apt.txt\n            gem.txt\n            npm.txt\n            pip.txt\n        src/\n            private/\n            odoo/\n            addons.yaml\n            repos.yaml\n    common/\n        entrypoint.sh\n        build.sh\n        entrypoint.d/\n        build.d/\n        conf.d/\n    auto\n        addons/\n        odoo.conf\n\nLet's go one by one.\n\n### `/opt/odoo/custom`: The important one\n\nHere you will put everything related to your project.\n\n#### `/opt/odoo/custom/entrypoint.d`\n\nAny executables found here will be run when you launch your container, before running\nthe command you ask.\n\n#### `/opt/odoo/custom/build.d`\n\nExecutables here will be aggregated with those in `/opt/odoo/common/build.d`.\n\nThe resulting set of executables will then be sorted alphabetically (ascending) and then\nsubsequently run.\n\n#### `/opt/odoo/custom/conf.d`\n\nFiles here will be environment-variable-expanded and concatenated in\n`/opt/odoo/auto/odoo.conf` in the entrypoint.\n\n#### `/opt/odoo/custom/ssh`\n\nIt must follow the same structure as a standard `~/.ssh` directory, including `config`\nand `known_hosts` files. In fact, it is completely equivalent to `~root/.ssh`.\n\nThe `config` file can contain `IdentityFile` keys to represent the private key that\nshould be used for that host. Unless specified otherwise, this defaults to\n`identity[.pub]`, `id_rsa[.pub]` or `id_dsa[.pub]` files found in this same directory.\n\nThis is very useful **to use deployment keys** that grant git access to your private\nrepositories.\n\nExample - a private key file in the `ssh` folder named `my_private_key` for the host\n`repo.example.com` would have a `config` entry similar to the below:\n\n```\nHost repo.example.com\n  IdentityFile ~/.ssh/my_private_key\n```\n\nOr you could just drop the key in `id_rsa` and `id_rsa.pub` files and it should work by\ndefault without the need of adding a `config` file.\n\nHost key checking is enabled by default, which means that you also need to provide a\n`known_hosts` file for any repos that you wish to access via SSH.\n\nIn order to disable host key checks for a repo, your config would look something like\nthis:\n\n```\nHost repo.example.com\n  StrictHostKeyChecking no\n```\n\nFor additional information regarding this directory, take a look at this [Digital Ocean\nArticle][ssh-conf].\n\n#### `/opt/odoo/custom/src`\n\nHere you will put the actual source code for your project.\n\nWhen putting code here, you can either:\n\n- Use [`repos.yaml`][], that will fill anything at build time.\n- Directly copy all there.\n\nRecommendation: use [`repos.yaml`][] for everything except for [`private`][], and ignore\nin your `.gitignore` and `.dockerignore` files every folder here except [`private`][],\nwith rules like these:\n\n    odoo/custom/src/*\n    !odoo/custom/src/private\n    !odoo/custom/src/*.*\n\n##### `/opt/odoo/custom/src/odoo`\n\n**REQUIRED.** The source code for your odoo project.\n\nYou can choose your Odoo version, and even merge PRs from many of them using\n[`repos.yaml`][]. Some versions you might consider:\n\n- [Original Odoo][], by [Odoo S.A.][].\n\n- [OCB][] (Odoo Community Backports), by [OCA][]. The original + some features - some\n  stability strictness.\n\n- [OpenUpgrade][], by [OCA][]. The original, frozen at new version launch time +\n  migration scripts.\n\n##### `/opt/odoo/custom/src/private`\n\n**REQUIRED.** Folder with private addons for the project.\n\n##### `/opt/odoo/custom/src/repos.yaml`\n\nA [git-aggregator](#git-aggregator) configuration file.\n\nIt should look similar to this:\n\n```yaml\n# Odoo must be in the `odoo` folder for Doodba to work\nodoo:\n  defaults:\n    # This will use git shallow clones.\n    # $DEPTH_DEFAULT is 1 in test and prod, but 100 in devel.\n    # $DEPTH_MERGE is always 100.\n    # You can use any integer value, OTOH.\n    depth: $DEPTH_MERGE\n  remotes:\n    origin: https://github.com/OCA/OCB.git\n    odoo: https://github.com/odoo/odoo.git\n    openupgrade: https://github.com/OCA/OpenUpgrade.git\n  # $ODOO_VERSION is... the Odoo version! \"11.0\" or similar\n  target: origin $ODOO_VERSION\n  merges:\n    - origin $ODOO_VERSION\n    - odoo refs/pull/25594/head # Expose `Field` from search_filters.js\n\nweb:\n  defaults:\n    depth: $DEPTH_MERGE\n  remotes:\n    origin: https://github.com/OCA/web.git\n    tecnativa: https://github.com/Tecnativa/partner-contact.git\n  target: origin $ODOO_VERSION\n  merges:\n    - origin $ODOO_VERSION\n    - origin refs/pull/1007/head # web_responsive search\n    - tecnativa 11.0-some_addon-custom # Branch for this customer only\n```\n\n###### Automatic download of repos\n\nDoodba is smart enough to download automatically git repositories even if they are\nmissing in `repos.yaml`. It will happen if it is used in [`addons.yaml`][], except for\nthe special [`private`][] repo. This will help you keep your deployment definitions DRY.\n\nYou can configure this behavior with these environment variables (default values shown):\n\n- `DEFAULT_REPO_PATTERN=\"https://github.com/OCA/{}.git\"`\n- `DEFAULT_REPO_PATTERN_ODOO=\"https://github.com/OCA/OCB.git\"`\n\nAs you probably guessed, we use something like `str.format(repo_basename)` on top of\nthose variables to compute the default remote origin. If, i.e., you want to use your own\nrepositories as default remotes, just add these build arguments to your\n`docker-compose.yaml` file:\n\n```yaml\n# [...]\nservices:\n  odoo:\n    build:\n      args:\n        DEFAULT_REPO_PATTERN: \u0026origin \"https://github.com/Tecnativa/{}.git\"\n        DEFAULT_REPO_PATTERN_ODOO: *origin\n# [...]\n```\n\nSo, for example, if your [`repos.yaml`][] file is empty and your [`addons.yaml`][]\ncontains this:\n\n```yaml\nserver-tools:\n  - module_auto_update\n```\n\nA `/opt/odoo/auto/repos.yaml` file with this will be generated and used to download git\ncode:\n\n```yaml\n/opt/odoo/custom/src/odoo:\n  defaults:\n    depth: $DEPTH_DEFAULT\n  remotes:\n    origin: https://github.com/OCA/OCB.git\n  target: origin $ODOO_VERSION\n  merges:\n    - origin $ODOO_VERSION\n/opt/odoo/custom/src/server-tools:\n  defaults:\n    depth: $DEPTH_DEFAULT\n  remotes:\n    origin: https://github.com/OCA/server-tools.git\n  target: origin $ODOO_VERSION\n  merges:\n    - origin $ODOO_VERSION\n```\n\nAll of this means that, you only need to define the git aggregator spec in\n[`repos.yaml`][] if anything diverges from the standard:\n\n- You need special merges.\n- You need a special origin.\n- The folder name does not match the origin pattern.\n- The branch name does not match `$ODOO_VERSION`.\n- Etc.\n\n##### `/opt/odoo/custom/src/addons.yaml`\n\nOne entry per repo and addon you want to activate in your project. Like this:\n\n```yaml\nwebsite:\n  - website_cookie_notice\n  - website_legal_page\nweb:\n  - web_responsive\n```\n\nAdvanced features:\n\n- You can bundle [several YAML documents][] if you want to logically group your addons\n  and some repos are repeated among groups, by separating each document with `---`.\n\n- Addons under `private` and `odoo/addons` are linked automatically unless you specify\n  them.\n\n- You can use `ONLY` to supply a dictionary of environment variables and a list of\n  possible values to enable that document in the matching environments.\n\n- You can use `ENV` to supply a dictionary of environment variables to be used on\n  downloading repositories. Following variables are supported:\n\n  - `DEFAULT_REPO_PATTERN`\n  - `DEFAULT_REPO_PATTERN_ODOO`\n  - `DEPTH_DEFAULT`\n  - `ODOO_VERSION` - can be used as repository branch\n\n- If an addon is found in several places at the same time, it will get linked according\n  to this priority table:\n\n  1. Addons in [`private`][].\n  2. Addons in other repositories (in case one is matched in several, it will be random,\n     BEWARE!). Better have no duplicated names if possible.\n  3. Core Odoo addons from [`odoo/addons`][`odoo`].\n\n- If an addon is specified but not available at runtime, it will fail silently.\n\n- You can use any wildcards supported by [Python's glob module][glob].\n\nThe following example shows these advanced features:\n\n```yaml\n# Spanish Localization\nl10n-spain:\n  - l10n_es # Overrides built-in l10n_es under odoo/addons\nserver-tools:\n  - \"*date*\" # All modules that contain \"date\" in their name\n  - auditlog\nweb:\n  - \"*\" # All web addons\n---\n# Different YAML document to separate SEO Tools\nwebsite:\n  - website_blog_excertp_img\nserver-tools: # Here we repeat server-tools, but no problem because it's a\n  # different document\n  - html_image_url_extractor\n  - html_text\n---\n# Enable demo ribbon only for devel and test environments\nONLY:\n  PGDATABASE: # This environment variable must exist and be in the list\n    - devel\n    - test\nweb:\n  - web_environment_ribbon\n---\n# Enable special authentication methods only in production environment\nONLY:\n  PGDATABASE:\n    - prod\nserver-tools:\n  - auth_*\n---\n# Custom repositories\nENV:\n  DEFAULT_REPO_PATTERN: https://github.com/Tecnativa/{}.git\n  ODOO_VERSION: 16.0-new-feature\nsome-repo: # Cloned from https://github.com/Tecnativa/some-repo.git branch 15.0-new-feature\n  - some_custom_module\n```\n\n##### `/opt/odoo/custom/dependencies/*.txt`\n\nFiles to indicate dependencies of your subimage, one for each of the supported package\nmanagers:\n\n- `apt_build.txt`: build-time dependencies, installed before any others and removed\n  after all the others too. Usually these would include Debian packages such as\n  `build-essential` or `python-dev`. From Doodba 11.0, this is most likely not needed,\n  as build dependencies are shipped with the image, and local python develpment headers\n  should be used instead of those downloaded from apt.\n- `apt.txt`: run-time dependencies installed by apt.\n- `gem.txt`: run-time dependencies installed by gem.\n- `npm.txt`: run-time dependencies installed by npm.\n- `pip.txt`: a normal [pip `requirements.txt`][] file, for run-time dependencies too. It\n  will get executed with `--update` flag, just in case you want to overwrite any of the\n  pre-bundled dependencies.\n\n### `/opt/odoo/common`: The useful one\n\nThis folder is full of magic. I'll document it some day. For now, just look at the code.\n\nOnly some notes:\n\n- Will compile your code with [`PYTHONOPTIMIZE=\"\"`][] by default.\n\n- Will remove all code not used from the image by default (not listed in\n  `/opt/odoo/custom/src/addons.yaml`), to keep it thin.\n\n### `/opt/odoo/auto`: The automatic one\n\nThis directory will have things that are automatically generated at build time.\n\n#### `/opt/odoo/auto/addons`\n\nIt will be full of symlinks to the addons you selected in [`addons.yaml`][].\n\n#### `/opt/odoo/auto/odoo.conf`\n\nIt will have the result of merging all configurations under\n`/opt/odoo/{common,custom}/conf.d/`, in that order.\n\n## The `Dockerfile`\n\nI will document all build arguments and environment variables some day, but for now keep\nthis in mind:\n\n- This is just a base image, full of tools. **You need to build your project subimage**\n  from this one, even if your project's `Dockerfile` only contains these 2 lines:\n\n      FROM tecnativa/doodba\n      MAINTAINER Me \u003cme@example.com\u003e\n\n- The above sentence becomes true because we have a lot of `ONBUILD` sentences here, so\n  at least **your project must have a `./custom` folder** along with its `Dockerfile`\n  for it to work.\n\n- All should be magic if you adhere to our opinions here. Just put the code where it\n  should go, and relax.\n\n## Bundled tools\n\nThere is a good collections of tools available in the image that help dealing with Odoo\nand its peculiarities:\n\n### `addons`\n\nA handy CLI tool to automate addon management based on the current environment. It\nallows you to install, update, test and/or list private, extra and/or core addons\navailable to current container, based on current [`addons.yaml`][] configuration.\n\nCall `addons --help` for usage instructions.\n\n### `click-odoo` and related scripts\n\nThe great [`click-odoo`][] scripting framework and the collection of scripts found in\n[`click-odoo-contrib`][] are included. Refer to their sites to know how to use them.\n\n\\* Note: This replaces the deprecated `python-odoo-shell` binary.\n\n### [`nano`](https://www.nano-editor.org/)\n\nThe CLI text editor we all know, just in case you need to inspect some bug in hot\ndeployments.\n\n### `log`\n\nJust a little shell script that you can use to add logs to your build or entrypoint\nscripts:\n\n    log INFO I'm informing\n\n### `pot`\n\nLittle shell shortcut for exporting a translation template from any addon(s). Usage:\n\n    pot my_addon,my_other_addon\n\n### [`psql`](https://www.postgresql.org/docs/current/app-psql.html)\n\nEnvironment variables are there so that if you need to connect with the database, you\njust need to execute:\n\n    docker-compose run -l traefik.enable=false --rm odoo psql\n\nThe same is true for any other [Postgres client applications][].\n\n### [`inotify`](https://github.com/dsoprea/PyInotify)\n\nEnables hot code reloading when odoo is started with `--dev` and passed `reload` or\n`all` as an argument.\n\n[copier template](https://github.com/Tecnativa/doodba-copier-template) enables this by\ndefault in the development environment.\n\nDoodba supports this feature under versions 11.0 and later. Check\n[CLI docs](https://www.odoo.com/documentation/13.0/reference/cmdline.html#developer-features)\nfor details.\n\n### [`debugpy`](https://github.com/microsoft/vscode-python)\n\n[VSCode][] debugger. If you use this editor with its python module, you will find it\nuseful.\n\nTo debug at a certain point of the code, add this Python code somewhere:\n\n```python\nimport debugpy\ndebugpy.listen(6899)\nprint(\"Waiting for debugger attach\")\ndebugpy.wait_for_client()\ndebugpy.breakpoint()\nprint('break on this line')\n```\n\nTo start Odoo within a debugpy environment, which will obey the breakpoints established\nin your IDE (but will work slowly), just add `-e DEBUGPY_ENABLE=1` to your odoo\ncontainer.\n\nIf you use the official [template][], you can boot it in debugpy mode with:\n\n```bash\nexport DOODBA_DEBUGPY_ENABLE=1\ndocker-compose -f devel.yaml up -d\n```\n\nOf course, you need to have properly configured your [VSCode][]. To do so, make sure in\nyour project there is a `.vscode/launch.json` file with these minimal contents:\n\n```json\n{\n  \"version\": \"0.2.0\",\n  \"configurations\": [\n    {\n      \"name\": \"Attach to debug in devel.yaml\",\n      \"type\": \"python\",\n      \"request\": \"attach\",\n      \"pathMappings\": [\n        {\n          \"localRoot\": \"${workspaceRoot}/odoo\",\n          \"remoteRoot\": \"/opt/odoo\"\n        }\n      ],\n      \"port\": 6899,\n      \"host\": \"localhost\"\n    }\n  ]\n}\n```\n\nThen, execute that configuration as usual.\n\n### [`pudb`](https://github.com/inducer/pudb)\n\nThis is another great debugger that includes remote debugging via telnet, which can be\nuseful for some cases, or for people that prefer it over [wdb](#wdb).\n\nTo use it, inject this in any Python script:\n\n```python\nimport pudb.remote\npudb.remote.set_trace(term_size=(80, 24))\n```\n\nThen open a telnet connection to it (running in `0.0.0.0:6899` by default).\n\nIt is safe to use in [production][] environments **if you know what you are doing and do\nnot expose the debugging port to attackers**. Usage:\n\n    docker-compose exec odoo telnet localhost 6899\n\n### [`git-aggregator`](https://pypi.python.org/pypi/git-aggregator)\n\nWe found this one to be the most useful tool for downlading code, merging it and placing\nit somewhere.\n\n### `autoaggregate`\n\nThis little script wraps `git-aggregator` to make it work fine and automatically with\nthis image. Used in the [template][]'s `setup-devel.yaml` step.\n\n#### Example `repos.yaml` file\n\nThis [`repos.yaml`][] example merges [several sources][`odoo`]:\n\n```yaml\n./odoo:\n  defaults:\n    # Shallow repositores are faster \u0026 thinner. You better use\n    # $DEPTH_DEFAULT here when you need no merges.\n    depth: $DEPTH_MERGE\n  remotes:\n    ocb: https://github.com/OCA/OCB.git\n    odoo: https://github.com/odoo/odoo.git\n  target: ocb $ODOO_VERSION\n  merges:\n    - ocb $ODOO_VERSION\n    - odoo refs/pull/13635/head\n  shell_command_after:\n    # Useful to merge a diff when there's no git history correlation\n    - curl -sSL https://github.com/odoo/odoo/pull/37187.diff | patch -fp1\n```\n\n### [`odoo`](https://www.odoo.com/documentation/10.0/reference/cmdline.html)\n\nWe set an `$OPENERP_SERVER` environment variable pointing to\n[the autogenerated configuration file](#optodooautoodooconf) so you don't have to worry\nabout it. Just execute `odoo` and it will work fine.\n\nNote that version 9.0 has an `odoo` binary to provide forward compatibility (but it has\nthe `odoo.py` one too).\n\n## Subproject template\n\nThat's a big structure! Get it up and running quickly using the\n[copier template](https://github.com/Tecnativa/doodba-copier-template) we provide to\nhelp you generate your subproject.\n\nCheck its docs to know how to use it.\n\n## FAQ\n\n### Will there be not retrocompatible changes on the image?\n\nThis image is production-ready, but it is constantly evolving too, so some new features\ncan break some old ones, or conflict with them, and some old features might get\ndeprecated and removed at some point.\n\nThe best you can do is to [subscribe to the compatibility breakage announcements\nissue][retrobreak].\n\n### This project is too opinionated, but can I question any of those opinions?\n\nOf course. There's no guarantee that we will like it, but please do it. :wink:\n\n### What's this `hooks` folder here?\n\nIt runs triggers when doing the automatic build in the Docker Hub.\n[Check this](https://hub.docker.com/r/thibaultdelor/testautobuildhooks/).\n\n### How can I pin an image version?\n\nVersion-pinning is a good idea to keep your code from differing among image updates.\nIt's the best way to ensure no updates got in between the last time you checked the\nimage and the time you deploy it to production.\n\nYou can do it through **its sha256 code**.\n\nGet any image's code through inspect, running from a computer where the correct image\nversion is downloaded:\n\n    docker image inspect --format='{{.RepoDigests}}' tecnativa/doodba:10.0-onbuild\n\nAlternatively, you can browse [this image's builds][builds], click on the one you know\nit works fine for you, and search for the `digest` word using your browser's _search in\npage_ system (Ctrl+F usually).\n\nYou will find lines similar to:\n\n    [...]\n    10.0: digest: sha256:fba69478f9b0616561aa3aba4d18e4bcc2f728c9568057946c98d5d3817699e1 size: 4508\n    [...]\n    8.0: digest: sha256:27a3dd3a32ce6c4c259b4a184d8db0c6d94415696bec6c2668caafe755c6445e size: 4508\n    [...]\n    9.0: digest: sha256:33a540eca6441b950d633d3edc77d2cc46586717410f03d51c054ce348b2e977 size: 4508\n    [...]\n\nOnce you find them, you can use that pinned version in your builds, using a Dockerfile\nsimilar to this one:\n\n```Dockerfile\n# Hash-pinned version of tecnativa/doodba:10.0-onbuild\nFROM tecnativa/doodba@sha256:fba69478f9b0616561aa3aba4d18e4bcc2f728c9568057946c98d5d3817699e1\n```\n\n### How can I help?\n\nJust [head to our project](https://github.com/Tecnativa/doodba) and open a discussion,\nissue or pull request.\n\n## Related Projects\n\n- Of course,\n  [the Doodba Copier Template](https://github.com/Tecnativa/doodba-copier-template).\n- [QA tools for Doodba-based projects][doodba-qa]\n- [Ansible role for automated deployment / update from Le Filament](https://github.com/remi-filament/ansible_role_odoo_docker)\n- Find others by searching\n  [GitHub projects tagged with `#doodba`](https://github.com/topics/doodba)\n\n[`/opt/odoo/auto/addons`]: #optodooautoaddons\n[`addons.yaml`]: #optodoocustomsrcaddonsyaml\n[`compose_file` environment variable]:\n  https://docs.docker.com/compose/reference/envvars/#/composefile\n[`odoo.conf`]: #optodooautoodooconf\n[`odoo`]: #optodoocustomsrcodoo\n[`private`]: #optodoocustomsrcprivate\n[`pythonoptimize=1`]: https://docs.python.org/3/using/cmdline.html#envvar-PYTHONOPTIMIZE\n[`repos.yaml`]: #optodoocustomsrcreposyaml\n[`click-odoo`]: https://github.com/acsone/click-odoo\n[`click-odoo-contrib`]: https://github.com/acsone/click-odoo-contrib\n[build.d]: #optodoocustombuildd\n[builds]: https://hub.docker.com/r/tecnativa/doodba/builds/\n[dependencies]: #optodoocustomdependenciestxt\n[development]: #development\n[doodba-qa]: https://github.com/Tecnativa/doodba-qa\n[fish]: http://fishshell.com/\n[glob]: https://docs.python.org/3/library/glob.html\n[mailhog]: #mailhog\n[oca]: https://odoo-community.org/\n[ocb]: https://github.com/OCA/OCB\n[odoo s.a.]: https://www.odoo.com\n[openupgrade]: https://github.com/OCA/OpenUpgrade/\n[original odoo]: https://github.com/odoo/odoo\n[pip `requirements.txt`]:\n  https://pip.readthedocs.io/en/latest/user_guide/#requirements-files\n[postgres client applications]:\n  https://www.postgresql.org/docs/current/static/reference-client.html\n[production]: #production\n[retrobreak]: https://github.com/Tecnativa/doodba/issues/67\n[template]: #subproject-template\n[several yaml documents]: http://www.yaml.org/spec/1.2/spec.html#id2760395\n[ssh-conf]:\n  https://www.digitalocean.com/community/tutorials/how-to-configure-custom-connection-options-for-your-ssh-client\n[testing]: #testing\n[traefik]: https://traefik.io/\n[vscode]: https://code.visualstudio.com/\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftecnativa%2Fdoodba","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftecnativa%2Fdoodba","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftecnativa%2Fdoodba/lists"}