11106ade6SVladimir Kotal# A Docker container for OpenGrok 21106ade6SVladimir Kotal 31106ade6SVladimir Kotal## OpenGrok from official source 41106ade6SVladimir Kotal 51106ade6SVladimir KotalBuilt from official source: https://github.com/oracle/opengrok/releases/ 61106ade6SVladimir Kotal 71106ade6SVladimir KotalYou can learn more about OpenGrok at http://oracle.github.io/opengrok/ 81106ade6SVladimir Kotal 91106ade6SVladimir KotalThe container is available from DockerHub at https://hub.docker.com/r/opengrok/docker/ 101106ade6SVladimir Kotal 111106ade6SVladimir Kotal## When not to use it 121106ade6SVladimir Kotal 13a391beadSAdam HornacekThis image is simple wrapper around OpenGrok environment. It is basically a small appliance. The indexer and the web container are **not** tuned for large workloads. 14bc2f6de0SVladimir Kotal 151106ade6SVladimir KotalIf you happen to have one of the following: 1664c0a233SShenghan Gao 171106ade6SVladimir Kotal - large source data (e.g. [AOSP](https://en.wikipedia.org/wiki/Android_Open_Source_Project) or the like) 181106ade6SVladimir Kotal - stable service 191106ade6SVladimir Kotal - Source Code Management systems not supported in the image (e.g. Perforce, 201106ade6SVladimir Kotal Clearcase, etc.) 21bc2f6de0SVladimir Kotal - need for authentication/authorization 22703bf669SVladimir Kotal 23bc2f6de0SVladimir Kotalthen it is advisable to run OpenGrok standalone or construct your own Docker 241106ade6SVladimir Kotalimage based on the official one. 251106ade6SVladimir Kotal 26f70822c2SVladimir Kotal## Additional info about the image 271106ade6SVladimir Kotal 28fe0c622fSAdam Hornacek* Tomcat 10 291c8c7ecbSVladimir Kotal* JRE 11 301106ade6SVladimir Kotal* Configurable mirroring/reindexing (default every 10 min) 311106ade6SVladimir Kotal 321106ade6SVladimir KotalThe mirroring step works by going through all projects and attempting to 33499a02c9S45hvnLsynchronize all its repositories (e.g. it will do `git pull --ff-only` for Git 341106ade6SVladimir Kotalrepositories). 351106ade6SVladimir Kotal 364810eb96SVladimir KotalProjects are enabled in this setup by default. See environment variables 374810eb96SVladimir Kotalbelow on how to change that. 38d7281829SVladimir Kotal 39ab135123SVladimir Kotal### Indexer logs 40ab135123SVladimir Kotal 411106ade6SVladimir KotalThe indexer/mirroring is set so that it does not log into files. 421106ade6SVladimir KotalRather, everything goes to standard (error) output. To see how the indexer 431106ade6SVladimir Kotalis doing, use the `docker logs` command. 441106ade6SVladimir Kotal 4584ed967bSVladimir Kotal### Source Code Management systems supported 4684ed967bSVladimir Kotal 4784ed967bSVladimir Kotal- Mercurial 4884ed967bSVladimir Kotal- Git 4984ed967bSVladimir Kotal- Subversion 5084ed967bSVladimir Kotal 51f70822c2SVladimir Kotal### Tags and versioning 52f70822c2SVladimir Kotal 53eea6103dSVladimir KotalEach OpenGrok release triggers creation of new Docker image. 54eea6103dSVladimir Kotal 55eea6103dSVladimir Kotal| Tag | Note | 56eea6103dSVladimir Kotal| -------- |:--------------------------------------------------------| 57*0ddc7958SVladimir Kotal| `master` | corresponds to the latest commit in the OpenGrok repo | 58*0ddc7958SVladimir Kotal| `latest` | tracks the latest [released version](https://github.com/oracle/opengrok/releases) | 59eea6103dSVladimir Kotal| `x.y.z` | if you want to pin against a specific version | 60eea6103dSVladimir Kotal| `x.y` | stay on micro versions to avoid reindexing from scratch | 61f70822c2SVladimir Kotal 62*0ddc7958SVladimir KotalIf you want to stay on the bleeding edge, use the `opengrok/docker:master` image which is automatically refreshed whenever a commit is made to the OpenGrok source code repository. This allows to track the development. After all, this is what http://demo.opengrok.org/ is running. 63*0ddc7958SVladimir Kotal 64*0ddc7958SVladimir KotalFor other use cases, stick to the other image tags. 65*0ddc7958SVladimir Kotal 661106ade6SVladimir Kotal## How to run 671106ade6SVladimir Kotal 681106ade6SVladimir Kotal### From DockerHub 691106ade6SVladimir Kotal 701106ade6SVladimir Kotal docker run -d -v <path/to/your/src>:/opengrok/src -p 8080:8080 opengrok/docker:latest 711106ade6SVladimir Kotal 721106ade6SVladimir KotalThe container exports ports 8080 for OpenGrok. 731106ade6SVladimir Kotal 741106ade6SVladimir KotalThe volume mounted to `/opengrok/src` should contain the projects you want to make searchable (in sub directories). You can use common revision control checkouts (git, svn, etc...) and OpenGrok will make history and blame information available. 751106ade6SVladimir Kotal 76941332aaSVladimir Kotal## Directories 77941332aaSVladimir Kotal 78941332aaSVladimir KotalThe image contains these directories: 79941332aaSVladimir Kotal 80941332aaSVladimir Kotal| Directory | Description | 81941332aaSVladimir Kotal| --------- | ----------- | 82941332aaSVladimir Kotal`/opengrok/etc` | stores the configuration for both web app and indexer 83941332aaSVladimir Kotal`/opengrok/data` | data root - index data 84941332aaSVladimir Kotal`/opengrok/src` | source root - input data 85941332aaSVladimir Kotal`/scripts` | startup script and top level configuration. Do not override unless debugging. 86941332aaSVladimir Kotal 8715936b04SVladimir Kotal## Environment Variables 881106ade6SVladimir Kotal 89e2dc7a48SVladimir Kotal| Docker Environment Var. | Default value | Description | 90e2dc7a48SVladimir Kotal| ----------------------- | ------------- | ----------- | 91b531e965SVladimir Kotal`SYNC_PERIOD_MINUTES` | 10 | Period of automatic synchronization (i.e. mirroring + reindexing) in minutes. Setting to `0` will disable periodic syncing (the sync after container startup will still be done). 927ee480e4SVladimir Kotal`INDEXER_OPT` | empty | pass **extra** options to OpenGrok Indexer. The default set of indexer options is: `--remote on -P -H -W`. For example, `-i d:vendor` will remove all the `*/vendor/*` files from the index. You can check the indexer options on https://github.com/oracle/opengrok/wiki/Python-scripts-transition-guide 93e2dc7a48SVladimir Kotal`NOMIRROR` | empty | To avoid the mirroring step, set the variable to non-empty value. 94e2dc7a48SVladimir Kotal`URL_ROOT` | `/` | Override the sub-URL that OpenGrok should run on. 954810eb96SVladimir Kotal`WORKERS` | number of CPUs in the container | number of workers to use for syncing (applies only to setup with projects enabled) 96941332aaSVladimir Kotal`AVOID_PROJECTS` | empty | run in project less configuration. Set to non empty value disables projects. Also disables repository synchronization. 97f1835fddSVladimir Kotal`REST_PORT` | 5000 | TCP port where simple REST app listens for GET requests on `/reindex` to trigger manual reindex. 98f1835fddSVladimir Kotal`REST_TOKEN` | None | if set, the REST app will require this token as Bearer token in order to trigger reindex. 99b9361335SVladimir Kotal`READONLY_CONFIG_FILE` | None | if set, the configuration will be merged with configuration from this file. This is run when the container starts. 100f750ae73SVladimir Kotal`CHECK_INDEX` | None | if set, the format of the index will be checked first. **If the index is not compatible with the currently running version, the data root will be wiped out and reindex from scratch will be performed.** 1011106ade6SVladimir Kotal 1023d5852a4SVladimir KotalTo specify environment variable for `docker run`, use the `-e` option, e.g. `-e SYNC_PERIOD_MINUTES=30` 1031106ade6SVladimir Kotal 104c0e6959dSVladimir Kotal## Repository synchronization 105c0e6959dSVladimir Kotal 106c0e6959dSVladimir KotalTo get more control over repository synchronization (enabled only when projects 107c0e6959dSVladimir Kotalare enabled), the `/opengrok/etc/mirror.yml` configuration file can be modified 108c0e6959dSVladimir Kotalas per the https://github.com/oracle/opengrok/wiki/Repository-synchronization 109c0e6959dSVladimir Kotalwiki. 110c0e6959dSVladimir Kotal 1111106ade6SVladimir Kotal## OpenGrok Web-Interface 1121106ade6SVladimir Kotal 1131106ade6SVladimir KotalThe container has OpenGrok as default web app installed (accessible directly from `/`). With the above container setup, you can find it running on 1141106ade6SVladimir Kotal 1151106ade6SVladimir Kotalhttp://localhost:8080/ 1161106ade6SVladimir Kotal 1171106ade6SVladimir KotalThe first reindex will take some time to finish. Subsequent reindex will be incremental so will take signigicantly less time. 1181106ade6SVladimir Kotal 11933551f14SVladimir Kotal## Using Docker compose 12033551f14SVladimir Kotal 12133551f14SVladimir Kotal[Docker-compose](https://docs.docker.com/compose/install/) example: 12233551f14SVladimir Kotal 12333551f14SVladimir Kotal```yaml 12433551f14SVladimir Kotalversion: "3" 12533551f14SVladimir Kotal 12633551f14SVladimir Kotal# More info at https://github.com/oracle/opengrok/docker/ 12733551f14SVladimir Kotalservices: 12833551f14SVladimir Kotal opengrok: 12933551f14SVladimir Kotal container_name: opengrok 13033551f14SVladimir Kotal image: opengrok/docker:latest 13133551f14SVladimir Kotal ports: 13233551f14SVladimir Kotal - "8080:8080/tcp" 13333551f14SVladimir Kotal environment: 1343d5852a4SVladimir Kotal SYNC_PERIOD_MINUTES: '60' 13533551f14SVladimir Kotal # Volumes store your data between container upgrades 13633551f14SVladimir Kotal volumes: 1373db23db2SVladimir Kotal - '~/opengrok/src/:/opengrok/src/' # source code 1383db23db2SVladimir Kotal - '~/opengrok/etc/:/opengrok/etc/' # folder contains configuration.xml 1393db23db2SVladimir Kotal - '~/opengrok/data/:/opengrok/data/' # index and other things for source code 14033551f14SVladimir Kotal``` 14133551f14SVladimir Kotal 14233551f14SVladimir KotalSave the file into `docker-compose.yml` and then simply run 14333551f14SVladimir Kotal 14433551f14SVladimir Kotal docker-compose up -d 14533551f14SVladimir Kotal 14633551f14SVladimir KotalEquivalent `docker run` command would look like this: 14733551f14SVladimir Kotal 14833551f14SVladimir Kotal```bash 14933551f14SVladimir Kotaldocker run -d \ 15033551f14SVladimir Kotal --name opengrok \ 15133551f14SVladimir Kotal -p 8080:8080/tcp \ 1523d5852a4SVladimir Kotal -e SYNC_PERIOD_MINUTES="60" \ 1530b7e6c83SAdam Hornáček -v ~/opengrok-src/:/opengrok/src/ \ 1540b7e6c83SAdam Hornáček -v ~/opengrok-etc/:/opengrok/etc/ \ 1550b7e6c83SAdam Hornáček -v ~/opengrok-data/:/opengrok/data/ \ 15633551f14SVladimir Kotal opengrok/docker:latest 15733551f14SVladimir Kotal``` 15833551f14SVladimir Kotal 15933551f14SVladimir Kotal## Build image locally 1601106ade6SVladimir Kotal 1611106ade6SVladimir KotalIf you want to do your own development, you can build the image yourself: 1621106ade6SVladimir Kotal 163b3440527SVladimir Kotal git clone https://github.com/oracle/opengrok.git 164b3440527SVladimir Kotal cd opengrok 1651106ade6SVladimir Kotal docker build -t opengrok-dev . 1661106ade6SVladimir Kotal 1671106ade6SVladimir KotalThen run the container: 1681106ade6SVladimir Kotal 1691106ade6SVladimir Kotal docker run -d -v <path/to/your/src>:/opengrok/src -p 8080:8080 opengrok-dev 1701106ade6SVladimir Kotal 1711106ade6SVladimir Kotal## Inspecting the container 1721106ade6SVladimir Kotal 1731106ade6SVladimir KotalYou can get inside a container using the [command below](https://docs.docker.com/engine/reference/commandline/exec/): 1741106ade6SVladimir Kotal 17564c0a233SShenghan Gao```bash 1761106ade6SVladimir Kotaldocker exec -it <container> bash 1771106ade6SVladimir Kotal``` 1781106ade6SVladimir Kotal 1791106ade6SVladimir KotalEnjoy. 180