| # Gerrit Code Review docker images | |
| These images provide official Gerrit Code Review releases using the | |
| DEB/RPM packages available from the | |
| [GerritForge repositories](https://gitenterprise.me/2015/02/27/gerrit-2-10-rpm-and-debian-packages-available/). | |
| The DEB/RPM packages contain the release `gerrit.war` file along with additional configuration files that | |
| provide an [out-of-the-box](https://gerrit.googlesource.com/plugins/out-of-the-box/) setup. | |
| Each image is intended to be used AS-IS for training or staging environments. | |
| For production environments, the images provide a base on which required customizations | |
| to `gerrit.config` and persistent external modules can be made. | |
| ## Quickstart | |
| Start Gerrit Code Review in its demo/staging "out-of-the-box" setup like so: | |
| ``` | |
| docker run -ti -p 8080:8080 -p 29418:29418 docker.io/gerritcodereview/gerrit | |
| ``` | |
| Wait a few minutes until the `Gerrit Code Review NNN ready` message appears, | |
| where NNN is your current Gerrit version, then open your browser to http://localhost:8080 | |
| and you will be in Gerrit Code Review. | |
| *NOTE*: If your docker server is running on a remote host, change 'localhost' to | |
| the hostname or IP address of your remote docker server. | |
| The [plugin-manager](https://gerrit.googlesource.com/plugins/plugin-manager/) introduction screen | |
| guides you through the basics of Gerrit and allows installation of additional plugins downloaded from | |
| [Gerrit CI](https://gerrit-ci.gerritforge.com). | |
| Images for previous Gerrit Code Review releases are available; e.g. to run version 3.8.0, | |
| use the following command: | |
| ``` | |
| docker run -ti -p 8080:8080 -p 29418:29418 docker.io/gerritcodereview/gerrit:3.8.0 | |
| ``` | |
| ## Build docker images | |
| To build docker images, clone the git repository https://gerrit.googlesource.com/docker-gerrit. | |
| Release tags are available and can be used to build particular releases. E.g. to build an | |
| image using Gerrit 3.8.0, checkout the respective tag: | |
| ``` | |
| git checkout v3.8.0 | |
| ``` | |
| Navigate to either `./almalinux/9` or `./ubuntu/22` to build the almalinux- or ubuntu-based | |
| docker image. Then run: | |
| ``` | |
| docker build -t gerritcodereview/gerrit:$(git describe) . | |
| ``` | |
| To build an image containing a development build of Gerrit (e.g. to test a change), run the | |
| following command instead: | |
| ``` | |
| docker build --build-arg GERRIT_WAR_URL="<url>" -t gerritcodereview/gerrit -f Dockerfile-dev . | |
| ``` | |
| The `<url>` passed to the `GERRIT_WAR_URL`-build argument has to point to a Gerrit-`.war`-file. | |
| The build argument defaults to the URL pointing to the last successful build of the Gerrit master | |
| branch on the [Gerrit CI](https://gerrit-ci.gerritforge.com). | |
| ## Build multi-platform images | |
| For the official releases one can build both `amd64` and `arm64` images at once and either | |
| load them to the local docker registry or push them to the `gerritcodereview` dockerhub account. | |
| In order to do that, one simply calls: | |
| ``` | |
| ./build_multiplatform.sh --load | |
| ``` | |
| And multiplatform images will be created and loaded locally. Calling: | |
| ``` | |
| ./build_multiplatform.sh --push | |
| ``` | |
| pushes images to docker-hub instead. | |
| Notes: | |
| * in the `--load` target only the current system architecture image is pushed to the local | |
| registry | |
| * the almalinux image is additionally tagged as the default release image. | |
| ## Using persistent volumes | |
| Use docker persistent volumes to keep Gerrit data across restarts. | |
| Below is a sample `docker-compose.yaml` with externally-mounted Lucene indexes, | |
| Caches and Git repositories. | |
| ```yaml | |
| version: '3' | |
| services: | |
| gerrit: | |
| image: docker.io/gerritcodereview/gerrit | |
| volumes: | |
| - git-volume:/var/gerrit/git | |
| - index-volume:/var/gerrit/index | |
| - cache-volume:/var/gerrit/cache | |
| ports: | |
| - "29418:29418" | |
| - "8080:8080" | |
| volumes: | |
| git-volume: | |
| index-volume: | |
| cache-volume: | |
| ``` | |
| Run `docker compose up` (or `docker-compose up` with older versions of | |
| Docker) to trigger the build and execution of your container. | |
| Note that the path `/var/gerrit/etc` may also be externally-mounted. If this is done, then | |
| the config file `/var/gerrit/etc/gerrit.config` initialized by the Gerrit DEB/RPM | |
| package inside the container will no longer be available. If gerrit does not find an existing | |
| `gerrit.config` file under the externally-mounted path, then it generates a new one. However, the | |
| newly generated config file does not provide the same first-run behaviour as the one from the | |
| DEB/RPM package (the out-of-the-box plugin is not configured, and the introductory screen of | |
| the plugin-manager will not appear). | |
| ## Environment variables | |
| This is a list of available environment variables to change the Gerrit configuration: | |
| * `CANONICAL_WEB_URL`: Optional. Set the `gerrit.canonicalWebUrl` parameter in `gerrit.config`. | |
| Defaults to `http://<image_hostname>` | |
| * `HTTPD_LISTEN_URL`: Optional. Override the `httpd.listenUrl` parameter in `gerrit.config`. | |
| ## Using Gerrit in production | |
| When running Gerrit on Docker in production, it is a good idea to rely on a physical external | |
| storage with much better performance and reliability than the Docker's internal AUFS, and an external | |
| configuration directory (`etc`) for better change management traceability. Additionally, | |
| you may want to use a proper external authentication (e.g. ldap). | |
| A more advanced `docker-compose.yaml` example is given below, which uses OpenLDAP | |
| (published by Osixia on Docker Hub). The example assumes you have an external directory | |
| available as `/external/gerrit` | |
| ```yaml | |
| version: '3' | |
| services: | |
| gerrit: | |
| image: docker.io/gerritcodereview/gerrit | |
| ports: | |
| - "29418:29418" | |
| - "80:8080" | |
| depends_on: | |
| - ldap | |
| volumes: | |
| - /external/gerrit/etc:/var/gerrit/etc | |
| - /external/gerrit/git:/var/gerrit/git | |
| - /external/gerrit/db:/var/gerrit/db | |
| - /external/gerrit/index:/var/gerrit/index | |
| - /external/gerrit/cache:/var/gerrit/cache | |
| environment: | |
| - CANONICAL_WEB_URL=http://localhost | |
| # command: init | |
| ldap: | |
| image: docker.io/osixia/openldap | |
| ports: | |
| - "389:389" | |
| - "636:636" | |
| environment: | |
| - LDAP_ADMIN_PASSWORD=secret | |
| volumes: | |
| - /external/gerrit/ldap/var:/var/lib/ldap | |
| - /external/gerrit/ldap/etc:/etc/ldap/slapd.d | |
| ldap-admin: | |
| image: docker.io/osixia/phpldapadmin | |
| ports: | |
| - "6443:443" | |
| environment: | |
| - PHPLDAPADMIN_LDAP_HOSTS=ldap | |
| ``` | |
| Example of `/external/gerrit/etc/gerrit.config` | |
| ``` | |
| [gerrit] | |
| basePath = git | |
| [index] | |
| type = LUCENE | |
| [auth] | |
| type = ldap | |
| gitBasicAuth = true | |
| [ldap] | |
| server = ldap://ldap | |
| username=cn=admin,dc=example,dc=org | |
| accountBase = dc=example,dc=org | |
| accountPattern = (&(objectClass=person)(uid=${username})) | |
| accountFullName = displayName | |
| accountEmailAddress = mail | |
| [sendemail] | |
| smtpServer = localhost | |
| [sshd] | |
| listenAddress = *:29418 | |
| [httpd] | |
| listenUrl = http://*:8080/ | |
| [cache] | |
| directory = cache | |
| [container] | |
| user = root | |
| ``` | |
| Example of `/external/gerrit/etc/secure.config` | |
| ``` | |
| [ldap] | |
| password = secret | |
| ``` | |
| ### Initialize Gerrit DB and Git repositories with Docker | |
| The external filesystem needs to be initialized with gerrit.war beforehand: | |
| - All-Projects and All-Users Git repositories created in Gerrit | |
| - System Group UUIDs created in Git repositories | |
| The initialization can be done as a one-off operation before starting all containers. | |
| #### Step-1: Run Gerrit docker init setup from docker | |
| Uncomment the `command: init` option in `docker-compose.yaml` and run Gerrit with `docker compose` | |
| in foreground. | |
| ``` | |
| docker compose up gerrit | |
| ``` | |
| Wait until you see in the output the message `Initialized /var/gerrit` and then the container | |
| will exit. | |
| #### Step-2: Start Gerrit in daemon mode | |
| Comment out the `command: init` option in `docker-compose.yaml` and start all the nodes: | |
| ``` | |
| docker compose up -d | |
| ``` | |
| ### Registering users in OpenLDAP with PhpLdapAdmin | |
| The sample docker compose project includes a node with PhpLdapAdmin connected to OpenLDAP | |
| and exposed via Web UX at https://localhost:6443. | |
| The first user that logs in Gerrit is considered the initial administrator, it is important | |
| that you configure it on LDAP to login and having the ability to administer your Gerrit setup. | |
| #### Define the Gerrit administrator in OpenLDAP | |
| Login to PhpLdapAdmin using `cn=admin,dc=example,dc=org` as username and `secret` as password | |
| and then create a new child node of type "Courier Mail Account" for the Gerrit Administrator | |
| Example: | |
| - Given Name: Gerrit | |
| - Last Name: Admin | |
| - Common Name: Gerrit Admin | |
| - User ID: gerritadmin | |
| - Email: gerritadmin@localdomain | |
| - Password: secret | |
| Verify that your data is correct and then commit the changes to LDAP. | |
| #### Login to Gerrit as Administrator | |
| Login to Gerrit on http://localhost using the new Gerrit Admin credentials created on LDAP. | |
| Example: | |
| - Login: gerritadmin | |
| - Password: secret | |
| ## More information about Gerrit Code Review | |
| Refer to Gerrit Documentation at http://localhost/Documentation/index.html for more information on | |
| how to configure, administer and use Gerrit Code Review. | |
| For a full list of Gerrit Code Review resources, refer to the [Gerrit Code Review home page](https://www.gerritcodereview.com) |