xref: /OpenGrok/docker/README.md (revision b84dfa7658ea336b31276c2839789749527551ca)
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