This is page 12 of 25. Use http://codebase.md/id/docs/get_started/create/presentation_layout.html?lines=true&page={x} to view the full context.
# Directory Structure
```
├── .ci
│ ├── check-markdownfmt.sh
│ ├── check-metadata.sh
│ ├── check-pr-no-readme.sh
│ ├── check-required-files.sh
│ ├── check-short.sh
│ ├── check-ymlfmt.sh
│ └── get-markdownfmt.sh
├── .common-templates
│ ├── maintainer-community.md
│ ├── maintainer-docker.md
│ ├── maintainer-hashicorp.md
│ └── maintainer-influxdata.md
├── .dockerignore
├── .github
│ └── workflows
│ └── ci.yml
├── .template-helpers
│ ├── arches.sh
│ ├── autogenerated-warning.md
│ ├── compose.md
│ ├── generate-dockerfile-links-partial.sh
│ ├── generate-dockerfile-links-partial.tmpl
│ ├── get-help.md
│ ├── issues.md
│ ├── license-common.md
│ ├── template.md
│ ├── variant-alpine.md
│ ├── variant-default-buildpack-deps.md
│ ├── variant-default-debian.md
│ ├── variant-default-ubuntu.md
│ ├── variant-onbuild.md
│ ├── variant-slim.md
│ ├── variant-windowsservercore.md
│ ├── variant.md
│ └── variant.sh
├── adminer
│ ├── compose.yaml
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── aerospike
│ ├── content.md
│ ├── github-repo
│ ├── issues.md
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── almalinux
│ ├── content.md
│ ├── github-repo
│ ├── issues.md
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── alpine
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── alt
│ ├── content.md
│ ├── github-repo
│ ├── issues.md
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── amazoncorretto
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── amazonlinux
│ ├── content.md
│ ├── github-repo
│ ├── issues.md
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── api-firewall
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.svg
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── arangodb
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── archlinux
│ ├── content.md
│ ├── github-repo
│ ├── issues.md
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── backdrop
│ ├── compose.yaml
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── bash
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── bonita
│ ├── compose.yaml
│ ├── content.md
│ ├── get-help.md
│ ├── github-repo
│ ├── issues.md
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── buildpack-deps
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── busybox
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ ├── README.md
│ ├── variant-glibc.md
│ ├── variant-musl.md
│ ├── variant-uclibc.md
│ └── variant.md
├── caddy
│ ├── content.md
│ ├── get-help.md
│ ├── github-repo
│ ├── license.md
│ ├── logo-120.png
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── cassandra
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── chronograf
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── cirros
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── clearlinux
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── clefos
│ ├── content.md
│ ├── deprecated.md
│ ├── github-repo
│ ├── issues.md
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── clickhouse
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.svg
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── clojure
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── composer
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── convertigo
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── couchbase
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── couchdb
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── crate
│ ├── content.md
│ ├── get-help.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.svg
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── dart
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.svg
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── debian
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ ├── README.md
│ ├── variant-slim.md
│ └── variant.md
├── docker
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ ├── README.md
│ ├── variant-rootless.md
│ └── variant-windowsservercore.md
├── Dockerfile
├── drupal
│ ├── compose.yaml
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.svg
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ ├── README.md
│ └── variant-fpm.md
├── eclipse-mosquitto
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── eclipse-temurin
│ ├── content.md
│ ├── get-help.md
│ ├── github-repo
│ ├── issues.md
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── eggdrop
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── elasticsearch
│ ├── compose.yaml
│ ├── content.md
│ ├── get-help.md
│ ├── github-repo
│ ├── issues.md
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ ├── README.md
│ └── variant-alpine.md
├── elixir
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── emqx
│ ├── content.md
│ ├── get-help.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.svg
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── erlang
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── fedora
│ ├── content.md
│ ├── github-repo
│ ├── issues.md
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── flink
│ ├── content.md
│ ├── get-help.md
│ ├── github-repo
│ ├── issues.md
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── fluentd
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── friendica
│ ├── compose.yaml
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.svg
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── gazebo
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── gcc
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── generate-repo-stub-readme.sh
├── geonetwork
│ ├── compose.yaml
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ ├── README.md
│ ├── variant-postgres.md
│ └── variant.md
├── get-categories.sh
├── ghost
│ ├── compose.yaml
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── golang
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ ├── README.md
│ ├── variant-alpine.md
│ └── variant-tip.md
├── gradle
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── groovy
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── haproxy
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── haskell
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ ├── README.md
│ └── variant-slim.md
├── haxe
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── hello-world
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ ├── README.md
│ └── update.sh
├── hitch
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── httpd
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── hylang
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── ibm-semeru-runtimes
│ ├── content.md
│ ├── github-repo
│ ├── issues.md
│ ├── license.md
│ ├── logo.svg
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── ibmjava
│ ├── content.md
│ ├── get-help.md
│ ├── github-repo
│ ├── issues.md
│ ├── license.md
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── influxdb
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ ├── README.md
│ ├── variant-data.md
│ └── variant-meta.md
├── irssi
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── jetty
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── joomla
│ ├── compose.yaml
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── jruby
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── julia
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── kapacitor
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── kibana
│ ├── compose.yaml
│ ├── content.md
│ ├── get-help.md
│ ├── github-repo
│ ├── issues.md
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── kong
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── krakend
│ ├── content.md
│ ├── get-help.md
│ ├── github-repo
│ ├── license.md
│ ├── logo-120.png
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── LICENSE
├── lightstreamer
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── liquibase
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── logstash
│ ├── content.md
│ ├── get-help.md
│ ├── github-repo
│ ├── issues.md
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ ├── README.md
│ └── variant-alpine.md
├── mageia
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── mariadb
│ ├── compose.yaml
│ ├── content.md
│ ├── get-help.md
│ ├── github-repo
│ ├── issues.md
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── markdownfmt.sh
├── matomo
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── maven
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── mediawiki
│ ├── compose.yaml
│ ├── content.md
│ ├── github-repo
│ ├── issues.md
│ ├── license.md
│ ├── logo.svg
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── memcached
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── metadata.json
├── metadata.sh
├── mongo
│ ├── compose.yaml
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── mongo-express
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── monica
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.svg
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── mono
│ ├── content.md
│ ├── deprecated.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── mysql
│ ├── compose.yaml
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── nats
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── neo4j
│ ├── content.md
│ ├── get-help.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── neurodebian
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── nextcloud
│ ├── content.md
│ ├── deprecated.md
│ ├── github-repo
│ ├── license.md
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── nginx
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ ├── README.md
│ └── variant-perl.md
├── node
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── notary
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── odoo
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── open-liberty
│ ├── content.md
│ ├── get-help.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── openjdk
│ ├── content.md
│ ├── deprecated.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ ├── README.md
│ ├── variant-alpine.md
│ ├── variant-oracle.md
│ └── variant-slim.md
├── oraclelinux
│ ├── content.md
│ ├── get-help.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ ├── README.md
│ └── variant-slim.md
├── orientdb
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── parallel-update.sh
├── percona
│ ├── compose.yaml
│ ├── content.md
│ ├── github-repo
│ ├── issues.md
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── perl
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── photon
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── php
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ ├── README.md
│ ├── variant-apache.md
│ ├── variant-cli.md
│ ├── variant-fpm.md
│ └── variant.md
├── php-zendserver
│ ├── content.md
│ ├── deprecated.md
│ ├── github-repo
│ ├── issues.md
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── phpmyadmin
│ ├── compose.yaml
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── plone
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.svg
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── postfixadmin
│ ├── compose.yaml
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ ├── README.md
│ ├── variant-apache.md
│ ├── variant-fpm-alpine.md
│ └── variant-fpm.md
├── postgres
│ ├── compose.yaml
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── push.pl
├── push.sh
├── pypy
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── python
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ ├── README.md
│ └── variant-slim.md
├── r-base
│ ├── content.md
│ ├── github-repo
│ ├── issues.md
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── rabbitmq
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── rakudo-star
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── README.md
├── redis
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── redmine
│ ├── compose.yaml
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── registry
│ ├── content.md
│ ├── get-help.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── rethinkdb
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── rocket.chat
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.svg
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── rockylinux
│ ├── content.md
│ ├── github-repo
│ ├── issues.md
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── ros
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── ruby
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── rust
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── sapmachine
│ ├── content.md
│ ├── get-help.md
│ ├── github-repo
│ ├── issues.md
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── satosa
│ ├── content.md
│ ├── get-help.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.svg
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── scratch
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── silverpeas
│ ├── content.md
│ ├── get-help.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── solr
│ ├── content.md
│ ├── get-help.md
│ ├── github-repo
│ ├── issues.md
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── sonarqube
│ ├── content.md
│ ├── get-help.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── spark
│ ├── content.md
│ ├── get-help.md
│ ├── github-repo
│ ├── issues.md
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── spiped
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── storm
│ ├── compose.yaml
│ ├── content.md
│ ├── get-help.md
│ ├── github-repo
│ ├── issues.md
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── swift
│ ├── content.md
│ ├── get-help.md
│ ├── github-repo
│ ├── issues.md
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── swipl
│ ├── content.md
│ ├── get-help.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── teamspeak
│ ├── compose.yaml
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── telegraf
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── tomcat
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── tomee
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── traefik
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ ├── README.md
│ └── variant-alpine.md
├── ubuntu
│ ├── content.md
│ ├── github-repo
│ ├── issues.md
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── unit
│ ├── content.md
│ ├── get-help.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.svg
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── update.sh
├── varnish
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── websphere-liberty
│ ├── content.md
│ ├── get-help.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── wordpress
│ ├── compose.yaml
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ ├── README.md
│ ├── variant-cli.md
│ └── variant-fpm.md
├── xwiki
│ ├── content.md
│ ├── get-help.md
│ ├── github-repo
│ ├── issues.md
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ └── README.md
├── ymlfmt.sh
├── yourls
│ ├── compose.yaml
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.svg
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ ├── README.md
│ └── variant-fpm.md
├── znc
│ ├── content.md
│ ├── github-repo
│ ├── license.md
│ ├── logo.png
│ ├── maintainer.md
│ ├── metadata.json
│ ├── README-short.txt
│ ├── README.md
│ └── variant-slim.md
└── zookeeper
├── compose.yaml
├── content.md
├── github-repo
├── license.md
├── logo.png
├── maintainer.md
├── metadata.json
├── README-short.txt
└── README.md
```
# Files
--------------------------------------------------------------------------------
/websphere-liberty/README.md:
--------------------------------------------------------------------------------
```markdown
1 | <!--
2 |
3 | ********************************************************************************
4 |
5 | WARNING:
6 |
7 | DO NOT EDIT "websphere-liberty/README.md"
8 |
9 | IT IS AUTO-GENERATED
10 |
11 | (from the other files in "websphere-liberty/" combined with a set of templates)
12 |
13 | ********************************************************************************
14 |
15 | -->
16 |
17 | # Quick reference
18 |
19 | - **Maintained by**:
20 | [the IBM WASdev Community](https://github.com/WASdev/ci.docker)
21 |
22 | - **Where to get help**:
23 | [the WASdev community](https://developer.ibm.com/wasdev/help/)
24 |
25 | # Supported tags and respective `Dockerfile` links
26 |
27 | - [`kernel`, `kernel-java8-ibmjava`](https://github.com/WASdev/ci.docker/blob/39ee1440e2dc942c6978eb56f2ae09a2213218dd/ga/latest/kernel/Dockerfile.ubuntu.ibmjava8)
28 |
29 | - [`kernel-java11-openj9`](https://github.com/WASdev/ci.docker/blob/39ee1440e2dc942c6978eb56f2ae09a2213218dd/ga/latest/kernel/Dockerfile.ubuntu.openjdk11)
30 |
31 | - [`kernel-java17-openj9`](https://github.com/WASdev/ci.docker/blob/39ee1440e2dc942c6978eb56f2ae09a2213218dd/ga/latest/kernel/Dockerfile.ubuntu.openjdk17)
32 |
33 | - [`full`, `latest`, `full-java8-ibmjava`](https://github.com/WASdev/ci.docker/blob/39ee1440e2dc942c6978eb56f2ae09a2213218dd/ga/latest/full/Dockerfile.ubuntu.ibmjava8)
34 |
35 | - [`full-java11-openj9`](https://github.com/WASdev/ci.docker/blob/39ee1440e2dc942c6978eb56f2ae09a2213218dd/ga/latest/full/Dockerfile.ubuntu.openjdk11)
36 |
37 | - [`full-java17-openj9`](https://github.com/WASdev/ci.docker/blob/39ee1440e2dc942c6978eb56f2ae09a2213218dd/ga/latest/full/Dockerfile.ubuntu.openjdk17)
38 |
39 | - [`24.0.0.12-kernel-java8-ibmjava`](https://github.com/WASdev/ci.docker/blob/39ee1440e2dc942c6978eb56f2ae09a2213218dd/ga/24.0.0.12/kernel/Dockerfile.ubuntu.ibmjava8)
40 |
41 | - [`24.0.0.12-kernel-java11-openj9`](https://github.com/WASdev/ci.docker/blob/39ee1440e2dc942c6978eb56f2ae09a2213218dd/ga/24.0.0.12/kernel/Dockerfile.ubuntu.openjdk11)
42 |
43 | - [`24.0.0.12-kernel-java17-openj9`](https://github.com/WASdev/ci.docker/blob/39ee1440e2dc942c6978eb56f2ae09a2213218dd/ga/24.0.0.12/kernel/Dockerfile.ubuntu.openjdk17)
44 |
45 | - [`24.0.0.12-full-java8-ibmjava`](https://github.com/WASdev/ci.docker/blob/39ee1440e2dc942c6978eb56f2ae09a2213218dd/ga/24.0.0.12/full/Dockerfile.ubuntu.ibmjava8)
46 |
47 | - [`24.0.0.12-full-java11-openj9`](https://github.com/WASdev/ci.docker/blob/39ee1440e2dc942c6978eb56f2ae09a2213218dd/ga/24.0.0.12/full/Dockerfile.ubuntu.openjdk11)
48 |
49 | - [`24.0.0.12-full-java17-openj9`](https://github.com/WASdev/ci.docker/blob/39ee1440e2dc942c6978eb56f2ae09a2213218dd/ga/24.0.0.12/full/Dockerfile.ubuntu.openjdk17)
50 |
51 | - [`25.0.0.3-kernel-java8-ibmjava`](https://github.com/WASdev/ci.docker/blob/39ee1440e2dc942c6978eb56f2ae09a2213218dd/ga/25.0.0.3/kernel/Dockerfile.ubuntu.ibmjava8)
52 |
53 | - [`25.0.0.3-kernel-java11-openj9`](https://github.com/WASdev/ci.docker/blob/39ee1440e2dc942c6978eb56f2ae09a2213218dd/ga/25.0.0.3/kernel/Dockerfile.ubuntu.openjdk11)
54 |
55 | - [`25.0.0.3-kernel-java17-openj9`](https://github.com/WASdev/ci.docker/blob/39ee1440e2dc942c6978eb56f2ae09a2213218dd/ga/25.0.0.3/kernel/Dockerfile.ubuntu.openjdk17)
56 |
57 | - [`25.0.0.3-full-java8-ibmjava`](https://github.com/WASdev/ci.docker/blob/39ee1440e2dc942c6978eb56f2ae09a2213218dd/ga/25.0.0.3/full/Dockerfile.ubuntu.ibmjava8)
58 |
59 | - [`25.0.0.3-full-java11-openj9`](https://github.com/WASdev/ci.docker/blob/39ee1440e2dc942c6978eb56f2ae09a2213218dd/ga/25.0.0.3/full/Dockerfile.ubuntu.openjdk11)
60 |
61 | - [`25.0.0.3-full-java17-openj9`](https://github.com/WASdev/ci.docker/blob/39ee1440e2dc942c6978eb56f2ae09a2213218dd/ga/25.0.0.3/full/Dockerfile.ubuntu.openjdk17)
62 |
63 | - [`25.0.0.4-kernel-java8-ibmjava`](https://github.com/WASdev/ci.docker/blob/39ee1440e2dc942c6978eb56f2ae09a2213218dd/ga/25.0.0.4/kernel/Dockerfile.ubuntu.ibmjava8)
64 |
65 | - [`25.0.0.4-kernel-java11-openj9`](https://github.com/WASdev/ci.docker/blob/39ee1440e2dc942c6978eb56f2ae09a2213218dd/ga/25.0.0.4/kernel/Dockerfile.ubuntu.openjdk11)
66 |
67 | - [`25.0.0.4-kernel-java17-openj9`](https://github.com/WASdev/ci.docker/blob/39ee1440e2dc942c6978eb56f2ae09a2213218dd/ga/25.0.0.4/kernel/Dockerfile.ubuntu.openjdk17)
68 |
69 | - [`25.0.0.4-full-java8-ibmjava`](https://github.com/WASdev/ci.docker/blob/39ee1440e2dc942c6978eb56f2ae09a2213218dd/ga/25.0.0.4/full/Dockerfile.ubuntu.ibmjava8)
70 |
71 | - [`25.0.0.4-full-java11-openj9`](https://github.com/WASdev/ci.docker/blob/39ee1440e2dc942c6978eb56f2ae09a2213218dd/ga/25.0.0.4/full/Dockerfile.ubuntu.openjdk11)
72 |
73 | - [`25.0.0.4-full-java17-openj9`](https://github.com/WASdev/ci.docker/blob/39ee1440e2dc942c6978eb56f2ae09a2213218dd/ga/25.0.0.4/full/Dockerfile.ubuntu.openjdk17)
74 |
75 | # Quick reference (cont.)
76 |
77 | - **Where to file issues**:
78 | [https://github.com/WASdev/ci.docker/issues](https://github.com/WASdev/ci.docker/issues?q=)
79 |
80 | - **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64))
81 | [`amd64`](https://hub.docker.com/r/amd64/websphere-liberty/), [`arm64v8`](https://hub.docker.com/r/arm64v8/websphere-liberty/), [`ppc64le`](https://hub.docker.com/r/ppc64le/websphere-liberty/), [`s390x`](https://hub.docker.com/r/s390x/websphere-liberty/)
82 |
83 | - **Published image artifact details**:
84 | [repo-info repo's `repos/websphere-liberty/` directory](https://github.com/docker-library/repo-info/blob/master/repos/websphere-liberty) ([history](https://github.com/docker-library/repo-info/commits/master/repos/websphere-liberty))
85 | (image metadata, transfer size, etc)
86 |
87 | - **Image updates**:
88 | [official-images repo's `library/websphere-liberty` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fwebsphere-liberty)
89 | [official-images repo's `library/websphere-liberty` file](https://github.com/docker-library/official-images/blob/master/library/websphere-liberty) ([history](https://github.com/docker-library/official-images/commits/master/library/websphere-liberty))
90 |
91 | - **Source of this description**:
92 | [docs repo's `websphere-liberty/` directory](https://github.com/docker-library/docs/tree/master/websphere-liberty) ([history](https://github.com/docker-library/docs/commits/master/websphere-liberty))
93 |
94 | # Overview
95 |
96 | All of the images in this repository use Ubuntu as the Operating System. For variants that use the Universal Base Image, please see [this repository](https://hub.docker.com/r/ibmcom/websphere-liberty/).
97 |
98 | For more information on these images please see our [GitHub repository](https://github.com/WASdev/ci.docker#container-images).
99 |
100 | # Image User
101 |
102 | This image runs by default with `USER 1001` (non-root), as part of group `0`. Please make sure you read below to set the appropriate folder and file permissions.
103 |
104 | ## Updating folder permissions
105 |
106 | All of the folders accessed by WebSphere Liberty have been given the appropriate permissions, but if your extending Dockerfile needs permission to another location you can simply temporarily switch into root and provide the needed permissions, example:
107 |
108 | ```dockerfile
109 | USER root
110 | RUN mkdir -p /myFolder && chown -R 1001:0 /myFolder
111 | USER 1001
112 | ```
113 |
114 | ## Updating file permissions
115 |
116 | You have to make sure that **all** the artifacts you are copying into the image (via `COPY` or `ADD`) have the correct permissions to be `read` and `executed` by user `1001` or group `0`, because the ownership of the file is changed to be `root:0` when transferring into the docker image.
117 |
118 | You have a few options for doing this: before copying the file, during copy, or after copy.
119 |
120 | ### Updating permissions before copying
121 |
122 | Since the ownership of the file will change to `root:0`, you can simply set the permissions for the owner's group to be able to read/execute the artifact (i.e. the middle digit of a `chmod` command). For example, you can do `chmod g+rx server.xml` to ensure your `server.xml` can be `read` and `executed` by group `0`, as well as any artifacts such as the application's `EAR` or `WAR` file, JDBC driver, or other files that are placed on the image via `COPY` or `ADD`.
123 |
124 | ### Updating permissions during copy
125 |
126 | If you're using Docker v17.09.0-ce and newer you can take advantage of the flag `--chown=<user>:<group>` during either `ADD` or `COPY`. For example: `COPY --chown=1001:0 jvm.options /config/jvm.options`. This is the preferred approach as you don't need to worry about changing permissions before calling `docker build` and you also do not duplicate layers in the resulting image.
127 |
128 | ### Updating permissions after copy
129 |
130 | If you need your Dockerfile to work with older versions of Docker CE and don't want to pre-process the permissions of the files you can temporarily switch into root to change the permissions of the needed files. For example:
131 |
132 | ```dockerfile
133 | USER root
134 | RUN chown 1001:0 /config/jvm.options
135 | RUN chown 1001:0 /output/resources/security/ltpa.keys
136 | USER 1001
137 | ```
138 |
139 | Please note that this pattern will duplicate the docker layers for those artifacts, which can heavily bloat your resulting docker image (depending on the size of the artifact). So it is recommended to set the permissions before or during copy.
140 |
141 | # Tags
142 |
143 | There are multiple tags available in this repository. The image with the tag `beta` contains the contents of the install archive for the latest monthly beta. The other images are all based on the latest generally available fix pack.
144 |
145 | The `kernel` image contains just the Liberty kernel and no additional runtime features. This image is the recommended basis for custom built images, so that they can contain only the features required for a specific application. For example, the following Dockerfile starts with this image, copies in the `server.xml` that lists the features required by the application, and then uses the `configure.sh` script to download those features from the online repository.
146 |
147 | ```dockerfile
148 | FROM websphere-liberty:kernel
149 | COPY --chown=1001:0 Sample1.war /config/dropins/
150 | COPY --chown=1001:0 server.xml /config/
151 | RUN configure.sh
152 | ```
153 |
154 | # Usage
155 |
156 | The images are designed to support a number of different usage patterns. The following examples are based on the Java EE8 Liberty [application deployment sample](https://developer.ibm.com/wasdev/docs/article_appdeployment/) and assume that [DefaultServletEngine.zip](https://github.com/WASdev/sample.servlet/releases/download/V1/DefaultServletEngine.zip) has been extracted to `/tmp` and the `server.xml` updated to accept HTTP connections from outside of the container by adding the following element inside the `server` stanza (if not using one of the pre-packaged `server.xml` files with our tags):
157 |
158 | ```xml
159 | <httpEndpoint host="*" httpPort="9080" httpsPort="-1"/>
160 | ```
161 |
162 | ## Application Image
163 |
164 | It is a very strong best practice to create an extending Docker image, we called it the `application image`, that encapsulates an application and its configuration. This creates a robust, self-contained and predictable Docker image that can span new containers upon request, without relying on volumes or other external runtime artifacts that may behave different over time.
165 |
166 | If you want to build the smallest possible WebSphere Liberty application image you can start with our `kernel` tag, add your artifacts, and run `configure.sh` to grow the set of features to be fit-for-purpose. Please see our [GitHub page](https://github.com/WASdev/ci.docker#building-an-application-image) for more details.
167 |
168 | ## Enabling Enterprise functionality
169 |
170 | The WebSphere Liberty images have a set of built-in XML snippets that enable and configure enterprise functionality such as session cache and monitoring. These are toggled by specific `ARG`s in your application image Dockerfile and configured via the `configure.sh` script. Please see the [instructions](https://github.com/wasdev/ci.docker#enterprise-functionality) on our GitHub page for more information.
171 |
172 | ## Using volumes for configuration
173 |
174 | This pattern can be useful for quick experiments / early development (i.e. `I just want to run the application as I iterate over it`), but should not be used for development scenarios that involve different teams and environments - for these cases the `Application Image` pattern described above is the way to go.
175 |
176 | When using `volumes`, an application file can be mounted in the `dropins` directory of this server and run. The following example starts a container in the background running a .WAR file from the host file system with the HTTP and HTTPS ports mapped to 80 and 443 respectively.
177 |
178 | ```console
179 | $ docker run -d -p 80:9080 -p 443:9443 \
180 | -v /tmp/DefaultServletEngine/dropins/Sample1.war:/config/dropins/Sample1.war \
181 | websphere-liberty:webProfile8
182 | ```
183 |
184 | When the server is started, you can browse to http://localhost/Sample1/SimpleServlet on the Docker host.
185 |
186 | Note: If you are using the boot2docker virtual machine on OS X or Windows, you need to get the IP of the virtual host by using the command `boot2docker ip` instead of by using localhost.
187 |
188 | For greater flexibility over configuration, it is possible to mount an entire server configuration directory from the host and then specify the server name as a parameter to the run command. Note: This particular example server configuration provides only HTTP access.
189 |
190 | ```console
191 | $ docker run -d -p 80:9080 \
192 | -v /tmp/DefaultServletEngine:/config \
193 | websphere-liberty:webProfile8
194 | ```
195 |
196 | # Using Spring Boot with WebSphere Liberty
197 |
198 | The `full` images introduce capabilities specific to the support of all Liberty features, including Spring Boot applications. This image thus includes the `springBootUtility` used to separate Spring Boot applications into thin applications and dependency library caches. To get these same capabilities without including features you are not using, build instead on top of `kernel` images and run configure.sh for your server.xml, ensuring that it enables either the `springBoot-1.5` or `springBoot-2.0` feature.
199 |
200 | To elaborate these capabilities this section assumes the standalone Spring Boot 2.0.x application `hellospringboot.jar` exists in the `/tmp` directory.
201 |
202 | 1. A Spring Boot application JAR deploys to the `dropins/spring` directory within the default server configuration, not the `dropins` directory. Liberty allows one Spring Boot application per server configuration. You can create a Spring Boot application layer over this image by adding the application JAR to the `dropins/spring` directory. In this example we copied `hellospringboot.jar` from `/tmp` to the same directory containing the following Dockerfile.
203 |
204 | ```dockerfile
205 | FROM websphere-liberty:kernel
206 |
207 | COPY --chown=1001:0 hellospringboot.jar /config/dropins/spring/
208 | COPY --chown=1001:0 server.xml /config/
209 |
210 | RUN configure.sh
211 | ```
212 |
213 | The custom image can be built and run as follows.
214 |
215 | ```console
216 | $ docker build -t app .
217 | $ docker run -d -p 8080:9080 app
218 | ```
219 |
220 | 2. The `full` images provide the library cache directory, `lib.index.cache`, which contains an indexed library cache created by the `springBootUtility` command. Use `lib.index.cache` to provide the library cache for a thin application.
221 |
222 | You can use the `springBootUtility` command to create thin application and library cache layers over a `full` image. The following example uses docker staging to efficiently build an image that deploys a fat Spring Boot application as two layers containing a thin application and a library cache.
223 |
224 | ```dockerfile
225 | FROM websphere-liberty:kernel as staging
226 | COPY --chown=1001:0 hellospringboot.jar /staging/myFatApp.jar
227 | COPY --chown=1001:0 server.xml /config/
228 | RUN springBootUtility thin \
229 | --sourceAppPath=/staging/myFatApp.jar \
230 | --targetThinAppPath=/staging/myThinApp.jar \
231 | --targetLibCachePath=/staging/lib.index.cache
232 | FROM websphere-liberty:kernel
233 | COPY --chown=1001:0 server.xml /config
234 | COPY --from=staging /staging/lib.index.cache /lib.index.cache
235 | COPY --from=staging /staging/myThinApp.jar /config/dropins/spring/myThinApp.jar
236 | RUN configure.sh
237 | ```
238 |
239 | For Spring Boot applications packaged with library dependencies that rarely change across continuous application updates, you can use the capabilities mentioned above to to share library caches across containers and to create even more efficient docker layers that leverage the docker build cache.
240 |
241 | # Providing your own keystore/truststore
242 |
243 | By default, when a `websphere-liberty` image starts, a Liberty server XML snippet is generated in `/config/configDropins/defaults/keystore.xml` that specifies a `keyStore` stanza with a generated password. This causes Liberty to generate a default keystore and truststore with a self-signed certificate when it starts (see the [Knowledge Center](https://www.ibm.com/support/knowledgecenter/SSEQTP_liberty/com.ibm.websphere.wlp.doc/ae/rwlp_liberty_ssl_defaults.html) for more information). When providing your own keystore/truststore, this default behavior can be disabled by ensuring that a file already exists at `/config/configDropins/defaults/keystore.xml` (for example, added as part of your Docker build). This file can contain your keystore configuration or could just contain an empty `<server></server>` stanza.
244 |
245 | # Using IBM JRE Class data sharing
246 |
247 | The IBM JRE provides a feature [Class data sharing](http://www-01.ibm.com/support/knowledgecenter/SSYKE2_8.0.0/com.ibm.java.lnx.80.doc/diag/understanding/shared_classes.html) which offers transparent and dynamic sharing of data between multiple Java Virtual Machines running on the same host by using shared memory backed by a file. When running the Liberty Docker image, it looks for the file at `/opt/ibm/wlp/output/.classCache`. To benefit from Class data sharing, this location needs to be shared between containers either through the host or a data volume container.
248 |
249 | Taking the application image from example 3 above, containers can share the host file location (containing the shared cache) `/tmp/websphere-liberty/classCache` as follows:
250 |
251 | ```console
252 | docker run -d -p 80:9080 -p 443:9443 \
253 | -v /tmp/websphere-liberty/classCache:/opt/ibm/wlp/output/.classCache app
254 | ```
255 |
256 | Or, create a named data volume container that exposes a volume at the location of the shared file:
257 |
258 | ```console
259 | docker run -e LICENSE=accept -v /opt/ibm/wlp/output/.classCache \
260 | --name classcache websphere-liberty true
261 | ```
262 |
263 | Then, run the WebSphere Liberty image with the volumes from the data volume container classcache mounted as follows:
264 |
265 | ```console
266 | docker run -d -p 80:9080 -p 443:9443 --volumes-from classcache app
267 | ```
268 |
269 | # Running WebSphere Liberty in read-only mode
270 |
271 | Liberty writes to two different directories when running: `/opt/ibm/wlp/output` and `/logs`. In order to run the Liberty image in read-only mode these may be mounted as temporary file systems. If using the provided image, the keystore will be generated on initial start up in the server configuration. This means that the server configuration directory either needs to be read-write or the keystore will need to be built into the image. In the example command `/config` is mounted as a read-write volume.
272 |
273 | ```console
274 | docker run -d -p 80:9080 -p 443:9443 \
275 | --tmpfs /opt/ibm/wlp/output --tmpfs /logs -v /config --read-only \
276 | websphere-liberty:javaee8
277 | ```
278 |
279 | # Changing locale
280 |
281 | The base Ubuntu image does not include additional language packs. To use an alternative locale, build your own image that installs the required language pack and then sets the `LANG` environment variable. For example, the following Dockerfile starts with the `websphere-liberty:full` image, installs the Portuguese language pack, and sets Brazilian Portuguese as the default locale:
282 |
283 | ```dockerfile
284 | FROM websphere-liberty:full
285 | RUN apt-get update \
286 | && apt-get install -y language-pack-pt-base \
287 | && rm -rf /var/lib/apt/lists/*
288 | ENV LANG pt_BR.UTF-8
289 | ```
290 |
291 | # License
292 |
293 | The Dockerfiles and associated scripts are licensed under the [Apache License 2.0](http://www.apache.org/licenses/LICENSE-2.0.html).
294 |
295 | Starting with WebSphere Liberty 18.0.0.3, the WebSphere Liberty Docker images found in Docker Hub contain an International License Agreement for Non-Warranted Programs (ILAN) license which allows entitled WebSphere Liberty customers to use these same images under an International Program License Agreement (IPLA) term.
296 |
297 | For customers that still wish to apply a WebSphere Application Server license to their docker image can do so following [these instructions](https://github.com/WASdev/ci.docker/tree/master/ga/production-upgrade).
298 |
299 | As with all Docker images, these likely also contain other software which may be under other licenses (such as Bash, etc from the base distribution, along with any direct or indirect dependencies of the primary software being contained).
300 |
301 | Some additional license information which was able to be auto-detected might be found in [the `repo-info` repository's `websphere-liberty/` directory](https://github.com/docker-library/repo-info/tree/master/repos/websphere-liberty).
302 |
303 | As for any pre-built image usage, it is the image user's responsibility to ensure that any use of this image complies with any relevant licenses for all software contained within.
304 |
```
--------------------------------------------------------------------------------
/friendica/README.md:
--------------------------------------------------------------------------------
```markdown
1 | <!--
2 |
3 | ********************************************************************************
4 |
5 | WARNING:
6 |
7 | DO NOT EDIT "friendica/README.md"
8 |
9 | IT IS AUTO-GENERATED
10 |
11 | (from the other files in "friendica/" combined with a set of templates)
12 |
13 | ********************************************************************************
14 |
15 | -->
16 |
17 | # Quick reference
18 |
19 | - **Maintained by**:
20 | [nupplaPhil](https://github.com/friendica/docker)
21 |
22 | - **Where to get help**:
23 | [the Docker Community Slack](https://dockr.ly/comm-slack), [Server Fault](https://serverfault.com/help/on-topic), [Unix & Linux](https://unix.stackexchange.com/help/on-topic), or [Stack Overflow](https://stackoverflow.com/help/on-topic)
24 |
25 | # Supported tags and respective `Dockerfile` links
26 |
27 | - [`2024.12-apache`, `apache`, `stable-apache`, `2024.12`, `latest`, `stable`](https://github.com/friendica/docker/blob/e56a5124cbf9b88e01f0ebeab0b20d6dfeb25f10/2024.12/apache/Dockerfile)
28 |
29 | - [`2024.12-fpm`, `fpm`, `stable-fpm`](https://github.com/friendica/docker/blob/ae4df4f198515a27ab160bd3679cf91183a17cce/2024.12/fpm/Dockerfile)
30 |
31 | - [`2024.12-fpm-alpine`, `fpm-alpine`, `stable-fpm-alpine`](https://github.com/friendica/docker/blob/ae4df4f198515a27ab160bd3679cf91183a17cce/2024.12/fpm-alpine/Dockerfile)
32 |
33 | - [`2025.02-dev-apache`, `dev-apache`, `2025.02-dev`, `dev`](https://github.com/friendica/docker/blob/e56a5124cbf9b88e01f0ebeab0b20d6dfeb25f10/2025.02-dev/apache/Dockerfile)
34 |
35 | - [`2025.02-dev-fpm`, `dev-fpm`](https://github.com/friendica/docker/blob/ae4df4f198515a27ab160bd3679cf91183a17cce/2025.02-dev/fpm/Dockerfile)
36 |
37 | - [`2025.02-dev-fpm-alpine`, `dev-fpm-alpine`](https://github.com/friendica/docker/blob/ae4df4f198515a27ab160bd3679cf91183a17cce/2025.02-dev/fpm-alpine/Dockerfile)
38 |
39 | # Quick reference (cont.)
40 |
41 | - **Where to file issues**:
42 | [https://github.com/friendica/docker/issues](https://github.com/friendica/docker/issues?q=)
43 |
44 | - **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64))
45 | [`amd64`](https://hub.docker.com/r/amd64/friendica/), [`arm32v5`](https://hub.docker.com/r/arm32v5/friendica/), [`arm32v6`](https://hub.docker.com/r/arm32v6/friendica/), [`arm32v7`](https://hub.docker.com/r/arm32v7/friendica/), [`arm64v8`](https://hub.docker.com/r/arm64v8/friendica/), [`i386`](https://hub.docker.com/r/i386/friendica/), [`mips64le`](https://hub.docker.com/r/mips64le/friendica/), [`ppc64le`](https://hub.docker.com/r/ppc64le/friendica/), [`riscv64`](https://hub.docker.com/r/riscv64/friendica/), [`s390x`](https://hub.docker.com/r/s390x/friendica/)
46 |
47 | - **Published image artifact details**:
48 | [repo-info repo's `repos/friendica/` directory](https://github.com/docker-library/repo-info/blob/master/repos/friendica) ([history](https://github.com/docker-library/repo-info/commits/master/repos/friendica))
49 | (image metadata, transfer size, etc)
50 |
51 | - **Image updates**:
52 | [official-images repo's `library/friendica` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Ffriendica)
53 | [official-images repo's `library/friendica` file](https://github.com/docker-library/official-images/blob/master/library/friendica) ([history](https://github.com/docker-library/official-images/commits/master/library/friendica))
54 |
55 | - **Source of this description**:
56 | [docs repo's `friendica/` directory](https://github.com/docker-library/docs/tree/master/friendica) ([history](https://github.com/docker-library/docs/commits/master/friendica))
57 |
58 | # What is Friendica?
59 |
60 | Friendica is a decentralised communications platform that integrates social communication. Our platform links to independent social projects and corporate services.
61 |
62 | 
63 |
64 | # How to use this image
65 |
66 | The images are designed to be used in a micro-service environment. There are two types of the image you can choose from.
67 |
68 | The `apache` tag contains a full Friendica installation including an apache web server. It is designed to be easy to use and gets you running pretty fast. This is also the default for the `latest` tag and version tags that are not further specified.
69 |
70 | The second option is a `fpm` container. It is based on the [php-fpm](https://hub.docker.com/_/php/) image and runs a fastCGI-Process that serves your Friendica server. To use this image it must be combined with any Webserver that can proxy the http requests to the FastCGI-port of the container.
71 |
72 | ## Using the apache image
73 |
74 | You need at least one other mariadb/mysql-container to link it to Friendica.
75 |
76 | The apache image contains a webserver and exposes port 80. To start the container type:
77 |
78 | ```console
79 | $ docker run -d -p 8080:80 --network some-network friendica
80 | ```
81 |
82 | Now you can access the Friendica installation wizard at http://localhost:8080/ from your host system.
83 |
84 | ## Using the fpm image
85 |
86 | To use the fpm image you need an additional web server that can proxy http-request to the fpm-port of the container. For fpm connection this container exposes port 9000. In most cases you might want use another container or your host as proxy. If you use your host you can address your Friendica container directly on port 9000. If you use another container, make sure that you add them to the same docker network (via `docker run --network <NAME> ...` or a `compose.yaml` file). In both cases you don't want to map the fpm port to you host.
87 |
88 | ```console
89 | $ docker run -d friendica:fpm
90 | ```
91 |
92 | As the fastCGI-Process is not capable of serving static files (style sheets, images, ...) the webserver needs access to these files. This can be achieved with the `volumes-from` option. You can find more information in the Docker Compose section.
93 |
94 | ## Background tasks
95 |
96 | Friendica requires background tasks to fetch and send all kind of messages and maintain the complete instance. This setup is crucial for the Friendica node. There are two options to enable background tasks for Friendica:
97 |
98 | - Using the default Image and manually setup background tasks (see Friendica [Install](https://github.com/friendica/friendica/blob/2021.03-rc/doc/Install.md#required-background-tasks))
99 | - Using the default image (apache, fpm, fpm-alpine) and starting a dedicated `cron` instance and use `cron.sh` as startup command (like this [Example](https://github.com/friendica/docker/blob/stable/.examples/docker-compose/insecure/mariadb-cron-redis/apache/docker-compose.yml))
100 |
101 | ## Possible Environment Variables
102 |
103 | **Friendica Settings**
104 |
105 | - `FRIENDICA_URL` The Friendica complete URL including protocol, domain and subpath (example: https://friendica.local/sub/ ).
106 | - `FRIENDICA_TZ` The default localization of the Friendica server.
107 | - `FRIENDICA_LANG` The default language of the Friendica server.
108 | - `FRIENDICA_SITENAME` The Sitename of the Friendica server.
109 | - `FRIENDICA_NO_VALIDATION` If set to `true`, the URL and E-Mail validation will be disabled.
110 | - `FRIENDICA_DATA` Set the name of the storage provider (e.g `Filesystem` to use filesystem), default ist the DB backend.
111 | - `FRIENDICA_DATA_DIR` The data directory of the Friendica server (Default: /var/www/data).
112 | - `FRIENDICA_UPGRADE` Force starting the Friendica update even it's the same version (Default: `false`).
113 |
114 | **Friendica Logging**
115 |
116 | - `FRIENDICA_DEBUGGING` If set to `true`, the logging of Friendica is enabled.
117 | - `FRIENDICA_LOGFILE` (optional) The path to the logfile (Default: /var/www/friendica.log).
118 | - `FRIENDICA_LOGLEVEL` (optional) The loglevel to log (Default: notice).
119 | - `FRIENDICA_LOGGER` (optional) Set the type - stream, syslog, monolog (Default: stream).
120 | - `FRIENDICA_SYSLOG_FLAGS` (optional) In case syslog is used, set the corresponding flags (Default: `LOG_PID | LOG_ODELAY | LOG_CONS | LOG_PERROR`).
121 | - `FRIENDICA_SYSLOG_FACTORY` (optional) In case syslog is used, set the corresponding factory (Default: `LOG_USER`).
122 |
123 | **Database** (**required at installation**)
124 |
125 | - `MYSQL_USER` Username for the database user using mysql / mariadb.
126 | - `MYSQL_PASSWORD` Password for the database user using mysql / mariadb.
127 | - `MYSQL_DATABASE` Name of the database using mysql / mariadb.
128 | - `MYSQL_HOST` Hostname of the database server using mysql / mariadb.
129 | - `MYSQL_PORT` Port of the database server using mysql / mariadb (Default: `3306`)
130 |
131 | **Lock Driver (Redis)**
132 |
133 | - `REDIS_HOST` The hostname of the redis instance (in case of locking).
134 | - `REDIS_PORT` (optional) The port of the redis instance (in case of locking).
135 | - `REDIS_PW` (optional) The password for the redis instance (in case of locking).
136 | - `REDIS_DB` (optional) The database instance of the redis instance (in case of locking).
137 |
138 | **PHP limits**
139 |
140 | - `PHP_MEMORY_LIMIT` (default `512M`) This sets the maximum amount of memory in bytes that a script is allowed to allocate. This is meant to help prevent poorly written scripts from eating up all available memory, but it can prevent normal operation if set too tight.
141 | - `PHP_UPLOAD_LIMIT` (default `512M`) This sets the upload limit (`post_max_size` and `upload_max_filesize`) for big files. Note that you may have to change other limits depending on your client, webserver or operating system.
142 |
143 | ## Administrator account
144 |
145 | Because Friendica links the administrator account to a specific mail address, you **have** to set a valid address for `MAILNAME`.
146 |
147 | ## Mail settings
148 |
149 | The binary `ssmtp` is used for the `mail()` support of Friendica.
150 |
151 | You have to set the `--hostname/-h` parameter correctly to use the right domainname for the `mail()` command.
152 |
153 | You have to set a valid SMTP-MTA for the `SMTP` environment variable to enable mail support in Friendica. A valid SMTP-MTA would be, for example, `mx.example.org`.
154 |
155 | The following environment variables are possible for the SMTP examples.
156 |
157 | - `SMTP` Address of the SMTP Mail-Gateway. (**required**)
158 | - `SMTP_PORT` Port of the SMTP Mail-Gateway. (Default: 587)
159 | - `SMTP_DOMAIN` The sender domain. (**required** - e.g. `friendica.local`)
160 | - `SMTP_FROM` Sender user-part of the address. (Default: `no-reply` - e.g. [email protected])
161 | - `SMTP_TLS` Use TLS for connecting the SMTP Mail-Gateway. (Default: empty)
162 | - `SMTP_STARTTLS` Use STARTTLS for connecting the SMTP Mail-Gateway. (Default: `On`)
163 | - `SMTP_AUTH` Auth mode for the SMTP Mail-Gateway. (Default: `On`)
164 | - `SMTP_AUTH_USER` Username for the SMTP Mail-Gateway. (Default: empty)
165 | - `SMTP_AUTH_PASS` Password for the SMTP Mail-Gateway. (Default: empty)
166 |
167 | **Addition to STARTTLS**
168 |
169 | the `tls_starttls` setting is either `On` or `Off`, but never unset. That's because in case it's unset, `starttls` would be activated by default (which would need additional configuration like a separate port).
170 |
171 | ## Database settings
172 |
173 | You have to add the Friendica container to the same network as the running database container, e. g. `--network some-network`, and then use `mysql` as the database host on setup.
174 |
175 | ## Persistent data
176 |
177 | The Friendica installation and all data beyond what lives in the database (file uploads, etc) is stored in the [unnamed docker volume](https://docs.docker.com/storage/volumes/) volume `/var/www/html`. The docker daemon will store that data within the docker directory `/var/lib/docker/volumes/...`. That means your data is saved even if the container crashes, is stopped or deleted. To make your data persistent to upgrading and get access for backups is using named docker volume or mount a host folder. To achieve this you need one volume for your database container and Friendica.
178 |
179 | Friendica:
180 |
181 | - `/var/www/html/` folder where all Friendica data lives
182 |
183 | ```console
184 | $ docker run -d \
185 | -v friendica-vol-1:/var/www/html \
186 | --network some-network
187 | friendica
188 | ```
189 |
190 | Database:
191 |
192 | - `/var/lib/mysql` MySQL / MariaDB Data
193 |
194 | ```console
195 | $ docker run -d \
196 | -v mysql-vol-1:/var/lib/mysql \
197 | --network some-network
198 | mariadb
199 | ```
200 |
201 | ## Automatic installation
202 |
203 | The Friendica image supports auto configuration via environment variables. You can preconfigure everything that is asked on the install page on first run. To enable the automatic installation, you have to the following environment variables:
204 |
205 | - `FRIENDICA_URL` The Friendica complete URL including protocol, domain and subpath (example: https://friendica.local/sub/ ).
206 | - `FRIENDICA_ADMIN_MAIL` E-Mail address of the administrator.
207 | - `MYSQL_USER` Username for the database user using mysql / mariadb.
208 | - `MYSQL_PASSWORD` Password for the database user using mysql / mariadb.
209 | - `MYSQL_DATABASE` Name of the database using mysql / mariadb.
210 | - `MYSQL_HOST` Hostname of the database server using mysql / mariadb.
211 |
212 | # Docker Secrets
213 |
214 | As an alternative to passing sensitive information via environment variables, _FILE may be appended to the previously listed environment variables, causing the initialization script to load the values for those variables from files present in the container. In particular, this can be used to load passwords from Docker secrets stored in /run/secrets/<secret_name> files. For example:
215 |
216 | ```yaml
217 | services:
218 | db:
219 | image: mariadb
220 | restart: always
221 | volumes:
222 | - db:/var/lib/mysql
223 | environment:
224 | - MYSQL_DATABASE_FILE=/run/secrets/mysql_database
225 | - MYSQL_USER_FILE=/run/secrets/mysql_user
226 | - MYSQL_PASSWORD_FILE=/run/secrets/mysql_password
227 | secrets:
228 | - mysql_database
229 | - mysql_password
230 | - mysql_user
231 |
232 | app:
233 | image: friendica
234 | restart: always
235 | volumes:
236 | - friendica:/var/www/html
237 | ports:
238 | - "8080:80"
239 | environment:
240 | - MYSQL_HOST=db
241 | - MYSQL_DATABASE_FILE=/run/secrets/mysql_database
242 | - MYSQL_USER_FILE=/run/secrets/mysql_user
243 | - MYSQL_PASSWORD_FILE=/run/secrets/mysql_password
244 | - FRIENDICA_ADMIN_MAIL_FILE=/run/secrets/friendica_admin_mail
245 | depends_on:
246 | - db
247 | secrets:
248 | - friendica_admin_mail
249 | - mysql_database
250 | - mysql_password
251 | - mysql_user
252 |
253 | volumes:
254 | db:
255 | friendica:
256 |
257 | secrets:
258 | friendica_admin_mail:
259 | file: ./friendica_admin_mail.txt # put admin email to this file
260 | mysql_database:
261 | file: ./mysql_database.txt # put mysql database name to this file
262 | mysql_password:
263 | file: ./mysql_password.txt # put mysql password to this file
264 | mysql_user:
265 | file: ./mysql_user.txt # put mysql username to this file
266 | ```
267 |
268 | Currently, this is only supported for `FRIENDICA_ADMIN_MAIL`, `MYSQL_DATABASE`, `MYSQL_PASSWORD`, `MYSQL_USER`.
269 |
270 | # Maintenance of the image
271 |
272 | ## Updating to a newer version
273 |
274 | You have to pull the latest image from the hub (`docker pull friendica`). The stable branch gets checked at every startup and will get updated if no installation was found or a new image is used.
275 |
276 | # Running this image with Docker Compose
277 |
278 | The easiest way to get a fully featured and functional setup is using a `compose.yaml` file. There are too many different possibilities to setup your system, so here are only some examples what you have to look for.
279 |
280 | At first make sure you have chosen the right base image (fpm or apache) and added the features you wanted (see below). In every case you want to add a database container and docker volumes to get easy access to your persistent data. When you want your server reachable from the internet adding HTTPS-encryption is mandatory! See below for more information.
281 |
282 | ## Base version - apache
283 |
284 | This version will use the apache image and add a mariaDB container. The volumes are set to keep your data persistent. This setup provides **no ssl encryption** and is intended to run behind a proxy.
285 |
286 | Make sure to set the variable `MYSQL_PASSWORD` before run this setup.
287 |
288 | ```yaml
289 | services:
290 | db:
291 | image: mariadb
292 | restart: always
293 | volumes:
294 | - db:/var/lib/mysql
295 | environment:
296 | - MYSQL_USER=friendica
297 | - MYSQL_PASSWORD=
298 | - MYSQL_DATABASE=friendica
299 | - MYSQL_RANDOM_ROOT_PASSWORD=yes
300 |
301 | app:
302 | image: friendica
303 | restart: always
304 | volumes:
305 | - friendica:/var/www/html
306 | ports:
307 | - "8080:80"
308 | environment:
309 | - MYSQL_HOST=db
310 | - MYSQL_USER=friendica
311 | - MYSQL_PASSWORD=
312 | - MYSQL_DATABASE=friendica
313 | - [email protected]
314 | depends_on:
315 | - db
316 |
317 | volumes:
318 | db:
319 | friendica:
320 | ```
321 |
322 | Then run `docker compose up -d`, now you can access Friendica at http://localhost:8080/ from your system.
323 |
324 | ## Base version - FPM
325 |
326 | When using the FPM image you need another container that acts as web server on port 80 and proxies requests to the Friendica container. In this example a simple nginx container is combined with the Friendica-fpm image and a MariaDB database container. The data is stored in docker volumes. The nginx container also need access to static files from your Friendica installation. It gets access to all the volumes mounted to Friendica via the `volumes_from` option. The configuration for nginx is stored in the configuration file `nginx.conf` that is mounted into the container.
327 |
328 | An example can be found in the [examples section](https://github.com/friendica/docker/tree/master/.examples).
329 |
330 | As this setup does **not include encryption** it should to be run behind a proxy.
331 |
332 | Prerequisites for this example:
333 |
334 | - Make sure to set the variable `MYSQL_PASSWORD` and `MYSQL_USER` before you run the setup.
335 | - Create a `nginx.conf` in the same directory as the `compose.yaml` file (take it from [example](https://github.com/friendica/docker/tree/master/.examples/docker-compose/with-traefik-proxy/mariadb-cron-smtp/fpm/web/nginx.conf))
336 |
337 | ```yaml
338 | services:
339 | db:
340 | image: mariadb
341 | restart: always
342 | volumes:
343 | - db:/var/lib/mysql
344 | environment:
345 | - MYSQL_USER=friendica
346 | - MYSQL_PASSWORD=
347 | - MYSQL_DATABASE=friendica
348 | - MYSQL_RANDOM_ROOT_PASSWORD=yes
349 |
350 | app:
351 | image: friendica:fpm
352 | restart: always
353 | volumes:
354 | - friendica:/var/www/html
355 | environment:
356 | - MYSQL_HOST=db
357 | - MYSQL_USER=friendica
358 | - MYSQL_PASSWORD=
359 | - MYSQL_DATABASE=friendica
360 | - [email protected]
361 | networks:
362 | - proxy-tier
363 | - default
364 |
365 | web:
366 | image: nginx
367 | ports:
368 | - 8080:80
369 | links:
370 | - app
371 | volumes:
372 | - ./nginx.conf:/etc/nginx/nginx.conf:ro
373 | restart: always
374 | networks:
375 | - proxy-tier
376 |
377 | volumes:
378 | db:
379 | friendica:
380 |
381 | networks:
382 | proxy-tier:
383 | ```
384 |
385 | Then run `docker compose up -d`, now you can access Friendica at http://localhost:8080/ from your system.
386 |
387 | # Special settings for DEV/RC images
388 |
389 | The `*-dev` and `*-rc` branches are directly downloaded and verified at each docker start to ensure that the latest sources are used. The parameter `FRIENDICA_UPGRADE` is required to be `true` (Default: `false`) to activate this behavior.
390 |
391 | # Questions / Issues
392 |
393 | If you got any questions or problems using the image, please visit our [Github Repository](https://github.com/friendica/docker) and write an issue.
394 |
395 | # Image Variants
396 |
397 | The `friendica` images come in many flavors, each designed for a specific use case.
398 |
399 | ## `friendica:<version>`
400 |
401 | This is the defacto image. If you are unsure about what your needs are, you probably want to use this one. It is designed to be used both as a throw away container (mount your source code and start the container to start your app), as well as the base to build other images off of.
402 |
403 | ## `friendica:<version>-alpine`
404 |
405 | This image is based on the popular [Alpine Linux project](https://alpinelinux.org), available in [the `alpine` official image](https://hub.docker.com/_/alpine). Alpine Linux is much smaller than most distribution base images (~5MB), and thus leads to much slimmer images in general.
406 |
407 | This variant is useful when final image size being as small as possible is your primary concern. The main caveat to note is that it does use [musl libc](https://musl.libc.org) instead of [glibc and friends](https://www.etalabs.net/compare_libcs.html), so software will often run into issues depending on the depth of their libc requirements/assumptions. See [this Hacker News comment thread](https://news.ycombinator.com/item?id=10782897) for more discussion of the issues that might arise and some pro/con comparisons of using Alpine-based images.
408 |
409 | To minimize image size, it's uncommon for additional related tools (such as `git` or `bash`) to be included in Alpine-based images. Using this image as a base, add the things you need in your own Dockerfile (see the [`alpine` image description](https://hub.docker.com/_/alpine/) for examples of how to install packages if you are unfamiliar).
410 |
411 | # License
412 |
413 | View [license information](https://github.com/friendica/server/blob/master/LICENSE) for the software contained in this image.
414 |
415 | As with all Docker images, these likely also contain other software which may be under other licenses (such as Bash, etc from the base distribution, along with any direct or indirect dependencies of the primary software being contained).
416 |
417 | Some additional license information which was able to be auto-detected might be found in [the `repo-info` repository's `friendica/` directory](https://github.com/docker-library/repo-info/tree/master/repos/friendica).
418 |
419 | As for any pre-built image usage, it is the image user's responsibility to ensure that any use of this image complies with any relevant licenses for all software contained within.
420 |
```
--------------------------------------------------------------------------------
/geonetwork/README.md:
--------------------------------------------------------------------------------
```markdown
1 | <!--
2 |
3 | ********************************************************************************
4 |
5 | WARNING:
6 |
7 | DO NOT EDIT "geonetwork/README.md"
8 |
9 | IT IS AUTO-GENERATED
10 |
11 | (from the other files in "geonetwork/" combined with a set of templates)
12 |
13 | ********************************************************************************
14 |
15 | -->
16 |
17 | # Quick reference
18 |
19 | - **Maintained by**:
20 | [GeoNetwork opensource](https://github.com/geonetwork/docker-geonetwork)
21 |
22 | - **Where to get help**:
23 | [the Docker Community Slack](https://dockr.ly/comm-slack), [Server Fault](https://serverfault.com/help/on-topic), [Unix & Linux](https://unix.stackexchange.com/help/on-topic), or [Stack Overflow](https://stackoverflow.com/help/on-topic)
24 |
25 | # Supported tags and respective `Dockerfile` links
26 |
27 | - [`3.12.12`, `3.12`, `3`](https://github.com/geonetwork/docker-geonetwork/blob/17278beab34080c90454c0b7059bd6b49701f979/3.12.12/Dockerfile)
28 |
29 | - [`3.12.12-postgres`, `3.12-postgres`, `3-postgres`](https://github.com/geonetwork/docker-geonetwork/blob/17278beab34080c90454c0b7059bd6b49701f979/3.12.12/postgres/Dockerfile)
30 |
31 | - [`4.2.12`, `4.2`](https://github.com/geonetwork/docker-geonetwork/blob/a3e15b94330e69449238b4bb0c6e6909f958afa2/4.2.12/Dockerfile)
32 |
33 | - [`4.4.7`, `4.4`, `4`, `latest`](https://github.com/geonetwork/docker-geonetwork/blob/87a25196b8dd3a8a1bd2bc8644f86c878de2b1d4/4.4.7/Dockerfile)
34 |
35 | # Quick reference (cont.)
36 |
37 | - **Where to file issues**:
38 | [https://github.com/geonetwork/docker-geonetwork/issues](https://github.com/geonetwork/docker-geonetwork/issues?q=)
39 |
40 | - **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64))
41 | [`amd64`](https://hub.docker.com/r/amd64/geonetwork/), [`arm32v7`](https://hub.docker.com/r/arm32v7/geonetwork/), [`arm64v8`](https://hub.docker.com/r/arm64v8/geonetwork/), [`ppc64le`](https://hub.docker.com/r/ppc64le/geonetwork/)
42 |
43 | - **Published image artifact details**:
44 | [repo-info repo's `repos/geonetwork/` directory](https://github.com/docker-library/repo-info/blob/master/repos/geonetwork) ([history](https://github.com/docker-library/repo-info/commits/master/repos/geonetwork))
45 | (image metadata, transfer size, etc)
46 |
47 | - **Image updates**:
48 | [official-images repo's `library/geonetwork` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fgeonetwork)
49 | [official-images repo's `library/geonetwork` file](https://github.com/docker-library/official-images/blob/master/library/geonetwork) ([history](https://github.com/docker-library/official-images/commits/master/library/geonetwork))
50 |
51 | - **Source of this description**:
52 | [docs repo's `geonetwork/` directory](https://github.com/docker-library/docs/tree/master/geonetwork) ([history](https://github.com/docker-library/docs/commits/master/geonetwork))
53 |
54 | # What is GeoNetwork?
55 |
56 | GeoNetwork is a catalog application to **manage spatially referenced resources**. It provides powerful **metadata editing** and **search** functions as well as an interactive **web map viewer**.
57 |
58 | The GeoNetwork project started out in year 2001 as a Spatial Data Catalogue System for the Food and Agriculture organisation of the United Nations (FAO), the United Nations World Food Programme (WFP) and the United Nations Environmental Programme (UNEP).
59 |
60 | At present the project is widely used as the basis of **Spatial Data Infrastructures** all around the world.
61 |
62 | GeoNetwork has been developed to connect spatial information communities and their data using a modern architecture, which is at the same time powerful and low cost, based on the principles of Free and Open Source Software (FOSS) and International and Open Standards for services and protocols (e.g.: ISO/TC211, OGC).
63 |
64 | The project is part of the Open Source Geospatial Foundation ( [OSGeo](http://www.osgeo.org/) ) and can be found at [GeoNetwork opensource](http://www.geonetwork-opensource.org). GeoNetwork has been developed to connect spatial information communities and their data using a modern architecture, which is at the same time powerful and low cost.
65 |
66 | 
67 |
68 | ## How to use this image
69 |
70 | GeoNetwork 4 uses an Elasticsearch server to store the index of the documents it manages so **it can't be run without configuring the URL of the Elasticsearch server**.
71 |
72 | This is a quick example of how to get GeoNetwork 4.4 Latest up and running for demo purposes. This configuration doesn't keep the data if containers are removed.
73 |
74 | ```console
75 | docker pull elasticsearch:7.17.15
76 | docker pull geonetwork:4
77 |
78 | docker network create gn-network
79 |
80 | docker run -d --name my-es-host --network gn-network -e "discovery.type=single-node" elasticsearch:7.17.15
81 | docker run --name geonetwork-host --network gn-network -e GN_CONFIG_PROPERTIES="-Des.host=my-es-host -Des.protocol=http -Des.port=9200 -Des.url=http://my-es-host:9200" -p 8080:8080 geonetwork:4
82 | ```
83 |
84 | For GeoNetwork 4.2 Stable:
85 |
86 | ```console
87 | docker pull elasticsearch:7.17.15
88 | docker pull geonetwork:4.2
89 |
90 | docker network create gn-network
91 |
92 | docker run -d --name my-es-host --network gn-network -e "discovery.type=single-node" elasticsearch:7.17.15
93 | docker run --name geonetwork-host --network gn-network -e ES_HOST=my-es-host -e ES_PROTOCOL=http -e ES_PORT=9200 -p 8080:8080 geonetwork:4.2
94 | ```
95 |
96 | To be sure about what Elasticsearch version to use you can check the [GeoNetwork documentation](https://docs.geonetwork-opensource.org/4.4/install-guide/installing-index/) for your GN version or the `es.version` property in the [`pom.xml`](https://github.com/geonetwork/core-geonetwork/blob/main/pom.xml#L1528C17-L1528C24) file of the GeoNetwork release used.
97 |
98 | ### Default credentials
99 |
100 | After installation, use the default credentials: **`admin`** (username) and **`admin`** (password). It is recommended to update the default password after installation.
101 |
102 | ### Elasticsearch configuration
103 |
104 | #### Java properties (version 4.4.0 and newer)
105 |
106 | Since GeoNetwork 4.4.0, use Java properties passed in the `GN_CONFIG_PROPERTIES` environment variable for Elasticsearch connection configuration:
107 |
108 | - `es.host`: *optional* (default `localhost`): The host name of the Elasticsearch server.
109 | - `es.port` *optional* (default `9200`): The port where Elasticsearch server is listening to.
110 | - `es.protocol` *optional* (default `http`): The protocol used to talk to Elasticsearch. Can be `http` or `https`.
111 | - `es.url`: **mandatory if host, port or protocol aren't the default values** (default `http://localhost:9200`): Full URL of the Elasticsearch server.
112 | - `es.index.records` *optional* (default `gn_records`): In case you have more than GeoNetwork instance using the same Elasticsearch cluster each one needs to use a different index name. Use this variable to define the name of the index used by each GeoNetwork.
113 | - `es.username` *optional* (default empty): username used to connect to Elasticsearch.
114 | - `es.password` *optional* (default empty): password used to connect to Elasticsearch.
115 | - `kb.url` *optional* (default `http://localhost:5601`): The URL where Kibana is listening.
116 |
117 | Example Docker Compose YAML snippet:
118 |
119 | ```yaml
120 | services:
121 | geonetwork:
122 | image: geonetwork:4.4
123 | environment:
124 | GN_CONFIG_PROPERTIES: >-
125 | -Des.host=elasticsearch
126 | -Des.protocol=http
127 | -Des.port=9200
128 | -Des.url=http://elasticsearch:9200
129 | -Des.username=my_es_username
130 | -Des.password=my_es_password
131 | -Dkb.url=http://kibana:5601
132 | ```
133 |
134 | #### Environment variables (version 4.2 and older)
135 |
136 | For versions older than 4.4.0, configure Elasticsearch using environment variables:
137 |
138 | - `ES_HOST` **mandatory**: The host name of the Elasticsearch server.
139 | - `ES_PORT` *optional* (default `9200`): The port where Elasticsearch server is listening to.
140 | - `ES_PROTOCOL` *optional* (default `http`): The protocol used to talk to Elasticsearch. Can be `http` or `https`.
141 | - `ES_INDEX_RECORDS` *optional* (default `gn_records`): In case you have more than GeoNetwork instance using the same Elasticsearch cluster each one needs to use a different index name. Use this variable to define the name of the index used by each GeoNetwork.
142 | - `ES_USERNAME` *optional* (default empty): username used to connect to Elasticsearch.
143 | - `ES_PASSWORD` *optional* (default empty): password used to connect to Elasticsearch.
144 | - `KB_URL` *Optional* (default `http://localhost:5601`): The URL where Kibana is listening.
145 |
146 | ### Database configuration
147 |
148 | By default GeoNetwork uses a local **H2 database** for demo use (this one is **not recommended for production**). The image contains JDBC drivers for PostgreSQL and MySQL. To configure the database connection use these environment variables:
149 |
150 | - `GEONETWORK_DB_TYPE`: The type of database to use. Valid values are `postgres`, `postgres-postgis`, `mysql`. The image can be extended including other drivers and these other types could be used too: `db2`, `h2`, `oracle`, `sqlserver`. The JAR drivers for these other databases would need to be added to `/opt/geonetwork/WEB-INF/lib` mounting them as binds or extending the official image.
151 | - `GEONETWORK_DB_HOST`: The database host name.
152 | - `GEONETWORK_DB_PORT`: The database port.
153 | - `GEONETWORK_DB_NAME`: The database name.
154 | - `GEONETWORK_DB_USERNAME`: The username used to connect to the database.
155 | - `GEONETWORK_DB_PASSWORD`: The password used to connect to the database.
156 | - `GEONETWORK_DB_CONNECTION_PROPERTIES`: Additional properties to be added to the connection string, for example `search_path=test,public&ssl=true` will produce a JDBC connection string like `jdbc:postgresql://localhost:5432/postgres?search_path=test,public&ssl=true`
157 |
158 | ### Start GeoNetwork
159 |
160 | This command will start a debian-based container, running a Tomcat (GN 3) or Jetty (GN 4) web server, with a GeoNetwork WAR deployed on the server:
161 |
162 | ```console
163 | docker run --name some-geonetwork -d geonetwork
164 | ```
165 |
166 | ### Publish port
167 |
168 | GeoNetwork listens on port `8080`. If you want to access the container at the host, **you must publish this port**. For instance, this, will redirect all the container traffic on port 8080, to the same port on the host:
169 |
170 | ```console
171 | docker run --name some-geonetwork -d -p 8080:8080 geonetwork
172 | ```
173 |
174 | Then, if you are running docker on Linux, you may access geonetwork at http://localhost:8080/geonetwork.
175 |
176 | ### Set the data directory and H2 db file
177 |
178 | The data directory is the location on the file system where the catalog stores much of its custom configuration and uploaded files. It is also where it stores a number of support files, used for various purposes (e.g.: spatial index, thumbnails). The default variant also uses a local H2 database to store the metadata catalog itself.
179 |
180 | By default, GeoNetwork sets the data directory on `/opt/geonetwork/WEB-INF/data` and H2 database file to the Jetty dir `/var/lib/jetty/gn.h2.db` (since GN 4.0.0) or Tomcat `/usr/local/tomcat/gn.h2.db` (for GN 3), but you may override these values by injecting environment variables into the container: - `-e DATA_DIR=...` (defaults to `/opt/geonetwork/WEB-INF/data`) and `-e GEONETWORK_DB_NAME=...` (defaults to `gn` which sets up database `gn.h2.db` in tomcat bin dir `/usr/local/tomcat`). Note that setting the database location via `GEONETWORK_DB_NAME` only works from version 3.10.3 onwards.
181 |
182 | Since version 4.4.0 the data directory needs to be configued using Java properties passed in the `GN_CONFIG_PROPERTIES` environment variable. For example:
183 |
184 | ```console
185 | docker run --name some-geonetwork -d -p 8080:8080 -e GN_CONFIG_PROPERTIES="-Dgeonetwork.dir=/catalogue-data" -e GEONETWORK_DB_NAME=/catalogue-data/db/gn geonetwork
186 | ```
187 |
188 | ### Persisting data
189 |
190 | To set the data directory to `/catalogue-data/data` and H2 database file to `/catalogue-data/db/gn.h2.db` so they both persist through restarts:
191 |
192 | - GeoNetwork 4.2 and older
193 |
194 | ```console
195 | docker run --name some-geonetwork -d -p 8080:8080 -e DATA_DIR=/catalogue-data/data -e GEONETWORK_DB_NAME=/catalogue-data/db/gn geonetwork:3
196 | ```
197 |
198 | - Since GeoNetwork 4.4.0
199 |
200 | ```console
201 | docker run --name some-geonetwork -d -p 8080:8080 -e GN_CONFIG_PROPERTIES="-Dgeonetwork.dir=/catalogue-data" -e GEONETWORK_DB_NAME=/catalogue-data/db/gn geonetwork
202 | ```
203 |
204 | If you want the data directory to live beyond restarts, or even destruction of the container, you can mount a directory from the docker engine's host into the container. - `-v /host/path:/path/to/data/directory`. For instance this, will mount the host directory `/host/geonetwork-docker` into `/catalogue-data` on the container:
205 |
206 | - GeoNetwork 4.2 and older
207 |
208 | ```console
209 | docker run --name some-geonetwork -d -p 8080:8080 -e DATA_DIR=/catalogue-data/data -e GEONETWORK_DB_NAME=/catalogue-data/db/gn -v /host/geonetwork-docker:/catalogue-data geonetwork:3
210 | ```
211 |
212 | - GeoNetwork 4.4.0 and newer
213 |
214 | ```console
215 | docker run --name some-geonetwork -d -p 8080:8080 -e GN_CONFIG_PROPERTIES="-Dgeonetwork.dir=/catalogue-data" -e GEONETWORK_DB_NAME=/catalogue-data/db/gn -v /host/geonetwork-docker:/catalogue-data geonetwork
216 | ```
217 |
218 | ### ... via [`docker compose`](https://github.com/docker/compose)
219 |
220 | Example `compose.yaml` for `geonetwork`:
221 |
222 | ```yaml
223 | # GeoNetwork
224 | #
225 | # Access via "http://localhost:8080/geonetwork"
226 | #
227 | # Default user: admin
228 | # Default password: admin
229 |
230 | volumes:
231 | geonetwork:
232 | esdata:
233 | pgdata:
234 | pglog:
235 |
236 | services:
237 | geonetwork:
238 | image: geonetwork:4.4
239 | healthcheck:
240 | test: curl http://localhost:8080/
241 | interval: 5s
242 | timeout: 5s
243 | retries: 30
244 | restart: always
245 | volumes:
246 | - geonetwork:/catalogue-data
247 | depends_on:
248 | database:
249 | condition: service_healthy
250 | ports:
251 | - 8080:8080
252 | environment:
253 | WEBAPP_CONTEXT_PATH: /geonetwork
254 | DATA_DIR: /catalogue-data
255 | TZ: Europe/Amsterdam
256 |
257 | JAVA_OPTS: >-
258 | --add-opens=jdk.management/com.sun.management.internal=ALL-UNNAMED
259 | -Djava.security.egd=file:/dev/./urandom -Djava.awt.headless=true
260 | -Xms512M -Xss512M -Xmx2G -XX:+UseConcMarkSweepGC
261 | -Djetty.httpConfig.requestHeaderSize=32768
262 | -Dorg.eclipse.jetty.server.Request.maxFormContentSize=500000
263 | -Dorg.eclipse.jetty.server.Request.maxFormKeys=4000
264 | # For remote debug
265 | # -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
266 |
267 | GN_CONFIG_PROPERTIES: >-
268 | -Dgeonetwork.dir=/catalogue-data
269 | -Dgeonetwork.formatter.dir=/catalogue-data/data/formatter
270 | -Dgeonetwork.schema.dir=/opt/geonetwork/WEB-INF/data/config/schema_plugins
271 | -Dgeonetwork.indexConfig.dir=/opt/geonetwork/WEB-INF/data/config/index
272 | -Dgeonetwork.schemapublication.dir=/opt/geonetwork/WEB-INF/data/resources/schemapublication
273 | -Dgeonetwork.htmlcache.dir=/opt/geonetwork/WEB-INF/data/resources/htmlcache
274 | -Des.host=elasticsearch
275 | -Des.protocol=http
276 | -Des.port=9200
277 | -Des.url=http://elasticsearch:9200
278 | -Des.username=
279 | -Des.password=
280 | -Dgeonetwork.ESFeaturesProxy.targetUri=http://elasticsearch:9200/gn-features/{_}
281 | -Dgeonetwork.HttpDashboardProxy.targetUri=http://kibana:5601
282 |
283 | GEONETWORK_DB_TYPE: postgres-postgis
284 | GEONETWORK_DB_HOST: database
285 | GEONETWORK_DB_PORT: 5432
286 | GEONETWORK_DB_NAME: geonetwork
287 | GEONETWORK_DB_USERNAME: geonetwork
288 | GEONETWORK_DB_PASSWORD: geonetwork
289 |
290 | database:
291 | image: postgis/postgis:16-3.4
292 | environment:
293 | POSTGRES_USER: geonetwork
294 | POSTGRES_PASSWORD: geonetwork
295 | POSTGRES_DB: geonetwork
296 | command: [postgres, -c, log_statement=all, -c, logging_collector=true, -c, log_file_mode=0644,
297 | -c, log_directory=/var/log/postgresql, -c, log_filename=postgresql.log]
298 | healthcheck:
299 | test: [CMD-SHELL, pg_isready -U postgres]
300 | interval: 5s
301 | timeout: 5s
302 | retries: 5
303 | volumes:
304 | - pgdata:/var/lib/postgresql/data
305 | - pglog:/var/log/postgresql
306 |
307 | elasticsearch:
308 | image: elasticsearch:7.17.15
309 | ports:
310 | - 9200:9200
311 | ulimits:
312 | memlock:
313 | soft: -1
314 | hard: -1
315 | nofile:
316 | soft: 65536
317 | hard: 65536
318 | healthcheck:
319 | test: curl -s http://localhost:9200 >/dev/null || exit 1
320 | interval: 10s
321 | timeout: 2s
322 | retries: 10
323 | start_period: 2m
324 | environment:
325 | ES_JAVA_OPTS: -Xms1G -Xmx1G
326 | discovery.type: single-node
327 | volumes:
328 | - esdata:/usr/share/elasticsearch/data
329 |
330 | kibana:
331 | image: kibana:7.17.15
332 | environment:
333 | SERVER_NAME: kibana
334 | ELASTICSEARCH_URL: http://elasticsearch:9200/
335 | SERVER_BASEPATH: /geonetwork/dashboards
336 | SERVER_REWRITEBASEPATH: 'false'
337 | KIBANA_INDEX: .dashboards
338 | XPACK_MONITORING_UI_CONTAINER_ELASTICSEARCH_ENABLED: 'true'
339 | depends_on:
340 | elasticsearch:
341 | condition: service_healthy
342 | ```
343 |
344 | Run `docker compose up`, wait for it to initialize completely, and visit `http://localhost:8080/geonetwork` or `http://host-ip:8080/geonetwork` (as appropriate).
345 |
346 | ### Default credentials
347 |
348 | After installation a default user with name `admin` and password `admin` is created. Use this credentials to start with. It is recommended to update the default password after installation.
349 |
350 | # Image Variants
351 |
352 | The `geonetwork` images come in many flavors, each designed for a specific use case.
353 |
354 | ## `geonetwork:<version>`
355 |
356 | This is the defacto image. If you are unsure about what your needs are, you probably want to use this one. It is designed to be used both as a throw away container (mount your source code and start the container to start your app), as well as the base to build other images off of.
357 |
358 | By default, an H2 database is configured and created when the application first starts. If you are interested in a database engine other than H2, please have a look at other image variants.
359 |
360 | ## `geonetwork:postgres` (Only for GeoNetwork 3 series)
361 |
362 | This image gives support for using [PostgreSQL](https://www.postgresql.org/) as database engine for geonetwork. When you start the container, a database is created, and it is populated by geonetwork, once it starts.
363 |
364 | Please note that this image **does not ship** the postgres database server itself, but it gives you the option to link to a container running postgres, or to connect to a postgres instance using its ip address. If you are looking for a self-contained installation of geonetwork, **including the database engine**, please have a look at the default image variant.
365 |
366 | In order to setup the connection from geonetwork, you **must** inject the following variables into the container: - `POSTGRES_DB_USERNAME`: postgres user on your database server (must have permission to create databases) - `POSTGRES_DB_PASSWORD`: postgres password on your database server
367 |
368 | If your postgres instance is listening on a non-standard port, you must also set that variable: - `POSTGRES_DB_PORT`: postgres port on your database server (defaults to `5432`)
369 |
370 | ### Connecting to a postgres database
371 |
372 | If you want to connect to a postgres server, you need to pass an extra environment variable, `POSTGRES_DB_HOST`, containing the address of this server.
373 |
374 | If you want to connect to an **external database server**, you can use either the IP address or the DNS as `POSTGRES_DB_HOST`. For instance, if the server is running on `mydns.net`, on port `5434`, the username is `postgres` and the password is `mysecretpassword`:
375 |
376 | ```console
377 | docker run --name geonetwork -d -p 8080:8080 -e POSTGRES_DB_HOST=mydns.net -e POSTGRES_DB_PORT=5434 -e POSTGRES_DB_USERNAME=postgres -e POSTGRES_DB_PASSWORD=mysecretpassword -e POSTGRES_DB_NAME=mydbname geonetwork:postgres
378 | ```
379 |
380 | If are want to **run postgres on a container**, you can use the container name as `POSTGRES_DB_HOST`: just make sure that containers can discover each other, by **running them in the same user-defined network**. For instance, you can create a bridge network:
381 |
382 | ```console
383 | docker network create --driver bridge mynet
384 | ```
385 |
386 | Then if you want to run the official image of postgres, using `some-postgres` as container name, you could launch it like this:
387 |
388 | ```console
389 | docker run --name some-postgres --network=mynet -d postgres
390 | ```
391 |
392 | And then you could launch geonetwork, making sure you join the same network, and setting the required environment variables, including the `POSTGRES_DB_HOST`:
393 |
394 | ```console
395 | docker run --name geonetwork -d -p 8080:8080 --network=mynet -e POSTGRES_DB_HOST=some-postgres -e POSTGRES_DB_PORT=5432 -e POSTGRES_DB_USERNAME=postgres -e POSTGRES_DB_PASSWORD=mysecretpassword -e POSTGRES_DB_NAME=mydbname geonetwork:postgres
396 | ```
397 |
398 | #### Configuration environment variables
399 |
400 | These are some environments variables that can be set to configure the database connection:
401 |
402 | - `POSTGRES_DB_HOST`: database host name.
403 | - `POSTGRES_DB_PORT`: port where database server is listening (by default `5432`).
404 | - `POSTGRES_DB_NAME`: name of the database. If it doesn't exist the container will try to create it.
405 | - `POSTGRES_DB_USERNAME`: username.
406 | - `POSTGRES_DB_PASSWORD`: password.
407 |
408 | # License
409 |
410 | View [license information](http://www.geonetwork-opensource.org/manuals/trunk/eng/users/overview/license.html) for the software contained in this image.
411 |
412 | As with all Docker images, these likely also contain other software which may be under other licenses (such as Bash, etc from the base distribution, along with any direct or indirect dependencies of the primary software being contained).
413 |
414 | Some additional license information which was able to be auto-detected might be found in [the `repo-info` repository's `geonetwork/` directory](https://github.com/docker-library/repo-info/tree/master/repos/geonetwork).
415 |
416 | As for any pre-built image usage, it is the image user's responsibility to ensure that any use of this image complies with any relevant licenses for all software contained within.
417 |
```
--------------------------------------------------------------------------------
/open-liberty/README.md:
--------------------------------------------------------------------------------
```markdown
1 | <!--
2 |
3 | ********************************************************************************
4 |
5 | WARNING:
6 |
7 | DO NOT EDIT "open-liberty/README.md"
8 |
9 | IT IS AUTO-GENERATED
10 |
11 | (from the other files in "open-liberty/" combined with a set of templates)
12 |
13 | ********************************************************************************
14 |
15 | -->
16 |
17 | # Quick reference
18 |
19 | - **Maintained by**:
20 | [the Open Liberty Community](https://github.com/OpenLiberty/ci.docker)
21 |
22 | - **Where to get help**:
23 | [the Open Liberty community](https://www.openliberty.io/community/)
24 |
25 | # Supported tags and respective `Dockerfile` links
26 |
27 | - [`beta`](https://github.com/OpenLiberty/ci.docker/blob/ea421dc2f72c32dec2cb226ad9e9d6cfcda38ed0/releases/latest/beta/Dockerfile.ubuntu.openjdk8)
28 |
29 | - [`beta-java11`](https://github.com/OpenLiberty/ci.docker/blob/ea421dc2f72c32dec2cb226ad9e9d6cfcda38ed0/releases/latest/beta/Dockerfile.ubuntu.openjdk11)
30 |
31 | - [`beta-java17`](https://github.com/OpenLiberty/ci.docker/blob/ea421dc2f72c32dec2cb226ad9e9d6cfcda38ed0/releases/latest/beta/Dockerfile.ubuntu.openjdk17)
32 |
33 | - [`kernel-slim`, `kernel-slim-java8-openj9`](https://github.com/OpenLiberty/ci.docker/blob/ea421dc2f72c32dec2cb226ad9e9d6cfcda38ed0/releases/latest/kernel-slim/Dockerfile.ubuntu.openjdk8)
34 |
35 | - [`kernel-slim-java11-openj9`](https://github.com/OpenLiberty/ci.docker/blob/ea421dc2f72c32dec2cb226ad9e9d6cfcda38ed0/releases/latest/kernel-slim/Dockerfile.ubuntu.openjdk11)
36 |
37 | - [`kernel-slim-java17-openj9`](https://github.com/OpenLiberty/ci.docker/blob/ea421dc2f72c32dec2cb226ad9e9d6cfcda38ed0/releases/latest/kernel-slim/Dockerfile.ubuntu.openjdk17)
38 |
39 | - [`full`, `full-java8-openj9`, `latest`](https://github.com/OpenLiberty/ci.docker/blob/ea421dc2f72c32dec2cb226ad9e9d6cfcda38ed0/releases/latest/full/Dockerfile.ubuntu.openjdk8)
40 |
41 | - [`full-java11-openj9`](https://github.com/OpenLiberty/ci.docker/blob/ea421dc2f72c32dec2cb226ad9e9d6cfcda38ed0/releases/latest/full/Dockerfile.ubuntu.openjdk11)
42 |
43 | - [`full-java17-openj9`](https://github.com/OpenLiberty/ci.docker/blob/ea421dc2f72c32dec2cb226ad9e9d6cfcda38ed0/releases/latest/full/Dockerfile.ubuntu.openjdk17)
44 |
45 | - [`24.0.0.12-kernel-slim-java8-openj9`](https://github.com/OpenLiberty/ci.docker/blob/ea421dc2f72c32dec2cb226ad9e9d6cfcda38ed0/releases/24.0.0.12/kernel-slim/Dockerfile.ubuntu.openjdk8)
46 |
47 | - [`24.0.0.12-kernel-slim-java11-openj9`](https://github.com/OpenLiberty/ci.docker/blob/ea421dc2f72c32dec2cb226ad9e9d6cfcda38ed0/releases/24.0.0.12/kernel-slim/Dockerfile.ubuntu.openjdk11)
48 |
49 | - [`24.0.0.12-kernel-slim-java17-openj9`](https://github.com/OpenLiberty/ci.docker/blob/ea421dc2f72c32dec2cb226ad9e9d6cfcda38ed0/releases/24.0.0.12/kernel-slim/Dockerfile.ubuntu.openjdk17)
50 |
51 | - [`24.0.0.12-full-java8-openj9`](https://github.com/OpenLiberty/ci.docker/blob/ea421dc2f72c32dec2cb226ad9e9d6cfcda38ed0/releases/24.0.0.12/full/Dockerfile.ubuntu.openjdk8)
52 |
53 | - [`24.0.0.12-full-java11-openj9`](https://github.com/OpenLiberty/ci.docker/blob/ea421dc2f72c32dec2cb226ad9e9d6cfcda38ed0/releases/24.0.0.12/full/Dockerfile.ubuntu.openjdk11)
54 |
55 | - [`24.0.0.12-full-java17-openj9`](https://github.com/OpenLiberty/ci.docker/blob/ea421dc2f72c32dec2cb226ad9e9d6cfcda38ed0/releases/24.0.0.12/full/Dockerfile.ubuntu.openjdk17)
56 |
57 | - [`25.0.0.3-kernel-slim-java8-openj9`](https://github.com/OpenLiberty/ci.docker/blob/ea421dc2f72c32dec2cb226ad9e9d6cfcda38ed0/releases/25.0.0.3/kernel-slim/Dockerfile.ubuntu.openjdk8)
58 |
59 | - [`25.0.0.3-kernel-slim-java11-openj9`](https://github.com/OpenLiberty/ci.docker/blob/ea421dc2f72c32dec2cb226ad9e9d6cfcda38ed0/releases/25.0.0.3/kernel-slim/Dockerfile.ubuntu.openjdk11)
60 |
61 | - [`25.0.0.3-kernel-slim-java17-openj9`](https://github.com/OpenLiberty/ci.docker/blob/ea421dc2f72c32dec2cb226ad9e9d6cfcda38ed0/releases/25.0.0.3/kernel-slim/Dockerfile.ubuntu.openjdk17)
62 |
63 | - [`25.0.0.3-full-java8-openj9`](https://github.com/OpenLiberty/ci.docker/blob/ea421dc2f72c32dec2cb226ad9e9d6cfcda38ed0/releases/25.0.0.3/full/Dockerfile.ubuntu.openjdk8)
64 |
65 | - [`25.0.0.3-full-java11-openj9`](https://github.com/OpenLiberty/ci.docker/blob/ea421dc2f72c32dec2cb226ad9e9d6cfcda38ed0/releases/25.0.0.3/full/Dockerfile.ubuntu.openjdk11)
66 |
67 | - [`25.0.0.3-full-java17-openj9`](https://github.com/OpenLiberty/ci.docker/blob/ea421dc2f72c32dec2cb226ad9e9d6cfcda38ed0/releases/25.0.0.3/full/Dockerfile.ubuntu.openjdk17)
68 |
69 | - [`25.0.0.4-kernel-slim-java8-openj9`](https://github.com/OpenLiberty/ci.docker/blob/ea421dc2f72c32dec2cb226ad9e9d6cfcda38ed0/releases/25.0.0.4/kernel-slim/Dockerfile.ubuntu.openjdk8)
70 |
71 | - [`25.0.0.4-kernel-slim-java11-openj9`](https://github.com/OpenLiberty/ci.docker/blob/ea421dc2f72c32dec2cb226ad9e9d6cfcda38ed0/releases/25.0.0.4/kernel-slim/Dockerfile.ubuntu.openjdk11)
72 |
73 | - [`25.0.0.4-kernel-slim-java17-openj9`](https://github.com/OpenLiberty/ci.docker/blob/ea421dc2f72c32dec2cb226ad9e9d6cfcda38ed0/releases/25.0.0.4/kernel-slim/Dockerfile.ubuntu.openjdk17)
74 |
75 | - [`25.0.0.4-full-java8-openj9`](https://github.com/OpenLiberty/ci.docker/blob/ea421dc2f72c32dec2cb226ad9e9d6cfcda38ed0/releases/25.0.0.4/full/Dockerfile.ubuntu.openjdk8)
76 |
77 | - [`25.0.0.4-full-java11-openj9`](https://github.com/OpenLiberty/ci.docker/blob/ea421dc2f72c32dec2cb226ad9e9d6cfcda38ed0/releases/25.0.0.4/full/Dockerfile.ubuntu.openjdk11)
78 |
79 | - [`25.0.0.4-full-java17-openj9`](https://github.com/OpenLiberty/ci.docker/blob/ea421dc2f72c32dec2cb226ad9e9d6cfcda38ed0/releases/25.0.0.4/full/Dockerfile.ubuntu.openjdk17)
80 |
81 | # Quick reference (cont.)
82 |
83 | - **Where to file issues**:
84 | [https://github.com/OpenLiberty/ci.docker/issues](https://github.com/OpenLiberty/ci.docker/issues?q=)
85 |
86 | - **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64))
87 | [`amd64`](https://hub.docker.com/r/amd64/open-liberty/), [`arm64v8`](https://hub.docker.com/r/arm64v8/open-liberty/), [`ppc64le`](https://hub.docker.com/r/ppc64le/open-liberty/), [`s390x`](https://hub.docker.com/r/s390x/open-liberty/)
88 |
89 | - **Published image artifact details**:
90 | [repo-info repo's `repos/open-liberty/` directory](https://github.com/docker-library/repo-info/blob/master/repos/open-liberty) ([history](https://github.com/docker-library/repo-info/commits/master/repos/open-liberty))
91 | (image metadata, transfer size, etc)
92 |
93 | - **Image updates**:
94 | [official-images repo's `library/open-liberty` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fopen-liberty)
95 | [official-images repo's `library/open-liberty` file](https://github.com/docker-library/official-images/blob/master/library/open-liberty) ([history](https://github.com/docker-library/official-images/commits/master/library/open-liberty))
96 |
97 | - **Source of this description**:
98 | [docs repo's `open-liberty/` directory](https://github.com/docker-library/docs/tree/master/open-liberty) ([history](https://github.com/docker-library/docs/commits/master/open-liberty))
99 |
100 | # Overview
101 |
102 | All of the images in this repository use Ubuntu as the Operating System. For variants that use the Universal Base Image, please see [this repository](https://hub.docker.com/r/openliberty/open-liberty/).
103 |
104 | For more information on these images please see our [GitHub repository](https://github.com/OpenLiberty/ci.docker#container-images).
105 |
106 | # Image User
107 |
108 | This image runs by default with `USER 1001` (non-root), as part of group `0`. Please make sure you read below to set the appropriate folder and file permissions.
109 |
110 | ## Updating folder permissions
111 |
112 | All of the folders accessed by Open Liberty have been given the appropriate permissions, but if your extending Dockerfile needs permission to another location you can simply temporarily switch into root and provide the needed permissions, example:
113 |
114 | ```dockerfile
115 | USER root
116 | RUN mkdir -p /myFolder && chown -R 1001:0 /myFolder
117 | USER 1001
118 | ```
119 |
120 | ## Updating file permissions
121 |
122 | You have to make sure that **all** the artifacts you are copying into the image (via `COPY` or `ADD`) have the correct permissions to be `read` and `executed` by user `1001` or group `0`, because the ownership of the file is changed to be `root:0` when transferring into the docker image.
123 |
124 | You have a few options for doing this: before copying the file, during copy, or after copy.
125 |
126 | ### Updating permissions before copying
127 |
128 | Since the ownership of the file will change to `root:0`, you can simply set the permissions for the owner's group to be able to read/execute the artifact (i.e. the middle digit of a `chmod` command). For example, you can do `chmod g+rx server.xml` to ensure your `server.xml` can be `read` and `executed` by group `0`, as well as any artifacts such as the application's `EAR` or `WAR` file, JDBC driver, or other files that are placed on the image via `COPY` or `ADD`.
129 |
130 | ### Updating permissions during copy
131 |
132 | If you're using Docker v17.09.0-ce and newer you can take advantage of the flag `--chown=<user>:<group>` during either `ADD` or `COPY`. For example: `COPY --chown=1001:0 jvm.options /config/jvm.options`. This is the preferred approach as you don't need to worry about changing permissions before calling `docker build` and you also do not duplicate layers in the resulting image.
133 |
134 | ### Updating permissions after copy
135 |
136 | If you need your Dockerfile to work with older versions of Docker CE and don't want to pre-process the permissions of the files you can temporarily switch into root to change the permissions of the needed files. For example:
137 |
138 | ```dockerfile
139 | USER root
140 | RUN chown 1001:0 /config/jvm.options
141 | RUN chown 1001:0 /output/resources/security/ltpa.keys
142 | USER 1001
143 | ```
144 |
145 | Please note that this pattern will duplicate the docker layers for those artifacts, which can heavily bloat your resulting docker image (depending on the size of the artifact). So it is recommended to set the permissions before or during copy.
146 |
147 | ## Tags
148 |
149 | There are multiple tags available in this repository.
150 |
151 | The `kernel-slim` image contains just the Liberty kernel and no additional runtime features. This image is the recommended basis for custom built images, so that they can contain only the features required for a specific application. For example, the following Dockerfile starts with this image, copies in the `server.xml` that lists the features required by the application, and then uses the `features.sh` script to download those features from the online repository.
152 |
153 | ```dockerfile
154 | FROM open-liberty:kernel-slim
155 |
156 | # Add server configuration
157 | COPY --chown=1001:0 server.xml /config/
158 | # This script will add the requested XML snippets to enable Liberty features and grow image to be fit-for-purpose using featureUtility.
159 | # Only available in 'kernel-slim'. The 'full' tag already includes all features for convenience.
160 | RUN features.sh
161 |
162 | # Add the application
163 | COPY --chown=1001:0 Sample1.war /config/dropins/
164 | # This script will add the requested server configurations, apply any interim fixes and populate caches to optimize runtime.
165 | RUN configure.sh
166 | ```
167 |
168 | The full list of images are found in the `Supported tags and respective Dockerfile links` section above.
169 |
170 | # Usage
171 |
172 | The images are designed to support a number of different usage patterns. The following examples are based on the Java EE8 Liberty [application deployment sample](https://developer.ibm.com/wasdev/docs/article_appdeployment/) and assume that [DefaultServletEngine.zip](https://github.com/WASdev/sample.servlet/releases/download/V1/DefaultServletEngine.zip) has been extracted to `/tmp` and the `server.xml` updated to accept HTTP connections from outside of the container by adding the following element inside the `server` stanza (if not using one of the pre-packaged `server.xml` files with our tags):
173 |
174 | ```xml
175 | <httpEndpoint host="*" httpPort="9080" httpsPort="-1"/>
176 | ```
177 |
178 | ## Application Image
179 |
180 | It is a very strong best practice to create an extending Docker image, we called it the `application image`, that encapsulates an application and its configuration. This creates a robust, self-contained and predictable Docker image that can span new containers upon request, without relying on volumes or other external runtime artifacts that may behave different over time.
181 |
182 | If you want to build the smallest possible Open Liberty application image you can start with our `kernel` tag, add your artifacts, and run `configure.sh` to grow the set of features to be fit-for-purpose. Please see our [GitHub page](https://github.com/OpenLiberty/ci.docker#building-an-application-image) for more details.
183 |
184 | ## Enabling Enterprise functionality
185 |
186 | The Open Liberty images have a set of built-in XML snippets that enable and configure enterprise functionality such as session cache and monitoring. These are toggled by specific `ARG`s in your application image Dockerfile and configured via the `configure.sh` script. Please see the [instructions](https://github.com/openliberty/ci.docker#enterprise-functionality) on our GitHub page for more information.
187 |
188 | ## Using volumes for configuration
189 |
190 | This pattern can be useful for quick experiments / early development (i.e. `I just want to run the application as I iterate over it`), but should not be used for development scenarios that involve different teams and environments - for these cases the `Application Image` pattern described above is the way to go.
191 |
192 | When using `volumes`, an application file can be mounted in the `dropins` directory of this server and run. The following example starts a container in the background running a .WAR file from the host file system with the HTTP and HTTPS ports mapped to 80 and 443 respectively.
193 |
194 | ```console
195 | $ docker run -d -p 80:9080 -p 443:9443 \
196 | -v /tmp/DefaultServletEngine/dropins/Sample1.war:/config/dropins/Sample1.war \
197 | open-liberty:full
198 | ```
199 |
200 | When the server is started, you can browse to http://localhost/Sample1/SimpleServlet on the Docker host.
201 |
202 | Note: If you are using the boot2docker virtual machine on OS X or Windows, you need to get the IP of the virtual host by using the command `boot2docker ip` instead of by using localhost.
203 |
204 | For greater flexibility over configuration, it is possible to mount an entire server configuration directory from the host and then specify the server name as a parameter to the run command. Note: This particular example server configuration provides only HTTP access.
205 |
206 | ```console
207 | $ docker run -d -p 80:9080 \
208 | -v /tmp/DefaultServletEngine:/config \
209 | open-liberty:full
210 | ```
211 |
212 | # Using Spring Boot with Open Liberty
213 |
214 | The `full` images introduce capabilities specific to the support of all Liberty features, including Spring Boot applications. This image thus includes the `springBootUtility` used to separate Spring Boot applications into thin applications and dependency library caches. To get these same capabilities without including features you are not using, build instead on top of `kernel` images and run configure.sh for your server.xml, ensuring that it enables either the `springBoot-1.5` or `springBoot-2.0` feature.
215 |
216 | To elaborate these capabilities this section assumes the standalone Spring Boot 2.0.x application `hellospringboot.jar` exists in the `/tmp` directory.
217 |
218 | 1. A Spring Boot application JAR deploys to the `dropins/spring` directory within the default server configuration, not the `dropins` directory. Liberty allows one Spring Boot application per server configuration. You can create a Spring Boot application layer over this image by adding the application JAR to the `dropins/spring` directory. In this example we copied `hellospringboot.jar` from `/tmp` to the same directory containing the following Dockerfile.
219 |
220 | ```dockerfile
221 | FROM open-liberty:kernel
222 |
223 | COPY --chown=1001:0 hellospringboot.jar /config/dropins/spring/
224 | COPY --chown=1001:0 server.xml /config/
225 |
226 | RUN configure.sh
227 | ```
228 |
229 | The custom image can be built and run as follows.
230 |
231 | ```console
232 | $ docker build -t app .
233 | $ docker run -d -p 8080:9080 app
234 | ```
235 |
236 | 2. The `full` images provide the library cache directory, `lib.index.cache`, which contains an indexed library cache created by the `springBootUtility` command. Use `lib.index.cache` to provide the library cache for a thin application.
237 |
238 | You can use the `springBootUtility` command to create thin application and library cache layers over a `full` image. The following example uses docker staging to efficiently build an image that deploys a fat Spring Boot application as two layers containing a thin application and a library cache.
239 |
240 | ```dockerfile
241 | FROM open-liberty:kernel as staging
242 | COPY --chown=1001:0 hellospringboot.jar /staging/myFatApp.jar
243 | COPY --chown=1001:0 server.xml /config/
244 | RUN springBootUtility thin \
245 | --sourceAppPath=/staging/myFatApp.jar \
246 | --targetThinAppPath=/staging/myThinApp.jar \
247 | --targetLibCachePath=/staging/lib.index.cache
248 | FROM open-liberty:kernel
249 | COPY --chown=1001:0 server.xml /config
250 | COPY --from=staging /staging/lib.index.cache /lib.index.cache
251 | COPY --from=staging /staging/myThinApp.jar /config/dropins/spring/myThinApp.jar
252 | RUN configure.sh
253 | ```
254 |
255 | For Spring Boot applications packaged with library dependencies that rarely change across continuous application updates, you can use the capabilities mentioned above to to share library caches across containers and to create even more efficient docker layers that leverage the docker build cache.
256 |
257 | # Providing your own keystore/truststore
258 |
259 | When an `open-liberty` image starts, it can generate a Liberty server XML snippet in `/config/configDropins/defaults/keystore.xml` that specifies a `keyStore` stanza with a generated password. This causes Open Liberty to generate a default keystore and truststore with a self-signed certificate when it starts. Images can request this by setting:
260 |
261 | ```console
262 | ENV KEYSTORE_REQUIRED "true"
263 | ```
264 |
265 | When providing your own keystore/truststore, this default behavior can be disabled by adding:
266 |
267 | ```console
268 | ENV KEYSTORE_REQUIRED "false"
269 | ```
270 |
271 | It is good practice to place the keystore customization in `/config/configDropins/defaults/keystore.xml` even when not generated since this makes it easier to find and makes moving to the websphere-liberty docker image simpler.
272 |
273 | # Using IBM JRE Class data sharing
274 |
275 | The IBM JRE provides a feature [Class data sharing](http://www-01.ibm.com/support/knowledgecenter/SSYKE2_8.0.0/com.ibm.java.lnx.80.doc/diag/understanding/shared_classes.html) which offers transparent and dynamic sharing of data between multiple Java Virtual Machines running on the same host by using shared memory backed by a file. When running the Liberty Docker image, it looks for the file at `/opt/ol/wlp//output/.classCache`. To benefit from Class data sharing, this location needs to be shared between containers either through the host or a data volume container.
276 |
277 | Taking the application image from example 3 above, containers can share the host file location (containing the shared cache) `/tmp/open-liberty/classCache` as follows:
278 |
279 | ```console
280 | docker run -d -p 80:9080 -p 443:9443 \
281 | -v /tmp/open-liberty/classCache:/opt/ol/wlp/output/.classCache app
282 | ```
283 |
284 | Or, create a named data volume container that exposes a volume at the location of the shared file:
285 |
286 | ```console
287 | docker run -v /opt/ol/wlp//output/.classCache \
288 | --name classcache open-liberty true
289 | ```
290 |
291 | Then, run the Open Liberty image with the volumes from the data volume container classcache mounted as follows:
292 |
293 | ```console
294 | docker run -d -p 80:9080 -p 443:9443 --volumes-from classcache app
295 | ```
296 |
297 | # Running Open Liberty in read-only mode
298 |
299 | Liberty writes to two different directories when running: `/opt/ol/wlp//output` and `/logs`. In order to run the Liberty image in read-only mode these may be mounted as temporary file systems. If using the provided image, the keystore will be generated on initial start up in the server configuration. This means that the server configuration directory either needs to be read-write or the keystore will need to be built into the image. In the example command `/config` is mounted as a read-write volume.
300 |
301 | ```console
302 | docker run -d -p 80:9080 -p 443:9443 \
303 | --tmpfs /opt/ol/wlp//output --tmpfs /logs -v /config --read-only \
304 | open-liberty:webProfile8
305 | ```
306 |
307 | # Relationship between Open Liberty and WebSphere Liberty
308 |
309 | WebSphere Liberty is a commercial distribution of Open Liberty. There is an official docker image for websphere-liberty. The websphere-liberty docker image predates the open-liberty one, so to make it simpler to move from open-liberty to websphere-liberty (or vice versa) the images are broadly compatible. It should be possible to move from one to the other with a simple FROM clause change. Some considerations for moving between them:
310 |
311 | - Open Liberty installs into `/opt/ol` rather than `/opt/ibm`.
312 | - Use the `/config` folder for accessing the server configuration.
313 | - Use the `/output` folder for accessing the server output.
314 | - When adding your own SSL configuration use the `/config/configDropins/defaults/keystore.xml`.
315 |
316 | # Image Variants
317 |
318 | The `open-liberty` images come in many flavors, each designed for a specific use case.
319 |
320 | ## `open-liberty:<version>`
321 |
322 | This is the defacto image. If you are unsure about what your needs are, you probably want to use this one. It is designed to be used both as a throw away container (mount your source code and start the container to start your app), as well as the base to build other images off of.
323 |
324 | ## `open-liberty:<version>-slim`
325 |
326 | This image does not contain the common packages contained in the default tag and only contains the minimal packages needed to run `open-liberty`. Unless you are working in an environment where *only* the `open-liberty` image will be deployed and you have space constraints, we highly recommend using the default image of this repository.
327 |
328 | # License
329 |
330 | View [license information](https://github.com/OpenLiberty/open-liberty/blob/master/LICENSE) for the software contained in this image.
331 |
332 | As with all Docker images, these likely also contain other software which may be under other licenses (such as Bash, etc from the base distribution, along with any direct or indirect dependencies of the primary software being contained).
333 |
334 | Some additional license information which was able to be auto-detected might be found in [the `repo-info` repository's `open-liberty/` directory](https://github.com/docker-library/repo-info/tree/master/repos/open-liberty).
335 |
336 | As for any pre-built image usage, it is the image user's responsibility to ensure that any use of this image complies with any relevant licenses for all software contained within.
337 |
```
--------------------------------------------------------------------------------
/python/README.md:
--------------------------------------------------------------------------------
```markdown
1 | <!--
2 |
3 | ********************************************************************************
4 |
5 | WARNING:
6 |
7 | DO NOT EDIT "python/README.md"
8 |
9 | IT IS AUTO-GENERATED
10 |
11 | (from the other files in "python/" combined with a set of templates)
12 |
13 | ********************************************************************************
14 |
15 | -->
16 |
17 | # Quick reference
18 |
19 | - **Maintained by**:
20 | [the Docker Community](https://github.com/docker-library/python)
21 |
22 | - **Where to get help**:
23 | [the Docker Community Slack](https://dockr.ly/comm-slack), [Server Fault](https://serverfault.com/help/on-topic), [Unix & Linux](https://unix.stackexchange.com/help/on-topic), or [Stack Overflow](https://stackoverflow.com/help/on-topic)
24 |
25 | # Supported tags and respective `Dockerfile` links
26 |
27 | (See ["What's the difference between 'Shared' and 'Simple' tags?" in the FAQ](https://github.com/docker-library/faq#whats-the-difference-between-shared-and-simple-tags).)
28 |
29 | ## Simple Tags
30 |
31 | - [`3.14.0b1-bookworm`, `3.14-rc-bookworm`](https://github.com/docker-library/python/blob/90aa427282f3f8283652c97011a511a77ea699b8/3.14-rc/bookworm/Dockerfile)
32 |
33 | - [`3.14.0b1-slim-bookworm`, `3.14-rc-slim-bookworm`, `3.14.0b1-slim`, `3.14-rc-slim`](https://github.com/docker-library/python/blob/90aa427282f3f8283652c97011a511a77ea699b8/3.14-rc/slim-bookworm/Dockerfile)
34 |
35 | - [`3.14.0b1-bullseye`, `3.14-rc-bullseye`](https://github.com/docker-library/python/blob/90aa427282f3f8283652c97011a511a77ea699b8/3.14-rc/bullseye/Dockerfile)
36 |
37 | - [`3.14.0b1-slim-bullseye`, `3.14-rc-slim-bullseye`](https://github.com/docker-library/python/blob/90aa427282f3f8283652c97011a511a77ea699b8/3.14-rc/slim-bullseye/Dockerfile)
38 |
39 | - [`3.14.0b1-alpine3.21`, `3.14-rc-alpine3.21`, `3.14.0b1-alpine`, `3.14-rc-alpine`](https://github.com/docker-library/python/blob/90aa427282f3f8283652c97011a511a77ea699b8/3.14-rc/alpine3.21/Dockerfile)
40 |
41 | - [`3.14.0b1-alpine3.20`, `3.14-rc-alpine3.20`](https://github.com/docker-library/python/blob/90aa427282f3f8283652c97011a511a77ea699b8/3.14-rc/alpine3.20/Dockerfile)
42 |
43 | - [`3.14.0b1-windowsservercore-ltsc2025`, `3.14-rc-windowsservercore-ltsc2025`](https://github.com/docker-library/python/blob/0fb50d347fe0df6a92b492ed52d012cb4d502627/3.14-rc/windows/windowsservercore-ltsc2025/Dockerfile)
44 |
45 | - [`3.14.0b1-windowsservercore-ltsc2022`, `3.14-rc-windowsservercore-ltsc2022`](https://github.com/docker-library/python/blob/0fb50d347fe0df6a92b492ed52d012cb4d502627/3.14-rc/windows/windowsservercore-ltsc2022/Dockerfile)
46 |
47 | - [`3.14.0b1-windowsservercore-1809`, `3.14-rc-windowsservercore-1809`](https://github.com/docker-library/python/blob/0fb50d347fe0df6a92b492ed52d012cb4d502627/3.14-rc/windows/windowsservercore-1809/Dockerfile)
48 |
49 | - [`3.13.3-bookworm`, `3.13-bookworm`, `3-bookworm`, `bookworm`](https://github.com/docker-library/python/blob/90aa427282f3f8283652c97011a511a77ea699b8/3.13/bookworm/Dockerfile)
50 |
51 | - [`3.13.3-slim-bookworm`, `3.13-slim-bookworm`, `3-slim-bookworm`, `slim-bookworm`, `3.13.3-slim`, `3.13-slim`, `3-slim`, `slim`](https://github.com/docker-library/python/blob/90aa427282f3f8283652c97011a511a77ea699b8/3.13/slim-bookworm/Dockerfile)
52 |
53 | - [`3.13.3-bullseye`, `3.13-bullseye`, `3-bullseye`, `bullseye`](https://github.com/docker-library/python/blob/90aa427282f3f8283652c97011a511a77ea699b8/3.13/bullseye/Dockerfile)
54 |
55 | - [`3.13.3-slim-bullseye`, `3.13-slim-bullseye`, `3-slim-bullseye`, `slim-bullseye`](https://github.com/docker-library/python/blob/90aa427282f3f8283652c97011a511a77ea699b8/3.13/slim-bullseye/Dockerfile)
56 |
57 | - [`3.13.3-alpine3.21`, `3.13-alpine3.21`, `3-alpine3.21`, `alpine3.21`, `3.13.3-alpine`, `3.13-alpine`, `3-alpine`, `alpine`](https://github.com/docker-library/python/blob/90aa427282f3f8283652c97011a511a77ea699b8/3.13/alpine3.21/Dockerfile)
58 |
59 | - [`3.13.3-alpine3.20`, `3.13-alpine3.20`, `3-alpine3.20`, `alpine3.20`](https://github.com/docker-library/python/blob/90aa427282f3f8283652c97011a511a77ea699b8/3.13/alpine3.20/Dockerfile)
60 |
61 | - [`3.13.3-windowsservercore-ltsc2025`, `3.13-windowsservercore-ltsc2025`, `3-windowsservercore-ltsc2025`, `windowsservercore-ltsc2025`](https://github.com/docker-library/python/blob/70fc099be48e4a130afd949a4dd3c6afe6935b8a/3.13/windows/windowsservercore-ltsc2025/Dockerfile)
62 |
63 | - [`3.13.3-windowsservercore-ltsc2022`, `3.13-windowsservercore-ltsc2022`, `3-windowsservercore-ltsc2022`, `windowsservercore-ltsc2022`](https://github.com/docker-library/python/blob/70fc099be48e4a130afd949a4dd3c6afe6935b8a/3.13/windows/windowsservercore-ltsc2022/Dockerfile)
64 |
65 | - [`3.13.3-windowsservercore-1809`, `3.13-windowsservercore-1809`, `3-windowsservercore-1809`, `windowsservercore-1809`](https://github.com/docker-library/python/blob/70fc099be48e4a130afd949a4dd3c6afe6935b8a/3.13/windows/windowsservercore-1809/Dockerfile)
66 |
67 | - [`3.12.10-bookworm`, `3.12-bookworm`](https://github.com/docker-library/python/blob/90aa427282f3f8283652c97011a511a77ea699b8/3.12/bookworm/Dockerfile)
68 |
69 | - [`3.12.10-slim-bookworm`, `3.12-slim-bookworm`, `3.12.10-slim`, `3.12-slim`](https://github.com/docker-library/python/blob/90aa427282f3f8283652c97011a511a77ea699b8/3.12/slim-bookworm/Dockerfile)
70 |
71 | - [`3.12.10-bullseye`, `3.12-bullseye`](https://github.com/docker-library/python/blob/90aa427282f3f8283652c97011a511a77ea699b8/3.12/bullseye/Dockerfile)
72 |
73 | - [`3.12.10-slim-bullseye`, `3.12-slim-bullseye`](https://github.com/docker-library/python/blob/90aa427282f3f8283652c97011a511a77ea699b8/3.12/slim-bullseye/Dockerfile)
74 |
75 | - [`3.12.10-alpine3.21`, `3.12-alpine3.21`, `3.12.10-alpine`, `3.12-alpine`](https://github.com/docker-library/python/blob/90aa427282f3f8283652c97011a511a77ea699b8/3.12/alpine3.21/Dockerfile)
76 |
77 | - [`3.12.10-alpine3.20`, `3.12-alpine3.20`](https://github.com/docker-library/python/blob/90aa427282f3f8283652c97011a511a77ea699b8/3.12/alpine3.20/Dockerfile)
78 |
79 | - [`3.12.10-windowsservercore-ltsc2025`, `3.12-windowsservercore-ltsc2025`](https://github.com/docker-library/python/blob/70fc099be48e4a130afd949a4dd3c6afe6935b8a/3.12/windows/windowsservercore-ltsc2025/Dockerfile)
80 |
81 | - [`3.12.10-windowsservercore-ltsc2022`, `3.12-windowsservercore-ltsc2022`](https://github.com/docker-library/python/blob/70fc099be48e4a130afd949a4dd3c6afe6935b8a/3.12/windows/windowsservercore-ltsc2022/Dockerfile)
82 |
83 | - [`3.12.10-windowsservercore-1809`, `3.12-windowsservercore-1809`](https://github.com/docker-library/python/blob/70fc099be48e4a130afd949a4dd3c6afe6935b8a/3.12/windows/windowsservercore-1809/Dockerfile)
84 |
85 | - [`3.11.12-bookworm`, `3.11-bookworm`](https://github.com/docker-library/python/blob/90aa427282f3f8283652c97011a511a77ea699b8/3.11/bookworm/Dockerfile)
86 |
87 | - [`3.11.12-slim-bookworm`, `3.11-slim-bookworm`, `3.11.12-slim`, `3.11-slim`](https://github.com/docker-library/python/blob/90aa427282f3f8283652c97011a511a77ea699b8/3.11/slim-bookworm/Dockerfile)
88 |
89 | - [`3.11.12-bullseye`, `3.11-bullseye`](https://github.com/docker-library/python/blob/90aa427282f3f8283652c97011a511a77ea699b8/3.11/bullseye/Dockerfile)
90 |
91 | - [`3.11.12-slim-bullseye`, `3.11-slim-bullseye`](https://github.com/docker-library/python/blob/90aa427282f3f8283652c97011a511a77ea699b8/3.11/slim-bullseye/Dockerfile)
92 |
93 | - [`3.11.12-alpine3.21`, `3.11-alpine3.21`, `3.11.12-alpine`, `3.11-alpine`](https://github.com/docker-library/python/blob/90aa427282f3f8283652c97011a511a77ea699b8/3.11/alpine3.21/Dockerfile)
94 |
95 | - [`3.11.12-alpine3.20`, `3.11-alpine3.20`](https://github.com/docker-library/python/blob/90aa427282f3f8283652c97011a511a77ea699b8/3.11/alpine3.20/Dockerfile)
96 |
97 | - [`3.10.17-bookworm`, `3.10-bookworm`](https://github.com/docker-library/python/blob/90aa427282f3f8283652c97011a511a77ea699b8/3.10/bookworm/Dockerfile)
98 |
99 | - [`3.10.17-slim-bookworm`, `3.10-slim-bookworm`, `3.10.17-slim`, `3.10-slim`](https://github.com/docker-library/python/blob/90aa427282f3f8283652c97011a511a77ea699b8/3.10/slim-bookworm/Dockerfile)
100 |
101 | - [`3.10.17-bullseye`, `3.10-bullseye`](https://github.com/docker-library/python/blob/90aa427282f3f8283652c97011a511a77ea699b8/3.10/bullseye/Dockerfile)
102 |
103 | - [`3.10.17-slim-bullseye`, `3.10-slim-bullseye`](https://github.com/docker-library/python/blob/90aa427282f3f8283652c97011a511a77ea699b8/3.10/slim-bullseye/Dockerfile)
104 |
105 | - [`3.10.17-alpine3.21`, `3.10-alpine3.21`, `3.10.17-alpine`, `3.10-alpine`](https://github.com/docker-library/python/blob/90aa427282f3f8283652c97011a511a77ea699b8/3.10/alpine3.21/Dockerfile)
106 |
107 | - [`3.10.17-alpine3.20`, `3.10-alpine3.20`](https://github.com/docker-library/python/blob/90aa427282f3f8283652c97011a511a77ea699b8/3.10/alpine3.20/Dockerfile)
108 |
109 | - [`3.9.22-bookworm`, `3.9-bookworm`](https://github.com/docker-library/python/blob/5f041dab48cbaa33eef235fb94ddf07c61a53ad7/3.9/bookworm/Dockerfile)
110 |
111 | - [`3.9.22-slim-bookworm`, `3.9-slim-bookworm`, `3.9.22-slim`, `3.9-slim`](https://github.com/docker-library/python/blob/5f041dab48cbaa33eef235fb94ddf07c61a53ad7/3.9/slim-bookworm/Dockerfile)
112 |
113 | - [`3.9.22-bullseye`, `3.9-bullseye`](https://github.com/docker-library/python/blob/5f041dab48cbaa33eef235fb94ddf07c61a53ad7/3.9/bullseye/Dockerfile)
114 |
115 | - [`3.9.22-slim-bullseye`, `3.9-slim-bullseye`](https://github.com/docker-library/python/blob/5f041dab48cbaa33eef235fb94ddf07c61a53ad7/3.9/slim-bullseye/Dockerfile)
116 |
117 | - [`3.9.22-alpine3.21`, `3.9-alpine3.21`, `3.9.22-alpine`, `3.9-alpine`](https://github.com/docker-library/python/blob/5f041dab48cbaa33eef235fb94ddf07c61a53ad7/3.9/alpine3.21/Dockerfile)
118 |
119 | - [`3.9.22-alpine3.20`, `3.9-alpine3.20`](https://github.com/docker-library/python/blob/5f041dab48cbaa33eef235fb94ddf07c61a53ad7/3.9/alpine3.20/Dockerfile)
120 |
121 | ## Shared Tags
122 |
123 | - `3.14.0b1`, `3.14-rc`:
124 |
125 | - [`3.14.0b1-bookworm`](https://github.com/docker-library/python/blob/90aa427282f3f8283652c97011a511a77ea699b8/3.14-rc/bookworm/Dockerfile)
126 | - [`3.14.0b1-windowsservercore-ltsc2025`](https://github.com/docker-library/python/blob/0fb50d347fe0df6a92b492ed52d012cb4d502627/3.14-rc/windows/windowsservercore-ltsc2025/Dockerfile)
127 | - [`3.14.0b1-windowsservercore-ltsc2022`](https://github.com/docker-library/python/blob/0fb50d347fe0df6a92b492ed52d012cb4d502627/3.14-rc/windows/windowsservercore-ltsc2022/Dockerfile)
128 | - [`3.14.0b1-windowsservercore-1809`](https://github.com/docker-library/python/blob/0fb50d347fe0df6a92b492ed52d012cb4d502627/3.14-rc/windows/windowsservercore-1809/Dockerfile)
129 |
130 | - `3.14.0b1-windowsservercore`, `3.14-rc-windowsservercore`:
131 |
132 | - [`3.14.0b1-windowsservercore-ltsc2025`](https://github.com/docker-library/python/blob/0fb50d347fe0df6a92b492ed52d012cb4d502627/3.14-rc/windows/windowsservercore-ltsc2025/Dockerfile)
133 | - [`3.14.0b1-windowsservercore-ltsc2022`](https://github.com/docker-library/python/blob/0fb50d347fe0df6a92b492ed52d012cb4d502627/3.14-rc/windows/windowsservercore-ltsc2022/Dockerfile)
134 | - [`3.14.0b1-windowsservercore-1809`](https://github.com/docker-library/python/blob/0fb50d347fe0df6a92b492ed52d012cb4d502627/3.14-rc/windows/windowsservercore-1809/Dockerfile)
135 |
136 | - `3.13.3`, `3.13`, `3`, `latest`:
137 |
138 | - [`3.13.3-bookworm`](https://github.com/docker-library/python/blob/90aa427282f3f8283652c97011a511a77ea699b8/3.13/bookworm/Dockerfile)
139 | - [`3.13.3-windowsservercore-ltsc2025`](https://github.com/docker-library/python/blob/70fc099be48e4a130afd949a4dd3c6afe6935b8a/3.13/windows/windowsservercore-ltsc2025/Dockerfile)
140 | - [`3.13.3-windowsservercore-ltsc2022`](https://github.com/docker-library/python/blob/70fc099be48e4a130afd949a4dd3c6afe6935b8a/3.13/windows/windowsservercore-ltsc2022/Dockerfile)
141 | - [`3.13.3-windowsservercore-1809`](https://github.com/docker-library/python/blob/70fc099be48e4a130afd949a4dd3c6afe6935b8a/3.13/windows/windowsservercore-1809/Dockerfile)
142 |
143 | - `3.13.3-windowsservercore`, `3.13-windowsservercore`, `3-windowsservercore`, `windowsservercore`:
144 |
145 | - [`3.13.3-windowsservercore-ltsc2025`](https://github.com/docker-library/python/blob/70fc099be48e4a130afd949a4dd3c6afe6935b8a/3.13/windows/windowsservercore-ltsc2025/Dockerfile)
146 | - [`3.13.3-windowsservercore-ltsc2022`](https://github.com/docker-library/python/blob/70fc099be48e4a130afd949a4dd3c6afe6935b8a/3.13/windows/windowsservercore-ltsc2022/Dockerfile)
147 | - [`3.13.3-windowsservercore-1809`](https://github.com/docker-library/python/blob/70fc099be48e4a130afd949a4dd3c6afe6935b8a/3.13/windows/windowsservercore-1809/Dockerfile)
148 |
149 | - `3.12.10`, `3.12`:
150 |
151 | - [`3.12.10-bookworm`](https://github.com/docker-library/python/blob/90aa427282f3f8283652c97011a511a77ea699b8/3.12/bookworm/Dockerfile)
152 | - [`3.12.10-windowsservercore-ltsc2025`](https://github.com/docker-library/python/blob/70fc099be48e4a130afd949a4dd3c6afe6935b8a/3.12/windows/windowsservercore-ltsc2025/Dockerfile)
153 | - [`3.12.10-windowsservercore-ltsc2022`](https://github.com/docker-library/python/blob/70fc099be48e4a130afd949a4dd3c6afe6935b8a/3.12/windows/windowsservercore-ltsc2022/Dockerfile)
154 | - [`3.12.10-windowsservercore-1809`](https://github.com/docker-library/python/blob/70fc099be48e4a130afd949a4dd3c6afe6935b8a/3.12/windows/windowsservercore-1809/Dockerfile)
155 |
156 | - `3.12.10-windowsservercore`, `3.12-windowsservercore`:
157 |
158 | - [`3.12.10-windowsservercore-ltsc2025`](https://github.com/docker-library/python/blob/70fc099be48e4a130afd949a4dd3c6afe6935b8a/3.12/windows/windowsservercore-ltsc2025/Dockerfile)
159 | - [`3.12.10-windowsservercore-ltsc2022`](https://github.com/docker-library/python/blob/70fc099be48e4a130afd949a4dd3c6afe6935b8a/3.12/windows/windowsservercore-ltsc2022/Dockerfile)
160 | - [`3.12.10-windowsservercore-1809`](https://github.com/docker-library/python/blob/70fc099be48e4a130afd949a4dd3c6afe6935b8a/3.12/windows/windowsservercore-1809/Dockerfile)
161 |
162 | - `3.11.12`, `3.11`:
163 |
164 | - [`3.11.12-bookworm`](https://github.com/docker-library/python/blob/90aa427282f3f8283652c97011a511a77ea699b8/3.11/bookworm/Dockerfile)
165 |
166 | - `3.10.17`, `3.10`:
167 |
168 | - [`3.10.17-bookworm`](https://github.com/docker-library/python/blob/90aa427282f3f8283652c97011a511a77ea699b8/3.10/bookworm/Dockerfile)
169 |
170 | - `3.9.22`, `3.9`:
171 |
172 | - [`3.9.22-bookworm`](https://github.com/docker-library/python/blob/5f041dab48cbaa33eef235fb94ddf07c61a53ad7/3.9/bookworm/Dockerfile)
173 |
174 | # Quick reference (cont.)
175 |
176 | - **Where to file issues**:
177 | [https://github.com/docker-library/python/issues](https://github.com/docker-library/python/issues?q=)
178 |
179 | - **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64))
180 | [`amd64`](https://hub.docker.com/r/amd64/python/), [`arm32v5`](https://hub.docker.com/r/arm32v5/python/), [`arm32v6`](https://hub.docker.com/r/arm32v6/python/), [`arm32v7`](https://hub.docker.com/r/arm32v7/python/), [`arm64v8`](https://hub.docker.com/r/arm64v8/python/), [`i386`](https://hub.docker.com/r/i386/python/), [`mips64le`](https://hub.docker.com/r/mips64le/python/), [`ppc64le`](https://hub.docker.com/r/ppc64le/python/), [`riscv64`](https://hub.docker.com/r/riscv64/python/), [`s390x`](https://hub.docker.com/r/s390x/python/), [`windows-amd64`](https://hub.docker.com/r/winamd64/python/)
181 |
182 | - **Published image artifact details**:
183 | [repo-info repo's `repos/python/` directory](https://github.com/docker-library/repo-info/blob/master/repos/python) ([history](https://github.com/docker-library/repo-info/commits/master/repos/python))
184 | (image metadata, transfer size, etc)
185 |
186 | - **Image updates**:
187 | [official-images repo's `library/python` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fpython)
188 | [official-images repo's `library/python` file](https://github.com/docker-library/official-images/blob/master/library/python) ([history](https://github.com/docker-library/official-images/commits/master/library/python))
189 |
190 | - **Source of this description**:
191 | [docs repo's `python/` directory](https://github.com/docker-library/docs/tree/master/python) ([history](https://github.com/docker-library/docs/commits/master/python))
192 |
193 | # What is Python?
194 |
195 | Python is an interpreted, interactive, object-oriented, open-source programming language. It incorporates modules, exceptions, dynamic typing, very high level dynamic data types, and classes. Python combines remarkable power with very clear syntax. It has interfaces to many system calls and libraries, as well as to various window systems, and is extensible in C or C++. It is also usable as an extension language for applications that need a programmable interface. Finally, Python is portable: it runs on many Unix variants, on the Mac, and on Windows 2000 and later.
196 |
197 | > [wikipedia.org/wiki/Python_(programming_language)](https://en.wikipedia.org/wiki/Python_%28programming_language%29)
198 |
199 | 
200 |
201 | # How to use this image
202 |
203 | ## Create a `Dockerfile` in your Python app project
204 |
205 | ```dockerfile
206 | FROM python:3
207 |
208 | WORKDIR /usr/src/app
209 |
210 | COPY requirements.txt ./
211 | RUN pip install --no-cache-dir -r requirements.txt
212 |
213 | COPY . .
214 |
215 | CMD [ "python", "./your-daemon-or-script.py" ]
216 | ```
217 |
218 | or (if you need to use Python 2):
219 |
220 | ```dockerfile
221 | FROM python:2
222 |
223 | WORKDIR /usr/src/app
224 |
225 | COPY requirements.txt ./
226 | RUN pip install --no-cache-dir -r requirements.txt
227 |
228 | COPY . .
229 |
230 | CMD [ "python", "./your-daemon-or-script.py" ]
231 | ```
232 |
233 | You can then build and run the Docker image:
234 |
235 | ```console
236 | $ docker build -t my-python-app .
237 | $ docker run -it --rm --name my-running-app my-python-app
238 | ```
239 |
240 | ## Run a single Python script
241 |
242 | For many simple, single file projects, you may find it inconvenient to write a complete `Dockerfile`. In such cases, you can run a Python script by using the Python Docker image directly:
243 |
244 | ```console
245 | $ docker run -it --rm --name my-running-script -v "$PWD":/usr/src/myapp -w /usr/src/myapp python:3 python your-daemon-or-script.py
246 | ```
247 |
248 | or (again, if you need to use Python 2):
249 |
250 | ```console
251 | $ docker run -it --rm --name my-running-script -v "$PWD":/usr/src/myapp -w /usr/src/myapp python:2 python your-daemon-or-script.py
252 | ```
253 |
254 | ## Multiple Python versions in the image
255 |
256 | In the non-slim variants there will be an additional (distro-provided) `python` executable at `/usr/bin/python` (and/or `/usr/bin/python3`) while the desired image-provided `/usr/local/bin/python` is the default choice in the `$PATH`. This is an unfortunate side-effect of using the `buildpack-deps` image in the non-slim variants (and many distribution-provided tools being written against and likely to break with a different Python installation, so we can't safely remove/overwrite it).
257 |
258 | # Image Variants
259 |
260 | The `python` images come in many flavors, each designed for a specific use case.
261 |
262 | ## `python:<version>`
263 |
264 | This is the defacto image. If you are unsure about what your needs are, you probably want to use this one. It is designed to be used both as a throw away container (mount your source code and start the container to start your app), as well as the base to build other images off of.
265 |
266 | Some of these tags may have names like bookworm or bullseye in them. These are the suite code names for releases of [Debian](https://wiki.debian.org/DebianReleases) and indicate which release the image is based on. If your image needs to install any additional packages beyond what comes with the image, you'll likely want to specify one of these explicitly to minimize breakage when there are new releases of Debian.
267 |
268 | This tag is based off of [`buildpack-deps`](https://hub.docker.com/_/buildpack-deps/). `buildpack-deps` is designed for the average user of Docker who has many images on their system. It, by design, has a large number of extremely common Debian packages. This reduces the number of packages that images that derive from it need to install, thus reducing the overall size of all images on your system.
269 |
270 | ## `python:<version>-slim`
271 |
272 | This image does not contain the common Debian packages contained in the default tag and only contains the minimal Debian packages needed to run `python`. Unless you are working in an environment where *only* the `python` image will be deployed and you have space constraints, we highly recommend using the default image of this repository.
273 |
274 | When using this image `pip install` will work if a suitable built distribution is available for the Python distribution package being installed. `pip install` may fail when installing a Python distribution package from a source distribution. This image does not contain the Debian packages required to compile extension modules written in other languages. Possible solutions if a `pip install` fails include:
275 |
276 | - Use this image and install any required Debian packages before running `pip install`.
277 | - Use the default image of this repository. The default image contains the most commonly required Debian packages. The majority of arbitrary `pip install`s should be successful without additional header/development Debian packages.
278 |
279 | ## `python:<version>-alpine`
280 |
281 | This image is based on the popular [Alpine Linux project](https://alpinelinux.org), available in [the `alpine` official image](https://hub.docker.com/_/alpine). Alpine Linux is much smaller than most distribution base images (~5MB), and thus leads to much slimmer images in general.
282 |
283 | This variant is useful when final image size being as small as possible is your primary concern. The main caveat to note is that it does use [musl libc](https://musl.libc.org) instead of [glibc and friends](https://www.etalabs.net/compare_libcs.html), so software will often run into issues depending on the depth of their libc requirements/assumptions. See [this Hacker News comment thread](https://news.ycombinator.com/item?id=10782897) for more discussion of the issues that might arise and some pro/con comparisons of using Alpine-based images.
284 |
285 | To minimize image size, it's uncommon for additional related tools (such as `git` or `bash`) to be included in Alpine-based images. Using this image as a base, add the things you need in your own Dockerfile (see the [`alpine` image description](https://hub.docker.com/_/alpine/) for examples of how to install packages if you are unfamiliar).
286 |
287 | ## `python:<version>-windowsservercore`
288 |
289 | This image is based on [Windows Server Core (`microsoft/windowsservercore`)](https://hub.docker.com/r/microsoft/windowsservercore/). As such, it only works in places which that image does, such as Windows 10 Professional/Enterprise (Anniversary Edition) or Windows Server 2016.
290 |
291 | For information about how to get Docker running on Windows, please see the relevant "Quick Start" guide provided by Microsoft:
292 |
293 | - [Windows Server Quick Start](https://msdn.microsoft.com/en-us/virtualization/windowscontainers/quick_start/quick_start_windows_server)
294 | - [Windows 10 Quick Start](https://msdn.microsoft.com/en-us/virtualization/windowscontainers/quick_start/quick_start_windows_10)
295 |
296 | # License
297 |
298 | View license information for [Python 2](https://docs.python.org/2/license.html) and [Python 3](https://docs.python.org/3/license.html).
299 |
300 | As with all Docker images, these likely also contain other software which may be under other licenses (such as Bash, etc from the base distribution, along with any direct or indirect dependencies of the primary software being contained).
301 |
302 | Some additional license information which was able to be auto-detected might be found in [the `repo-info` repository's `python/` directory](https://github.com/docker-library/repo-info/tree/master/repos/python).
303 |
304 | As for any pre-built image usage, it is the image user's responsibility to ensure that any use of this image complies with any relevant licenses for all software contained within.
305 |
```