From 0dce785e074468144a0c0ac431208fced264fbf6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Cotineau?= Date: Mon, 16 Jan 2023 10:59:30 +0100 Subject: [PATCH 1/2] Sync upstream Docker official image documentation (#16) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Link to more Stack Exchange sites Also, link directly to their "What topics can I ask about here?" pages instead of to a search. * Run update.sh * Run update.sh * Run update.sh * [nats] Release v2.9.3 Details can be found [here](https://github.com/nats-io/nats-server/releases/tag/v2.9.3) Signed-off-by: Ivan Kozlovic * Readme Typo when referring to pre-existing db folder (#2212) * Run update.sh * Run update.sh * Run update.sh * [nats-streaming] Release v0.25.2 Details can be found [here](https://github.com/nats-io/nats-streaming-server/releases/tag/v0.25.2) Signed-off-by: Ivan Kozlovic * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Update the HAProxy Docs URL see https://www.mail-archive.com/haproxy@formilux.org/msg42790.html * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Add Alpine locale information for Postgres 15 (#2220) * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Update community Slack link * Run update.sh * Update forwarded ports in example docker run commands (#2224) * Update ports in example docker run commands * Run update.sh * Tidy up port list * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * [varnish] add a few words about port variables * ubuntu: Update Git references to Launchpad Ubuntu base images rootfs tarballs are now fetched from Launchpad Git repository. The location https://partner-images.canonical.com/oci/ is no longer used. Update links in the documentation to refer to the https://git.launchpad.net/cloud-images/+oci/ubuntu-base Git repository URL instead. The Launchpad Git repository URL is also set in github-repo file. This shouldn't matter because the fact that an URL is a GitHub URL is used only to fetch badges from open-source CI/CD services, and in case the URL is not a GitHub URL, the HTTP request will just fail, and no badge will be included. * remove line in jetty docs about JDK9 and HTTP2 (#2230) Signed-off-by: Lachlan Roberts * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * [nats] Release v2.9.8 Details can be found [here](https://github.com/nats-io/nats-server/releases/tag/v2.9.8) Signed-off-by: Waldemar Quevedo * Run update.sh * Update the phpMyAdmin image docs Ref: https://github.com/docker-library/official-images/pull/13594 * Run update.sh * Run update.sh * Run update.sh * Remove "neo4j" short tags special case > Now that we're only supporting 3 images, would it be possible to get the supported tags listed on https://hub.docker.com/_/neo4j?tab=description again? * Run update.sh * Run update.sh * Run update.sh * update emqx docs * Influxdb: rearrange readme (#2236) * Influxdb: Add quick start * influxdb: re-arrange upgrade instructions. Upgrading from version 1.x is no longer as important, and can be moved below the general use instructions for version 2.x * influxDB: formatting * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Update for Convertigo 8.1.0 documentation: use PouchDB and configure SSL (#2244) * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * update emqx tagline and what is emqx section * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Update "arbitrary --user" notes for postgres nss_wrapper is now available in alpine, too. * Improve Hashicorp Vault docker run example for server mode (#2246) * Improve Hashicorp Vault docker run example for server mode to actually be directly usable and fix backend to current wording of storage * Upgrade hashicorp vault readme by suggestions from mladlow making it explicit that docker run example is not meant for productional use Co-authored-by: Theo Diefenthal * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Fix badges urls apply changes for https://github.com/badges/shields/issues/8671 * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Add new env var docs for develop tag (#2255) * Add package install directions * change irc servers * fix formatting * Update server env docs ...and remove old dns module comment * Finish sentence * typo fix * Add new env var docs for develop * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Change from WEBrick to Puma Ever since https://github.com/docker-library/redmine/pull/261 the default uses puma instead of WEBrick. Puma is considered production-ready whereas WEBrick was not recommended for production. * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh * Run update.sh Signed-off-by: Ivan Kozlovic Signed-off-by: Lachlan Roberts Signed-off-by: Waldemar Quevedo Co-authored-by: Tianon Gravi Co-authored-by: yosifkit Co-authored-by: Docker Library Bot Co-authored-by: Ivan Kozlovic Co-authored-by: Alberto Roura Co-authored-by: Tim Düsterhus Co-authored-by: wglambert Co-authored-by: udkyo Co-authored-by: Guillaume Quintard Co-authored-by: Tomáš Virtus Co-authored-by: Lachlan Co-authored-by: Waldemar Quevedo Co-authored-by: William Desportes Co-authored-by: Ivan Dyachkov Co-authored-by: kalleguld <393906+kalleguld@users.noreply.github.com> Co-authored-by: Albert Nicolas Co-authored-by: Wolfgang Walther Co-authored-by: Theo Diefenthal <4670569+theodiefenthal@users.noreply.github.com> Co-authored-by: Theo Diefenthal Co-authored-by: Geo Co-authored-by: Pete --- .ci/check-pr-no-readme.sh | 5 +- .github/workflows/ci.yml | 15 +- .../generate-dockerfile-links-partial.tmpl | 40 +- .template-helpers/get-help.md | 2 +- .template-helpers/template.md | 2 +- .template-helpers/variant-alpine.md | 4 +- .template-helpers/variant.sh | 2 +- README.md | 174 ++++--- adminer/README.md | 12 +- adminer/content.md | 2 +- adoptopenjdk/README-short.txt | 1 - adoptopenjdk/README.md | 352 ------------- adoptopenjdk/content.md | 67 --- adoptopenjdk/get-help.md | 1 - adoptopenjdk/github-repo | 1 - adoptopenjdk/issues.md | 1 - adoptopenjdk/logo.png | Bin 10489 -> 0 bytes adoptopenjdk/maintainer.md | 1 - aerospike/README.md | 203 ++++++-- aerospike/content.md | 180 +++++-- aerospike/github-repo | 2 +- aerospike/license.md | 8 +- almalinux/README-short.txt | 1 + almalinux/README.md | 87 ++++ almalinux/content.md | 27 + almalinux/github-repo | 1 + almalinux/issues.md | 1 + almalinux/license.md | 1 + almalinux/logo.png | Bin 0 -> 22916 bytes almalinux/maintainer.md | 1 + alpine/README.md | 20 +- alpine/content.md | 4 +- alt/README.md | 12 +- amazoncorretto/README.md | 69 ++- amazoncorretto/content.md | 12 + amazoncorretto/github-repo | 2 +- amazonlinux/README.md | 16 +- amazonlinux/content.md | 2 + api-firewall/README-short.txt | 1 + api-firewall/README.md | 153 ++++++ api-firewall/content.md | 96 ++++ api-firewall/github-repo | 1 + api-firewall/license.md | 1 + api-firewall/logo.svg | 22 + api-firewall/maintainer.md | 1 + arangodb/README.md | 47 +- arangodb/content.md | 33 +- arangodb/license.md | 2 +- archlinux/README.md | 40 +- archlinux/content.md | 22 +- archlinux/issues.md | 1 + archlinux/maintainer.md | 2 +- backdrop/README.md | 9 +- backdrop/content.md | 1 - bash/README.md | 26 +- bonita/README.md | 479 +++++++----------- bonita/content.md | 437 ++++++---------- bonita/get-help.md | 1 + bonita/github-repo | 2 +- bonita/issues.md | 1 + bonita/stack.yml | 24 +- buildpack-deps/README.md | 66 +-- busybox/README.md | 26 +- caddy/README.md | 91 +++- caddy/content.md | 55 +- caddy/get-help.md | 1 + cassandra/README.md | 14 +- centos/README-short.txt | 2 +- centos/README.md | 26 +- centos/deprecated.md | 1 + chronograf/README.md | 22 +- cirros/README.md | 8 +- clearlinux/README.md | 6 +- clefos/README.md | 4 +- clojure/README.md | 99 ++-- composer/README.md | 37 +- composer/content.md | 26 +- consul/README.md | 14 +- consul/content.md | 4 +- convertigo/README-short.txt | 2 +- convertigo/README.md | 181 +++++-- convertigo/content.md | 175 ++++++- convertigo/license.md | 2 +- couchbase/README.md | 156 +++--- couchbase/content.md | 129 +++-- couchbase/license.md | 12 +- couchdb/README.md | 11 +- crate/README-short.txt | 2 +- crate/README.md | 40 +- crate/content.md | 28 +- crate/get-help.md | 2 +- crate/logo.png | Bin 2796 -> 0 bytes crate/logo.svg | 1 + crux/README-short.txt | 1 - crux/README.md | 73 --- crux/content.md | 15 - crux/github-repo | 1 - crux/license.md | 1 - crux/logo.png | Bin 9542 -> 0 bytes crux/maintainer.md | 1 - dart/README-short.txt | 1 + dart/README.md | 145 ++++++ dart/content.md | 87 ++++ dart/github-repo | 1 + dart/license.md | 1 + dart/logo.svg | 23 + dart/maintainer.md | 1 + debian/README.md | 62 ++- debian/content.md | 4 +- docker/README.md | 81 ++- docker/content.md | 34 +- docker/variant-windowsservercore.md | 3 + drupal/README.md | 74 ++- drupal/logo.png | Bin 62713 -> 0 bytes drupal/logo.svg | 1 + drupal/variant-fpm.md | 1 + eclipse-mosquitto/README.md | 11 +- eclipse-temurin/README-short.txt | 1 + eclipse-temurin/README.md | 330 ++++++++++++ eclipse-temurin/content.md | 84 +++ eclipse-temurin/get-help.md | 1 + eclipse-temurin/github-repo | 1 + eclipse-temurin/issues.md | 1 + {adoptopenjdk => eclipse-temurin}/license.md | 1 - eclipse-temurin/logo.png | Bin 0 -> 39456 bytes eclipse-temurin/maintainer.md | 1 + eggdrop/README.md | 72 ++- eggdrop/content.md | 64 ++- elasticsearch/README.md | 10 +- elasticsearch/license.md | 2 +- elixir/README.md | 66 +-- elixir/github-repo | 2 +- elixir/maintainer.md | 2 +- emqx/README-short.txt | 1 + emqx/README.md | 366 +++++++++++++ emqx/content.md | 307 +++++++++++ emqx/get-help.md | 1 + emqx/github-repo | 1 + emqx/license.md | 1 + emqx/logo.svg | 14 + emqx/maintainer.md | 1 + erlang/README.md | 42 +- euleros/README-short.txt | 1 - euleros/README.md | 79 --- euleros/content.md | 19 - euleros/get-help.md | 1 - euleros/github-repo | 1 - euleros/license.md | 1 - euleros/logo.png | Bin 3431 -> 0 bytes euleros/maintainer.md | 1 - express-gateway/README-short.txt | 2 +- express-gateway/README.md | 12 +- express-gateway/deprecated.md | 1 + fedora/README.md | 24 +- fedora/content.md | 2 +- fedora/issues.md | 2 +- fedora/logo.png | Bin 11879 -> 4298 bytes flink/README.md | 100 +--- flink/content.md | 80 +-- flink/get-help.md | 2 +- flink/github-repo | 2 +- flink/issues.md | 1 + flink/license.md | 2 +- flink/maintainer.md | 2 +- fluentd/README.md | 8 +- friendica/README.md | 128 +++-- friendica/content.md | 106 +++- fsharp/README-short.txt | 1 - fsharp/README.md | 80 --- fsharp/content.md | 21 - fsharp/github-repo | 1 - fsharp/license.md | 1 - fsharp/logo.png | Bin 8550 -> 0 bytes fsharp/maintainer.md | 1 - gazebo/README.md | 24 +- gcc/README.md | 13 +- gcc/license.md | 2 +- generate-repo-stub-readme.sh | 50 +- geonetwork/README.md | 32 +- geonetwork/content.md | 18 +- ghost/README.md | 71 ++- ghost/content.md | 38 +- ghost/stack.yml | 13 +- golang/README.md | 126 +++-- golang/content.md | 25 +- golang/variant-alpine.md | 9 + gradle/README.md | 47 +- groovy/README.md | 38 +- haproxy/README.md | 56 +- haproxy/content.md | 16 +- haproxy/logo.png | Bin 3522 -> 12526 bytes haskell/README.md | 58 ++- haskell/content.md | 24 +- haskell/variant-slim.md | 5 + haxe/README.md | 145 +++--- hello-world/README.md | 25 +- hello-world/content.md | 6 +- hello-world/update.sh | 16 +- hitch/README-short.txt | 1 + hitch/README.md | 121 +++++ hitch/content.md | 63 +++ hitch/github-repo | 1 + hitch/license.md | 1 + hitch/maintainer.md | 1 + httpd/README.md | 14 +- hylang/README.md | 90 ++-- ibm-semeru-runtimes/README-short.txt | 1 + ibm-semeru-runtimes/README.md | 144 ++++++ ibm-semeru-runtimes/content.md | 37 ++ ibm-semeru-runtimes/github-repo | 1 + ibm-semeru-runtimes/issues.md | 1 + ibm-semeru-runtimes/license.md | 5 + ibm-semeru-runtimes/maintainer.md | 1 + ibmjava/README.md | 33 +- ibmjava/content.md | 2 +- ibmjava/license.md | 4 +- influxdb/README.md | 462 +++++++++++++++-- influxdb/content.md | 420 ++++++++++++++- influxdb/variant-data.md | 2 +- irssi/README.md | 12 +- jetty/README.md | 68 ++- jetty/content.md | 2 - jetty/github-repo | 2 +- jetty/license.md | 2 +- jobber/README-short.txt | 2 +- jobber/README.md | 10 +- jobber/deprecated.md | 1 + joomla/README.md | 26 +- jruby/README.md | 44 +- jruby/github-repo | 2 +- julia/README.md | 74 ++- julia/content.md | 6 + kaazing-gateway/README-short.txt | 1 - kaazing-gateway/README.md | 113 ----- kaazing-gateway/content.md | 56 -- kaazing-gateway/github-repo | 1 - kaazing-gateway/license.md | 1 - kaazing-gateway/logo.png | Bin 19324 -> 0 bytes kaazing-gateway/maintainer.md | 1 - kapacitor/README.md | 16 +- kibana/README.md | 10 +- kibana/license.md | 2 +- known/README-short.txt | 1 - known/README.md | 107 ---- known/content.md | 50 -- known/github-repo | 1 - known/license.md | 1 - known/logo.png | Bin 11116 -> 0 bytes known/maintainer.md | 1 - kong/README-short.txt | 2 +- kong/README.md | 97 ++-- kong/content.md | 59 ++- lightstreamer/README.md | 23 +- lightstreamer/content.md | 1 - lightstreamer/logo.png | Bin 19629 -> 74477 bytes logstash/README.md | 8 +- mageia/README.md | 8 +- mariadb/README-short.txt | 2 +- mariadb/README.md | 317 +++++++++--- mariadb/content.md | 285 +++++++++-- mariadb/get-help.md | 3 + mariadb/github-repo | 2 +- mariadb/issues.md | 1 + mariadb/logo.png | Bin 16832 -> 16087 bytes mariadb/maintainer.md | 2 +- mariadb/stack.yml | 2 +- matomo/README.md | 19 +- matomo/content.md | 5 +- maven/README.md | 52 +- maven/maintainer.md | 2 +- mediawiki/README.md | 49 +- mediawiki/logo.png | Bin 252240 -> 0 bytes mediawiki/logo.svg | 49 ++ mediawiki/maintainer.md | 2 +- mediawiki/stack.yml | 9 +- memcached/README.md | 16 +- mongo-express/README.md | 7 +- mongo/README.md | 113 +++-- mongo/content.md | 12 +- mongo/stack.yml | 1 + monica/README-short.txt | 1 + monica/README.md | 296 +++++++++++ monica/content.md | 221 ++++++++ monica/github-repo | 1 + monica/license.md | 1 + monica/logo.svg | 1 + monica/maintainer.md | 1 + mono/README.md | 38 +- mono/content.md | 24 +- mysql/README.md | 27 +- mysql/content.md | 10 +- mysql/stack.yml | 2 + nats-streaming/README-short.txt | 2 +- nats-streaming/README.md | 195 +++---- nats-streaming/content.md | 162 +++--- nats-streaming/deprecated.md | 1 + nats/README.md | 107 ++-- nats/content.md | 75 ++- neo4j/README.md | 93 +--- neo4j/content.md | 37 +- neo4j/get-help.md | 2 +- neo4j/logo.png | Bin 16955 -> 233916 bytes neurodebian/README.md | 40 +- nextcloud/README.md | 255 +++++++--- nextcloud/content.md | 228 ++++++--- nginx/README.md | 87 ++-- nginx/content.md | 52 +- nginx/variant-perl.md | 3 + node/README.md | 72 ++- notary/README.md | 8 +- nuxeo/README-short.txt | 1 - nuxeo/README.md | 252 --------- nuxeo/content.md | 192 ------- nuxeo/github-repo | 1 - nuxeo/license.md | 1 - nuxeo/logo.png | Bin 1821 -> 0 bytes nuxeo/maintainer.md | 1 - odoo/README.md | 75 ++- odoo/content.md | 63 ++- odoo/license.md | 2 +- open-liberty/README-short.txt | 2 +- open-liberty/README.md | 71 ++- open-liberty/content.md | 22 +- openjdk/README-short.txt | 2 +- openjdk/README.md | 179 +++---- openjdk/content.md | 4 +- openjdk/deprecated.md | 11 + openjdk/variant-alpine.md | 7 + openjdk/variant-oracle.md | 8 +- opensuse/README-short.txt | 1 - opensuse/README.md | 85 ---- opensuse/content.md | 22 - opensuse/deprecated.md | 3 - opensuse/github-repo | 1 - opensuse/license.md | 1 - opensuse/logo.png | Bin 23435 -> 0 bytes opensuse/maintainer.md | 1 - oraclelinux/README.md | 63 +-- oraclelinux/content.md | 43 +- oraclelinux/logo.png | Bin 4176 -> 20535 bytes oraclelinux/maintainer.md | 2 +- orientdb/README.md | 18 +- percona/README.md | 22 +- percona/content.md | 4 +- perl/README.md | 76 +-- perl/content.md | 20 +- photon/README.md | 10 +- php-zendserver/README.md | 11 +- php/README.md | 99 ++-- php/content.md | 10 +- php/variant-fpm.md | 2 + phpmyadmin/README-short.txt | 1 + phpmyadmin/README.md | 252 +++++++++ phpmyadmin/content.md | 154 ++++++ phpmyadmin/github-repo | 1 + phpmyadmin/license.md | 1 + phpmyadmin/logo.png | Bin 0 -> 4601 bytes phpmyadmin/maintainer.md | 1 + phpmyadmin/stack.yml | 16 + plone/README.md | 42 +- plone/content.md | 19 +- postfixadmin/README.md | 48 +- postfixadmin/content.md | 22 +- postfixadmin/stack.yml | 2 +- postfixadmin/variant-apache.md | 3 + postfixadmin/variant-fpm-alpine.md | 3 + postfixadmin/variant-fpm.md | 3 + postgres/README.md | 83 +-- postgres/content.md | 53 +- push.pl | 36 +- pypy/README.md | 67 ++- python/README.md | 146 +++--- python/content.md | 4 + r-base/README.md | 8 +- rabbitmq/README.md | 160 +++--- rabbitmq/content.md | 130 ++--- rakudo-star/README.md | 30 +- rakudo-star/content.md | 14 +- rakudo-star/github-repo | 2 +- rakudo-star/maintainer.md | 2 +- rapidoid/README-short.txt | 1 - rapidoid/README.md | 199 -------- rapidoid/content.md | 136 ----- rapidoid/deprecated.md | 3 - rapidoid/github-repo | 1 - rapidoid/license.md | 1 - rapidoid/logo.png | Bin 17104 -> 0 bytes rapidoid/maintainer.md | 1 - redis/README.md | 29 +- redis/content.md | 8 +- redmine/README.md | 45 +- redmine/content.md | 22 +- registry/README.md | 21 +- registry/content.md | 10 +- registry/get-help.md | 3 + registry/logo.png | Bin 0 -> 28962 bytes rethinkdb/README.md | 22 +- rocket.chat/README.md | 11 +- rockylinux/README-short.txt | 1 + rockylinux/README.md | 92 ++++ rockylinux/content.md | 32 ++ rockylinux/github-repo | 1 + rockylinux/issues.md | 1 + rockylinux/license.md | 1 + rockylinux/logo.png | Bin 0 -> 19946 bytes rockylinux/maintainer.md | 1 + ros/README.md | 370 +++++++------- ros/content.md | 325 ++++++------ ros/license.md | 4 +- ruby/README.md | 54 +- ruby/content.md | 6 +- rust/README.md | 24 +- rust/content.md | 2 +- sapmachine/README.md | 9 +- satosa/README-short.txt | 1 + satosa/README.md | 158 ++++++ satosa/content.md | 73 +++ satosa/get-help.md | 1 + satosa/github-repo | 1 + satosa/license.md | 1 + satosa/logo.svg | 2 + satosa/maintainer.md | 1 + sentry/README-short.txt | 1 - sentry/README.md | 184 ------- sentry/content.md | 102 ---- sentry/github-repo | 1 - sentry/license.md | 1 - sentry/logo.png | Bin 6598 -> 0 bytes sentry/maintainer.md | 1 - sentry/variant-onbuild.md | 15 - silverpeas/README.md | 24 +- silverpeas/content.md | 19 +- sl/README.md | 5 +- solr/README-short.txt | 2 +- solr/README.md | 58 +-- solr/content.md | 24 +- solr/get-help.md | 2 +- solr/github-repo | 2 +- solr/issues.md | 1 + solr/license.md | 2 +- solr/maintainer.md | 2 +- sonarqube/README.md | 55 +- sourcemage/README-short.txt | 1 - sourcemage/README.md | 87 ---- sourcemage/content.md | 28 - sourcemage/github-repo | 1 - sourcemage/license.md | 3 - sourcemage/logo.png | Bin 21396 -> 0 bytes sourcemage/maintainer.md | 1 - spiped/README.md | 12 +- storm/README.md | 11 +- swarm/README-short.txt | 1 - swarm/README.md | 111 ---- swarm/content.md | 54 -- swarm/github-repo | 1 - swarm/license.md | 1 - swarm/logo.png | Bin 123625 -> 0 bytes swarm/maintainer.md | 1 - swift/README.md | 88 +++- swipl/README.md | 8 +- teamspeak/README.md | 6 +- telegraf/README.md | 44 +- telegraf/content.md | 24 +- thrift/README-short.txt | 1 - thrift/README.md | 75 --- thrift/content.md | 15 - thrift/github-repo | 1 - thrift/license.md | 1 - thrift/maintainer.md | 1 - tomcat/README.md | 100 ++-- tomee/README.md | 93 +++- traefik/README.md | 42 +- traefik/content.md | 18 +- traefik/github-repo | 2 +- traefik/license.md | 2 +- ubuntu/README.md | 33 +- ubuntu/content.md | 12 +- ubuntu/github-repo | 2 +- ubuntu/maintainer.md | 2 +- update.sh | 12 +- varnish/README.md | 167 +++++- varnish/content.md | 138 ++++- vault/README.md | 26 +- vault/content.md | 14 +- vault/logo.svg | 2 +- websphere-liberty/README-short.txt | 2 +- websphere-liberty/README.md | 45 +- websphere-liberty/content.md | 8 +- wordpress/README.md | 118 +++-- wordpress/content.md | 71 ++- wordpress/variant-cli.md | 7 +- wordpress/variant-fpm.md | 1 + xwiki/README.md | 15 +- yourls/README.md | 117 +++-- yourls/content.md | 80 ++- yourls/github-repo | 2 +- yourls/logo.png | Bin 12112 -> 0 bytes yourls/logo.svg | 1 + yourls/stack.yml | 3 +- yourls/variant-fpm.md | 1 + znc/README.md | 12 +- znc/content.md | 4 +- zookeeper/README.md | 45 +- zookeeper/content.md | 20 +- zookeeper/stack.yml | 6 +- 505 files changed, 11817 insertions(+), 7566 deletions(-) delete mode 100644 adoptopenjdk/README-short.txt delete mode 100644 adoptopenjdk/README.md delete mode 100644 adoptopenjdk/content.md delete mode 100644 adoptopenjdk/get-help.md delete mode 100644 adoptopenjdk/github-repo delete mode 100644 adoptopenjdk/issues.md delete mode 100644 adoptopenjdk/logo.png delete mode 100644 adoptopenjdk/maintainer.md create mode 100644 almalinux/README-short.txt create mode 100644 almalinux/README.md create mode 100644 almalinux/content.md create mode 100644 almalinux/github-repo create mode 100644 almalinux/issues.md create mode 100644 almalinux/license.md create mode 100644 almalinux/logo.png create mode 100644 almalinux/maintainer.md create mode 100644 api-firewall/README-short.txt create mode 100644 api-firewall/README.md create mode 100644 api-firewall/content.md create mode 100644 api-firewall/github-repo create mode 100644 api-firewall/license.md create mode 100644 api-firewall/logo.svg create mode 100644 api-firewall/maintainer.md create mode 100644 archlinux/issues.md create mode 100644 bonita/get-help.md create mode 100644 bonita/issues.md create mode 100644 caddy/get-help.md create mode 100644 centos/deprecated.md delete mode 100644 crate/logo.png create mode 100644 crate/logo.svg delete mode 100644 crux/README-short.txt delete mode 100644 crux/README.md delete mode 100644 crux/content.md delete mode 100644 crux/github-repo delete mode 100644 crux/license.md delete mode 100644 crux/logo.png delete mode 100644 crux/maintainer.md create mode 100644 dart/README-short.txt create mode 100644 dart/README.md create mode 100644 dart/content.md create mode 100644 dart/github-repo create mode 100644 dart/license.md create mode 100644 dart/logo.svg create mode 100644 dart/maintainer.md create mode 100644 docker/variant-windowsservercore.md delete mode 100644 drupal/logo.png create mode 100644 drupal/logo.svg create mode 120000 drupal/variant-fpm.md create mode 100644 eclipse-temurin/README-short.txt create mode 100644 eclipse-temurin/README.md create mode 100644 eclipse-temurin/content.md create mode 100644 eclipse-temurin/get-help.md create mode 100644 eclipse-temurin/github-repo create mode 100644 eclipse-temurin/issues.md rename {adoptopenjdk => eclipse-temurin}/license.md (65%) create mode 100644 eclipse-temurin/logo.png create mode 100644 eclipse-temurin/maintainer.md create mode 100644 emqx/README-short.txt create mode 100644 emqx/README.md create mode 100644 emqx/content.md create mode 100644 emqx/get-help.md create mode 100644 emqx/github-repo create mode 100644 emqx/license.md create mode 100644 emqx/logo.svg create mode 100644 emqx/maintainer.md delete mode 100644 euleros/README-short.txt delete mode 100644 euleros/README.md delete mode 100644 euleros/content.md delete mode 100644 euleros/get-help.md delete mode 100644 euleros/github-repo delete mode 100644 euleros/license.md delete mode 100644 euleros/logo.png delete mode 100644 euleros/maintainer.md create mode 100644 express-gateway/deprecated.md create mode 100644 flink/issues.md delete mode 100644 fsharp/README-short.txt delete mode 100644 fsharp/README.md delete mode 100644 fsharp/content.md delete mode 100644 fsharp/github-repo delete mode 100644 fsharp/license.md delete mode 100644 fsharp/logo.png delete mode 100644 fsharp/maintainer.md create mode 100644 golang/variant-alpine.md create mode 100644 haskell/variant-slim.md create mode 100644 hitch/README-short.txt create mode 100644 hitch/README.md create mode 100644 hitch/content.md create mode 100644 hitch/github-repo create mode 100644 hitch/license.md create mode 100644 hitch/maintainer.md create mode 100644 ibm-semeru-runtimes/README-short.txt create mode 100644 ibm-semeru-runtimes/README.md create mode 100644 ibm-semeru-runtimes/content.md create mode 100644 ibm-semeru-runtimes/github-repo create mode 100644 ibm-semeru-runtimes/issues.md create mode 100644 ibm-semeru-runtimes/license.md create mode 100644 ibm-semeru-runtimes/maintainer.md create mode 100644 jobber/deprecated.md delete mode 100644 kaazing-gateway/README-short.txt delete mode 100644 kaazing-gateway/README.md delete mode 100644 kaazing-gateway/content.md delete mode 100644 kaazing-gateway/github-repo delete mode 100644 kaazing-gateway/license.md delete mode 100644 kaazing-gateway/logo.png delete mode 100644 kaazing-gateway/maintainer.md delete mode 100644 known/README-short.txt delete mode 100644 known/README.md delete mode 100644 known/content.md delete mode 100644 known/github-repo delete mode 100644 known/license.md delete mode 100644 known/logo.png delete mode 100644 known/maintainer.md create mode 100644 mariadb/get-help.md create mode 100644 mariadb/issues.md mode change 120000 => 100644 mariadb/maintainer.md delete mode 100644 mediawiki/logo.png create mode 100644 mediawiki/logo.svg create mode 100644 monica/README-short.txt create mode 100644 monica/README.md create mode 100644 monica/content.md create mode 100644 monica/github-repo create mode 100644 monica/license.md create mode 100644 monica/logo.svg create mode 100644 monica/maintainer.md create mode 100644 nats-streaming/deprecated.md create mode 100644 nginx/variant-perl.md delete mode 100644 nuxeo/README-short.txt delete mode 100644 nuxeo/README.md delete mode 100644 nuxeo/content.md delete mode 100644 nuxeo/github-repo delete mode 100644 nuxeo/license.md delete mode 100644 nuxeo/logo.png delete mode 100644 nuxeo/maintainer.md create mode 100644 openjdk/deprecated.md create mode 100644 openjdk/variant-alpine.md delete mode 100644 opensuse/README-short.txt delete mode 100644 opensuse/README.md delete mode 100644 opensuse/content.md delete mode 100644 opensuse/deprecated.md delete mode 100644 opensuse/github-repo delete mode 100644 opensuse/license.md delete mode 100644 opensuse/logo.png delete mode 100644 opensuse/maintainer.md create mode 100644 phpmyadmin/README-short.txt create mode 100644 phpmyadmin/README.md create mode 100644 phpmyadmin/content.md create mode 100644 phpmyadmin/github-repo create mode 100644 phpmyadmin/license.md create mode 100644 phpmyadmin/logo.png create mode 100644 phpmyadmin/maintainer.md create mode 100644 phpmyadmin/stack.yml create mode 100644 postfixadmin/variant-apache.md create mode 100644 postfixadmin/variant-fpm-alpine.md create mode 100644 postfixadmin/variant-fpm.md delete mode 100644 rapidoid/README-short.txt delete mode 100644 rapidoid/README.md delete mode 100644 rapidoid/content.md delete mode 100644 rapidoid/deprecated.md delete mode 100644 rapidoid/github-repo delete mode 100644 rapidoid/license.md delete mode 100644 rapidoid/logo.png delete mode 100644 rapidoid/maintainer.md create mode 100644 registry/get-help.md create mode 100644 registry/logo.png create mode 100644 rockylinux/README-short.txt create mode 100644 rockylinux/README.md create mode 100644 rockylinux/content.md create mode 100644 rockylinux/github-repo create mode 100644 rockylinux/issues.md create mode 100644 rockylinux/license.md create mode 100644 rockylinux/logo.png create mode 100644 rockylinux/maintainer.md create mode 100644 satosa/README-short.txt create mode 100644 satosa/README.md create mode 100644 satosa/content.md create mode 100644 satosa/get-help.md create mode 100644 satosa/github-repo create mode 100644 satosa/license.md create mode 100644 satosa/logo.svg create mode 100644 satosa/maintainer.md delete mode 100644 sentry/README-short.txt delete mode 100644 sentry/README.md delete mode 100644 sentry/content.md delete mode 100644 sentry/github-repo delete mode 100644 sentry/license.md delete mode 100644 sentry/logo.png delete mode 100644 sentry/maintainer.md delete mode 100644 sentry/variant-onbuild.md create mode 100644 solr/issues.md delete mode 100644 sourcemage/README-short.txt delete mode 100644 sourcemage/README.md delete mode 100644 sourcemage/content.md delete mode 100644 sourcemage/github-repo delete mode 100644 sourcemage/license.md delete mode 100644 sourcemage/logo.png delete mode 100644 sourcemage/maintainer.md delete mode 100644 swarm/README-short.txt delete mode 100644 swarm/README.md delete mode 100644 swarm/content.md delete mode 100644 swarm/github-repo delete mode 100644 swarm/license.md delete mode 100644 swarm/logo.png delete mode 120000 swarm/maintainer.md delete mode 100644 thrift/README-short.txt delete mode 100644 thrift/README.md delete mode 100644 thrift/content.md delete mode 100644 thrift/github-repo delete mode 100644 thrift/license.md delete mode 120000 thrift/maintainer.md create mode 120000 wordpress/variant-fpm.md delete mode 100644 yourls/logo.png create mode 100644 yourls/logo.svg create mode 120000 yourls/variant-fpm.md diff --git a/.ci/check-pr-no-readme.sh b/.ci/check-pr-no-readme.sh index 6ffe4f25b03c..5f74c2c30ab5 100755 --- a/.ci/check-pr-no-readme.sh +++ b/.ci/check-pr-no-readme.sh @@ -4,11 +4,12 @@ set -Eeuo pipefail cd "$(dirname "$(readlink -f "$BASH_SOURCE")")/.." git fetch -q https://github.com/docker-library/docs.git master -if [ -n "$(git diff --numstat FETCH_HEAD...HEAD -- '*/README.md')" ]; then +numstat="$(git diff --numstat FETCH_HEAD...HEAD -- '*/README.md')" +if [ -n "$numstat" ]; then echo >&2 'Error: at least one repo README.md has changed' echo >&2 'These files are autogenerated, so it is unnecessary to modify them' echo >&2 'Please update content.md and docker-library-bot will take care of README.md' - echo >&2 'See: https://github.com/docker-library/docs/#image-namereadmemd' + echo >&2 'See: https://github.com/docker-library/docs/#readmemd' echo >&2 exit 1 fi diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3c42274bd017..130d1c4e7cdc 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,5 +1,8 @@ name: GitHub CI +permissions: + contents: read + on: pull_request: push: @@ -16,28 +19,30 @@ jobs: markdownfmt: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - run: docker pull tianon/markdownfmt - run: .ci/check-markdownfmt.sh ymlfmt: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - run: docker pull tianon/ymlfmt - run: .ci/check-ymlfmt.sh short: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - run: .ci/check-short.sh required-files: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - run: .ci/check-required-files.sh no-readme: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 + with: + fetch-depth: 0 - run: .ci/check-pr-no-readme.sh if: ${{ github.event_name == 'pull_request' }} diff --git a/.template-helpers/generate-dockerfile-links-partial.tmpl b/.template-helpers/generate-dockerfile-links-partial.tmpl index 1426e00277e0..2889640fb4ce 100644 --- a/.template-helpers/generate-dockerfile-links-partial.tmpl +++ b/.template-helpers/generate-dockerfile-links-partial.tmpl @@ -21,22 +21,26 @@ This template defines the "Supported tags and Dockerfile links" portion of an im {{- $froms := $.ArchDockerFroms $arch $e -}} {{- $gitRepo := $e.ArchGitRepo $arch -}} + {{- $gitCommit := $e.ArchGitCommit $arch -}} + {{- $dir := .ArchDirectory $arch -}} + {{- $dockerfile := .ArchFile $arch -}} + {{- $dockerfilePath := eq $dir "." | ternary $dockerfile (join "/" $dir $dockerfile) -}} {{- $repoUrlBase := $gitRepo | replace "git://" "https://" | trimSuffixes ".git" -}} - {{- $isGitHub := hasPrefix "https://github.com/" $repoUrlBase -}} + {{- $url := hasPrefix "https://github.com/" $repoUrlBase | ternary (join "/" $repoUrlBase "blob" $gitCommit $dockerfilePath) "" -}} + {{- /* handle https://gitlab.../.../... style URLs (by reasonably assuming they're a gitlab instance) */ -}} + {{- $url = $url | ternary $url (hasPrefix "https://gitlab." $repoUrlBase | ternary (join "/" $repoUrlBase "-/blob" $gitCommit $dockerfilePath) "") -}} + {{- /* handle https://git.launchpad.net/ URLs */ -}} + {{- $url = $url | ternary $url (hasPrefix "https://git.launchpad.net/" $repoUrlBase | ternary (print $repoUrlBase "/tree/" $dockerfilePath "?h=" ($e.ArchGitFetch $arch) "&id=" $gitCommit) "") -}} + {{- /* TODO decide what to do (if anything) about other non-GitHub repos with respect to URL */ -}} {{- if $i -}} {{- "\n" -}} {{- end -}} - {{- "\t" -}} - {{- if $isGitHub -}} [ {{- end -}} - {{- $dir := .ArchDirectory $arch -}} - {{- $dockerfile := .ArchFile $arch -}} - {{- $dockerfilePath := eq $dir "." | ternary $dockerfile (join "/" $dir $dockerfile) -}} + {{- if $url -}} [ {{- end -}} ` {{- $e.Tags | join "`, `" -}} ` - {{- $gitCommit := $e.ArchGitCommit $arch -}} - {{- if $isGitHub -}} ]( {{- $repoUrlBase -}} /blob/ {{- $gitCommit -}} / {{- $dockerfilePath -}} ) {{- end -}} - {{- /* TODO decide what to do (if anything) about non-GitHub repos with respect to URL */ -}} + {{- if $url -}} ]( {{- $url -}} ) {{- end -}} {{- end -}} {{- "\n\n" -}} @@ -58,18 +62,22 @@ This template defines the "Supported tags and Dockerfile links" portion of an im {{- $froms := $.ArchDockerFroms $arch $e -}} {{- $gitRepo := $e.ArchGitRepo $arch -}} - {{- $repoUrlBase := $gitRepo | replace "git://" "https://" | trimSuffixes ".git" -}} - {{- $isGitHub := hasPrefix "https://github.com/" $repoUrlBase -}} - - {{- "\t-\t" -}} - {{- if $isGitHub -}} [ {{- end -}} + {{- $gitCommit := $e.ArchGitCommit $arch -}} {{- $dir := .ArchDirectory $arch -}} {{- $dockerfile := .ArchFile $arch -}} {{- $dockerfilePath := eq $dir "." | ternary $dockerfile (join "/" $dir $dockerfile) -}} + {{- $repoUrlBase := $gitRepo | replace "git://" "https://" | trimSuffixes ".git" -}} + {{- $url := hasPrefix "https://github.com/" $repoUrlBase | ternary (join "/" $repoUrlBase "blob" $gitCommit $dockerfilePath) "" -}} + {{- /* handle https://gitlab.../.../... style URLs (by reasonably assuming they're a gitlab instance) */ -}} + {{- $url = $url | ternary $url (hasPrefix "https://gitlab." $repoUrlBase | ternary (join "/" $repoUrlBase "-/blob" $gitCommit $dockerfilePath) "") -}} + {{- /* handle https://git.launchpad.net/ URLs */ -}} + {{- $url = $url | ternary $url (hasPrefix "https://git.launchpad.net/" $repoUrlBase | ternary (print $repoUrlBase "/tree/" $dockerfilePath "?h=" ($e.ArchGitFetch $arch) "&id=" $gitCommit) "") -}} + {{- /* TODO decide what to do (if anything) about other non-GitHub repos with respect to URL */ -}} + + {{- "\t-\t" -}} + {{- if $url -}} [ {{- end -}} ` {{- $e.Tags | first -}} ` - {{- $gitCommit := $e.ArchGitCommit $arch -}} - {{- if $isGitHub -}} ]( {{- $repoUrlBase -}} /blob/ {{- $gitCommit -}} / {{- $dockerfilePath -}} ) {{- end -}} - {{- /* TODO decide what to do (if anything) about non-GitHub repos with respect to URL */ -}} + {{- if $url -}} ]( {{- $url -}} ) {{- end -}} {{- "\n" -}} {{- end -}} diff --git a/.template-helpers/get-help.md b/.template-helpers/get-help.md index b5896e3f2e7d..f9d0b5d2fecd 100644 --- a/.template-helpers/get-help.md +++ b/.template-helpers/get-help.md @@ -1 +1 @@ -[the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) +[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) diff --git a/.template-helpers/template.md b/.template-helpers/template.md index 987374943304..b2f9618678f9 100644 --- a/.template-helpers/template.md +++ b/.template-helpers/template.md @@ -23,7 +23,7 @@ (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/%%REPO%%`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2F%%REPO%%) + [official-images repo's `library/%%REPO%%` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2F%%REPO%%) [official-images repo's `library/%%REPO%%` file](https://github.com/docker-library/official-images/blob/master/library/%%REPO%%) ([history](https://github.com/docker-library/official-images/commits/master/library/%%REPO%%)) - **Source of this description**: diff --git a/.template-helpers/variant-alpine.md b/.template-helpers/variant-alpine.md index 5debddb77465..e04f87e1de5a 100644 --- a/.template-helpers/variant-alpine.md +++ b/.template-helpers/variant-alpine.md @@ -1,7 +1,7 @@ ## `%%IMAGE%%:-alpine` -This image is based on the popular [Alpine Linux project](http://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. +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. -This variant is highly recommended when final image size being as small as possible is desired. The main caveat to note is that it does use [musl libc](http://www.musl-libc.org) instead of [glibc and friends](http://www.etalabs.net/compare_libcs.html), so certain software might run into issues depending on the depth of their libc requirements. However, most software doesn't have an issue with this, so this variant is usually a very safe choice. 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. +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. 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). diff --git a/.template-helpers/variant.sh b/.template-helpers/variant.sh index 79c88853241c..dd802ec5c82d 100755 --- a/.template-helpers/variant.sh +++ b/.template-helpers/variant.sh @@ -102,7 +102,7 @@ if [ -n "$text" ]; then default+=$'\n' # parameter expansion eats the trailing newline if [ "$repo" != 'debian' ] && [ "$repo" != 'ubuntu' ]; then - # what is 'jessie', 'stretch' and 'sid' + # what is 'bullseye', 'buster' and 'sid' # https://github.com/docker-library/python/issues/343 debian=( $(bashbrew list --uniq "$(_repo 'debian')" | grep -vE 'stable|slim|backports|experimental|testing' | cut -d: -f2) ) ubuntu=( $(bashbrew list "$(_repo 'ubuntu')" | grep -vE 'devel|latest|[0-9]' | cut -d: -f2) ) diff --git a/README.md b/README.md index 52fb627f70c3..fd46f6562c67 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ # What is this? -This repository contains the image documentation for each of the official images. See [docker-library/official-images](https://github.com/docker-library/official-images) for more information about the program in general. +This repository contains the image documentation for each of the Docker Official Images. See [docker-library/official-images](https://github.com/docker-library/official-images) for more information about the program in general. -All Markdown files here are run through [tianon's fork of `markdownfmt`](https://github.com/tianon/markdownfmt) (only forked to add some smaller-diff preference and minor DockerHub-compatibility changes), and verified as formatted correctly via GitHub Actions. +All Markdown files here are run through [tianon's fork of `markdownfmt`](https://github.com/tianon/markdownfmt), and verified as formatted correctly via GitHub Actions. -- [![GitHub CI status badge](https://img.shields.io/github/workflow/status/docker-library/docs/GitHub%20CI/master?label=GitHub%20CI)](https://github.com/docker-library/docs/actions?query=workflow%3A%22GitHub+CI%22+branch%3Amaster) +- [![GitHub CI status badge](https://img.shields.io/github/actions/workflow/status/docker-library/docs/ci.yml?branch=master&label=GitHub%20CI)](https://github.com/docker-library/docs/actions?query=workflow%3A%22GitHub+CI%22+branch%3Amaster) - [![library update.sh status badge](https://img.shields.io/jenkins/s/https/doi-janky.infosiftr.net/job/docs/job/library.svg?label=Automated%20library%20update.sh)](https://doi-janky.infosiftr.net/job/docs/job/library/) - [![amd64 update.sh status badge](https://img.shields.io/jenkins/s/https/doi-janky.infosiftr.net/job/docs/job/amd64.svg?label=Automated%20amd64%20update.sh)](https://doi-janky.infosiftr.net/job/docs/job/amd64/) - [![arm32v5 update.sh status badge](https://img.shields.io/jenkins/s/https/doi-janky.infosiftr.net/job/docs/job/arm32v5.svg?label=Automated%20arm32v5%20update.sh)](https://doi-janky.infosiftr.net/job/docs/job/arm32v5/) @@ -22,82 +22,68 @@ All Markdown files here are run through [tianon's fork of `markdownfmt`](https:/ 1. [What is this?](#what-is-this) 1. [Table of Contents](#table-of-contents) -2. [How do I add a new image's docs](#how-do-i-add-a-new-images-docs) -3. [How do I update an image's docs](#how-do-i-update-an-images-docs) -4. [What are all these files?](#what-are-all-these-files) +2. [How do I update an image's docs](#how-do-i-update-an-images-docs) +3. [How do I add a new image's docs](#how-do-i-add-a-new-images-docs) +4. [Files related to an image's docs](#files-related-to-an-images-docs) + 1. [folder ``](#folder-image-name) + 2. [`README.md`](#readmemd) + 3. [`content.md`](#contentmd) + 4. [`get-help.md`](#get-helpmd) + 5. [`github-repo`](#github-repo) + 6. [`license.md`](#licensemd) + 7. [`logo.png`](#logopng) + 8. [`maintainer.md`](#maintainermd) + 9. [`README-short.txt`](#readme-shorttxt) + 10. [`stack.yml`](#stackyml) +5. [Files for main Docs repo](#files-for-main-docs-repo) 1. [`update.sh`](#updatesh) - 2. [`generate-repo-stub-readme.sh`](#generate-repo-stub-readmesh) - 3. [`push.pl`](#pushpl) - 4. [`.template-helpers/generate-dockerfile-links-partial.sh`](#template-helpersgenerate-dockerfile-links-partialsh) - 5. [`.template-helpers/template.md` and `.template-helpers/user-feedback.md`](#template-helperstemplatemd-and-template-helpersuser-feedbackmd) - 6. [folder ``](#folder-image-name) - 7. [`/README.md`](#image-namereadmemd) - 8. [`/content.md`](#image-namecontentmd) - 9. [`/README-short.txt`](#image-namereadme-shorttxt) - 10. [`/logo.png`](#image-namelogopng) - 11. [`/license.md`](#image-namelicensemd) - 12. [`/maintainer.md`](#image-namemaintainermd) - 13. [`/github-repo`](#image-namegithub-repo) - 14. [`/user-feedback.md`](#image-nameuser-feedbackmd) -5. [Issues and Contributing](#issues-and-contributing) + 2. [`markdownfmt.sh` and `ymlfmt.sh`](#markdownfmtsh-and-ymlfmtsh) + 3. [`.template-helpers/generate-dockerfile-links-partial.sh`](#template-helpersgenerate-dockerfile-links-partialsh) + 4. [`.template-helpers/`](#template-helpers) +6. [Scripts unrelated to templates](#scripts-unrelated-to-templates) + 1. [`generate-repo-stub-readme.sh`](#generate-repo-stub-readmesh) + 2. [`push.pl` and `push.sh`](#pushpl-and-pushsh) +7. [Issues and Contributing](#issues-and-contributing) -# How do I add a new image's docs - -- create a folder for my image: `mkdir myimage` -- create a `README-short.txt` (required, 100 char max) -- create a `content.md` (required) -- create a `license.md` (required) -- create a `maintainer.md` (required) -- create a `github-repo` (required) -- add a `logo.png` (recommended) - -Optionally: - -- run `./markdownfmt.sh -l myimage` to verify whether format of your markdown files is compliant to `tianon/markdownfmt`. In case you see any file names, markdownfmt detected some issues, which might result in a failed build during continuous integration. run `./markdownfmt.sh -d myimage` to see a diff of changes required to pass. -- run `./update.sh myimage` to generate `myimage/README.md` for manual review of the generated copy. - **Note:** do not actually commit the `README.md` file; it is automatically generated/committed before being uploaded to Docker Hub. - # How do I update an image's docs -To update `README.md` for a specific image do not edit `README.md` directly. Please edit `content.md` or another appropriate file within the folder. To see the changes, run `./update.sh myimage` from the repo root, but do not add the `README.md` changes to your pull request. See also `markdownfmt.sh` point [above](#how-do-i-add-a-new-images-docs). - -# What are all these files? - -## `update.sh` - -This is the main script used to generate the `README.md` files for each image. The generated file is committed along with the files used to generate it (see below on what customizations are available). Accepted arguments are which image(s) you want to update or no arguments to update all of them. - -This script assumes [`bashbrew`](https://github.com/docker-library/official-images/tree/81e90ca8dcec892ade7eb348cba5a4a5d6851e17/bashbrew) is in your `PATH` (for scraping relevant tag information from the library manifest file for each repository). - -## `generate-repo-stub-readme.sh` - -This is used to generate a simple `README.md` to put in the image's repo. Argument is the name of the image, like `golang` and it then outputs the readme to standard out. +Edit the `content.md` for an image; not the `README.md` as it's auto-generated from the contents of the other files in that repo. To see the changes to the `README.md`, run `./update.sh myimage` from the repo root, but do not add the `README.md` changes to your pull request. See also `markdownfmt.sh` point [below](#how-do-i-add-a-new-images-docs). -## `push.pl` +After opening your Pull Request the changes will be checked by an automated `markdownfmt.sh` before it can be merged. A common issue is incorrect spacing such as with two lines missing an empty line between them (double-spaced). -This is used by us to push the actual content of the READMEs to the Docker Hub as special access is required to modify the Hub description contents. +# How do I add a new image's docs -## `.template-helpers/generate-dockerfile-links-partial.sh` +- Create a folder for my image: `mkdir myimage` +- Create a `README-short.txt` (required, 100 char max) +- Create a `content.md` (required) +- Create a `license.md` (required) +- Create a `maintainer.md` (required) +- Create a `github-repo` (required) +- Add a `logo.png` (recommended) -This script is used by `update.sh` to create the "Supported tags and respective `Dockerfile` links" section of each generated `README.md` from the information in the [official-images `library/` manifests](https://github.com/docker-library/official-images/tree/master/library). +Optionally: -## `.template-helpers/template.md` and `.template-helpers/user-feedback.md` +- Run `./markdownfmt.sh -l myimage` to list any files that are non-compliant to [`tianon/markdownfmt`](https://hub.docker.com/r/tianon/markdownfmt). + Any files in the list will result in a failed build during continuous integration. + - run `./markdownfmt.sh -d myimage` to see a diff of changes required to pass. +- Run `./update.sh myimage` to generate `myimage/README.md` for manual review of the generated copy. + **Note:** do not actually commit the `README.md` file; it is automatically generated/committed before being uploaded to Docker Hub. -These files are the templates used in building the `/README.md` file, in combination with the individual image's files. +# Files related to an image's docs ## folder `` -This is where all the partial and generated files for a given image reside, (ex: `golang/`). +This is where all the partial (e.g. `content.md`) and generated files (e.g. `README.md`) for a given image reside, (e.g. `golang/`). It must match the name of the image used in `docker-library/official-images`. -## `/README.md` +## `README.md` -This file is generated using `update.sh`. +This file is generated using `update.sh`. Do not commit or edit this file; it is regenerated periodically by a bot. -## `/content.md` +## `content.md` -This file contains the main content of your image's long description. The basic parts you should have are a "What Is" section and a "How To" section. See the doc on [Official Repos](https://docs.docker.com/docker-hub/official_repos/#a-long-description) for more information on long description. The issues and contribution section is generated by the script but can be overridden. The following is a basic layout: +This file contains the main content of your image's long description. The basic parts you should have are a "What Is" section and a "How To" section. The following is a basic layout: ```markdown # What is XYZ? @@ -112,17 +98,19 @@ This file contains the main content of your image's long description. The basic // make use of subsections as necessary ``` -## `/README-short.txt` +## `get-help.md` -This is the short description for the docker hub, limited to 100 characters in a single line. +This file is an optional override of the default `get-help.md`. This is the content of the "Where to get help" part of the "Quick reference" at the top of the generated README. We recommend linking to the best places for community support like forums, chat rooms, or mailing lists. -> Go (golang) is a general purpose, higher-level, imperative programming language. +## `github-repo` -## `/logo.png` +This file should contain the URL to the GitHub repository for the Dockerfiles that become the images. The file should be in a single line ending in a newline with no extraneous whitespace. Only one GitHub repo per image repository is supported. It is used in generating links. Here is an example for `golang`: -Logo for the contained software. While there are not hard rules on formatting, most existing logos are square or landscape and stay within a few hundred pixels of width. +```text +https://github.com/docker-library/golang +``` -## `/license.md` +## `license.md` This file should contain a link to the license for the main software in the image. Here is an example for `golang`: @@ -130,24 +118,60 @@ This file should contain a link to the license for the main software in the imag View [license information](http://golang.org/LICENSE) for the software contained in this image. ``` -## `/maintainer.md` +## `logo.png` + +Logo for the contained software. While there are not hard rules on formatting, most existing logos are square or landscape and stay within a few hundred pixels of width. Alternatively, a `logo.svg` can be used instead, but only one logo file will apply. To use it within `content.md`, put `%%LOGO%%` as shown above in the basic `content.md` layout. + +The image is automatically scaled to a 120 pixel square for the top of the Docker Hub page and Hub search results. + +## `maintainer.md` This file should contain a link to the maintainers of the Dockerfile. -## `/github-repo` +## `README-short.txt` -This file should contain the URL to the GitHub repository for the Dockerfiles that become the images. The file should be in a single line ending in a newline with no extraneous whitespace. Only one GitHub repo per image repository is supported. It is used in generating links. Here is an example for `golang`: +This is the short description for the Docker Hub, limited to 100 characters in a single line. -```text -https://github.com/docker-library/golang -``` +> Go (golang) is a general purpose, higher-level, imperative programming language. + +## `stack.yml` + +This optional file contains a small, working [Compose file for Docker Swarm](https://docs.docker.com/compose/compose-file/compose-file-v3/) showing off how to use the image. To use the `stack.yml`, add `%%STACK%%` to the `content.md` and this will embed the YAML along with a link to directly try it in [Play with Docker](https://labs.play-with-docker.com/). + +The file must work via `docker stack deploy` since that is how Play with Docker will launch it, but it is helpful for users to try locally if it works for `docker-compose` as well. Other official images may be referenced within the YAML to demonstrate the functionality of the image, but no images external to the Docker Official Images program may be referenced. + +# Files for main Docs repo + +## `update.sh` + +This is the main script used to generate the `README.md` files for each image. The generated file is committed along with the files used to generate it. Accepted arguments are which image(s) you want to update or no arguments to update all of them. + +This script assumes [`bashbrew`](https://github.com/docker-library/official-images/tree/81e90ca8dcec892ade7eb348cba5a4a5d6851e17/bashbrew) is in your `PATH` (for scraping relevant tag information from the library manifest file for each repository). + +## `markdownfmt.sh` and `ymlfmt.sh` + +These two scripts are for verifying the formatting of Markdown (`.md`) and YAML (`.yml`) files, respectively. `markdownfmt.sh` uses the [`tianon/markdownfmt`](https://hub.docker.com/r/tianon/markdownfmt) image and `ymlfmt.sh` uses the [`tianon/ymlfmt`](https://hub.docker.com/r/tianon/ymlfmt) image. + +## `.template-helpers/generate-dockerfile-links-partial.sh` + +This script is used by `update.sh` to create the "Supported tags and respective `Dockerfile` links" section of each generated `README.md` from the information in the [official-images `library/` manifests](https://github.com/docker-library/official-images/tree/master/library). + +## `.template-helpers/` + +The scripts and Markdown files in here are used in building an image's `README.md` file in combination with its individual files. + +# Scripts unrelated to templates + +## `generate-repo-stub-readme.sh` + +This is used to generate a simple `README.md` to put in the image's repo. We use this in Git repositories within https://github.com/docker-library to simplify our maintenance, but it is not required for anyone else. The only argument is the name of the image (or repo), like `golang` and it then outputs the readme to standard out. -## `/user-feedback.md` +## `push.pl` and `push.sh` -This file is an optional override of the default `user-feedback.md` for those repositories with different issue and contributing policies. +These are used by us to push the actual content of the READMEs to the Docker Hub as special access is required to modify the Hub description contents. The `Dockerfile` is used to create a suitable environment for `push.pl`. # Issues and Contributing If you would like to make a new Official Image, be sure to follow the [guidelines](https://docs.docker.com/docker-hub/official_repos/). -Feel free to make a pull request for fixes and improvements to current documentation. For questions or problems on this repo come talk to us via the `#docker-library` IRC channel on [Freenode](https://freenode.net) or open up an issue. +Feel free to make a pull request for fixes and improvements to current documentation. For questions or problems on this repo come talk to us via the `#docker-library` IRC channel on [Libera.Chat](https://libera.chat/) or open up an issue. diff --git a/adminer/README.md b/adminer/README.md index 3897e0c88f02..030a6cd24f0e 100644 --- a/adminer/README.md +++ b/adminer/README.md @@ -20,12 +20,12 @@ WARNING: [Tim Düsterhus (of the Docker Community)](https://github.com/TimWolla/docker-adminer) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`4.7.7-standalone`, `4.7-standalone`, `4-standalone`, `standalone`, `4.7.7`, `4.7`, `4`, `latest`](https://github.com/TimWolla/docker-adminer/blob/18344428b4b12907f82ab8c03e865094d1ae0663/4/Dockerfile) -- [`4.7.7-fastcgi`, `4.7-fastcgi`, `4-fastcgi`, `fastcgi`](https://github.com/TimWolla/docker-adminer/blob/18344428b4b12907f82ab8c03e865094d1ae0663/4/fastcgi/Dockerfile) +- [`4.8.1-standalone`, `4-standalone`, `standalone`, `4.8.1`, `4`, `latest`](https://github.com/TimWolla/docker-adminer/blob/c9c54b18f79a66409a3153a94f629ea68f08647c/4/Dockerfile) +- [`4.8.1-fastcgi`, `4-fastcgi`, `fastcgi`](https://github.com/TimWolla/docker-adminer/blob/c9c54b18f79a66409a3153a94f629ea68f08647c/4/fastcgi/Dockerfile) # Quick reference (cont.) @@ -33,14 +33,14 @@ WARNING: [https://github.com/TimWolla/docker-adminer/issues](https://github.com/TimWolla/docker-adminer/issues) - **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) - [`amd64`](https://hub.docker.com/r/amd64/adminer/), [`arm32v6`](https://hub.docker.com/r/arm32v6/adminer/), [`arm32v7`](https://hub.docker.com/r/arm32v7/adminer/), [`arm64v8`](https://hub.docker.com/r/arm64v8/adminer/), [`i386`](https://hub.docker.com/r/i386/adminer/), [`ppc64le`](https://hub.docker.com/r/ppc64le/adminer/), [`s390x`](https://hub.docker.com/r/s390x/adminer/) + [`amd64`](https://hub.docker.com/r/amd64/adminer/), [`arm32v5`](https://hub.docker.com/r/arm32v5/adminer/), [`arm32v7`](https://hub.docker.com/r/arm32v7/adminer/), [`arm64v8`](https://hub.docker.com/r/arm64v8/adminer/), [`i386`](https://hub.docker.com/r/i386/adminer/), [`mips64le`](https://hub.docker.com/r/mips64le/adminer/), [`ppc64le`](https://hub.docker.com/r/ppc64le/adminer/), [`s390x`](https://hub.docker.com/r/s390x/adminer/) - **Published image artifact details**: [repo-info repo's `repos/adminer/` directory](https://github.com/docker-library/repo-info/blob/master/repos/adminer) ([history](https://github.com/docker-library/repo-info/commits/master/repos/adminer)) (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/adminer`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fadminer) + [official-images repo's `library/adminer` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fadminer) [official-images repo's `library/adminer` file](https://github.com/docker-library/official-images/blob/master/library/adminer) ([history](https://github.com/docker-library/official-images/commits/master/library/adminer)) - **Source of this description**: @@ -116,7 +116,7 @@ To load plugins you can pass a list of filenames in `ADMINER_PLUGINS`: $ docker run --link some_database:db -p 8080:8080 -e ADMINER_PLUGINS='tables-filter tinymce' adminer ``` -If a plugin *requires* parameters to work correctly you will need to add a custom file to the container: +If a plugin *requires* parameters to work correctly instead of adding the plugin to `ADMINER_PLUGINS`, you need to add a custom file to the container: ```console $ docker run --link some_database:db -p 8080:8080 -e ADMINER_PLUGINS='login-servers' adminer diff --git a/adminer/content.md b/adminer/content.md index 9257e20e9fcf..8ff1691833a8 100644 --- a/adminer/content.md +++ b/adminer/content.md @@ -44,7 +44,7 @@ To load plugins you can pass a list of filenames in `ADMINER_PLUGINS`: $ docker run --link some_database:db -p 8080:8080 -e ADMINER_PLUGINS='tables-filter tinymce' %%IMAGE%% ``` -If a plugin *requires* parameters to work correctly you will need to add a custom file to the container: +If a plugin *requires* parameters to work correctly instead of adding the plugin to `ADMINER_PLUGINS`, you need to add a custom file to the container: ```console $ docker run --link some_database:db -p 8080:8080 -e ADMINER_PLUGINS='login-servers' %%IMAGE%% diff --git a/adoptopenjdk/README-short.txt b/adoptopenjdk/README-short.txt deleted file mode 100644 index 7a7122b65803..000000000000 --- a/adoptopenjdk/README-short.txt +++ /dev/null @@ -1 +0,0 @@ -Official Images for OpenJDK + HotSpot and OpenJDK + Eclipse OpenJ9 binaries built by AdoptOpenJDK. diff --git a/adoptopenjdk/README.md b/adoptopenjdk/README.md deleted file mode 100644 index 3e0e2581736e..000000000000 --- a/adoptopenjdk/README.md +++ /dev/null @@ -1,352 +0,0 @@ - - -# Quick reference - -- **Maintained by**: - [AdoptOpenJDK](https://github.com/AdoptOpenJDK/openjdk-docker) - -- **Where to get help**: - [AdoptOpenJDK Slack](https://adoptopenjdk.net/slack.html); [AdoptOpenJDK Mailing List](https://mail.openjdk.java.net/mailman/listinfo/adoption-discuss); [Eclipse OpenJ9 Slack](https://www.eclipse.org/openj9/oj9_joinslack.html); [Eclipse OpenJ9 Mailing List](https://dev.eclipse.org/mailman/listinfo/openj9-dev) - -# Supported tags and respective `Dockerfile` links - -(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).) - -## Simple Tags - -- [`8u252-b09-jdk-hotspot-bionic`, `8-jdk-hotspot-bionic`, `8-hotspot-bionic`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/f104ef0fd80dc1d8e2b796a80f00512ab06a1465/8/jdk/ubuntu/Dockerfile.hotspot.releases.full) -- [`8u252-b09.1-jdk-hotspot-windowsservercore-ltsc2016`, `8-jdk-hotspot-windowsservercore-ltsc2016`, `8-hotspot-windowsservercore-ltsc2016`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/8/jdk/windows/windowsservercore-ltsc2016/Dockerfile.hotspot.releases.full) -- [`8u252-b09.1-jdk-hotspot-windowsservercore-1809`, `8-jdk-hotspot-windowsservercore-1809`, `8-hotspot-windowsservercore-1809`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/8/jdk/windows/windowsservercore-1809/Dockerfile.hotspot.releases.full) -- [`8u252-b09-jre-hotspot-bionic`, `8-jre-hotspot-bionic`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/f104ef0fd80dc1d8e2b796a80f00512ab06a1465/8/jre/ubuntu/Dockerfile.hotspot.releases.full) -- [`8u252-b09.1-jre-hotspot-windowsservercore-ltsc2016`, `8-jre-hotspot-windowsservercore-ltsc2016`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/8/jre/windows/windowsservercore-ltsc2016/Dockerfile.hotspot.releases.full) -- [`8u252-b09.1-jre-hotspot-windowsservercore-1809`, `8-jre-hotspot-windowsservercore-1809`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/8/jre/windows/windowsservercore-1809/Dockerfile.hotspot.releases.full) -- [`11.0.7_10-jdk-hotspot-bionic`, `11-jdk-hotspot-bionic`, `11-hotspot-bionic`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/f104ef0fd80dc1d8e2b796a80f00512ab06a1465/11/jdk/ubuntu/Dockerfile.hotspot.releases.full) -- [`11.0.7_10.1-jdk-hotspot-windowsservercore-ltsc2016`, `11-jdk-hotspot-windowsservercore-ltsc2016`, `11-hotspot-windowsservercore-ltsc2016`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/11/jdk/windows/windowsservercore-ltsc2016/Dockerfile.hotspot.releases.full) -- [`11.0.7_10.1-jdk-hotspot-windowsservercore-1809`, `11-jdk-hotspot-windowsservercore-1809`, `11-hotspot-windowsservercore-1809`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/11/jdk/windows/windowsservercore-1809/Dockerfile.hotspot.releases.full) -- [`11.0.7_10-jre-hotspot-bionic`, `11-jre-hotspot-bionic`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/f104ef0fd80dc1d8e2b796a80f00512ab06a1465/11/jre/ubuntu/Dockerfile.hotspot.releases.full) -- [`11.0.7_10.1-jre-hotspot-windowsservercore-ltsc2016`, `11-jre-hotspot-windowsservercore-ltsc2016`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/11/jre/windows/windowsservercore-ltsc2016/Dockerfile.hotspot.releases.full) -- [`11.0.7_10.1-jre-hotspot-windowsservercore-1809`, `11-jre-hotspot-windowsservercore-1809`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/11/jre/windows/windowsservercore-1809/Dockerfile.hotspot.releases.full) -- [`13.0.2_8-jdk-hotspot-bionic`, `13-jdk-hotspot-bionic`, `13-hotspot-bionic`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/3b28dd3fb7230f208ed49da507432a01741b1259/13/jdk/ubuntu/Dockerfile.hotspot.releases.full) -- [`13.0.2_8-jdk-hotspot-windowsservercore-ltsc2016`, `13-jdk-hotspot-windowsservercore-ltsc2016`, `13-hotspot-windowsservercore-ltsc2016`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/3b28dd3fb7230f208ed49da507432a01741b1259/13/jdk/windows/windowsservercore-ltsc2016/Dockerfile.hotspot.releases.full) -- [`13.0.2_8-jdk-hotspot-windowsservercore-1809`, `13-jdk-hotspot-windowsservercore-1809`, `13-hotspot-windowsservercore-1809`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/3b28dd3fb7230f208ed49da507432a01741b1259/13/jdk/windows/windowsservercore-1809/Dockerfile.hotspot.releases.full) -- [`13.0.2_8-jre-hotspot-bionic`, `13-jre-hotspot-bionic`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/3b28dd3fb7230f208ed49da507432a01741b1259/13/jre/ubuntu/Dockerfile.hotspot.releases.full) -- [`13.0.2_8-jre-hotspot-windowsservercore-ltsc2016`, `13-jre-hotspot-windowsservercore-ltsc2016`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/3b28dd3fb7230f208ed49da507432a01741b1259/13/jre/windows/windowsservercore-ltsc2016/Dockerfile.hotspot.releases.full) -- [`13.0.2_8-jre-hotspot-windowsservercore-1809`, `13-jre-hotspot-windowsservercore-1809`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/3b28dd3fb7230f208ed49da507432a01741b1259/13/jre/windows/windowsservercore-1809/Dockerfile.hotspot.releases.full) -- [`14.0.1_7-jdk-hotspot-bionic`, `14-jdk-hotspot-bionic`, `14-hotspot-bionic`, `hotspot-bionic`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/2fb3fcc43ea049fd4bd020910e23ecdf492deb58/14/jdk/ubuntu/Dockerfile.hotspot.releases.full) -- [`14.0.1_7.1-jdk-hotspot-windowsservercore-ltsc2016`, `14-jdk-hotspot-windowsservercore-ltsc2016`, `14-hotspot-windowsservercore-ltsc2016`, `hotspot-windowsservercore-ltsc2016`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/14/jdk/windows/windowsservercore-ltsc2016/Dockerfile.hotspot.releases.full) -- [`14.0.1_7.1-jdk-hotspot-windowsservercore-1809`, `14-jdk-hotspot-windowsservercore-1809`, `14-hotspot-windowsservercore-1809`, `hotspot-windowsservercore-1809`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/14/jdk/windows/windowsservercore-1809/Dockerfile.hotspot.releases.full) -- [`14.0.1_7-jre-hotspot-bionic`, `14-jre-hotspot-bionic`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/2fb3fcc43ea049fd4bd020910e23ecdf492deb58/14/jre/ubuntu/Dockerfile.hotspot.releases.full) -- [`14.0.1_7.1-jre-hotspot-windowsservercore-ltsc2016`, `14-jre-hotspot-windowsservercore-ltsc2016`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/14/jre/windows/windowsservercore-ltsc2016/Dockerfile.hotspot.releases.full) -- [`14.0.1_7.1-jre-hotspot-windowsservercore-1809`, `14-jre-hotspot-windowsservercore-1809`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/14/jre/windows/windowsservercore-1809/Dockerfile.hotspot.releases.full) -- [`8u252-b09-jdk-openj9-0.20.0-bionic`, `8-jdk-openj9-bionic`, `8-openj9-bionic`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/f104ef0fd80dc1d8e2b796a80f00512ab06a1465/8/jdk/ubuntu/Dockerfile.openj9.releases.full) -- [`8u252-b09.1-jdk-openj9-0.20.0-windowsservercore-ltsc2016`, `8-jdk-openj9-windowsservercore-ltsc2016`, `8-openj9-windowsservercore-ltsc2016`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/8/jdk/windows/windowsservercore-ltsc2016/Dockerfile.openj9.releases.full) -- [`8u252-b09.1-jdk-openj9-0.20.0-windowsservercore-1809`, `8-jdk-openj9-windowsservercore-1809`, `8-openj9-windowsservercore-1809`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/8/jdk/windows/windowsservercore-1809/Dockerfile.openj9.releases.full) -- [`8u252-b09-jre-openj9-0.20.0-bionic`, `8-jre-openj9-bionic`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/f104ef0fd80dc1d8e2b796a80f00512ab06a1465/8/jre/ubuntu/Dockerfile.openj9.releases.full) -- [`8u252-b09.1-jre-openj9-0.20.0-windowsservercore-ltsc2016`, `8-jre-openj9-windowsservercore-ltsc2016`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/8/jre/windows/windowsservercore-ltsc2016/Dockerfile.openj9.releases.full) -- [`8u252-b09.1-jre-openj9-0.20.0-windowsservercore-1809`, `8-jre-openj9-windowsservercore-1809`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/8/jre/windows/windowsservercore-1809/Dockerfile.openj9.releases.full) -- [`11.0.7_10-jdk-openj9-0.20.0-bionic`, `11-jdk-openj9-bionic`, `11-openj9-bionic`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/f104ef0fd80dc1d8e2b796a80f00512ab06a1465/11/jdk/ubuntu/Dockerfile.openj9.releases.full) -- [`11.0.7_10.1-jdk-openj9-0.20.0-windowsservercore-ltsc2016`, `11-jdk-openj9-windowsservercore-ltsc2016`, `11-openj9-windowsservercore-ltsc2016`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/11/jdk/windows/windowsservercore-ltsc2016/Dockerfile.openj9.releases.full) -- [`11.0.7_10.1-jdk-openj9-0.20.0-windowsservercore-1809`, `11-jdk-openj9-windowsservercore-1809`, `11-openj9-windowsservercore-1809`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/11/jdk/windows/windowsservercore-1809/Dockerfile.openj9.releases.full) -- [`11.0.7_10-jre-openj9-0.20.0-bionic`, `11-jre-openj9-bionic`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/f104ef0fd80dc1d8e2b796a80f00512ab06a1465/11/jre/ubuntu/Dockerfile.openj9.releases.full) -- [`11.0.7_10.1-jre-openj9-0.20.0-windowsservercore-ltsc2016`, `11-jre-openj9-windowsservercore-ltsc2016`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/11/jre/windows/windowsservercore-ltsc2016/Dockerfile.openj9.releases.full) -- [`11.0.7_10.1-jre-openj9-0.20.0-windowsservercore-1809`, `11-jre-openj9-windowsservercore-1809`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/11/jre/windows/windowsservercore-1809/Dockerfile.openj9.releases.full) -- [`13.0.2_8-jdk-openj9-0.18.0-bionic`, `13-jdk-openj9-bionic`, `13-openj9-bionic`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/3b28dd3fb7230f208ed49da507432a01741b1259/13/jdk/ubuntu/Dockerfile.openj9.releases.full) -- [`13.0.2_8-jdk-openj9-0.18.0-windowsservercore-ltsc2016`, `13-jdk-openj9-windowsservercore-ltsc2016`, `13-openj9-windowsservercore-ltsc2016`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/3b28dd3fb7230f208ed49da507432a01741b1259/13/jdk/windows/windowsservercore-ltsc2016/Dockerfile.openj9.releases.full) -- [`13.0.2_8-jdk-openj9-0.18.0-windowsservercore-1809`, `13-jdk-openj9-windowsservercore-1809`, `13-openj9-windowsservercore-1809`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/3b28dd3fb7230f208ed49da507432a01741b1259/13/jdk/windows/windowsservercore-1809/Dockerfile.openj9.releases.full) -- [`13.0.2_8-jre-openj9-0.18.0-bionic`, `13-jre-openj9-bionic`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/3b28dd3fb7230f208ed49da507432a01741b1259/13/jre/ubuntu/Dockerfile.openj9.releases.full) -- [`13.0.2_8-jre-openj9-0.18.0-windowsservercore-ltsc2016`, `13-jre-openj9-windowsservercore-ltsc2016`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/3b28dd3fb7230f208ed49da507432a01741b1259/13/jre/windows/windowsservercore-ltsc2016/Dockerfile.openj9.releases.full) -- [`13.0.2_8-jre-openj9-0.18.0-windowsservercore-1809`, `13-jre-openj9-windowsservercore-1809`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/3b28dd3fb7230f208ed49da507432a01741b1259/13/jre/windows/windowsservercore-1809/Dockerfile.openj9.releases.full) -- [`14.0.1_7-jdk-openj9-0.20.0-bionic`, `14-jdk-openj9-bionic`, `14-openj9-bionic`, `openj9-bionic`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/f104ef0fd80dc1d8e2b796a80f00512ab06a1465/14/jdk/ubuntu/Dockerfile.openj9.releases.full) -- [`14.0.1_7.1-jdk-openj9-0.20.0-windowsservercore-ltsc2016`, `14-jdk-openj9-windowsservercore-ltsc2016`, `14-openj9-windowsservercore-ltsc2016`, `openj9-windowsservercore-ltsc2016`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/14/jdk/windows/windowsservercore-ltsc2016/Dockerfile.openj9.releases.full) -- [`14.0.1_7.1-jdk-openj9-0.20.0-windowsservercore-1809`, `14-jdk-openj9-windowsservercore-1809`, `14-openj9-windowsservercore-1809`, `openj9-windowsservercore-1809`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/14/jdk/windows/windowsservercore-1809/Dockerfile.openj9.releases.full) -- [`14.0.1_7-jre-openj9-0.20.0-bionic`, `14-jre-openj9-bionic`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/f104ef0fd80dc1d8e2b796a80f00512ab06a1465/14/jre/ubuntu/Dockerfile.openj9.releases.full) -- [`14.0.1_7.1-jre-openj9-0.20.0-windowsservercore-ltsc2016`, `14-jre-openj9-windowsservercore-ltsc2016`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/14/jre/windows/windowsservercore-ltsc2016/Dockerfile.openj9.releases.full) -- [`14.0.1_7.1-jre-openj9-0.20.0-windowsservercore-1809`, `14-jre-openj9-windowsservercore-1809`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/14/jre/windows/windowsservercore-1809/Dockerfile.openj9.releases.full) - -## Shared Tags - -- `8u252-b09-jdk-hotspot`: - - [`8u252-b09-jdk-hotspot-bionic`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/f104ef0fd80dc1d8e2b796a80f00512ab06a1465/8/jdk/ubuntu/Dockerfile.hotspot.releases.full) -- `8-jdk-hotspot`, `8-hotspot`: - - [`8u252-b09-jdk-hotspot-bionic`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/f104ef0fd80dc1d8e2b796a80f00512ab06a1465/8/jdk/ubuntu/Dockerfile.hotspot.releases.full) - - [`8u252-b09.1-jdk-hotspot-windowsservercore-ltsc2016`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/8/jdk/windows/windowsservercore-ltsc2016/Dockerfile.hotspot.releases.full) - - [`8u252-b09.1-jdk-hotspot-windowsservercore-1809`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/8/jdk/windows/windowsservercore-1809/Dockerfile.hotspot.releases.full) -- `8u252-b09.1-jdk-hotspot-windowsservercore`, `8-jdk-hotspot-windowsservercore`, `8-hotspot-windowsservercore`, `8u252-b09.1-jdk-hotspot`: - - [`8u252-b09.1-jdk-hotspot-windowsservercore-ltsc2016`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/8/jdk/windows/windowsservercore-ltsc2016/Dockerfile.hotspot.releases.full) - - [`8u252-b09.1-jdk-hotspot-windowsservercore-1809`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/8/jdk/windows/windowsservercore-1809/Dockerfile.hotspot.releases.full) -- `8u252-b09-jre-hotspot`: - - [`8u252-b09-jre-hotspot-bionic`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/f104ef0fd80dc1d8e2b796a80f00512ab06a1465/8/jre/ubuntu/Dockerfile.hotspot.releases.full) -- `8-jre-hotspot`: - - [`8u252-b09-jre-hotspot-bionic`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/f104ef0fd80dc1d8e2b796a80f00512ab06a1465/8/jre/ubuntu/Dockerfile.hotspot.releases.full) - - [`8u252-b09.1-jre-hotspot-windowsservercore-ltsc2016`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/8/jre/windows/windowsservercore-ltsc2016/Dockerfile.hotspot.releases.full) - - [`8u252-b09.1-jre-hotspot-windowsservercore-1809`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/8/jre/windows/windowsservercore-1809/Dockerfile.hotspot.releases.full) -- `8u252-b09.1-jre-hotspot-windowsservercore`, `8-jre-hotspot-windowsservercore`, `8u252-b09.1-jre-hotspot`: - - [`8u252-b09.1-jre-hotspot-windowsservercore-ltsc2016`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/8/jre/windows/windowsservercore-ltsc2016/Dockerfile.hotspot.releases.full) - - [`8u252-b09.1-jre-hotspot-windowsservercore-1809`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/8/jre/windows/windowsservercore-1809/Dockerfile.hotspot.releases.full) -- `11.0.7_10-jdk-hotspot`: - - [`11.0.7_10-jdk-hotspot-bionic`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/f104ef0fd80dc1d8e2b796a80f00512ab06a1465/11/jdk/ubuntu/Dockerfile.hotspot.releases.full) -- `11-jdk-hotspot`, `11-hotspot`: - - [`11.0.7_10-jdk-hotspot-bionic`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/f104ef0fd80dc1d8e2b796a80f00512ab06a1465/11/jdk/ubuntu/Dockerfile.hotspot.releases.full) - - [`11.0.7_10.1-jdk-hotspot-windowsservercore-ltsc2016`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/11/jdk/windows/windowsservercore-ltsc2016/Dockerfile.hotspot.releases.full) - - [`11.0.7_10.1-jdk-hotspot-windowsservercore-1809`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/11/jdk/windows/windowsservercore-1809/Dockerfile.hotspot.releases.full) -- `11.0.7_10.1-jdk-hotspot-windowsservercore`, `11-jdk-hotspot-windowsservercore`, `11-hotspot-windowsservercore`, `11.0.7_10.1-jdk-hotspot`: - - [`11.0.7_10.1-jdk-hotspot-windowsservercore-ltsc2016`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/11/jdk/windows/windowsservercore-ltsc2016/Dockerfile.hotspot.releases.full) - - [`11.0.7_10.1-jdk-hotspot-windowsservercore-1809`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/11/jdk/windows/windowsservercore-1809/Dockerfile.hotspot.releases.full) -- `11.0.7_10-jre-hotspot`: - - [`11.0.7_10-jre-hotspot-bionic`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/f104ef0fd80dc1d8e2b796a80f00512ab06a1465/11/jre/ubuntu/Dockerfile.hotspot.releases.full) -- `11-jre-hotspot`: - - [`11.0.7_10-jre-hotspot-bionic`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/f104ef0fd80dc1d8e2b796a80f00512ab06a1465/11/jre/ubuntu/Dockerfile.hotspot.releases.full) - - [`11.0.7_10.1-jre-hotspot-windowsservercore-ltsc2016`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/11/jre/windows/windowsservercore-ltsc2016/Dockerfile.hotspot.releases.full) - - [`11.0.7_10.1-jre-hotspot-windowsservercore-1809`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/11/jre/windows/windowsservercore-1809/Dockerfile.hotspot.releases.full) -- `11.0.7_10.1-jre-hotspot-windowsservercore`, `11-jre-hotspot-windowsservercore`, `11.0.7_10.1-jre-hotspot`: - - [`11.0.7_10.1-jre-hotspot-windowsservercore-ltsc2016`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/11/jre/windows/windowsservercore-ltsc2016/Dockerfile.hotspot.releases.full) - - [`11.0.7_10.1-jre-hotspot-windowsservercore-1809`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/11/jre/windows/windowsservercore-1809/Dockerfile.hotspot.releases.full) -- `13.0.2_8-jdk-hotspot`, `13-jdk-hotspot`, `13-hotspot`: - - [`13.0.2_8-jdk-hotspot-bionic`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/3b28dd3fb7230f208ed49da507432a01741b1259/13/jdk/ubuntu/Dockerfile.hotspot.releases.full) - - [`13.0.2_8-jdk-hotspot-windowsservercore-ltsc2016`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/3b28dd3fb7230f208ed49da507432a01741b1259/13/jdk/windows/windowsservercore-ltsc2016/Dockerfile.hotspot.releases.full) - - [`13.0.2_8-jdk-hotspot-windowsservercore-1809`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/3b28dd3fb7230f208ed49da507432a01741b1259/13/jdk/windows/windowsservercore-1809/Dockerfile.hotspot.releases.full) -- `13.0.2_8-jdk-hotspot-windowsservercore`, `13-jdk-hotspot-windowsservercore`, `13-hotspot-windowsservercore`: - - [`13.0.2_8-jdk-hotspot-windowsservercore-ltsc2016`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/3b28dd3fb7230f208ed49da507432a01741b1259/13/jdk/windows/windowsservercore-ltsc2016/Dockerfile.hotspot.releases.full) - - [`13.0.2_8-jdk-hotspot-windowsservercore-1809`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/3b28dd3fb7230f208ed49da507432a01741b1259/13/jdk/windows/windowsservercore-1809/Dockerfile.hotspot.releases.full) -- `hotspot-windowsservercore`: - - [`13.0.2_8-jdk-hotspot-windowsservercore-ltsc2016`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/3b28dd3fb7230f208ed49da507432a01741b1259/13/jdk/windows/windowsservercore-ltsc2016/Dockerfile.hotspot.releases.full) - - [`13.0.2_8-jdk-hotspot-windowsservercore-1809`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/3b28dd3fb7230f208ed49da507432a01741b1259/13/jdk/windows/windowsservercore-1809/Dockerfile.hotspot.releases.full) - - [`14.0.1_7.1-jdk-hotspot-windowsservercore-ltsc2016`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/14/jdk/windows/windowsservercore-ltsc2016/Dockerfile.hotspot.releases.full) - - [`14.0.1_7.1-jdk-hotspot-windowsservercore-1809`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/14/jdk/windows/windowsservercore-1809/Dockerfile.hotspot.releases.full) -- `13.0.2_8-jre-hotspot`, `13-jre-hotspot`: - - [`13.0.2_8-jre-hotspot-bionic`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/3b28dd3fb7230f208ed49da507432a01741b1259/13/jre/ubuntu/Dockerfile.hotspot.releases.full) - - [`13.0.2_8-jre-hotspot-windowsservercore-ltsc2016`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/3b28dd3fb7230f208ed49da507432a01741b1259/13/jre/windows/windowsservercore-ltsc2016/Dockerfile.hotspot.releases.full) - - [`13.0.2_8-jre-hotspot-windowsservercore-1809`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/3b28dd3fb7230f208ed49da507432a01741b1259/13/jre/windows/windowsservercore-1809/Dockerfile.hotspot.releases.full) -- `13.0.2_8-jre-hotspot-windowsservercore`, `13-jre-hotspot-windowsservercore`: - - [`13.0.2_8-jre-hotspot-windowsservercore-ltsc2016`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/3b28dd3fb7230f208ed49da507432a01741b1259/13/jre/windows/windowsservercore-ltsc2016/Dockerfile.hotspot.releases.full) - - [`13.0.2_8-jre-hotspot-windowsservercore-1809`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/3b28dd3fb7230f208ed49da507432a01741b1259/13/jre/windows/windowsservercore-1809/Dockerfile.hotspot.releases.full) -- `14.0.1_7-jdk-hotspot`: - - [`14.0.1_7-jdk-hotspot-bionic`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/2fb3fcc43ea049fd4bd020910e23ecdf492deb58/14/jdk/ubuntu/Dockerfile.hotspot.releases.full) -- `14-jdk-hotspot`, `14-hotspot`, `hotspot`, `latest`: - - [`14.0.1_7-jdk-hotspot-bionic`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/2fb3fcc43ea049fd4bd020910e23ecdf492deb58/14/jdk/ubuntu/Dockerfile.hotspot.releases.full) - - [`14.0.1_7.1-jdk-hotspot-windowsservercore-ltsc2016`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/14/jdk/windows/windowsservercore-ltsc2016/Dockerfile.hotspot.releases.full) - - [`14.0.1_7.1-jdk-hotspot-windowsservercore-1809`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/14/jdk/windows/windowsservercore-1809/Dockerfile.hotspot.releases.full) -- `14.0.1_7.1-jdk-hotspot-windowsservercore`, `14-jdk-hotspot-windowsservercore`, `14-hotspot-windowsservercore`, `14.0.1_7.1-jdk-hotspot`: - - [`14.0.1_7.1-jdk-hotspot-windowsservercore-ltsc2016`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/14/jdk/windows/windowsservercore-ltsc2016/Dockerfile.hotspot.releases.full) - - [`14.0.1_7.1-jdk-hotspot-windowsservercore-1809`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/14/jdk/windows/windowsservercore-1809/Dockerfile.hotspot.releases.full) -- `14.0.1_7-jre-hotspot`: - - [`14.0.1_7-jre-hotspot-bionic`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/2fb3fcc43ea049fd4bd020910e23ecdf492deb58/14/jre/ubuntu/Dockerfile.hotspot.releases.full) -- `14-jre-hotspot`: - - [`14.0.1_7-jre-hotspot-bionic`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/2fb3fcc43ea049fd4bd020910e23ecdf492deb58/14/jre/ubuntu/Dockerfile.hotspot.releases.full) - - [`14.0.1_7.1-jre-hotspot-windowsservercore-ltsc2016`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/14/jre/windows/windowsservercore-ltsc2016/Dockerfile.hotspot.releases.full) - - [`14.0.1_7.1-jre-hotspot-windowsservercore-1809`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/14/jre/windows/windowsservercore-1809/Dockerfile.hotspot.releases.full) -- `14.0.1_7.1-jre-hotspot-windowsservercore`, `14-jre-hotspot-windowsservercore`, `14.0.1_7.1-jre-hotspot`: - - [`14.0.1_7.1-jre-hotspot-windowsservercore-ltsc2016`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/14/jre/windows/windowsservercore-ltsc2016/Dockerfile.hotspot.releases.full) - - [`14.0.1_7.1-jre-hotspot-windowsservercore-1809`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/14/jre/windows/windowsservercore-1809/Dockerfile.hotspot.releases.full) -- `8u252-b09-jdk-openj9-0.20.0`: - - [`8u252-b09-jdk-openj9-0.20.0-bionic`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/f104ef0fd80dc1d8e2b796a80f00512ab06a1465/8/jdk/ubuntu/Dockerfile.openj9.releases.full) -- `8-jdk-openj9`, `8-openj9`: - - [`8u252-b09-jdk-openj9-0.20.0-bionic`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/f104ef0fd80dc1d8e2b796a80f00512ab06a1465/8/jdk/ubuntu/Dockerfile.openj9.releases.full) - - [`8u252-b09.1-jdk-openj9-0.20.0-windowsservercore-ltsc2016`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/8/jdk/windows/windowsservercore-ltsc2016/Dockerfile.openj9.releases.full) - - [`8u252-b09.1-jdk-openj9-0.20.0-windowsservercore-1809`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/8/jdk/windows/windowsservercore-1809/Dockerfile.openj9.releases.full) -- `8u252-b09.1-jdk-openj9-0.20.0-windowsservercore`, `8-jdk-openj9-windowsservercore`, `8-openj9-windowsservercore`, `8u252-b09.1-jdk-openj9-0.20.0`: - - [`8u252-b09.1-jdk-openj9-0.20.0-windowsservercore-ltsc2016`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/8/jdk/windows/windowsservercore-ltsc2016/Dockerfile.openj9.releases.full) - - [`8u252-b09.1-jdk-openj9-0.20.0-windowsservercore-1809`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/8/jdk/windows/windowsservercore-1809/Dockerfile.openj9.releases.full) -- `8u252-b09-jre-openj9-0.20.0`: - - [`8u252-b09-jre-openj9-0.20.0-bionic`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/f104ef0fd80dc1d8e2b796a80f00512ab06a1465/8/jre/ubuntu/Dockerfile.openj9.releases.full) -- `8-jre-openj9`: - - [`8u252-b09-jre-openj9-0.20.0-bionic`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/f104ef0fd80dc1d8e2b796a80f00512ab06a1465/8/jre/ubuntu/Dockerfile.openj9.releases.full) - - [`8u252-b09.1-jre-openj9-0.20.0-windowsservercore-ltsc2016`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/8/jre/windows/windowsservercore-ltsc2016/Dockerfile.openj9.releases.full) - - [`8u252-b09.1-jre-openj9-0.20.0-windowsservercore-1809`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/8/jre/windows/windowsservercore-1809/Dockerfile.openj9.releases.full) -- `8u252-b09.1-jre-openj9-0.20.0-windowsservercore`, `8-jre-openj9-windowsservercore`, `8u252-b09.1-jre-openj9-0.20.0`: - - [`8u252-b09.1-jre-openj9-0.20.0-windowsservercore-ltsc2016`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/8/jre/windows/windowsservercore-ltsc2016/Dockerfile.openj9.releases.full) - - [`8u252-b09.1-jre-openj9-0.20.0-windowsservercore-1809`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/8/jre/windows/windowsservercore-1809/Dockerfile.openj9.releases.full) -- `11.0.7_10-jdk-openj9-0.20.0`: - - [`11.0.7_10-jdk-openj9-0.20.0-bionic`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/f104ef0fd80dc1d8e2b796a80f00512ab06a1465/11/jdk/ubuntu/Dockerfile.openj9.releases.full) -- `11-jdk-openj9`, `11-openj9`: - - [`11.0.7_10-jdk-openj9-0.20.0-bionic`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/f104ef0fd80dc1d8e2b796a80f00512ab06a1465/11/jdk/ubuntu/Dockerfile.openj9.releases.full) - - [`11.0.7_10.1-jdk-openj9-0.20.0-windowsservercore-ltsc2016`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/11/jdk/windows/windowsservercore-ltsc2016/Dockerfile.openj9.releases.full) - - [`11.0.7_10.1-jdk-openj9-0.20.0-windowsservercore-1809`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/11/jdk/windows/windowsservercore-1809/Dockerfile.openj9.releases.full) -- `11.0.7_10.1-jdk-openj9-0.20.0-windowsservercore`, `11-jdk-openj9-windowsservercore`, `11.0.7_10.1-jdk-openj9-0.20.0`: - - [`11.0.7_10.1-jdk-openj9-0.20.0-windowsservercore-ltsc2016`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/11/jdk/windows/windowsservercore-ltsc2016/Dockerfile.openj9.releases.full) - - [`11.0.7_10.1-jdk-openj9-0.20.0-windowsservercore-1809`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/11/jdk/windows/windowsservercore-1809/Dockerfile.openj9.releases.full) -- `11-openj9-windowsservercore`: - - [`11.0.7_10.1-jdk-openj9-0.20.0-windowsservercore-ltsc2016`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/11/jdk/windows/windowsservercore-ltsc2016/Dockerfile.openj9.releases.full) - - [`11.0.7_10.1-jdk-openj9-0.20.0-windowsservercore-1809`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/11/jdk/windows/windowsservercore-1809/Dockerfile.openj9.releases.full) - - [`11.0.7_10.1-jre-openj9-0.20.0-windowsservercore-ltsc2016`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/11/jre/windows/windowsservercore-ltsc2016/Dockerfile.openj9.releases.full) -- `11.0.7_10-jre-openj9-0.20.0`: - - [`11.0.7_10-jre-openj9-0.20.0-bionic`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/f104ef0fd80dc1d8e2b796a80f00512ab06a1465/11/jre/ubuntu/Dockerfile.openj9.releases.full) -- `11-jre-openj9`: - - [`11.0.7_10-jre-openj9-0.20.0-bionic`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/f104ef0fd80dc1d8e2b796a80f00512ab06a1465/11/jre/ubuntu/Dockerfile.openj9.releases.full) - - [`11.0.7_10.1-jre-openj9-0.20.0-windowsservercore-ltsc2016`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/11/jre/windows/windowsservercore-ltsc2016/Dockerfile.openj9.releases.full) - - [`11.0.7_10.1-jre-openj9-0.20.0-windowsservercore-1809`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/11/jre/windows/windowsservercore-1809/Dockerfile.openj9.releases.full) -- `11.0.7_10.1-jre-openj9-0.20.0-windowsservercore`, `11-jre-openj9-windowsservercore`, `11.0.7_10.1-jre-openj9-0.20.0`: - - [`11.0.7_10.1-jre-openj9-0.20.0-windowsservercore-ltsc2016`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/11/jre/windows/windowsservercore-ltsc2016/Dockerfile.openj9.releases.full) - - [`11.0.7_10.1-jre-openj9-0.20.0-windowsservercore-1809`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/11/jre/windows/windowsservercore-1809/Dockerfile.openj9.releases.full) -- `13.0.2_8-jdk-openj9-0.18.0`, `13-jdk-openj9`, `13-openj9`: - - [`13.0.2_8-jdk-openj9-0.18.0-bionic`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/3b28dd3fb7230f208ed49da507432a01741b1259/13/jdk/ubuntu/Dockerfile.openj9.releases.full) - - [`13.0.2_8-jdk-openj9-0.18.0-windowsservercore-ltsc2016`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/3b28dd3fb7230f208ed49da507432a01741b1259/13/jdk/windows/windowsservercore-ltsc2016/Dockerfile.openj9.releases.full) - - [`13.0.2_8-jdk-openj9-0.18.0-windowsservercore-1809`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/3b28dd3fb7230f208ed49da507432a01741b1259/13/jdk/windows/windowsservercore-1809/Dockerfile.openj9.releases.full) -- `13.0.2_8-jdk-openj9-0.18.0-windowsservercore`, `13-jdk-openj9-windowsservercore`, `13-openj9-windowsservercore`: - - [`13.0.2_8-jdk-openj9-0.18.0-windowsservercore-ltsc2016`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/3b28dd3fb7230f208ed49da507432a01741b1259/13/jdk/windows/windowsservercore-ltsc2016/Dockerfile.openj9.releases.full) - - [`13.0.2_8-jdk-openj9-0.18.0-windowsservercore-1809`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/3b28dd3fb7230f208ed49da507432a01741b1259/13/jdk/windows/windowsservercore-1809/Dockerfile.openj9.releases.full) -- `openj9-windowsservercore`: - - [`13.0.2_8-jdk-openj9-0.18.0-windowsservercore-ltsc2016`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/3b28dd3fb7230f208ed49da507432a01741b1259/13/jdk/windows/windowsservercore-ltsc2016/Dockerfile.openj9.releases.full) - - [`13.0.2_8-jdk-openj9-0.18.0-windowsservercore-1809`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/3b28dd3fb7230f208ed49da507432a01741b1259/13/jdk/windows/windowsservercore-1809/Dockerfile.openj9.releases.full) - - [`14.0.1_7.1-jdk-openj9-0.20.0-windowsservercore-ltsc2016`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/14/jdk/windows/windowsservercore-ltsc2016/Dockerfile.openj9.releases.full) - - [`14.0.1_7.1-jdk-openj9-0.20.0-windowsservercore-1809`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/14/jdk/windows/windowsservercore-1809/Dockerfile.openj9.releases.full) -- `13.0.2_8-jre-openj9-0.18.0`, `13-jre-openj9`: - - [`13.0.2_8-jre-openj9-0.18.0-bionic`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/3b28dd3fb7230f208ed49da507432a01741b1259/13/jre/ubuntu/Dockerfile.openj9.releases.full) - - [`13.0.2_8-jre-openj9-0.18.0-windowsservercore-ltsc2016`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/3b28dd3fb7230f208ed49da507432a01741b1259/13/jre/windows/windowsservercore-ltsc2016/Dockerfile.openj9.releases.full) - - [`13.0.2_8-jre-openj9-0.18.0-windowsservercore-1809`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/3b28dd3fb7230f208ed49da507432a01741b1259/13/jre/windows/windowsservercore-1809/Dockerfile.openj9.releases.full) -- `13.0.2_8-jre-openj9-0.18.0-windowsservercore`, `13-jre-openj9-windowsservercore`: - - [`13.0.2_8-jre-openj9-0.18.0-windowsservercore-ltsc2016`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/3b28dd3fb7230f208ed49da507432a01741b1259/13/jre/windows/windowsservercore-ltsc2016/Dockerfile.openj9.releases.full) - - [`13.0.2_8-jre-openj9-0.18.0-windowsservercore-1809`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/3b28dd3fb7230f208ed49da507432a01741b1259/13/jre/windows/windowsservercore-1809/Dockerfile.openj9.releases.full) -- `14.0.1_7-jdk-openj9-0.20.0`: - - [`14.0.1_7-jdk-openj9-0.20.0-bionic`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/f104ef0fd80dc1d8e2b796a80f00512ab06a1465/14/jdk/ubuntu/Dockerfile.openj9.releases.full) -- `14-jdk-openj9`, `14-openj9`, `openj9`: - - [`14.0.1_7-jdk-openj9-0.20.0-bionic`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/f104ef0fd80dc1d8e2b796a80f00512ab06a1465/14/jdk/ubuntu/Dockerfile.openj9.releases.full) - - [`14.0.1_7.1-jdk-openj9-0.20.0-windowsservercore-ltsc2016`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/14/jdk/windows/windowsservercore-ltsc2016/Dockerfile.openj9.releases.full) - - [`14.0.1_7.1-jdk-openj9-0.20.0-windowsservercore-1809`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/14/jdk/windows/windowsservercore-1809/Dockerfile.openj9.releases.full) -- `14.0.1_7.1-jdk-openj9-0.20.0-windowsservercore`, `14-jdk-openj9-windowsservercore`, `14-openj9-windowsservercore`, `14.0.1_7.1-jdk-openj9-0.20.0`: - - [`14.0.1_7.1-jdk-openj9-0.20.0-windowsservercore-ltsc2016`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/14/jdk/windows/windowsservercore-ltsc2016/Dockerfile.openj9.releases.full) - - [`14.0.1_7.1-jdk-openj9-0.20.0-windowsservercore-1809`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/14/jdk/windows/windowsservercore-1809/Dockerfile.openj9.releases.full) -- `14.0.1_7-jre-openj9-0.20.0`: - - [`14.0.1_7-jre-openj9-0.20.0-bionic`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/f104ef0fd80dc1d8e2b796a80f00512ab06a1465/14/jre/ubuntu/Dockerfile.openj9.releases.full) -- `14-jre-openj9`: - - [`14.0.1_7-jre-openj9-0.20.0-bionic`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/f104ef0fd80dc1d8e2b796a80f00512ab06a1465/14/jre/ubuntu/Dockerfile.openj9.releases.full) - - [`14.0.1_7.1-jre-openj9-0.20.0-windowsservercore-ltsc2016`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/14/jre/windows/windowsservercore-ltsc2016/Dockerfile.openj9.releases.full) - - [`14.0.1_7.1-jre-openj9-0.20.0-windowsservercore-1809`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/14/jre/windows/windowsservercore-1809/Dockerfile.openj9.releases.full) -- `14.0.1_7.1-jre-openj9-0.20.0-windowsservercore`, `14-jre-openj9-windowsservercore`, `14.0.1_7.1-jre-openj9-0.20.0`: - - [`14.0.1_7.1-jre-openj9-0.20.0-windowsservercore-ltsc2016`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/14/jre/windows/windowsservercore-ltsc2016/Dockerfile.openj9.releases.full) - - [`14.0.1_7.1-jre-openj9-0.20.0-windowsservercore-1809`](https://github.com/AdoptOpenJDK/openjdk-docker/blob/facb9fef4e720ca5e037862e19ca8ac5b883cc48/14/jre/windows/windowsservercore-1809/Dockerfile.openj9.releases.full) - -# Quick reference (cont.) - -- **Where to file issues**: - [GitHub](https://github.com/AdoptOpenJDK/openjdk-docker/issues); The [adoptopenjdk support](https://adoptopenjdk.net/support.html) page has more information on quality, roadmap and support levels for AdoptOpenJDK builds; - -- **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) - [`amd64`](https://hub.docker.com/r/amd64/adoptopenjdk/), [`arm32v7`](https://hub.docker.com/r/arm32v7/adoptopenjdk/), [`arm64v8`](https://hub.docker.com/r/arm64v8/adoptopenjdk/), [`ppc64le`](https://hub.docker.com/r/ppc64le/adoptopenjdk/), [`s390x`](https://hub.docker.com/r/s390x/adoptopenjdk/), [`windows-amd64`](https://hub.docker.com/r/winamd64/adoptopenjdk/) - -- **Published image artifact details**: - [repo-info repo's `repos/adoptopenjdk/` directory](https://github.com/docker-library/repo-info/blob/master/repos/adoptopenjdk) ([history](https://github.com/docker-library/repo-info/commits/master/repos/adoptopenjdk)) - (image metadata, transfer size, etc) - -- **Image updates**: - [official-images PRs with label `library/adoptopenjdk`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fadoptopenjdk) - [official-images repo's `library/adoptopenjdk` file](https://github.com/docker-library/official-images/blob/master/library/adoptopenjdk) ([history](https://github.com/docker-library/official-images/commits/master/library/adoptopenjdk)) - -- **Source of this description**: - [docs repo's `adoptopenjdk/` directory](https://github.com/docker-library/docs/tree/master/adoptopenjdk) ([history](https://github.com/docker-library/docs/commits/master/adoptopenjdk)) - -## Overview - -The images in this repository contain OpenJDK binaries that are built by AdoptOpenJDK and contain both HotSpot and Eclipse OpenJ9 JVMs. - -# What is AdoptOpenJDK ? - -[AdoptOpenJDK](https://adoptopenjdk.net/) is a community of Java™ user group members, Java developers and vendors who are advocates of OpenJDK, the open source project which forms the basis of the Java programming language and platform. AdoptOpenJDK provides prebuilt OpenJDK binaries from a fully open source set of build scripts and infrastructure. AdoptOpenJDK builds and tests binaries for different source code streams based upon OpenJDK. Our binaries undergo extensive testing, and the Releases have passed all the available OpenJDK test suites and our additional tests (donated by the community), ensuring the best quality binary available. - -Java and all Java-based trademarks and logos are trademarks or registered trademarks of Oracle and/or its affiliates. - -![logo](https://raw.githubusercontent.com/docker-library/docs/0db0af87e256d941bf011e3b5b06ca4a8edb6b84/adoptopenjdk/logo.png) - -# What is Eclipse OpenJ9 ? - -[Eclipse OpenJ9](https://www.eclipse.org/openj9/) is a high performance, scalable, Java virtual machine (JVM) implementation that has a proven track record of running Java applications in production environments. Contributed to the Eclipse project by IBM, the OpenJ9 JVM underpins the IBM SDK, Java Technology Edition product that is a core component of many IBM Enterprise software products. Continued development of OpenJ9 at the Eclipse foundation ensures wider collaboration, fresh innovation, and the opportunity to influence the development of OpenJ9 for the next generation of Java applications. OpenJDK binaries that include Eclipse OpenJ9 are available through AdoptOpenJDK. - -# Images - -There are two types of Docker images here: the Java Development Kit (JDK) and the Java Runtime Environment (JRE). These images can be used as the basis for custom built images for running your applications. - -### Multi-Arch Image - -Docker Images for the following architectures are now available: - -- HotSpot - - `amd64`, `arm32v7`, `arm64v8`, `ppc64le`, `s390x`, `windows-amd64` -- Eclipse OpenJ9 - - `amd64`, `ppc64le`, `s390x`, `windows-amd64` - -# How to use this Image - -To run a pre-built jar file with the latest OpenJDK 11 with HotSpot JRE image, use the following Dockerfile: - -```dockerfile -FROM adoptopenjdk:11-jre-hotspot -RUN mkdir /opt/app -COPY japp.jar /opt/app -CMD ["java", "-jar", "/opt/app/japp.jar"] -``` - -To do the same with the latest OpenJDK 11 with Eclipse OpenJ9 JRE image, use the following Dockerfile: - -```dockerfile -FROM adoptopenjdk:11-jre-openj9 -RUN mkdir /opt/app -COPY japp.jar /opt/app -CMD ["java", "-jar", "/opt/app/japp.jar"] -``` - -You can build and run the Docker Image as shown in the following example: - -```console -docker build -t japp . -docker run -it --rm japp -``` - -If you want to place the jar file on the host file system instead of inside the container, you can mount the host path onto the container by using the following commands: - -```dockerfile -FROM adoptopenjdk:12.0.1_12-jdk-openj9-0.14.1 -CMD ["java", "-jar", "/opt/app/japp.jar"] -``` - -```console -docker build -t japp . -docker run -it -v /path/on/host/system/jars:/opt/app japp -``` - -# Image Variants - -The `adoptopenjdk` images come in many flavors, each designed for a specific use case. - -## `adoptopenjdk:` - -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. - -Some of these tags may have names like bionic in them. These are the suite code names for releases of [Ubuntu](https://wiki.ubuntu.com/Releases) 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 Ubuntu. - -## `adoptopenjdk:-windowsservercore` - -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. - -For information about how to get Docker running on Windows, please see the relevant "Quick Start" guide provided by Microsoft: - -- [Windows Server Quick Start](https://msdn.microsoft.com/en-us/virtualization/windowscontainers/quick_start/quick_start_windows_server) -- [Windows 10 Quick Start](https://msdn.microsoft.com/en-us/virtualization/windowscontainers/quick_start/quick_start_windows_10) - -# License - -The Dockerfiles and associated scripts are licensed under the [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.html). - -Licenses for the products installed within the images: - -- Eclipse OpenJ9 + OpenJDK: The combined works license is [GNU GPL v2 with Classpath Exception](http://openjdk.java.net/legal/gplv2+ce.html). -- OpenJDK: The project license is GNU GPL v2 with Classpath Exception. - -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). - -Some additional license information which was able to be auto-detected might be found in [the `repo-info` repository's `adoptopenjdk/` directory](https://github.com/docker-library/repo-info/tree/master/repos/adoptopenjdk). - -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. diff --git a/adoptopenjdk/content.md b/adoptopenjdk/content.md deleted file mode 100644 index 332d9072ed86..000000000000 --- a/adoptopenjdk/content.md +++ /dev/null @@ -1,67 +0,0 @@ -## Overview - -The images in this repository contain OpenJDK binaries that are built by AdoptOpenJDK and contain both HotSpot and Eclipse OpenJ9 JVMs. - -# What is AdoptOpenJDK ? - -[AdoptOpenJDK](https://adoptopenjdk.net/) is a community of Java™ user group members, Java developers and vendors who are advocates of OpenJDK, the open source project which forms the basis of the Java programming language and platform. AdoptOpenJDK provides prebuilt OpenJDK binaries from a fully open source set of build scripts and infrastructure. AdoptOpenJDK builds and tests binaries for different source code streams based upon OpenJDK. Our binaries undergo extensive testing, and the Releases have passed all the available OpenJDK test suites and our additional tests (donated by the community), ensuring the best quality binary available. - -Java and all Java-based trademarks and logos are trademarks or registered trademarks of Oracle and/or its affiliates. - -%%LOGO%% - -# What is Eclipse OpenJ9 ? - -[Eclipse OpenJ9](https://www.eclipse.org/openj9/) is a high performance, scalable, Java virtual machine (JVM) implementation that has a proven track record of running Java applications in production environments. Contributed to the Eclipse project by IBM, the OpenJ9 JVM underpins the IBM SDK, Java Technology Edition product that is a core component of many IBM Enterprise software products. Continued development of OpenJ9 at the Eclipse foundation ensures wider collaboration, fresh innovation, and the opportunity to influence the development of OpenJ9 for the next generation of Java applications. OpenJDK binaries that include Eclipse OpenJ9 are available through AdoptOpenJDK. - -# Images - -There are two types of Docker images here: the Java Development Kit (JDK) and the Java Runtime Environment (JRE). These images can be used as the basis for custom built images for running your applications. - -### Multi-Arch Image - -Docker Images for the following architectures are now available: - -- HotSpot - - `amd64`, `arm32v7`, `arm64v8`, `ppc64le`, `s390x`, `windows-amd64` -- Eclipse OpenJ9 - - `amd64`, `ppc64le`, `s390x`, `windows-amd64` - -# How to use this Image - -To run a pre-built jar file with the latest OpenJDK 11 with HotSpot JRE image, use the following Dockerfile: - -```dockerfile -FROM %%IMAGE%%:11-jre-hotspot -RUN mkdir /opt/app -COPY japp.jar /opt/app -CMD ["java", "-jar", "/opt/app/japp.jar"] -``` - -To do the same with the latest OpenJDK 11 with Eclipse OpenJ9 JRE image, use the following Dockerfile: - -```dockerfile -FROM %%IMAGE%%:11-jre-openj9 -RUN mkdir /opt/app -COPY japp.jar /opt/app -CMD ["java", "-jar", "/opt/app/japp.jar"] -``` - -You can build and run the Docker Image as shown in the following example: - -```console -docker build -t japp . -docker run -it --rm japp -``` - -If you want to place the jar file on the host file system instead of inside the container, you can mount the host path onto the container by using the following commands: - -```dockerfile -FROM %%IMAGE%%:12.0.1_12-jdk-openj9-0.14.1 -CMD ["java", "-jar", "/opt/app/japp.jar"] -``` - -```console -docker build -t japp . -docker run -it -v /path/on/host/system/jars:/opt/app japp -``` diff --git a/adoptopenjdk/get-help.md b/adoptopenjdk/get-help.md deleted file mode 100644 index 9cacfabc88be..000000000000 --- a/adoptopenjdk/get-help.md +++ /dev/null @@ -1 +0,0 @@ -[AdoptOpenJDK Slack](https://adoptopenjdk.net/slack.html); [AdoptOpenJDK Mailing List](https://mail.openjdk.java.net/mailman/listinfo/adoption-discuss); [Eclipse OpenJ9 Slack](https://www.eclipse.org/openj9/oj9_joinslack.html); [Eclipse OpenJ9 Mailing List](https://dev.eclipse.org/mailman/listinfo/openj9-dev) diff --git a/adoptopenjdk/github-repo b/adoptopenjdk/github-repo deleted file mode 100644 index 5d1ed261f0f1..000000000000 --- a/adoptopenjdk/github-repo +++ /dev/null @@ -1 +0,0 @@ -https://github.com/AdoptOpenJDK/openjdk-docker diff --git a/adoptopenjdk/issues.md b/adoptopenjdk/issues.md deleted file mode 100644 index 41dc82f40b3c..000000000000 --- a/adoptopenjdk/issues.md +++ /dev/null @@ -1 +0,0 @@ -[GitHub](%%GITHUB-REPO%%/issues); The [adoptopenjdk support](https://adoptopenjdk.net/support.html) page has more information on quality, roadmap and support levels for AdoptOpenJDK builds; diff --git a/adoptopenjdk/logo.png b/adoptopenjdk/logo.png deleted file mode 100644 index ce19fd82520daa6fc71f4fa3e20186e1bfd0f5bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10489 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 W#~M2<+P)d807Y3fnR+R+@c#iKHeHPX diff --git a/adoptopenjdk/maintainer.md b/adoptopenjdk/maintainer.md deleted file mode 100644 index 246c88ce351d..000000000000 --- a/adoptopenjdk/maintainer.md +++ /dev/null @@ -1 +0,0 @@ -[AdoptOpenJDK](%%GITHUB-REPO%%) diff --git a/aerospike/README.md b/aerospike/README.md index 2e533b505583..1412be72a97b 100644 --- a/aerospike/README.md +++ b/aerospike/README.md @@ -17,124 +17,235 @@ WARNING: # Quick reference - **Maintained by**: - [Aerospike, Inc.](https://github.com/aerospike/aerospike-server.docker) + [Aerospike, Inc.](https://github.com/aerospike/aerospike-server-enterprise.docker) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`4.8.0.9`](https://github.com/aerospike/aerospike-server.docker/blob/b30a98d9b80357fd50ac3fa254a7f11ca1ebbb67/Dockerfile) -- [`4.9.0.7`](https://github.com/aerospike/aerospike-server.docker/blob/21d402a4d704b8bb2548afb65200d9a140ee2c65/Dockerfile) -- [`5.0.0.3`, `latest`](https://github.com/aerospike/aerospike-server.docker/blob/eb51bd55b94f42a240735b52ec1d9b5c783ae3b1/Dockerfile) +- [`ee-6.2.0.2`](https://github.com/aerospike/aerospike-server.docker/blob/26089140713466195470d5d246fdd2bda5b82180/enterprise/debian11/Dockerfile) +- [`ce-6.2.0.2`](https://github.com/aerospike/aerospike-server.docker/blob/26089140713466195470d5d246fdd2bda5b82180/community/debian11/Dockerfile) # Quick reference (cont.) - **Where to file issues**: - [the Aerospike Forums](https://discuss.aerospike.com) or [GitHub](https://github.com/aerospike/aerospike-server.docker/issues) + [the Aerospike Forums](https://discuss.aerospike.com) or [GitHub](https://github.com/aerospike/aerospike-server-enterprise.docker/issues) - **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) - [`amd64`](https://hub.docker.com/r/amd64/aerospike/) + [`amd64`](https://hub.docker.com/r/amd64/aerospike/), [`arm64v8`](https://hub.docker.com/r/arm64v8/aerospike/) - **Published image artifact details**: [repo-info repo's `repos/aerospike/` directory](https://github.com/docker-library/repo-info/blob/master/repos/aerospike) ([history](https://github.com/docker-library/repo-info/commits/master/repos/aerospike)) (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/aerospike`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Faerospike) + [official-images repo's `library/aerospike` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Faerospike) [official-images repo's `library/aerospike` file](https://github.com/docker-library/official-images/blob/master/library/aerospike) ([history](https://github.com/docker-library/official-images/commits/master/library/aerospike)) - **Source of this description**: [docs repo's `aerospike/` directory](https://github.com/docker-library/docs/tree/master/aerospike) ([history](https://github.com/docker-library/docs/commits/master/aerospike)) -# Aerospike +# Aerospike Database Docker Images -Aerospike is an open source distributed database. Aerospike is built on a "shared nothing" architecture designed to reliably store terabytes of data with automatic fail-over, replication and cross data-center synchronization. +## What is Aerospike? + +[Aerospike](http://aerospike.com) is a distributed NoSQL database purposefully designed for high performance web scale applications. Aerospike supports key-value and document data models, and has multiple data types including List, Map, HyperLogLog, GeoJSON, and Blob. Aerospike's patented hybrid memory architecture delivers predictable high performance at scale and high data density per node. ![logo](https://raw.githubusercontent.com/docker-library/docs/9944063c59872460e15f6ecb19c1419c8124752f/aerospike/logo.png) -Documentation for Aerospike is available at [http://aerospike.com/docs](https://www.aerospike.com/docs). +## Getting Started + +Aerospike Enterprise Edition requires a feature key file to start and to ungate certain features in the database, such as compression. Enterprise customers can use their production or development keys. -# Using this Image +Anyone can [sign up](https://www.aerospike.com/lp/try-now/) to get an evaluation feature key file for a full-featured, single-node Aerospike Enterprise Edition. -The following will run `asd` with all the exposed ports forwarded to the host machine. +Aerospike Community Edition supports the same developer APIs as Aerospike Enterprise Edition, and differs in ease of operation and enterprise features. See the [product matrix](https://www.aerospike.com/products/product-matrix/) for more. + +### Running an Aerospike EE node with a feature key file in a mapped directory ```console -$ docker run -d --name aerospike -p 3000:3000 -p 3001:3001 -p 3002:3002 -p 3003:3003 aerospike +docker run -d -v DIR:/opt/aerospike/etc/ -e "FEATURE_KEY_FILE=/opt/aerospike/etc/features.conf" --name aerospike -p 3000-3002:3000-3002 aerospike:ee-[version] ``` -**NOTE** Although this is the simplest method to getting Aerospike up and running, but it is not the preferred method. To properly run the container, please specify a **custom configuration** with the **access-address** defined. +Above, *DIR* is a directory on your machine where you drop your feature key file. Make sure Docker Desktop has file sharing permission to bind mount it into Docker containers. -## Custom Aerospike Configuration +### Running an Aerospike EE node with a feature key file in a mapped directory -By default, `asd` will use the configuration file at `/etc/aerospike/aerospike.conf`, which is added to the directory by the Dockerfile. To provide a custom configuration, you should first mount a directory containing the custom aerospike.conf file using the `-v` option for `docker`: +```console +FEATKEY=$(base64 ~/Desktop/evaluation-features.conf) +docker run -d -e "FEATURES=$FEATKEY" -e "FEATURE_KEY_FILE=env-b64:FEATURES" --name aerospike -p 3000-3002:3000-3002 aerospike:ee-[version] +``` - -v :/opt/aerospike/etc +### Running an Aerospike CE node -Where `` is the path to a directory containing your custom aerospike.conf file. Next, you will want to tell `asd` to use the configuration file that was just mounted by using the `--config-file` option for `aerospike`: +```console +docker run -d --name aerospike -p 3000-3002:3000-3002 aerospike:ce-[version] +``` - --config-file /opt/aerospike/etc/aerospike.conf +## Advanced Configuration -This will tell `asd` to use the config file at `/opt/aerospike/etc/aerospike.conf`, which is mapped from `/aerospike.conf`. +The Aerospike Docker image has a default configuration file template that can be populated with individual configuration parameters, as we did before with `FEATURE_KEY_FILE`. Alternatively, it can be replaced with a custom configuration file. -A full example: +The following sections describe both advanced options. + +### Injecting configuration parameters + +You can inject parameters into the configuration template using container-side environment variables with the `-e` flag. + +For example, to set the default [namespace](https://www.aerospike.com/docs/architecture/data-model.html) name to *demo*: ```console -$ docker run -d -v :/opt/aerospike/etc --name aerospike -p 3000:3000 -p 3001:3001 -p 3002:3002 -p 3003:3003 aerospike asd --foreground --config-file /opt/aerospike/etc/aerospike.conf +docker run -d --name aerospike -e "NAMESPACE=demo" -p 3000-3002:3000-3002 -v /my/dir:/opt/aerospike/etc/ -e "FEATURE_KEY_FILE=/opt/aerospike/etc/features.conf" aerospike:ee-[version] ``` -### access-address Configuration +Injecting configuration parameters into the configuration template isn't compatible with using a custom configuration file. You can use one or the other. + +#### List of template variables + +- `FEATURE_KEY_FILE` - the [`feature_key_file`](https://www.aerospike.com/docs/reference/configuration/index.html#feature-key-file) is only required for the EE image. Default: /etc/aerospike/features.conf +- `SERVICE_THREADS` - the [`service_threads`](https://www.aerospike.com/docs/reference/configuration/index.html#service-threads). Default: Number of vCPUs +- `LOGFILE` - the [`file`](https://www.aerospike.com/docs/reference/configuration/index.html#file) param of the `logging` context. Default: /dev/null, do not log to file, log to stdout +- `SERVICE_ADDRESS` - the bind [`address`](https://www.aerospike.com/docs/reference/configuration/index.html#address) of the `networking.service` subcontext. Default: any +- `SERVICE_PORT` - the [`port`](https://www.aerospike.com/docs/reference/configuration/index.html#port) of the `networking.service` subcontext. Default: 3000 +- `HB_ADDRESS` - the `networking.heartbeat` [`address`](https://www.aerospike.com/docs/reference/configuration/index.html#address) for cross cluster mesh. Default: any +- `HB_PORT` - the [`port`](https://www.aerospike.com/docs/reference/configuration/index.html#port) for `networking.heartbeat` communications. Default: 3002 +- `FABRIC_ADDRESS` - the [`address`](https://www.aerospike.com/docs/reference/configuration/index.html#address) of the `networking.fabric` subcontext. Default: any +- `FABRIC_PORT` - the [`port`](https://www.aerospike.com/docs/reference/configuration/index.html#port) of the `networking.fabric` subcontext. Default: 3001 + +The single preconfigured namespace is [in-memory with filesystem persistence](https://www.aerospike.com/docs/operations/configure/namespace/storage/#recipe-for-a-hdd-storage-engine-with-data-in-index-engine) -In order for Aerospike to properly broadcast its address to the cluster or applications, the **access-address** needs to be set in the configuration file. If it is not set, then the IP address within the container will be used, which is not accessible to other nodes. +- `NAMESPACE` - the name of the namespace. Default: test +- `REPL_FACTOR` - the namespace [`replication-factor`](https://www.aerospike.com/docs/reference/configuration/index.html#replication-factor). Default: 2 +- `MEM_GB` - the namespace [`memory-size`](https://www.aerospike.com/docs/reference/configuration/index.html#memory-size). Default: 1, the unit is always `G` (GB) +- `DEFAULT_TTL` - the namespace [`default-ttl`](https://www.aerospike.com/docs/reference/configuration/index.html#default-ttl). Default: 30d +- `STORAGE_GB` - the namespace persistence `file` size. Default: 4, the unit is always `G` (GB) +- `NSUP_PERIOD` - the namespace [`nsup-period`](https://www.aerospike.com/docs/reference/configuration/index.html#nsup-period). Default: 120 , nsup-period in seconds -To specify **access-address** in aerospike.conf: +### Using a custom configuration file + +You can override the use of the configuration file template by providing your own aerospike.conf, as described in [Configuring Aerospike Database](https://www.aerospike.com/docs/operations/configure/index.html). + +You should first `-v` map a local directory, which Docker will bind mount. Next, drop your aerospike.conf file into this directory. Finally, use the `--config-file` option to tell Aerospike where in the container the configuration file is (the default path is /etc/aerospike/aerospike.conf). Remember that the feature key file is required, so use `feature-key-file` in your config file to point to a mounted path (such as /opt/aerospike/etc/feature.conf). + +For example: + +```console +docker run -d -v /opt/aerospike/etc/:/opt/aerospike/etc/ --name aerospike-p 3000-3002:3000-3002 aerospike:ee-[version] --config-file /opt/aerospike/etc/aerospike.conf +``` + +### Persistent Data Directory + +With Docker, the files within the container are not persisted past the life of the container. To persist data, you will want to mount a directory from the host to the container's /opt/aerospike/data using the `-v` option: + +For example: + +```console +docker run -d -v /opt/aerospike/data:/opt/aerospike/data -v /opt/aerospike/etc:/opt/aerospike/etc/ --name aerospike -p 3000-3002:3000-3002 -e "FEATURE_KEY_FILE=/opt/aerospike/etc/features.conf" aerospike:ee-[version] +``` - network { - service { - address any # Listening IP Address - port 3000 # Listening Port - access-address 192.168.1.100 # IP Address to be used by applications and other nodes in the cluster. +The example above uses the configuration template, where the single defined namespace is in-memory with file-based persistence. Just mounting the predefined /opt/aerospike/data directory enables the data to be persisted on the host. + +Alternatively, a custom configuration file is used with the parameter `file` set to be a file in the mounted /opt/aerospike/data, such as in the following config snippet: + + namespace test { + # : + storage-engine device { + file /opt/aerospike/data/test.dat + filesize 4G + data-in-memory true } - ... + } + +In this example we also mount the data directory in a similar way, using a custom configuration file. + +```console +docker run -d -v /opt/aerospike/data:/opt/aerospike/data -v /opt/aerospike/etc/:/opt/aerospike/etc/ --name aerospike -p 3000-3002:3000-3002 aerospike:ee-[version] --config-file /opt/aerospike/etc/aerospike.conf +``` -## Persistent Data Directory +### Block Storage -With Docker, the files within the container are not persisted. To persist the data, you will want to mount a directory from the host to the guest's `/opt/aerospike/data` using the `-v` option: +Docker provides an ability to expose a host's block devices to a running container. The `--device` option can be used to map a host block device within a container. - -v :/opt/aerospike/data +Update the `storage-engine device` section of the namespace in the custom aerospike configuration file. -Where `` is the path to a directory containing your data files. + namespace test { + # : + storage-engine device { + device /dev/xvdc + write-block-size 128k + } + } -A full example: +Now to map a host drive /dev/sdc to /dev/xvdc on a container ```console -$ docker run -d -v :/opt/aerospike/data --name aerospike -p 3000:3000 -p 3001:3001 -p 3002:3002 -p 3003:3003 aerospike +docker run -d --device '/dev/sdc:/dev/xvdc' -v /opt/aerospike/etc/:/opt/aerospike/etc/ --name aerospike -p 3000-3002:3000-3002 aerospike:ee-[version] --config-file /opt/aerospike/etc/aerospike.conf +``` + +### Persistent Lua Cache + +Upon restart, your lua cache will become emptied. To persist the cache, you will want to mount a directory from the host to the container's `/opt/aerospike/usr/udf/lua` using the `-v` option: + +```sh +docker run -d -v /opt/aerospike/lua:/opt/aerospike/usr/udf/lua -v /opt/aerospike/data:/opt/aerospike/data --name aerospike -p 3000-3002:3000-3002 -e "FEATURE_KEY_FILE=/opt/etc/aerospike/features.conf" aerospike:ee-[version] ``` ## Clustering -Aerospike recommends using Mesh Clustering. Mesh uses TCP point to point connections for heartbeats. Each node in the cluster maintains a heartbeat connection to all other nodes. Please see [http://www.aerospike.com/docs/operations/configure/network/heartbeat/#mesh-unicast-heartbeat](http://www.aerospike.com/docs/operations/configure/network/heartbeat/#mesh-unicast-heartbeat) +Developers using the Aerospike EE single-node evaluation, and most others using Docker Desktop on their machine for development, will not need to configure the node for clustering. If you're interested in using clustering and have a feature key file without a single node limit, read the following sections. + +### Configuring the node's access address + +In order for the Aerospike node to properly broadcast its address to the cluster and applications, the [`access-address`](https://www.aerospike.com/docs/reference/configuration/index.html#access-address) configuration parameter needs to be set in the configuration file. If it is not set, then the IP address within the container will be used, which is not accessible to other nodes. + + network { + service { + address any # Listening IP Address + port 3000 # Listening Port + access-address 192.168.1.100 # IP Address used by cluster nodes and applications + } ### Mesh Clustering Mesh networking requires setting up links between each node in the cluster. This can be achieved in two ways: -1. Define a configuration for each node in the cluster, as defined in [Network Heartbeat Configuration](http://www.aerospike.com/docs/operations/configure/network/heartbeat/#mesh-unicast-heartbeat). +1. Add a configuration for each node in the cluster, as defined in [Network Heartbeat Configuration](http://www.aerospike.com/docs/operations/configure/network/heartbeat/#mesh-unicast-heartbeat). 2. Use `asinfo` to send the `tip` command, to make the node aware of another node, as defined in [tip command in asinfo](http://www.aerospike.com/docs/tools/asinfo/#tip). -For more details and examples of clustering Aerospike in Docker, please see [Deploying Aerospike clusters with Docker](http://www.aerospike.com/docs/deploy_guides/docker/). +For more, see [How do I get a 2 nodes Aerospike cluster running quickly in Docker without editing a single file?](https://medium.com/aerospike-developer-blog/how-do-i-get-a-2-node-aerospike-cluster-running-quickly-in-docker-without-editing-a-single-file-1c2a94564a99?source=friends_link&sk=4ff6a22f0106596c42aa4b77d6cdc3a5) + +## Image Versions + +These images are based on [debian:strech-slim](https://hub.docker.com/_/debian). + +### ee-[version] + +These tags are for Aerospike EE images, and will require a feature key file, such as the one you get with the single-node EE evaluation, or one associated with a commercial enterprise license agreement. -## Sending Performance Data to Aerospike +### ce-[version] -Aerospike Telemetry is a feature that allows us to collect certain use data – not the database data – on your Aerospike Community Edition server use. We'd like to know when clusters are created and destroyed, cluster size, cluster workload, how often queries are run, whether instances are deployed purely in-memory or with Flash. Aerospike Telemetry collects information from running Community Edition server instances every 10 minutes. The data helps us to understand how the product is being used, identify issues, and create a better experience for the end user. [More Info](http://www.aerospike.com/aerospike-telemetry/) +These tags are for Aerospike CE images, and do not require a feature key file to start. As mentioned above, the developer API for both is the same, but the editions differ in operational features. + +## Reporting Issues + +If you have any problems with or questions about this image, please post on the [Aerospike discussion forum](https://discuss.aerospike.com). + +Enterprise customers are welcome to participate in the community forum, but can also report issues through the enterprise support system. + +Aerospike EE evaluation users can open an issue in [aerospike/aerospike-server-enterprise.docker](https://github.com/aerospike/aerospike-server-enterprise.docker/issues). + +Aerospike CE users can open an issue in [aerospike/aerospike-server.docker](https://github.com/aerospike/aerospike-server.docker/issues). # License -Copyright 2014-2015 Aerospike, Inc. +Copyright 2019-2021 Aerospike, Inc. + +If you are using a feature key file you received as part of your commercial enterprise license, you are operating under the [Aerospike Master License Agreement](https://www.aerospike.com/forms/master-license-agreement/). -Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0). +If you are using the Aerospike Database EE evaluation feature key file, you are operating under the [Aerospike Evaluation License Agreement](https://www.aerospike.com/forms/evaluation-license-agreement/). -Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +If you are using Aerospike Database CE refer to the license information in the [aerospike/aerospike-server](https://github.com/aerospike/aerospike-server) repository. 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). diff --git a/aerospike/content.md b/aerospike/content.md index b0200fde16c8..35650ff23744 100644 --- a/aerospike/content.md +++ b/aerospike/content.md @@ -1,80 +1,190 @@ -# Aerospike +# Aerospike Database Docker Images -Aerospike is an open source distributed database. Aerospike is built on a "shared nothing" architecture designed to reliably store terabytes of data with automatic fail-over, replication and cross data-center synchronization. +## What is Aerospike? + +[Aerospike](http://aerospike.com) is a distributed NoSQL database purposefully designed for high performance web scale applications. Aerospike supports key-value and document data models, and has multiple data types including List, Map, HyperLogLog, GeoJSON, and Blob. Aerospike's patented hybrid memory architecture delivers predictable high performance at scale and high data density per node. %%LOGO%% -Documentation for Aerospike is available at [http://aerospike.com/docs](https://www.aerospike.com/docs). +## Getting Started + +Aerospike Enterprise Edition requires a feature key file to start and to ungate certain features in the database, such as compression. Enterprise customers can use their production or development keys. + +Anyone can [sign up](https://www.aerospike.com/lp/try-now/) to get an evaluation feature key file for a full-featured, single-node Aerospike Enterprise Edition. + +Aerospike Community Edition supports the same developer APIs as Aerospike Enterprise Edition, and differs in ease of operation and enterprise features. See the [product matrix](https://www.aerospike.com/products/product-matrix/) for more. + +### Running an Aerospike EE node with a feature key file in a mapped directory + +```console +docker run -d -v DIR:/opt/aerospike/etc/ -e "FEATURE_KEY_FILE=/opt/aerospike/etc/features.conf" --name aerospike -p 3000-3002:3000-3002 %%IMAGE%%:ee-[version] +``` + +Above, *DIR* is a directory on your machine where you drop your feature key file. Make sure Docker Desktop has file sharing permission to bind mount it into Docker containers. + +### Running an Aerospike EE node with a feature key file in a mapped directory + +```console +FEATKEY=$(base64 ~/Desktop/evaluation-features.conf) +docker run -d -e "FEATURES=$FEATKEY" -e "FEATURE_KEY_FILE=env-b64:FEATURES" --name aerospike -p 3000-3002:3000-3002 %%IMAGE%%:ee-[version] +``` + +### Running an Aerospike CE node + +```console +docker run -d --name aerospike -p 3000-3002:3000-3002 %%IMAGE%%:ce-[version] +``` + +## Advanced Configuration -# Using this Image +The Aerospike Docker image has a default configuration file template that can be populated with individual configuration parameters, as we did before with `FEATURE_KEY_FILE`. Alternatively, it can be replaced with a custom configuration file. -The following will run `asd` with all the exposed ports forwarded to the host machine. +The following sections describe both advanced options. + +### Injecting configuration parameters + +You can inject parameters into the configuration template using container-side environment variables with the `-e` flag. + +For example, to set the default [namespace](https://www.aerospike.com/docs/architecture/data-model.html) name to *demo*: ```console -$ docker run -d --name aerospike -p 3000:3000 -p 3001:3001 -p 3002:3002 -p 3003:3003 %%IMAGE%% +docker run -d --name aerospike -e "NAMESPACE=demo" -p 3000-3002:3000-3002 -v /my/dir:/opt/aerospike/etc/ -e "FEATURE_KEY_FILE=/opt/aerospike/etc/features.conf" %%IMAGE%%:ee-[version] ``` -**NOTE** Although this is the simplest method to getting Aerospike up and running, but it is not the preferred method. To properly run the container, please specify a **custom configuration** with the **access-address** defined. +Injecting configuration parameters into the configuration template isn't compatible with using a custom configuration file. You can use one or the other. -## Custom Aerospike Configuration +#### List of template variables -By default, `asd` will use the configuration file at `/etc/aerospike/aerospike.conf`, which is added to the directory by the Dockerfile. To provide a custom configuration, you should first mount a directory containing the custom aerospike.conf file using the `-v` option for `docker`: +- `FEATURE_KEY_FILE` - the [`feature_key_file`](https://www.aerospike.com/docs/reference/configuration/index.html#feature-key-file) is only required for the EE image. Default: /etc/aerospike/features.conf +- `SERVICE_THREADS` - the [`service_threads`](https://www.aerospike.com/docs/reference/configuration/index.html#service-threads). Default: Number of vCPUs +- `LOGFILE` - the [`file`](https://www.aerospike.com/docs/reference/configuration/index.html#file) param of the `logging` context. Default: /dev/null, do not log to file, log to stdout +- `SERVICE_ADDRESS` - the bind [`address`](https://www.aerospike.com/docs/reference/configuration/index.html#address) of the `networking.service` subcontext. Default: any +- `SERVICE_PORT` - the [`port`](https://www.aerospike.com/docs/reference/configuration/index.html#port) of the `networking.service` subcontext. Default: 3000 +- `HB_ADDRESS` - the `networking.heartbeat` [`address`](https://www.aerospike.com/docs/reference/configuration/index.html#address) for cross cluster mesh. Default: any +- `HB_PORT` - the [`port`](https://www.aerospike.com/docs/reference/configuration/index.html#port) for `networking.heartbeat` communications. Default: 3002 +- `FABRIC_ADDRESS` - the [`address`](https://www.aerospike.com/docs/reference/configuration/index.html#address) of the `networking.fabric` subcontext. Default: any +- `FABRIC_PORT` - the [`port`](https://www.aerospike.com/docs/reference/configuration/index.html#port) of the `networking.fabric` subcontext. Default: 3001 - -v :/opt/aerospike/etc +The single preconfigured namespace is [in-memory with filesystem persistence](https://www.aerospike.com/docs/operations/configure/namespace/storage/#recipe-for-a-hdd-storage-engine-with-data-in-index-engine) -Where `` is the path to a directory containing your custom aerospike.conf file. Next, you will want to tell `asd` to use the configuration file that was just mounted by using the `--config-file` option for `%%IMAGE%%`: +- `NAMESPACE` - the name of the namespace. Default: test +- `REPL_FACTOR` - the namespace [`replication-factor`](https://www.aerospike.com/docs/reference/configuration/index.html#replication-factor). Default: 2 +- `MEM_GB` - the namespace [`memory-size`](https://www.aerospike.com/docs/reference/configuration/index.html#memory-size). Default: 1, the unit is always `G` (GB) +- `DEFAULT_TTL` - the namespace [`default-ttl`](https://www.aerospike.com/docs/reference/configuration/index.html#default-ttl). Default: 30d +- `STORAGE_GB` - the namespace persistence `file` size. Default: 4, the unit is always `G` (GB) +- `NSUP_PERIOD` - the namespace [`nsup-period`](https://www.aerospike.com/docs/reference/configuration/index.html#nsup-period). Default: 120 , nsup-period in seconds - --config-file /opt/aerospike/etc/aerospike.conf +### Using a custom configuration file -This will tell `asd` to use the config file at `/opt/aerospike/etc/aerospike.conf`, which is mapped from `/aerospike.conf`. +You can override the use of the configuration file template by providing your own aerospike.conf, as described in [Configuring Aerospike Database](https://www.aerospike.com/docs/operations/configure/index.html). -A full example: +You should first `-v` map a local directory, which Docker will bind mount. Next, drop your aerospike.conf file into this directory. Finally, use the `--config-file` option to tell Aerospike where in the container the configuration file is (the default path is /etc/aerospike/aerospike.conf). Remember that the feature key file is required, so use `feature-key-file` in your config file to point to a mounted path (such as /opt/aerospike/etc/feature.conf). + +For example: ```console -$ docker run -d -v :/opt/aerospike/etc --name aerospike -p 3000:3000 -p 3001:3001 -p 3002:3002 -p 3003:3003 %%IMAGE%% asd --foreground --config-file /opt/aerospike/etc/aerospike.conf +docker run -d -v /opt/aerospike/etc/:/opt/aerospike/etc/ --name aerospike-p 3000-3002:3000-3002 %%IMAGE%%:ee-[version] --config-file /opt/aerospike/etc/aerospike.conf ``` -### access-address Configuration +### Persistent Data Directory + +With Docker, the files within the container are not persisted past the life of the container. To persist data, you will want to mount a directory from the host to the container's /opt/aerospike/data using the `-v` option: + +For example: -In order for Aerospike to properly broadcast its address to the cluster or applications, the **access-address** needs to be set in the configuration file. If it is not set, then the IP address within the container will be used, which is not accessible to other nodes. +```console +docker run -d -v /opt/aerospike/data:/opt/aerospike/data -v /opt/aerospike/etc:/opt/aerospike/etc/ --name aerospike -p 3000-3002:3000-3002 -e "FEATURE_KEY_FILE=/opt/aerospike/etc/features.conf" %%IMAGE%%:ee-[version] +``` + +The example above uses the configuration template, where the single defined namespace is in-memory with file-based persistence. Just mounting the predefined /opt/aerospike/data directory enables the data to be persisted on the host. -To specify **access-address** in aerospike.conf: +Alternatively, a custom configuration file is used with the parameter `file` set to be a file in the mounted /opt/aerospike/data, such as in the following config snippet: - network { - service { - address any # Listening IP Address - port 3000 # Listening Port - access-address 192.168.1.100 # IP Address to be used by applications and other nodes in the cluster. + namespace test { + # : + storage-engine device { + file /opt/aerospike/data/test.dat + filesize 4G + data-in-memory true } - ... + } + +In this example we also mount the data directory in a similar way, using a custom configuration file. + +```console +docker run -d -v /opt/aerospike/data:/opt/aerospike/data -v /opt/aerospike/etc/:/opt/aerospike/etc/ --name aerospike -p 3000-3002:3000-3002 %%IMAGE%%:ee-[version] --config-file /opt/aerospike/etc/aerospike.conf +``` -## Persistent Data Directory +### Block Storage -With Docker, the files within the container are not persisted. To persist the data, you will want to mount a directory from the host to the guest's `/opt/aerospike/data` using the `-v` option: +Docker provides an ability to expose a host's block devices to a running container. The `--device` option can be used to map a host block device within a container. - -v :/opt/aerospike/data +Update the `storage-engine device` section of the namespace in the custom aerospike configuration file. -Where `` is the path to a directory containing your data files. + namespace test { + # : + storage-engine device { + device /dev/xvdc + write-block-size 128k + } + } -A full example: +Now to map a host drive /dev/sdc to /dev/xvdc on a container ```console -$ docker run -d -v :/opt/aerospike/data --name aerospike -p 3000:3000 -p 3001:3001 -p 3002:3002 -p 3003:3003 %%IMAGE%% +docker run -d --device '/dev/sdc:/dev/xvdc' -v /opt/aerospike/etc/:/opt/aerospike/etc/ --name aerospike -p 3000-3002:3000-3002 %%IMAGE%%:ee-[version] --config-file /opt/aerospike/etc/aerospike.conf +``` + +### Persistent Lua Cache + +Upon restart, your lua cache will become emptied. To persist the cache, you will want to mount a directory from the host to the container's `/opt/aerospike/usr/udf/lua` using the `-v` option: + +```sh +docker run -d -v /opt/aerospike/lua:/opt/aerospike/usr/udf/lua -v /opt/aerospike/data:/opt/aerospike/data --name aerospike -p 3000-3002:3000-3002 -e "FEATURE_KEY_FILE=/opt/etc/aerospike/features.conf" %%IMAGE%%:ee-[version] ``` ## Clustering -Aerospike recommends using Mesh Clustering. Mesh uses TCP point to point connections for heartbeats. Each node in the cluster maintains a heartbeat connection to all other nodes. Please see [http://www.aerospike.com/docs/operations/configure/network/heartbeat/#mesh-unicast-heartbeat](http://www.aerospike.com/docs/operations/configure/network/heartbeat/#mesh-unicast-heartbeat) +Developers using the Aerospike EE single-node evaluation, and most others using Docker Desktop on their machine for development, will not need to configure the node for clustering. If you're interested in using clustering and have a feature key file without a single node limit, read the following sections. + +### Configuring the node's access address + +In order for the Aerospike node to properly broadcast its address to the cluster and applications, the [`access-address`](https://www.aerospike.com/docs/reference/configuration/index.html#access-address) configuration parameter needs to be set in the configuration file. If it is not set, then the IP address within the container will be used, which is not accessible to other nodes. + + network { + service { + address any # Listening IP Address + port 3000 # Listening Port + access-address 192.168.1.100 # IP Address used by cluster nodes and applications + } ### Mesh Clustering Mesh networking requires setting up links between each node in the cluster. This can be achieved in two ways: -1. Define a configuration for each node in the cluster, as defined in [Network Heartbeat Configuration](http://www.aerospike.com/docs/operations/configure/network/heartbeat/#mesh-unicast-heartbeat). +1. Add a configuration for each node in the cluster, as defined in [Network Heartbeat Configuration](http://www.aerospike.com/docs/operations/configure/network/heartbeat/#mesh-unicast-heartbeat). 2. Use `asinfo` to send the `tip` command, to make the node aware of another node, as defined in [tip command in asinfo](http://www.aerospike.com/docs/tools/asinfo/#tip). -For more details and examples of clustering Aerospike in Docker, please see [Deploying Aerospike clusters with Docker](http://www.aerospike.com/docs/deploy_guides/docker/). +For more, see [How do I get a 2 nodes Aerospike cluster running quickly in Docker without editing a single file?](https://medium.com/aerospike-developer-blog/how-do-i-get-a-2-node-aerospike-cluster-running-quickly-in-docker-without-editing-a-single-file-1c2a94564a99?source=friends_link&sk=4ff6a22f0106596c42aa4b77d6cdc3a5) + +## Image Versions + +These images are based on [debian:strech-slim](https://hub.docker.com/_/debian). + +### ee-[version] + +These tags are for Aerospike EE images, and will require a feature key file, such as the one you get with the single-node EE evaluation, or one associated with a commercial enterprise license agreement. + +### ce-[version] + +These tags are for Aerospike CE images, and do not require a feature key file to start. As mentioned above, the developer API for both is the same, but the editions differ in operational features. + +## Reporting Issues + +If you have any problems with or questions about this image, please post on the [Aerospike discussion forum](https://discuss.aerospike.com). + +Enterprise customers are welcome to participate in the community forum, but can also report issues through the enterprise support system. -## Sending Performance Data to Aerospike +Aerospike EE evaluation users can open an issue in [aerospike/aerospike-server-enterprise.docker](https://github.com/aerospike/aerospike-server-enterprise.docker/issues). -Aerospike Telemetry is a feature that allows us to collect certain use data – not the database data – on your Aerospike Community Edition server use. We'd like to know when clusters are created and destroyed, cluster size, cluster workload, how often queries are run, whether instances are deployed purely in-memory or with Flash. Aerospike Telemetry collects information from running Community Edition server instances every 10 minutes. The data helps us to understand how the product is being used, identify issues, and create a better experience for the end user. [More Info](http://www.aerospike.com/aerospike-telemetry/) +Aerospike CE users can open an issue in [aerospike/aerospike-server.docker](https://github.com/aerospike/aerospike-server.docker/issues). diff --git a/aerospike/github-repo b/aerospike/github-repo index 91cf2ac3e131..bfe29fcaf8f4 100644 --- a/aerospike/github-repo +++ b/aerospike/github-repo @@ -1 +1 @@ -https://github.com/aerospike/aerospike-server.docker +https://github.com/aerospike/aerospike-server-enterprise.docker diff --git a/aerospike/license.md b/aerospike/license.md index e7ba65d90444..f7db53b12ae0 100644 --- a/aerospike/license.md +++ b/aerospike/license.md @@ -1,5 +1,7 @@ -Copyright 2014-2015 Aerospike, Inc. +Copyright 2019-2021 Aerospike, Inc. -Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0). +If you are using a feature key file you received as part of your commercial enterprise license, you are operating under the [Aerospike Master License Agreement](https://www.aerospike.com/forms/master-license-agreement/). -Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +If you are using the Aerospike Database EE evaluation feature key file, you are operating under the [Aerospike Evaluation License Agreement](https://www.aerospike.com/forms/evaluation-license-agreement/). + +If you are using Aerospike Database CE refer to the license information in the [aerospike/aerospike-server](https://github.com/aerospike/aerospike-server) repository. diff --git a/almalinux/README-short.txt b/almalinux/README-short.txt new file mode 100644 index 000000000000..8514523813fd --- /dev/null +++ b/almalinux/README-short.txt @@ -0,0 +1 @@ +The official build of AlmaLinux OS. diff --git a/almalinux/README.md b/almalinux/README.md new file mode 100644 index 000000000000..a71a0facc5d1 --- /dev/null +++ b/almalinux/README.md @@ -0,0 +1,87 @@ + + +# Quick reference + +- **Maintained by**: + [The AlmaLinux OS Foundation](https://github.com/AlmaLinux/docker-images) + +- **Where to get help**: + [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) + +# Supported tags and respective `Dockerfile` links + +- [`latest`, `8`, `8.7`, `8.7-20221201`](https://github.com/AlmaLinux/docker-images/blob/c23f18dbac3cb8bdba691019de42ebc25933c676/Dockerfile-x86_64-default) +- [`minimal`, `8-minimal`, `8.7-minimal`, `8.7-minimal-20221201`](https://github.com/AlmaLinux/docker-images/blob/c23f18dbac3cb8bdba691019de42ebc25933c676/Dockerfile-x86_64-minimal) +- [`9`, `9.1`, `9.1-20221201`](https://github.com/AlmaLinux/docker-images/blob/dd9e3fb5f2f6f68169a4286b32d0509f295d2fed/Dockerfile-x86_64-default) +- [`9-minimal`, `9.1-minimal`, `9.1-minimal-20221201`](https://github.com/AlmaLinux/docker-images/blob/dd9e3fb5f2f6f68169a4286b32d0509f295d2fed/Dockerfile-x86_64-minimal) + +# Quick reference (cont.) + +- **Where to file issues**: + [https://bugs.almalinux.org](https://bugs.almalinux.org) or [GitHub](https://github.com/AlmaLinux/docker-images/issues) + +- **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) + [`amd64`](https://hub.docker.com/r/amd64/almalinux/), [`arm64v8`](https://hub.docker.com/r/arm64v8/almalinux/), [`ppc64le`](https://hub.docker.com/r/ppc64le/almalinux/), [`s390x`](https://hub.docker.com/r/s390x/almalinux/) + +- **Published image artifact details**: + [repo-info repo's `repos/almalinux/` directory](https://github.com/docker-library/repo-info/blob/master/repos/almalinux) ([history](https://github.com/docker-library/repo-info/commits/master/repos/almalinux)) + (image metadata, transfer size, etc) + +- **Image updates**: + [official-images repo's `library/almalinux` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Falmalinux) + [official-images repo's `library/almalinux` file](https://github.com/docker-library/official-images/blob/master/library/almalinux) ([history](https://github.com/docker-library/official-images/commits/master/library/almalinux)) + +- **Source of this description**: + [docs repo's `almalinux/` directory](https://github.com/docker-library/docs/tree/master/almalinux) ([history](https://github.com/docker-library/docs/commits/master/almalinux)) + +# AlmaLinux OS + +[AlmaLinux OS](https://almalinux.org/) is an Open Source and forever-free enterprise Linux distribution, governed and driven by the community, focused on long-term stability and a robust production-grade platform. AlmaLinux OS is 1:1 binary compatible with RHEL® 8 and it was founded by the team behind the well-established [CloudLinux OS](https://www.cloudlinux.com/all-products/product-overview/cloudlinuxos). + +![logo](https://raw.githubusercontent.com/docker-library/docs/23547f3e976bc000d1a01a47241000f72aec9a40/almalinux/logo.png) + +# About this image + +## Platform image + +The default (platform) image is a general-purpose image with a full DNF stack and basic tools like find, tar, vi, etc. + +The `almalinux:latest` tag will always point to the latest stable release of the default image. Major releases and minor releases are also tagged with their version (e.g. `almalinux:8` or `almalinux:8.4`). + +## Minimal image + +The minimal image is a stripped-down image that uses the microdnf package manager and contains a very limited package set. It is designed for applications that come with their own dependencies bundled (e.g. NodeJS, Python). + +The `almalinux:minimal` tag always points to the most recent version of the minimal image. Tags for major (e.g. `almalinux:8-minimal`) and minor (e.g. `almalinux:8.4-minimal`) releases are also available. + +### Upgrade policy + +All images for supported releases will be updated monthly or as needed for security fixes. + +## How It's Made + +The rootfs tarballs for this image are built using the [livemedia-creator tool](http://weldr.io/lorax/livemedia-creator.html). The build script and kickstart files are available in the [AlmaLinux/docker-images](https://github.com/AlmaLinux/docker-images) git repository. + +# License + +View [license information](https://almalinux.org/legal/licensing-policy/) for the software contained in this image. + +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). + +Some additional license information which was able to be auto-detected might be found in [the `repo-info` repository's `almalinux/` directory](https://github.com/docker-library/repo-info/tree/master/repos/almalinux). + +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. diff --git a/almalinux/content.md b/almalinux/content.md new file mode 100644 index 000000000000..15219c47fa42 --- /dev/null +++ b/almalinux/content.md @@ -0,0 +1,27 @@ +# AlmaLinux OS + +[AlmaLinux OS](https://almalinux.org/) is an Open Source and forever-free enterprise Linux distribution, governed and driven by the community, focused on long-term stability and a robust production-grade platform. AlmaLinux OS is 1:1 binary compatible with RHEL® 8 and it was founded by the team behind the well-established [CloudLinux OS](https://www.cloudlinux.com/all-products/product-overview/cloudlinuxos). + +%%LOGO%% + +# About this image + +## Platform image + +The default (platform) image is a general-purpose image with a full DNF stack and basic tools like find, tar, vi, etc. + +The `%%IMAGE%%:latest` tag will always point to the latest stable release of the default image. Major releases and minor releases are also tagged with their version (e.g. `%%IMAGE%%:8` or `%%IMAGE%%:8.4`). + +## Minimal image + +The minimal image is a stripped-down image that uses the microdnf package manager and contains a very limited package set. It is designed for applications that come with their own dependencies bundled (e.g. NodeJS, Python). + +The `%%IMAGE%%:minimal` tag always points to the most recent version of the minimal image. Tags for major (e.g. `%%IMAGE%%:8-minimal`) and minor (e.g. `%%IMAGE%%:8.4-minimal`) releases are also available. + +### Upgrade policy + +All images for supported releases will be updated monthly or as needed for security fixes. + +## How It's Made + +The rootfs tarballs for this image are built using the [livemedia-creator tool](http://weldr.io/lorax/livemedia-creator.html). The build script and kickstart files are available in the [AlmaLinux/docker-images](https://github.com/AlmaLinux/docker-images) git repository. diff --git a/almalinux/github-repo b/almalinux/github-repo new file mode 100644 index 000000000000..d86cf1bfc5e9 --- /dev/null +++ b/almalinux/github-repo @@ -0,0 +1 @@ +https://github.com/AlmaLinux/docker-images diff --git a/almalinux/issues.md b/almalinux/issues.md new file mode 100644 index 000000000000..cddb326015d9 --- /dev/null +++ b/almalinux/issues.md @@ -0,0 +1 @@ +[https://bugs.almalinux.org](https://bugs.almalinux.org) or [GitHub](%%GITHUB-REPO%%/issues) diff --git a/almalinux/license.md b/almalinux/license.md new file mode 100644 index 000000000000..265b3c423845 --- /dev/null +++ b/almalinux/license.md @@ -0,0 +1 @@ +View [license information](https://almalinux.org/legal/licensing-policy/) for the software contained in this image. diff --git a/almalinux/logo.png b/almalinux/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..74553c9d7ea021d3addf9aac0838c728c7c6ac1f GIT binary patch literal 22916 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 + +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. + +## `amazoncorretto:-alpine` + +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. + +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. + +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). + # License Amazon Corretto is released under the same open source license as OpenJDK, which is licensed under the GNU Public License version 2 with the Class Path Exception ([GPLv2 with CPE](https://openjdk.java.net/legal/gplv2+ce.html)). diff --git a/amazoncorretto/content.md b/amazoncorretto/content.md index 783d33684c83..26cca78fc8d3 100644 --- a/amazoncorretto/content.md +++ b/amazoncorretto/content.md @@ -27,3 +27,15 @@ Amazon will provide security updates for Corretto 8 until at least June 2023. Up ### Can I use Corretto as a drop-in replacement for other JDKs? Corretto is designed as a drop-in replacement for all Java SE distributions unless you are using features (e.g., Java Flight Recorder) not available in OpenJDK. Once Corretto binaries are installed on a host and correctly invoked to run your Java applications (e.g., using the alternatives command on Linux), existing command-line options, tuning parameters, monitoring, and anything else in place will continue to work as before. + +### Why does security scanner show that a docker image has a CVE? + +If a security scanner reports that an amazoncorretto image includes a CVE, the first recommended action is to pull an updated version of this image. + +If no updated image is available, run the appropriate command to update packages for the platform, ie. run "apk -U upgrade" for Alpine or "yum update -y --security" for AmazonLinux in your Dockerfiles or systems to resolve the issue immediately. + +If no updated package is available, please treat this as a potential security issue and follow [these instructions](https://aws.amazon.com/security/vulnerability-reporting/) or email AWS security directly at [aws-security@amazon.com](mailto:aws-security@amazon.com). + +It is the responsibility of the base docker image supplier to provide timely security updates to images and packages. The amazoncorretto images are automatically rebuilt when a new base image is made available, but we do not make changes to our Dockerfiles to pull in one-off package updates. If a new base image has not yet been made generally available by a base docker image maintainer, please contact that maintainer to request that the issue be addressed. + +Note that there are multiple reasons why a CVE may appear to be present in a docker image, as explained in the [docker library FAQs](https://github.com/docker-library/faq/tree/73f10b0daf2fb8e7b38efaccc0e90b3510919d51#why-does-my-security-scanner-show-that-an-image-has-cves). diff --git a/amazoncorretto/github-repo b/amazoncorretto/github-repo index 9b9c270daeb0..960f5798efbe 100644 --- a/amazoncorretto/github-repo +++ b/amazoncorretto/github-repo @@ -1 +1 @@ -https://github.com/corretto/corretto-8-docker +https://github.com/corretto/corretto-docker diff --git a/amazonlinux/README.md b/amazonlinux/README.md index bc75ac053333..22e03c32da20 100644 --- a/amazonlinux/README.md +++ b/amazonlinux/README.md @@ -20,14 +20,16 @@ WARNING: [the Amazon Linux Team](https://github.com/aws/amazon-linux-docker-images) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`2.0.20200406.0`, `2`, `latest`](https://github.com/amazonlinux/container-images/blob/92466cbdf8600e425701459dba31a31aa53415e7/Dockerfile) -- [`2.0.20200406.0-with-sources`, `2-with-sources`, `with-sources`](https://github.com/amazonlinux/container-images/blob/d686ee33d867fddd67595fb5d0df581b23ebfdfe/Dockerfile) -- [`2018.03.0.20200318.1`, `2018.03`, `1`](https://github.com/amazonlinux/container-images/blob/3209338a28f4fa5f0a189e517c0809d095c777d8/Dockerfile) -- [`2018.03.0.20200318.1-with-sources`, `2018.03-with-sources`, `1-with-sources`](https://github.com/amazonlinux/container-images/blob/4f52cd2aa92456ef8f867fb6fa8ac63aab2d462f/Dockerfile) +- [`2.0.20221210.0`, `2`, `latest`](https://github.com/amazonlinux/container-images/blob/9025e0ce9166d150ef8c28dd0d88465a250cf79d/Dockerfile) +- [`2.0.20221210.0-with-sources`, `2-with-sources`, `with-sources`](https://github.com/amazonlinux/container-images/blob/2040b2eb2433e45f0f20ab4d8475bf122580a6f5/Dockerfile) +- [`2018.03.0.20221209.1`, `2018.03`, `1`](https://github.com/amazonlinux/container-images/blob/a55f337ad62fc1e1a0c06843ecd0b8f5b10347bb/Dockerfile) +- [`2018.03.0.20221209.1-with-sources`, `2018.03-with-sources`, `1-with-sources`](https://github.com/amazonlinux/container-images/blob/6bb52a2cc2d7899405098cff4373bfa397b6c4a8/Dockerfile) +- [`2022.0.20221207.4`, `2022`, `devel`](https://github.com/amazonlinux/container-images/blob/423528b1be8f280af50b6fe8c2cfa296b05e995f/Dockerfile) +- [`2022.0.20221207.4-with-sources`, `2022-with-sources`, `devel-with-sources`](https://github.com/amazonlinux/container-images/blob/8b3c53739a3853a701caa4ff99732c3b8325c5b4/Dockerfile) # Quick reference (cont.) @@ -42,7 +44,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/amazonlinux`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Famazonlinux) + [official-images repo's `library/amazonlinux` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Famazonlinux) [official-images repo's `library/amazonlinux` file](https://github.com/docker-library/official-images/blob/master/library/amazonlinux) ([history](https://github.com/docker-library/official-images/commits/master/library/amazonlinux)) - **Source of this description**: @@ -56,6 +58,8 @@ The Amazon Linux container image contains a minimal set of packages. To install AWS provides two versions of Amazon Linux: [Amazon Linux 2](https://aws.amazon.com/amazon-linux-2/) and [Amazon Linux AMI](https://aws.amazon.com/amazon-linux-ami/). +**Please note, that Amazon Linux 2022 is currently in the Preview mode and is not recommended for production workloads. Review the Amazon Linux 2022 [documentation](https://docs.aws.amazon.com/linux/al2022/ug/what-is-amazon-linux.html) to learn more.** + For information on security updates for Amazon Linux, please refer to [Amazon Linux 2 Security Advisories](https://alas.aws.amazon.com/alas2.html) and [Amazon Linux AMI Security Advisories](https://alas.aws.amazon.com/). Note that Docker Hub's vulnerability scanning for Amazon Linux is currently based on RPM versions, which does not reflect the state of backported patches for vulnerabilities. ![logo](https://raw.githubusercontent.com/docker-library/docs/9ca9202567ccc25ce110f98bbeb6c929844e05d0/amazonlinux/logo.png) diff --git a/amazonlinux/content.md b/amazonlinux/content.md index c222b8167f3e..e71ac1c4486f 100644 --- a/amazonlinux/content.md +++ b/amazonlinux/content.md @@ -6,6 +6,8 @@ The Amazon Linux container image contains a minimal set of packages. To install AWS provides two versions of Amazon Linux: [Amazon Linux 2](https://aws.amazon.com/amazon-linux-2/) and [Amazon Linux AMI](https://aws.amazon.com/amazon-linux-ami/). +**Please note, that Amazon Linux 2022 is currently in the Preview mode and is not recommended for production workloads. Review the Amazon Linux 2022 [documentation](https://docs.aws.amazon.com/linux/al2022/ug/what-is-amazon-linux.html) to learn more.** + For information on security updates for Amazon Linux, please refer to [Amazon Linux 2 Security Advisories](https://alas.aws.amazon.com/alas2.html) and [Amazon Linux AMI Security Advisories](https://alas.aws.amazon.com/). Note that Docker Hub's vulnerability scanning for Amazon Linux is currently based on RPM versions, which does not reflect the state of backported patches for vulnerabilities. %%LOGO%% diff --git a/api-firewall/README-short.txt b/api-firewall/README-short.txt new file mode 100644 index 000000000000..d27fd67af142 --- /dev/null +++ b/api-firewall/README-short.txt @@ -0,0 +1 @@ +A light-weighted API Firewall to protect your API endpoints with API Schema validation. \ No newline at end of file diff --git a/api-firewall/README.md b/api-firewall/README.md new file mode 100644 index 000000000000..431889b086cc --- /dev/null +++ b/api-firewall/README.md @@ -0,0 +1,153 @@ + + +# Quick reference + +- **Maintained by**: + The Wallarm Team + +- **Where to get help**: + [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) + +# Supported tags and respective `Dockerfile` links + +- [`0.6.9`, `latest`](https://github.com/wallarm/api-firewall-docker/blob/c2b622e7f59546d9fb338c81fa82d405a8767485/0.6.10/Dockerfile) + +# Quick reference (cont.) + +- **Where to file issues**: + [https://github.com/wallarm/api-firewall/issues](https://github.com/wallarm/api-firewall/issues) + +- **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) + [`amd64`](https://hub.docker.com/r/amd64/api-firewall/), [`arm64v8`](https://hub.docker.com/r/arm64v8/api-firewall/), [`i386`](https://hub.docker.com/r/i386/api-firewall/) + +- **Published image artifact details**: + [repo-info repo's `repos/api-firewall/` directory](https://github.com/docker-library/repo-info/blob/master/repos/api-firewall) ([history](https://github.com/docker-library/repo-info/commits/master/repos/api-firewall)) + (image metadata, transfer size, etc) + +- **Image updates**: + [official-images repo's `library/api-firewall` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fapi-firewall) + [official-images repo's `library/api-firewall` file](https://github.com/docker-library/official-images/blob/master/library/api-firewall) ([history](https://github.com/docker-library/official-images/commits/master/library/api-firewall)) + +- **Source of this description**: + [docs repo's `api-firewall/` directory](https://github.com/docker-library/docs/tree/master/api-firewall) ([history](https://github.com/docker-library/docs/commits/master/api-firewall)) + +![logo](https://raw.githubusercontent.com/docker-library/docs/61dec2a536d996ed45a71f3fad57cc9d24d6ad69/api-firewall/logo.svg?sanitize=true) + +# What is API Firewall? + +Wallarm API Firewall is an open-source light-weighted proxy designed to protect REST API endpoints in cloud-native environments by hardening based on a strict OpenAPI/Swagger schema validation. Wallarm API Firewall relies on a positive security model allowing calls that match a predefined API specification for requests and responses, while rejecting everything else. + +The **key features** of API Firewall are: + +- Protect REST API endpoints by blocking requests and responses that do not match the OAS/Swagger schema +- Discover Shadow API endpoints +- If using OAuth 2.0 protocol-based authentication, validate access tokens +- Quick and easy deployment and configuration +- Customization of request and response processing modes, response codes and log format + +# Use cases + +- Block abnormal requests and responses that do not match the OpenAPI 3.0 specification (if running API Firewall in the blocking mode) +- Discover Shadow APIs and undocumented endpoints (if running API Firewall in the logging mode) +- Log abnormal requests and responses that do not match the OpenAPI 3.0 specification (if running API Firewall in the logging mode) + +# API schema validation and positive security model + +When starting API Firewall, you should provide the [OpenAPI 3.0 specification](https://swagger.io/specification/) of the application to be protected with API Firewall. The started API Firewall will operate as a reverse proxy and validate whether requests and responses match the schema defined in the specification. + +The traffic that does not match the schema will be logged using the [`STDOUT` and `STDERR` Docker services](https://docs.docker.com/config/containers/logging/) or blocked (depending on the configured API Firewall operation mode). If operating in the logging mode and detecting the traffic on endpoints that are not included in the specification, API Firewall also logs these endpoints as the shadow ones (except for endpoints returning the code `404`). + +![API Firewall scheme](https://github.com/wallarm/api-firewall/blob/2ace2714ac5777694bde85c8cdbb1308e98a7fea/images/firewall-as-proxy.png?raw=true) + +Provided API schema should be described using the [OpenAPI 3.0 specification](https://swagger.io/specification/) in the YAML or JSON file (`.yaml`, `.yml`, `.json` file extensions). + +By allowing you to set the traffic requirements with the OpenAPI 3.0 specification, Wallarm API Firewall relies on a positive security model. + +# Technical characteristics + +API Firewall works as a reverse proxy with a built-in OpenAPI 3.0 request and response validator. The validator is written in Go and optimized for extreme performance and near-zero added latency. + +# Starting API Firewall + +To download, install, and start Wallarm API Firewall on Docker, see the [instructions](https://docs.wallarm.com/api-firewall/installation-guides/docker-container/). + +# Demos + +You can try API Firewall by running the demo environment that deploys an example application protected with Wallarm API Firewall. There are two available demo environments: + +- [Wallarm API Firewall demo with Docker Compose](https://github.com/wallarm/api-firewall/tree/main/demo/docker-compose) +- [Wallarm API Firewall demo with Kubernetes](https://github.com/wallarm/api-firewall/tree/main/demo/kubernetes) + +# Wallarm's blog articles related to API Firewall + +- [Discovering Shadow APIs with API Firewall](https://lab.wallarm.com/discovering-shadow-apis-with-a-api-firewall/) +- [Wallarm API Firewall outperforms NGINX in a production environment](https://lab.wallarm.com/wallarm-api-firewall-outperforms-nginx-in-a-production-environment/) + +# Performance + +When creating API Firewall, we prioritized speed and efficiency to ensure that our customers would have the fastest APIs possible. Our latest tests demonstrate that the average time required for API Firewall to process one request is 1.339 ms: + +```console +$ ab -c 200 -n 10000 -p ./large.json -T application/json http://127.0.0.1:8282/test/signup + +Document Path: /test/signup +Document Length: 20 bytes + +Concurrency Level: 200 +Time taken for tests: 0.769 seconds +Complete requests: 10000 +Failed requests: 0 +Total transferred: 2150000 bytes +Total body sent: 283770000 +HTML transferred: 200000 bytes +Requests per second: 13005.81 [#/sec] (mean) +Time per request: 15.378 [ms] (mean) +Time per request: 0.077 [ms] (mean, across all concurrent requests) +Transfer rate: 2730.71 [Kbytes/sec] received + 360415.95 kb/s sent + 363146.67 kb/s total + +Connection Times (ms) + min mean[+/-sd] median max +Connect: 0 5 1.6 5 12 +Processing: 2 10 5.4 9 59 +Waiting: 2 8 5.2 7 56 +Total: 3 15 5.7 14 68 + +Percentage of the requests served within a certain time (ms) + 50% 14 + 66% 15 + 75% 16 + 80% 17 + 90% 18 + 95% 23 + 98% 36 + 99% 44 + 100% 68 (longest request) +``` + +These performance results are not the only ones we have got during API Firewall testing. Other results along with the methods used to improve API Firewall performance are described in this [Wallarm's blog article](https://lab.wallarm.com/wallarm-api-firewall-outperforms-nginx-in-a-production-environment/). + +# License + +View [license information](https://www.mozilla.org/en-US/MPL/2.0/) for the software contained in this image. + +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). + +Some additional license information which was able to be auto-detected might be found in [the `repo-info` repository's `api-firewall/` directory](https://github.com/docker-library/repo-info/tree/master/repos/api-firewall). + +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. diff --git a/api-firewall/content.md b/api-firewall/content.md new file mode 100644 index 000000000000..26515e7924f2 --- /dev/null +++ b/api-firewall/content.md @@ -0,0 +1,96 @@ +%%LOGO%% + +# What is API Firewall? + +Wallarm API Firewall is an open-source light-weighted proxy designed to protect REST API endpoints in cloud-native environments by hardening based on a strict OpenAPI/Swagger schema validation. Wallarm API Firewall relies on a positive security model allowing calls that match a predefined API specification for requests and responses, while rejecting everything else. + +The **key features** of API Firewall are: + +- Protect REST API endpoints by blocking requests and responses that do not match the OAS/Swagger schema +- Discover Shadow API endpoints +- If using OAuth 2.0 protocol-based authentication, validate access tokens +- Quick and easy deployment and configuration +- Customization of request and response processing modes, response codes and log format + +# Use cases + +- Block abnormal requests and responses that do not match the OpenAPI 3.0 specification (if running API Firewall in the blocking mode) +- Discover Shadow APIs and undocumented endpoints (if running API Firewall in the logging mode) +- Log abnormal requests and responses that do not match the OpenAPI 3.0 specification (if running API Firewall in the logging mode) + +# API schema validation and positive security model + +When starting API Firewall, you should provide the [OpenAPI 3.0 specification](https://swagger.io/specification/) of the application to be protected with API Firewall. The started API Firewall will operate as a reverse proxy and validate whether requests and responses match the schema defined in the specification. + +The traffic that does not match the schema will be logged using the [`STDOUT` and `STDERR` Docker services](https://docs.docker.com/config/containers/logging/) or blocked (depending on the configured API Firewall operation mode). If operating in the logging mode and detecting the traffic on endpoints that are not included in the specification, API Firewall also logs these endpoints as the shadow ones (except for endpoints returning the code `404`). + +![API Firewall scheme](https://github.com/wallarm/api-firewall/blob/2ace2714ac5777694bde85c8cdbb1308e98a7fea/images/firewall-as-proxy.png?raw=true) + +Provided API schema should be described using the [OpenAPI 3.0 specification](https://swagger.io/specification/) in the YAML or JSON file (`.yaml`, `.yml`, `.json` file extensions). + +By allowing you to set the traffic requirements with the OpenAPI 3.0 specification, Wallarm API Firewall relies on a positive security model. + +# Technical characteristics + +API Firewall works as a reverse proxy with a built-in OpenAPI 3.0 request and response validator. The validator is written in Go and optimized for extreme performance and near-zero added latency. + +# Starting API Firewall + +To download, install, and start Wallarm API Firewall on Docker, see the [instructions](https://docs.wallarm.com/api-firewall/installation-guides/docker-container/). + +# Demos + +You can try API Firewall by running the demo environment that deploys an example application protected with Wallarm API Firewall. There are two available demo environments: + +- [Wallarm API Firewall demo with Docker Compose](https://github.com/wallarm/api-firewall/tree/main/demo/docker-compose) +- [Wallarm API Firewall demo with Kubernetes](https://github.com/wallarm/api-firewall/tree/main/demo/kubernetes) + +# Wallarm's blog articles related to API Firewall + +- [Discovering Shadow APIs with API Firewall](https://lab.wallarm.com/discovering-shadow-apis-with-a-api-firewall/) +- [Wallarm API Firewall outperforms NGINX in a production environment](https://lab.wallarm.com/wallarm-api-firewall-outperforms-nginx-in-a-production-environment/) + +# Performance + +When creating API Firewall, we prioritized speed and efficiency to ensure that our customers would have the fastest APIs possible. Our latest tests demonstrate that the average time required for API Firewall to process one request is 1.339 ms: + +```console +$ ab -c 200 -n 10000 -p ./large.json -T application/json http://127.0.0.1:8282/test/signup + +Document Path: /test/signup +Document Length: 20 bytes + +Concurrency Level: 200 +Time taken for tests: 0.769 seconds +Complete requests: 10000 +Failed requests: 0 +Total transferred: 2150000 bytes +Total body sent: 283770000 +HTML transferred: 200000 bytes +Requests per second: 13005.81 [#/sec] (mean) +Time per request: 15.378 [ms] (mean) +Time per request: 0.077 [ms] (mean, across all concurrent requests) +Transfer rate: 2730.71 [Kbytes/sec] received + 360415.95 kb/s sent + 363146.67 kb/s total + +Connection Times (ms) + min mean[+/-sd] median max +Connect: 0 5 1.6 5 12 +Processing: 2 10 5.4 9 59 +Waiting: 2 8 5.2 7 56 +Total: 3 15 5.7 14 68 + +Percentage of the requests served within a certain time (ms) + 50% 14 + 66% 15 + 75% 16 + 80% 17 + 90% 18 + 95% 23 + 98% 36 + 99% 44 + 100% 68 (longest request) +``` + +These performance results are not the only ones we have got during API Firewall testing. Other results along with the methods used to improve API Firewall performance are described in this [Wallarm's blog article](https://lab.wallarm.com/wallarm-api-firewall-outperforms-nginx-in-a-production-environment/). diff --git a/api-firewall/github-repo b/api-firewall/github-repo new file mode 100644 index 000000000000..7594bc60947b --- /dev/null +++ b/api-firewall/github-repo @@ -0,0 +1 @@ +https://github.com/wallarm/api-firewall \ No newline at end of file diff --git a/api-firewall/license.md b/api-firewall/license.md new file mode 100644 index 000000000000..fd11e071a1f0 --- /dev/null +++ b/api-firewall/license.md @@ -0,0 +1 @@ +View [license information](https://www.mozilla.org/en-US/MPL/2.0/) for the software contained in this image. diff --git a/api-firewall/logo.svg b/api-firewall/logo.svg new file mode 100644 index 000000000000..d0a2e7e1301c --- /dev/null +++ b/api-firewall/logo.svg @@ -0,0 +1,22 @@ + + + + + + + diff --git a/api-firewall/maintainer.md b/api-firewall/maintainer.md new file mode 100644 index 000000000000..f160178bb259 --- /dev/null +++ b/api-firewall/maintainer.md @@ -0,0 +1 @@ +The Wallarm Team diff --git a/arangodb/README.md b/arangodb/README.md index 5ebe65462608..64b51426e61b 100644 --- a/arangodb/README.md +++ b/arangodb/README.md @@ -20,13 +20,13 @@ WARNING: [ArangoDB](https://github.com/arangodb/arangodb-docker) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`3.4`, `3.4.10`](https://github.com/arangodb/arangodb-docker/blob/63dc866beb0546ba3b172e76f64759abfe1a0a28/alpine/3.4.10/Dockerfile) -- [`3.5`, `3.5.5`](https://github.com/arangodb/arangodb-docker/blob/8690d4d6c3f3f0aaea34af72455a2c78a5669149/alpine/3.5.5.1/Dockerfile) -- [`3.6`, `3.6.3`, `latest`](https://github.com/arangodb/arangodb-docker/blob/63dc866beb0546ba3b172e76f64759abfe1a0a28/alpine/3.6.3.1/Dockerfile) +- [`3.8`, `3.8.8`](https://github.com/arangodb/arangodb-docker/blob/6e5a02cd7f5106076a1faf24360218c3e2ca3003/alpine/3.8.8/Dockerfile) +- [`3.9`, `3.9.7`](https://github.com/arangodb/arangodb-docker/blob/7e84f26b857856a5350c5c636f6bedc43ee95ab0/alpine/3.9.7/Dockerfile) +- [`3.10`, `3.10.2`, `latest`](https://github.com/arangodb/arangodb-docker/blob/71fda53ef666d8c85fbd70748a26e7c86bcf3fbf/alpine/3.10.2/Dockerfile) # Quick reference (cont.) @@ -34,14 +34,14 @@ WARNING: [https://github.com/arangodb/arangodb-docker/issues](https://github.com/arangodb/arangodb-docker/issues) - **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) - [`amd64`](https://hub.docker.com/r/amd64/arangodb/) + [`amd64`](https://hub.docker.com/r/amd64/arangodb/), [`arm64v8`](https://hub.docker.com/r/arm64v8/arangodb/) - **Published image artifact details**: [repo-info repo's `repos/arangodb/` directory](https://github.com/docker-library/repo-info/blob/master/repos/arangodb) ([history](https://github.com/docker-library/repo-info/commits/master/repos/arangodb)) (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/arangodb`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Farangodb) + [official-images repo's `library/arangodb` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Farangodb) [official-images repo's `library/arangodb` file](https://github.com/docker-library/official-images/blob/master/library/arangodb) ([history](https://github.com/docker-library/official-images/commits/master/library/arangodb)) - **Source of this description**: @@ -49,9 +49,9 @@ WARNING: # What is ArangoDB? -ArangoDB is a multi-model, open-source database with flexible data models for documents, graphs, and key-values. Build high performance applications using a convenient SQL-like query language or JavaScript extensions. Use ACID transactions if you require them. Scale horizontally with a few mouse clicks. +ArangoDB is a multi-model, open-source database with flexible data models for documents, graphs, and key-values. Build high performance applications using a convenient SQL-like query language or JavaScript extensions. Use ACID transactions if you require them. Scale horizontally and vertically with a few mouse clicks. -ArangoDB runs everywhere: On-prem, in the cloud and also on [ArangoDBs Cloud Service Oasis](https://cloud.arangodb.com/home). +ArangoDB runs everywhere: On-prem, in the cloud and also on [ArangoDB's Cloud Service Oasis](https://cloud.arangodb.com/home). The supported data models can be mixed in queries and allow ArangoDB to be the aggregation point for your data. @@ -175,13 +175,34 @@ unix> docker exec -it jolly_joker arangosh See more information about [Configuration](https://www.arangodb.com/docs/stable/administration-configuration.html) -## Persistent Data +### Limiting resource utilization + +`arangod` checks the following environment variables, which can be used to restrict how much memory and how many CPU cores it should use: + +- `ARANGODB_OVERRIDE_DETECTED_TOTAL_MEMORY` *(introduced in v3.6.3)* + + This variable can be used to override the automatic detection of the total amount of RAM present on the system. One can specify a decimal number (in bytes). Furthermore, if `G` or `g` is appended, the value is multiplied by `2^30`. If `M` or `m` is appended, the value is multiplied by `2^20`. If `K` or `k` is appended, the value is multiplied by `2^10`. That is, `64G` means 64 gigabytes. + + The total amount of RAM detected is logged as an INFO message at server start. If the variable is set, the overridden value is shown. Various default sizes are calculated based on this value (e.g. RocksDB buffer cache size). + + Setting this option can in particular be useful in two cases: -ArangoDB supports two different storage engines as of ArangoDB 3.2. You can choose them while instantiating the container with the environment variable `ARANGO_STORAGE_ENGINE`. With `mmfiles` you choose the classic storage engine, `rocksdb` will choose the newly introduced storage engine based on [RocksDB](http://rocksdb.org/). The default choice is `mmfiles`. + 1. If `arangod` is running in a container and its cgroup has a RAM limitation, then one should specify this limitation in this environment variable, since it is currently not automatically detected. + 2. If `arangod` is running alongside other services on the same machine and thus sharing the RAM with them, one should limit the amount of memory using this environment variable. + +- `ARANGODB_OVERRIDE_DETECTED_NUMBER_OF_CORES` *(introduced in v3.7.1)* + + This variable can be used to override the automatic detection of the number of CPU cores present on the system. + + The number of CPU cores detected is logged as an INFO message at server start. If the variable is set, the overridden value is shown. Various default values for threading are calculated based on this value. + + Setting this option is useful if `arangod` is running in a container or alongside other services on the same machine and shall not use all available CPUs. + +## Persistent Data -ArangoDB use the volume `/var/lib/arangodb3` as database directory to store the collection data and the volume `/var/lib/arangodb3-apps` as apps directory to store any extensions. These directories are marked as docker volumes. +ArangoDB supports two different storage engines from version 3.2 to 3.6. You can choose them while instantiating the container with the environment variable `ARANGO_STORAGE_ENGINE`. With `mmfiles` you choose the classic storage engine (not available in 3.7 and later), `rocksdb` will choose the storage engine based on [RocksDB](http://rocksdb.org/). The default choice is `rocksdb` from version 3.4 on. -Please note that the old version 2.x used `/var/lib/arangodb` and `/var/lib/arangodb-apps`. We will refer to the 3.x variant in this document. In case you are starting a 2.x image just replace it with the 2.x variant. +ArangoDB uses the volume `/var/lib/arangodb3` as database directory to store the collection data and the volume `/var/lib/arangodb3-apps` as apps directory to store any extensions. These directories are marked as docker volumes. See `docker inspect --format "{{ .Config.Volumes}}" arangodb` for all volumes. @@ -232,7 +253,7 @@ When deriving the image, you can control the instantiation via putting files int # License -[Arangodb itself is licensed under the Apache License](https://github.com/arangodb/arangodb/blob/devel/LICENSE), but it contains [software of third parties under their respective licenses](https://github.com/arangodb/arangodb/blob/devel/LICENSES-OTHER-COMPONENTS.md). +[ArangoDB itself is licensed under the Apache License](https://github.com/arangodb/arangodb/blob/devel/LICENSE), but it contains [software of third parties under their respective licenses](https://github.com/arangodb/arangodb/blob/devel/LICENSES-OTHER-COMPONENTS.md). 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). diff --git a/arangodb/content.md b/arangodb/content.md index 576949ed55aa..935d90487510 100644 --- a/arangodb/content.md +++ b/arangodb/content.md @@ -1,8 +1,8 @@ # What is ArangoDB? -ArangoDB is a multi-model, open-source database with flexible data models for documents, graphs, and key-values. Build high performance applications using a convenient SQL-like query language or JavaScript extensions. Use ACID transactions if you require them. Scale horizontally with a few mouse clicks. +ArangoDB is a multi-model, open-source database with flexible data models for documents, graphs, and key-values. Build high performance applications using a convenient SQL-like query language or JavaScript extensions. Use ACID transactions if you require them. Scale horizontally and vertically with a few mouse clicks. -ArangoDB runs everywhere: On-prem, in the cloud and also on [ArangoDBs Cloud Service Oasis](https://cloud.arangodb.com/home). +ArangoDB runs everywhere: On-prem, in the cloud and also on [ArangoDB's Cloud Service Oasis](https://cloud.arangodb.com/home). The supported data models can be mixed in queries and allow ArangoDB to be the aggregation point for your data. @@ -126,13 +126,34 @@ unix> docker exec -it jolly_joker arangosh See more information about [Configuration](https://www.arangodb.com/docs/stable/administration-configuration.html) -## Persistent Data +### Limiting resource utilization + +`arangod` checks the following environment variables, which can be used to restrict how much memory and how many CPU cores it should use: + +- `ARANGODB_OVERRIDE_DETECTED_TOTAL_MEMORY` *(introduced in v3.6.3)* + + This variable can be used to override the automatic detection of the total amount of RAM present on the system. One can specify a decimal number (in bytes). Furthermore, if `G` or `g` is appended, the value is multiplied by `2^30`. If `M` or `m` is appended, the value is multiplied by `2^20`. If `K` or `k` is appended, the value is multiplied by `2^10`. That is, `64G` means 64 gigabytes. + + The total amount of RAM detected is logged as an INFO message at server start. If the variable is set, the overridden value is shown. Various default sizes are calculated based on this value (e.g. RocksDB buffer cache size). + + Setting this option can in particular be useful in two cases: -ArangoDB supports two different storage engines as of ArangoDB 3.2. You can choose them while instantiating the container with the environment variable `ARANGO_STORAGE_ENGINE`. With `mmfiles` you choose the classic storage engine, `rocksdb` will choose the newly introduced storage engine based on [RocksDB](http://rocksdb.org/). The default choice is `mmfiles`. + 1. If `arangod` is running in a container and its cgroup has a RAM limitation, then one should specify this limitation in this environment variable, since it is currently not automatically detected. + 2. If `arangod` is running alongside other services on the same machine and thus sharing the RAM with them, one should limit the amount of memory using this environment variable. + +- `ARANGODB_OVERRIDE_DETECTED_NUMBER_OF_CORES` *(introduced in v3.7.1)* + + This variable can be used to override the automatic detection of the number of CPU cores present on the system. + + The number of CPU cores detected is logged as an INFO message at server start. If the variable is set, the overridden value is shown. Various default values for threading are calculated based on this value. + + Setting this option is useful if `arangod` is running in a container or alongside other services on the same machine and shall not use all available CPUs. + +## Persistent Data -ArangoDB use the volume `/var/lib/arangodb3` as database directory to store the collection data and the volume `/var/lib/arangodb3-apps` as apps directory to store any extensions. These directories are marked as docker volumes. +ArangoDB supports two different storage engines from version 3.2 to 3.6. You can choose them while instantiating the container with the environment variable `ARANGO_STORAGE_ENGINE`. With `mmfiles` you choose the classic storage engine (not available in 3.7 and later), `rocksdb` will choose the storage engine based on [RocksDB](http://rocksdb.org/). The default choice is `rocksdb` from version 3.4 on. -Please note that the old version 2.x used `/var/lib/arangodb` and `/var/lib/arangodb-apps`. We will refer to the 3.x variant in this document. In case you are starting a 2.x image just replace it with the 2.x variant. +ArangoDB uses the volume `/var/lib/arangodb3` as database directory to store the collection data and the volume `/var/lib/arangodb3-apps` as apps directory to store any extensions. These directories are marked as docker volumes. See `docker inspect --format "{{ .Config.Volumes}}" arangodb` for all volumes. diff --git a/arangodb/license.md b/arangodb/license.md index a54be7f1daff..50e704672fa9 100644 --- a/arangodb/license.md +++ b/arangodb/license.md @@ -1 +1 @@ -[Arangodb itself is licensed under the Apache License](https://github.com/arangodb/arangodb/blob/devel/LICENSE), but it contains [software of third parties under their respective licenses](https://github.com/arangodb/arangodb/blob/devel/LICENSES-OTHER-COMPONENTS.md). +[ArangoDB itself is licensed under the Apache License](https://github.com/arangodb/arangodb/blob/devel/LICENSE), but it contains [software of third parties under their respective licenses](https://github.com/arangodb/arangodb/blob/devel/LICENSES-OTHER-COMPONENTS.md). diff --git a/archlinux/README.md b/archlinux/README.md index 0f0e5c908211..571f17fc0cc2 100644 --- a/archlinux/README.md +++ b/archlinux/README.md @@ -17,26 +17,20 @@ WARNING: # Quick reference - **Maintained by**: - Arch Linux trusted users [Santiago Torres-Arias](https://www.archlinux.org/people/trusted-users/#sangy) and [Christian Rebischke](https://www.archlinux.org/people/trusted-users/#shibumi) as well as Arch Linux developer [Pierre Schmitz](https://www.archlinux.org/people/developers/#pierre). + Arch Linux trusted users [Santiago Torres-Arias](https://www.archlinux.org/people/trusted-users/#sangy), [Christian Rebischke](https://www.archlinux.org/people/trusted-users/#shibumi) and [Justin Kromlinger](https://www.archlinux.org/people/trusted-users/#hashworks) as well as Arch Linux developer [Pierre Schmitz](https://www.archlinux.org/people/developers/#pierre). - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`latest`, `20200505`](https://github.com/archlinux/archlinux-docker/blob/dd03495526350f45138b21be43f2a93c1649453a/Dockerfile) -- [`20200407`](https://github.com/archlinux/archlinux-docker/blob/c136f3e502204c8d61fbfb48c2c64fa76c4f143c/Dockerfile) -- [`20200306`](https://github.com/archlinux/archlinux-docker/blob/7cc3899f3be9e2da0bc3c03f82f0f570df9ce908/Dockerfile) -- [`20200205`](https://github.com/archlinux/archlinux-docker/blob/38da0535b738f00ec3beeb18fef27758744b7f13/Dockerfile) -- [`20200106`](https://github.com/archlinux/archlinux-docker/blob/5cda6709af009df0c1db0022629b45a2ddc9f717/Dockerfile) -- [`20191205`](https://github.com/archlinux/archlinux-docker/blob/b285a662b4fb81b8614f8705d7ddd7681b8d530b/Dockerfile) -- [`20191105`](https://github.com/archlinux/archlinux-docker/blob/15a9a3997aa8e571a8ce2a019b65b5eb698919ec/Dockerfile) -- [`20191006`](https://github.com/archlinux/archlinux-docker/blob/ed18f615efd16f3a39b2c3eeed79a1f0c6a1dfca/Dockerfile) +- [`latest`, `base`, `base-20230108.0.116909`](https://gitlab.archlinux.org/archlinux/archlinux-docker/-/blob/9df32909737706d518425cc08d092074a4223314/Dockerfile.base) +- [`base-devel`, `base-devel-20230108.0.116909`](https://gitlab.archlinux.org/archlinux/archlinux-docker/-/blob/9df32909737706d518425cc08d092074a4223314/Dockerfile.base-devel) # Quick reference (cont.) - **Where to file issues**: - [https://github.com/archlinux/archlinux-docker/issues](https://github.com/archlinux/archlinux-docker/issues) + https://gitlab.archlinux.org/archlinux/archlinux-docker/issues - **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) [`amd64`](https://hub.docker.com/r/amd64/archlinux/) @@ -46,7 +40,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/archlinux`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Farchlinux) + [official-images repo's `library/archlinux` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Farchlinux) [official-images repo's `library/archlinux` file](https://github.com/docker-library/official-images/blob/master/library/archlinux) ([history](https://github.com/docker-library/official-images/commits/master/library/archlinux)) - **Source of this description**: @@ -56,34 +50,38 @@ WARNING: Arch Linux, is a lightweight and flexible Linux® distribution that tries to Keep It Simple. -Currently we have official packages optimized for the x86-64 architecture. We complement our official package sets with a community-operated package repository that grows in size and quality each and every day. +Currently, we have official packages optimized for the x86-64 architecture. We complement our official package sets with a community-operated package repository that grows in size and quality each and every day. -Our strong community is diverse and helpful, and we pride ourselves on the range of skillsets and uses for Arch that stem from it. Please check out our forums and mailing lists to get your feet wet. Also glance through our [wiki](https://wiki.archlinux.org) if you want to learn more about Arch. +Our strong community is diverse and helpful, and we pride ourselves on the range of skill sets and uses for Arch that stem from it. Please check out our forums and mailing lists to get your feet wet. Also glance through our [wiki](https://wiki.archlinux.org) if you want to learn more about Arch. ![logo](https://raw.githubusercontent.com/docker-library/docs/ccacad8fa355ebf38dcfd8c216855ab55f981f17/archlinux/logo.png) # About this image -The base filesystem tarball for this image is auto-generated in Arch Linux infrastructure at the beginning of each month. Given the rolling-release nature of Arch Linux, images are tagged with the timestamp of the date they were generated. For example, `archlinux:20191006` was generated the Sixth of October of 2019. The latest tag will contain the latest build always. +The root filesystem tarball for this image is auto-generated weekly at 00:00 UTC on Sunday in Arch Linux infrastructure. Given the rolling-release nature of Arch Linux, images are tagged with the included package group / meta package and the timestamp of the date they were generated. For example, `archlinux:base-20201101.0.7893` was generated the First of November 2020 in [CI job #7893](https://gitlab.archlinux.org/archlinux/archlinux-docker/-/jobs/7893). The `latest` tag will always match the latest `base` tag. + +Besides `base` we also provide images for the `base-devel` package group. This image is intended to serve the following goals: - Provide the Arch experience in a Docker Image -- Provide the most simple but complete image to base every other upon -- pacman needs to work out of the box +- Provide simplest but complete image to base every other upon +- `pacman` needs to work out of the box - All installed packages have to be kept unmodified -## Base packages +> ⚠️⚠️⚠️ NOTE: For Security Reasons, these images strip the pacman lsign key. This is because the same key would be spread to all containers of the same image, allowing for malicious actors to inject packages (via, for example, a man-in-the-middle). In order to create an lsign-key run `pacman-key --init` on the first execution, but be careful to not redistribute that key. ⚠️⚠️⚠️ + +## Availability -Given that that the image is intended to be light-weight several packages of the `base` group have been removed. Please take a look at the [packages](https://github.com/archlinux/archlinux-docker/blob/master/packages) file to see what packages are included on this release. +Root filesystem tarballs are [provided by our GitLab](https://gitlab.archlinux.org/archlinux/archlinux-docker/-/releases) for at least two months. ## Updating -Arch Linux is a rolling release distribution, so a full update is recommended when installing new packages. In other words, we suggest to either execute `RUN pacman -Syu` immediately after your `FROM` statement or as soon as you docker run into a container. +Arch Linux is a rolling release distribution, so a full update is recommended when installing new packages. In other words, we suggest to either execute `RUN pacman -Syu` immediately after your `FROM` statement or as soon as you `docker run` into a container. ## How It's Made -You can build this image with the tools on the [Github repository](https://github.com/archlinux/archlinux-docker) using the included makefile. +You can build this image with the tools on the [Arch Linux GitLab repository](https://gitlab.archlinux.org/archlinux/archlinux-docker) using the included makefile. # License diff --git a/archlinux/content.md b/archlinux/content.md index 4ed80731fe15..0e66b1fea0f4 100644 --- a/archlinux/content.md +++ b/archlinux/content.md @@ -2,31 +2,35 @@ Arch Linux, is a lightweight and flexible Linux® distribution that tries to Keep It Simple. -Currently we have official packages optimized for the x86-64 architecture. We complement our official package sets with a community-operated package repository that grows in size and quality each and every day. +Currently, we have official packages optimized for the x86-64 architecture. We complement our official package sets with a community-operated package repository that grows in size and quality each and every day. -Our strong community is diverse and helpful, and we pride ourselves on the range of skillsets and uses for Arch that stem from it. Please check out our forums and mailing lists to get your feet wet. Also glance through our [wiki](https://wiki.archlinux.org) if you want to learn more about Arch. +Our strong community is diverse and helpful, and we pride ourselves on the range of skill sets and uses for Arch that stem from it. Please check out our forums and mailing lists to get your feet wet. Also glance through our [wiki](https://wiki.archlinux.org) if you want to learn more about Arch. %%LOGO%% # About this image -The base filesystem tarball for this image is auto-generated in Arch Linux infrastructure at the beginning of each month. Given the rolling-release nature of Arch Linux, images are tagged with the timestamp of the date they were generated. For example, `%%IMAGE%%:20191006` was generated the Sixth of October of 2019. The latest tag will contain the latest build always. +The root filesystem tarball for this image is auto-generated weekly at 00:00 UTC on Sunday in Arch Linux infrastructure. Given the rolling-release nature of Arch Linux, images are tagged with the included package group / meta package and the timestamp of the date they were generated. For example, `%%IMAGE%%:base-20201101.0.7893` was generated the First of November 2020 in [CI job #7893](https://gitlab.archlinux.org/archlinux/archlinux-docker/-/jobs/7893). The `latest` tag will always match the latest `base` tag. + +Besides `base` we also provide images for the `base-devel` package group. This image is intended to serve the following goals: - Provide the Arch experience in a Docker Image -- Provide the most simple but complete image to base every other upon -- pacman needs to work out of the box +- Provide simplest but complete image to base every other upon +- `pacman` needs to work out of the box - All installed packages have to be kept unmodified -## Base packages +> ⚠️⚠️⚠️ NOTE: For Security Reasons, these images strip the pacman lsign key. This is because the same key would be spread to all containers of the same image, allowing for malicious actors to inject packages (via, for example, a man-in-the-middle). In order to create an lsign-key run `pacman-key --init` on the first execution, but be careful to not redistribute that key. ⚠️⚠️⚠️ + +## Availability -Given that that the image is intended to be light-weight several packages of the `base` group have been removed. Please take a look at the [packages](https://github.com/archlinux/archlinux-docker/blob/master/packages) file to see what packages are included on this release. +Root filesystem tarballs are [provided by our GitLab](https://gitlab.archlinux.org/archlinux/archlinux-docker/-/releases) for at least two months. ## Updating -Arch Linux is a rolling release distribution, so a full update is recommended when installing new packages. In other words, we suggest to either execute `RUN pacman -Syu` immediately after your `FROM` statement or as soon as you docker run into a container. +Arch Linux is a rolling release distribution, so a full update is recommended when installing new packages. In other words, we suggest to either execute `RUN pacman -Syu` immediately after your `FROM` statement or as soon as you `docker run` into a container. ## How It's Made -You can build this image with the tools on the [Github repository](%%GITHUB-REPO%%) using the included makefile. +You can build this image with the tools on the [Arch Linux GitLab repository](https://gitlab.archlinux.org/archlinux/archlinux-docker) using the included makefile. diff --git a/archlinux/issues.md b/archlinux/issues.md new file mode 100644 index 000000000000..d36ff968878a --- /dev/null +++ b/archlinux/issues.md @@ -0,0 +1 @@ +https://gitlab.archlinux.org/archlinux/archlinux-docker/issues diff --git a/archlinux/maintainer.md b/archlinux/maintainer.md index a8205cb8b724..d3a3bb1f192d 100644 --- a/archlinux/maintainer.md +++ b/archlinux/maintainer.md @@ -1 +1 @@ -Arch Linux trusted users [Santiago Torres-Arias](https://www.archlinux.org/people/trusted-users/#sangy) and [Christian Rebischke](https://www.archlinux.org/people/trusted-users/#shibumi) as well as Arch Linux developer [Pierre Schmitz](https://www.archlinux.org/people/developers/#pierre). +Arch Linux trusted users [Santiago Torres-Arias](https://www.archlinux.org/people/trusted-users/#sangy), [Christian Rebischke](https://www.archlinux.org/people/trusted-users/#shibumi) and [Justin Kromlinger](https://www.archlinux.org/people/trusted-users/#hashworks) as well as Arch Linux developer [Pierre Schmitz](https://www.archlinux.org/people/developers/#pierre). diff --git a/backdrop/README.md b/backdrop/README.md index b070535e03ed..a7b1892d8b0d 100644 --- a/backdrop/README.md +++ b/backdrop/README.md @@ -20,12 +20,12 @@ WARNING: [Backdrop Ops](https://github.com/backdrop-ops/backdrop-docker) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`1.13.2`, `1.13`, `1`, `1.13.2-apache`, `1.13-apache`, `1-apache`, `apache`, `latest`](https://github.com/backdrop-ops/backdrop-docker/blob/1c82e369b6bf1b8ab45becda7f9f9777fe7f6a7f/1/apache/Dockerfile) -- [`1.13.2-fpm`, `1.13-fpm`, `1-fpm`, `fpm`](https://github.com/backdrop-ops/backdrop-docker/blob/1c82e369b6bf1b8ab45becda7f9f9777fe7f6a7f/1/fpm/Dockerfile) +- [`1.23.1`, `1.23`, `1`, `1.23.1-apache`, `1.23-apache`, `1-apache`, `apache`, `latest`](https://github.com/backdrop-ops/backdrop-docker/blob/8012e0b47794605356eddc14dc56b1eda4b36f0c/1/apache/Dockerfile) +- [`1.23.1-fpm`, `1.23-fpm`, `1-fpm`, `fpm`](https://github.com/backdrop-ops/backdrop-docker/blob/8012e0b47794605356eddc14dc56b1eda4b36f0c/1/fpm/Dockerfile) # Quick reference (cont.) @@ -40,7 +40,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/backdrop`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fbackdrop) + [official-images repo's `library/backdrop` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fbackdrop) [official-images repo's `library/backdrop` file](https://github.com/docker-library/official-images/blob/master/library/backdrop) ([history](https://github.com/docker-library/official-images/commits/master/library/backdrop)) - **Source of this description**: @@ -111,7 +111,6 @@ db: MYSQL_PASSWORD: backdrop MYSQL_ALLOW_EMPTY_PASSWORD: 'yes' MYSQL_DATABASE: backdrop - ``` Run `docker-compose up`, wait for it to initialize completely, and visit `http://localhost:8080` or `http://host-ip:8080`. diff --git a/backdrop/content.md b/backdrop/content.md index 8e95c84cea5b..9de55cd372fb 100644 --- a/backdrop/content.md +++ b/backdrop/content.md @@ -63,7 +63,6 @@ db: MYSQL_PASSWORD: %%REPO%% MYSQL_ALLOW_EMPTY_PASSWORD: 'yes' MYSQL_DATABASE: %%REPO%% - ``` Run `docker-compose up`, wait for it to initialize completely, and visit `http://localhost:8080` or `http://host-ip:8080`. diff --git a/bash/README.md b/bash/README.md index d86f20ba74ee..517e650943dd 100644 --- a/bash/README.md +++ b/bash/README.md @@ -20,20 +20,22 @@ WARNING: [Tianon (of the Docker Community)](https://github.com/tianon/docker-bash), [with Chet's support (from Bash upstream)](https://github.com/docker-library/official-images/pull/2217#issue-181031192) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`devel-20200512`, `devel`](https://github.com/tianon/docker-bash/blob/f1678429fe4f9547d0ea426bb59f46a5e05a8b73/devel/Dockerfile) -- [`5.0.17`, `5.0`, `5`, `latest`](https://github.com/tianon/docker-bash/blob/bdb65fba59b806a9987f3b8e9d4522d5f4d49a92/5.0/Dockerfile) -- [`4.4.23`, `4.4`, `4`](https://github.com/tianon/docker-bash/blob/f55ec52c6bb3a9a1b942a775f848002826b58b8a/4.4/Dockerfile) -- [`4.3.48`, `4.3`](https://github.com/tianon/docker-bash/blob/f55ec52c6bb3a9a1b942a775f848002826b58b8a/4.3/Dockerfile) -- [`4.2.53`, `4.2`](https://github.com/tianon/docker-bash/blob/f55ec52c6bb3a9a1b942a775f848002826b58b8a/4.2/Dockerfile) -- [`4.1.17`, `4.1`](https://github.com/tianon/docker-bash/blob/f55ec52c6bb3a9a1b942a775f848002826b58b8a/4.1/Dockerfile) -- [`4.0.44`, `4.0`](https://github.com/tianon/docker-bash/blob/f55ec52c6bb3a9a1b942a775f848002826b58b8a/4.0/Dockerfile) -- [`3.2.57`, `3.2`, `3`](https://github.com/tianon/docker-bash/blob/f55ec52c6bb3a9a1b942a775f848002826b58b8a/3.2/Dockerfile) -- [`3.1.23`, `3.1`](https://github.com/tianon/docker-bash/blob/f55ec52c6bb3a9a1b942a775f848002826b58b8a/3.1/Dockerfile) -- [`3.0.22`, `3.0`](https://github.com/tianon/docker-bash/blob/f55ec52c6bb3a9a1b942a775f848002826b58b8a/3.0/Dockerfile) +- [`devel-20230107`, `devel`, `devel-20230107-alpine3.16`, `devel-alpine3.16`](https://github.com/tianon/docker-bash/blob/b4511227e84d5a41ae8134422418e208bc9fb3b5/devel/Dockerfile) +- [`5.2.15`, `5.2`, `5`, `latest`, `5.2.15-alpine3.16`, `5.2-alpine3.16`, `5-alpine3.16`, `alpine3.16`](https://github.com/tianon/docker-bash/blob/cb26ef95b253f1bd736824c8e88d86e9dcadfa5e/5.2/Dockerfile) +- [`5.1.16`, `5.1`, `5.1.16-alpine3.16`, `5.1-alpine3.16`](https://github.com/tianon/docker-bash/blob/ab48980aaa9b26f074375b19fe430e4bf5970573/5.1/Dockerfile) +- [`5.0.18`, `5.0`, `5.0.18-alpine3.16`, `5.0-alpine3.16`](https://github.com/tianon/docker-bash/blob/ab48980aaa9b26f074375b19fe430e4bf5970573/5.0/Dockerfile) +- [`4.4.23`, `4.4`, `4`, `4.4.23-alpine3.16`, `4.4-alpine3.16`, `4-alpine3.16`](https://github.com/tianon/docker-bash/blob/ab48980aaa9b26f074375b19fe430e4bf5970573/4.4/Dockerfile) +- [`4.3.48`, `4.3`, `4.3.48-alpine3.16`, `4.3-alpine3.16`](https://github.com/tianon/docker-bash/blob/ab48980aaa9b26f074375b19fe430e4bf5970573/4.3/Dockerfile) +- [`4.2.53`, `4.2`, `4.2.53-alpine3.16`, `4.2-alpine3.16`](https://github.com/tianon/docker-bash/blob/ab48980aaa9b26f074375b19fe430e4bf5970573/4.2/Dockerfile) +- [`4.1.17`, `4.1`, `4.1.17-alpine3.16`, `4.1-alpine3.16`](https://github.com/tianon/docker-bash/blob/ab48980aaa9b26f074375b19fe430e4bf5970573/4.1/Dockerfile) +- [`4.0.44`, `4.0`, `4.0.44-alpine3.16`, `4.0-alpine3.16`](https://github.com/tianon/docker-bash/blob/ab48980aaa9b26f074375b19fe430e4bf5970573/4.0/Dockerfile) +- [`3.2.57`, `3.2`, `3`, `3.2.57-alpine3.16`, `3.2-alpine3.16`, `3-alpine3.16`](https://github.com/tianon/docker-bash/blob/ab48980aaa9b26f074375b19fe430e4bf5970573/3.2/Dockerfile) +- [`3.1.23`, `3.1`, `3.1.23-alpine3.16`, `3.1-alpine3.16`](https://github.com/tianon/docker-bash/blob/ab48980aaa9b26f074375b19fe430e4bf5970573/3.1/Dockerfile) +- [`3.0.22`, `3.0`, `3.0.22-alpine3.16`, `3.0-alpine3.16`](https://github.com/tianon/docker-bash/blob/ab48980aaa9b26f074375b19fe430e4bf5970573/3.0/Dockerfile) # Quick reference (cont.) @@ -48,7 +50,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/bash`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fbash) + [official-images repo's `library/bash` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fbash) [official-images repo's `library/bash` file](https://github.com/docker-library/official-images/blob/master/library/bash) ([history](https://github.com/docker-library/official-images/commits/master/library/bash)) - **Source of this description**: diff --git a/bonita/README.md b/bonita/README.md index a8a51a73f1af..fc3e2a7ae36e 100644 --- a/bonita/README.md +++ b/bonita/README.md @@ -17,20 +17,22 @@ WARNING: # Quick reference - **Maintained by**: - [Bonitasoft Community](https://github.com/Bonitasoft-Community/docker_bonita) + [Bonitasoft Community](https://github.com/bonitasoft/bonita-distrib) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [Bonita official documentation](https://documentation.bonitasoft.com), [StackOverflow](https://stackoverflow.com/tags/bonita), [Bonitasoft Community forum](https://community.bonitasoft.com/questions-and-answers) # Supported tags and respective `Dockerfile` links -- [`7.9.5`, `7.9`](https://github.com/Bonitasoft-Community/docker_bonita/blob/b58b05d989055ca3521fc92211d10ff640b4028f/7.9/Dockerfile) -- [`7.10.4`, `7.10`, `latest`](https://github.com/Bonitasoft-Community/docker_bonita/blob/c25c0b161fe2f5ec620122822317e4985cc3b6f2/7.10/Dockerfile) +- [`2021.1`, `7.12.1`, `7.12`](https://github.com/bonitasoft/bonita-distrib/blob/bfdd527629063b73f053320e50e1f6bfcd135d0a/docker/Dockerfile) +- [`2021.2-u0`, `2021.2`, `7.13.0`, `7.13`](https://github.com/bonitasoft/bonita-distrib/blob/a1d9ee5e31d38958aa553cc7f9d465f1151d902f/docker/Dockerfile) +- [`2022.1-u0`, `2022.1`, `7.14.0`, `7.14`](https://github.com/bonitasoft/bonita-distrib/blob/694bf79347add872f8c6a4c0a7f5c3ef12c31dc8/docker/Dockerfile) +- [`2022.2-u0`, `2022.2`, `7.15.0`, `7.15`, `latest`](https://github.com/bonitasoft/bonita-distrib/blob/21c0e51634e836feaf910e8e3d6e95de200e1814/docker/Dockerfile) # Quick reference (cont.) - **Where to file issues**: - [https://github.com/Bonitasoft-Community/docker_bonita/issues](https://github.com/Bonitasoft-Community/docker_bonita/issues) + [Jira](https://bonita.atlassian.net/jira/software/c/projects/BBPMC/issues) - **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) [`amd64`](https://hub.docker.com/r/amd64/bonita/), [`arm64v8`](https://hub.docker.com/r/arm64v8/bonita/), [`ppc64le`](https://hub.docker.com/r/ppc64le/bonita/) @@ -40,7 +42,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/bonita`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fbonita) + [official-images repo's `library/bonita` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fbonita) [official-images repo's `library/bonita` file](https://github.com/docker-library/official-images/blob/master/library/bonita) ([history](https://github.com/docker-library/official-images/commits/master/library/bonita)) - **Source of this description**: @@ -48,7 +50,7 @@ WARNING: # What is Bonita? -Bonita (called Bonita BPM till 7.5) is an open-source business process management and workflow suite created in 2001. It was started in France National Institute for Research in Computer Science, and then had incubated several years inside of the French computer science company Groupe Bull. Since 2009, the development of Bonita is supported by a company dedicated to this activity: Bonitasoft. +Bonita is an open-source business process management and workflow suite created in 2001. It was started in France National Institute for Research in Computer Science, and then had incubated several years inside the French computer science company Groupe Bull. Since 2009, the development of Bonita is supported by a company dedicated to this activity: Bonitasoft. > [wikipedia.org/wiki/Bonita_BPM](http://en.wikipedia.org/wiki/Bonita_BPM) @@ -62,82 +64,38 @@ Bonita (called Bonita BPM till 7.5) is an open-source business process managemen $ docker run --name bonita -d -p 8080:8080 bonita ``` -This will start a container running [Bonita runtime](https://documentation.bonitasoft.com/bonita/7.10/tomcat-bundle): a Tomcat bundle with Bonita Engine + Bonita Portal. With no environment variables specified, it's as like if you have launched the bundle on your host using startup.{sh|bat} (with security hardening on REST and HTTP APIs, cf Security part). Bonita uses a H2 database here. +This will start a container running [Bonita runtime](https://documentation.bonitasoft.com/bonita/latest/tomcat-bundle): a Tomcat bundle with Bonita Engine + Bonita Portal. With no environment variables specified, it's as if you have launched the bundle on your host using startup.{sh|bat} (with security hardening on REST and HTTP APIs, cf Security part). Bonita uses a H2 database here. You can access the Bonita Portal on http://localhost:8080/bonita and login using the default credentials: install / install ## Link Bonita to a database -### PostgreSQL +The H2 database allows the Bonita container to work out of the box, but it is not recommended outside a development environment. -PostgreSQL is the recommended database. +As PostgreSQL is the recommended database for qualification and production environments, follow one of these next sections to configure your Bonita container to run on PostgreSQL database. You can work with either a PostgreSQL Container, or PostgreSQL as an installed service. -[Set max_prepared_transactions to 100](https://documentation.bonitasoft.com/bonita/7.10/database-configuration#toc5): +### PostgreSQL Container -```console -$ mkdir -p custom_postgres -$ echo '#!/bin/bash' > custom_postgres/bonita.sh -$ echo 'sed -i "s/^.*max_prepared_transactions\s*=\s*\(.*\)$/max_prepared_transactions = 100/" "$PGDATA"/postgresql.conf' >> custom_postgres/bonita.sh -$ chmod +x custom_postgres/bonita.sh -``` - -Mount that directory location as /docker-entrypoint-initdb.d inside the PostgreSQL container: - -```console -$ docker run --name mydbpostgres -v "$PWD"/custom_postgres/:/docker-entrypoint-initdb.d -e POSTGRES_PASSWORD=mysecretpassword -d postgres:11 -``` - -See the [official PostgreSQL documentation](https://hub.docker.com/_/postgres/) for more details. - -```console -$ docker run --name bonita_postgres --link mydbpostgres:postgres -d -p 8080:8080 bonita -``` - -### MySQL - -There are known issues with the management of XA transactions by MySQL engine and driver: see MySQL bugs [17343](http://bugs.mysql.com/bug.php?id=17343) and [12161](http://bugs.mysql.com/bug.php?id=12161) for more details. Thus, using MySQL database in a production environment is not recommended. +From Bonita 2022.1 onwards, the Bonita docker image does not include configuration scripts to automatically create databases and users anymore. -[Increase the packet size](https://documentation.bonitasoft.com/bonita/7.10/database-configuration#toc5) which is set by default to 1M: +Therefore the PostgreSQL container needs to be configured to work with Bonita before starting the Bonita container. The configuration of a PostgreSQL database to work with Bonita is described in details in the [database configuration page](https://documentation.bonitasoft.com/bonita/latest/runtime/database-configuration#postgres_setup). + Alternatively, Bonita provides a preconfigured [PostgreSQL image](https://hub.docker.com/r/bonitasoft/bonita-postgres) on docker-hub. + You can run the image with the following command: -```console -$ mkdir -p custom_mysql -$ echo "[mysqld]" > custom_mysql/bonita.cnf -$ echo "max_allowed_packet=16M" >> custom_mysql/bonita.cnf +```bash +docker run --name mydbpostgres -h -d bonitasoft/bonita-postgres:12.6 ``` -Mount that directory location as /etc/mysql/conf.d inside the MySQL container: - -```console -$ docker run --name mydbmysql -v "$PWD"/custom_mysql/:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=mysecretpassword -d mysql:8.0 -``` - -See the [official MySQL documentation](https://hub.docker.com/_/mysql/) for more details. - -Start your application container to link it to the MySQL container: - -```console -$ docker run --name bonita_mysql --link mydbmysql:mysql -d -p 8080:8080 bonita -``` - -## Modify default credentials - -```console -$ docker run --name=bonita -e "TENANT_LOGIN=tech_user" -e "TENANT_PASSWORD=secret" -e "PLATFORM_LOGIN=pfadmin" -e "PLATFORM_PASSWORD=pfsecret" -d -p 8080:8080 bonita -``` - -Now you can access the Bonita Portal on localhost:8080/bonita and login using: `tech_user` / `secret` +This image is built from the following [GitHub repository](https://github.com/Bonitasoft-Community/bonita-database-docker/tree/main/postgres/12), which can be further adapted/customized to suit your needs. ## ... via [`docker stack deploy`](https://docs.docker.com/engine/reference/commandline/stack_deploy/) or [`docker-compose`](https://github.com/docker/compose) Example `stack.yml` for `bonita`: ```yaml -# Use tech_user/secret as user/password credentials version: '3' services: db: - image: postgres:9.3 + image: bonitasoft/bonita-postgres:12.6 environment: POSTGRES_PASSWORD: example restart: always @@ -145,13 +103,20 @@ services: - -c - max_prepared_transactions=100 bonita: - image: bonita + image: bonita:7.14.0 + hostname: custom-hostname.example.com ports: - 8080:8080 environment: - - POSTGRES_ENV_POSTGRES_PASSWORD=example - DB_VENDOR=postgres - DB_HOST=db + - DB_PORT=5432 + - DB_NAME=bonita + - DB_USER=bonita + - DB_PASS=bpm + - BIZ_DB_NAME=business_data + - BIZ_DB_USER=business_data + - BIZ_DB_PASS=bpm - TENANT_LOGIN=tech_user - TENANT_PASSWORD=secret - PLATFORM_LOGIN=pfadmin @@ -164,350 +129,272 @@ services: - -c - | set -e - echo 'Waiting for Postgres to be available' - export PGPASSWORD="$$POSTGRES_ENV_POSTGRES_PASSWORD" + echo 'Waiting for PostgreSQL to be available' maxTries=10 - while [ "$$maxTries" -gt 0 ] && ! psql -h "$$DB_HOST" -U 'postgres' -c '\l'; do - let maxTries-- + while [ "$$maxTries" -gt 0 ] && [ $$(echo 'QUIT' | nc -w 1 "$$DB_HOST" 5432; echo "$$?") -gt 0 ]; do sleep 1 + let maxTries-- done - echo if [ "$$maxTries" -le 0 ]; then echo >&2 'error: unable to contact Postgres after 10 tries' exit 1 fi - exec /opt/files/startup.sh + exec /opt/files/startup.sh /opt/bonita/server/bin/catalina.sh run ``` -[![Try in PWD](https://github.com/play-with-docker/stacks/raw/cff22438cb4195ace27f9b15784bbb497047afa7/assets/images/button.png)](http://play-with-docker.com?stack=https://raw.githubusercontent.com/docker-library/docs/d7f952b15103e355727ad55d428e55c84383aca9/bonita/stack.yml) +[![Try in PWD](https://github.com/play-with-docker/stacks/raw/cff22438cb4195ace27f9b15784bbb497047afa7/assets/images/button.png)](http://play-with-docker.com?stack=https://raw.githubusercontent.com/docker-library/docs/d14f7b96a6cdcb815f50ba4244bf799f6127770f/bonita/stack.yml) Run `docker stack deploy -c stack.yml bonita` (or `docker-compose -f stack.yml up`), wait for it to initialize completely, and visit `http://swarm-ip:8080`, `http://localhost:8080`, or `http://host-ip:8080` (as appropriate). -## Where to store data - -Most of the data are stored in a database and can be stored outside the Bonita container as described above using the PostgreSQL or MySQL container. However, some data remains inside the Bonita bundle. Bonita Home is a folder, called `bonita`, which contains configuration, working, and temporary folders and files. There are also log files inside the `logs` folder till Bonita 7.8. - -Important note: There are several ways to store data used by applications that run in Docker containers. We encourage users of the `bonita` images to familiarize themselves with the options available, including: - -- Let Docker manage the storage of your data [by writing the files to disk on the host system using its own internal volume management](https://docs.docker.com/engine/tutorials/dockervolumes/#adding-a-data-volume). This is the default and is easy and fairly transparent to the user. The downside is that the files may be hard to locate for tools and applications that run directly on the host system, i.e. outside containers. -- Create a data directory on the host system (outside the container) and [mount this to a directory visible from inside the container](https://docs.docker.com/engine/tutorials/dockervolumes/#mount-a-host-directory-as-a-data-volume). This places the database files in a known location on the host system, and makes it easy for tools and applications on the host system to access the files. The downside is that the user needs to make sure that the directory exists, and that directory permissions and other security mechanisms on the host system are set up correctly. - -The Docker documentation is a good starting point for understanding the different storage options and variations, and there are multiple blogs and forum postings that discuss and give advice in this area. We will simply show the basic procedure here for the latter option above: - -1. Create a data directory on a suitable volume on your host system, e.g. `/my/own/datadir`. -2. Start your `bonita` container like this: - - docker run --name some-bonita -v /my/own/datadir:/opt/bonita -d -p 8080:8080 bonita:tag - -The `-v /my/own/datadir:/opt/bonita` part of the command mounts the `/my/own/datadir` directory from the underlying host system as `/opt/bonita` inside the container, where Bonita will deploy the bundle and write data files by default. +- Replace `` with the one used in the licence generation command +- leave double `$$` untouched -## Migrate from an earlier version of Bonita +### PostgreSQL as an installed service -- Stop the container to perform a backup +If you don't want to run your database in a docker container, the following `env.txt` file needs to be configured and provided to the docker run command: - ```console - $ docker stop bonita_7.9.5_postgres - ``` - -- For containers < 7.3.0 : - - - Check where your data are stored - - ```console - $ docker inspect bonita_7.2.3_postgres - [...] - "Mounts": [ - { - "Source": "/home/user/Documents/Docker/Volumes/bonita_7.2.3_postgres", - "Destination": "/opt/bonita", - "Mode": "", - "RW": true - } - ], - [...] - ``` - - - Copy data from the filesystem - - ```console - $ cp -r bonita_7.2.3_postgres bonita_migration - ``` - -- Retrieve the DB container IP - - ```console - $ docker inspect --format '{{ .NetworkSettings.IPAddress }}' mydbpostgres - 172.17.0.26 - ``` +```properties +DB_VENDOR=postgres +DB_HOST=172.17.0.2 +DB_PORT=5432 +DB_NAME=custombonitadb +DB_USER=custombonitauser +DB_PASS=custombonitapass +BIZ_DB_NAME=custombusinessdb +BIZ_DB_USER=custombusinessuser +BIZ_DB_PASS=custombusinesspass +``` -- Dump the database +```bash +docker run --name=bonita -h --env-file=env.txt -d -p 8080:8080 bonita +``` - ```console - $ export PGPASSWORD=mysecretpassword - $ pg_dump -O -x -h 172.17.0.26 -U postgres bonitadb > /tmp/bonitadb.sql - ``` +## Start Bonita with custom security credentials - Note that businessdb won't be updated with the migration tool but you may want to also backup/move it. +```bash +docker run --name=bonita -h -e "TENANT_LOGIN=tech_user" -e "TENANT_PASSWORD=secret" -e "PLATFORM_LOGIN=pfadmin" -e "PLATFORM_PASSWORD=pfsecret" -d -p 8080:8080 bonita +``` -- Load the dump +Now you can access the Bonita Runtime on localhost:8080/bonita and login using: tech_user / secret - ```console - $ export PGPASSWORD=mysecretpassword - $ psql -U postgres -h 172.17.0.26 -d postgres -c "CREATE USER newbonitauser WITH PASSWORD 'newbonitapass';" - $ psql -U postgres -h 172.17.0.26 -d postgres -c "CREATE DATABASE newbonitadb OWNER newbonitauser;" - $ export PGPASSWORD=newbonitapass - $ cat /tmp/bonitadb.sql | psql -U newbonitauser -h 172.17.0.26 newbonitadb - ``` +## Where data are stored -- Retrieve the last migration tool +Bonita uses tomcat that writes file to a working directory and a temp directory. - - If you migrate to a version < 7.3.0 +It can be a good practice to mount the following folders into volumes - - get also the target version of the Bonita bundle +- `/opt/bonita/server/temp` +- `/opt/bonita/server/work` - ```console - cd bonita_migration - wget https://release.ow2.org/bonita/bonita-migration-distrib-2.50.0.zip - wget https://download.forge.ow2.org/bonita/BonitaBPMCommunity-7.2.4-Tomcat-7.0.67.zip - unzip bonita-migration-distrib-2.50.0.zip - unzip BonitaBPMCommunity-7.2.4-Tomcat-7.0.67.zip - ``` +## Environment variables - - Move the previous Home into the new bundle +When you start the bonita image, you can adjust the configuration of the Bonita instance by passing one or more environment variables on the docker run command line. - ```console - mv BonitaBPMCommunity-7.2.4-Tomcat-7.0.67/bonita/ BonitaBPMCommunity-7.2.4-Tomcat-7.0.67/bonita.orig - cp -r BonitaBPMCommunity-7.2.3-Tomcat-7.0.67/bonita/ BonitaBPMCommunity-7.2.4-Tomcat-7.0.67/bonita/ - ``` +### PLATFORM_LOGIN - - If you migrate to a version >= 7.3.0 +This optional environment variable is used in conjunction with PLATFORM_PASSWORD to define the username for the platform administrator. If it is not specified, the default username `platformAdmin` will be used. - ```console - cd bonita_migration - wget https://release.ow2.org/bonita/bonita-migration-distrib-2.50.0.zip - unzip bonita-migration-distrib-2.50.0.zip - ``` +### PLATFORM_PASSWORD -- Configure the migration tool +This environment variable is recommended for you to use the Bonita image. It sets the platform administrator password for Bonita. If it is not specified, the default password `platform` will be used. - ```console - $ cd bonita-migration-distrib-2.50.0 - ``` +### TENANT_LOGIN - edit the migration tool config to point towards the copy of bonita home and db +This optional environment variable is used in conjunction with TENANT_PASSWORD to define the username for the tenant administrator. If it is not specified, the default username `install` will be used. - ```console - $ vim Config.properties - ``` +### TENANT_PASSWORD - For example : +This environment variable is recommended for you to use the Bonita image. It sets the tenant administrator password for Bonita. If it is not specified, the default password `install` will be used. - db.vendor=postgres - db.url=jdbc:postgresql://172.17.0.26:5432/newbonitadb - db.driverClass=org.postgresql.Driver - db.user=newbonitauser - db.password=newbonitapass - # location of the bonita home (only useful when migration from version before 7.3.0) - bonita.home=/home/user/Documents/Docker/Volumes/bonita_migration/BonitaBPMCommunity-7.2.3-Tomcat-7.0.67/bonita +### MONITORING_USERNAME -- Launch the migration +This optional environment variable is used in conjunction with `MONITORING_PASSWORD` to define the access to endpoints protected with [BASIC Auth access](https://en.wikipedia.org/wiki/Basic_access_authentication): it is used for the JMX remote access. If it is not specified, the default monitoring username `monitoring` will be used. - ```console - $ cd bin - $ ./bonita-migration-distrib - ``` +### MONITORING_PASSWORD -- Launch the new container pointing towards the copy of DB and filesystem +This optional environment variable is used in conjunction with `MONITORING_USERNAME` to define the access to endpoints protected with [BASIC Auth access](https://en.wikipedia.org/wiki/Basic_access_authentication): it is used for the JMX remote access. If it is not specified, the default monitoring password `mon1tor1ng_adm1n` will be used. - - If < 7.3.0 +### HTTP_API - ```console - $ docker run --name=bonita_7.2.4_postgres --link mydbpostgres:postgres -e "DB_NAME=newbonitadb" -e "DB_USER=newbonitauser" -e "DB_PASS=newbonitapass" -v "$PWD"/bonita_migration:/opt/bonita/ -d -p 8081:8080 bonita:7.2.4 - ``` +This optional environment variable is used to enable/disable the Bonita HTTP API. The default value is false, which will deactivate the HTTP API. From Bonita 2022.1, HTTP API is protected with [Basic access authentication](https://en.wikipedia.org/wiki/Basic_access_authentication). See the following 2 parameters to configure Basic access authentication. - - If >= 7.3.0 +### HTTP_API_USERNAME - ```console - $ docker run --name=bonita_7.10.4_postgres --link mydbpostgres:postgres -e "DB_NAME=newbonitadb" -e "DB_USER=newbonitauser" -e "DB_PASS=newbonitapass" -d -p 8081:8080 bonita:7.10.4 - ``` +This optional environment variable is used to configure the HTTP API Basic access authentication username. The default value is `http-api`. -- Reapply specific configuration if needed, for example with a version >= 7.3.0 : +### HTTP_API_PASSWORD - ```console - $ docker exec -ti bonita_7.10.4_postgres /bin/bash - ``` +This optional environment variable is used to configure the HTTP API Basic access authentication password. There is no default value, and providing a value is mandatory if `HTTP_API=true`. - ```console - $ cd /opt/bonita/BonitaCommunity-7.10.4/setup - $ ./setup.sh pull - $ TENANT_LOGIN=tech_user - $ TENANT_PASSWORD=secret - $ PLATFORM_LOGIN=pfadmin - $ PLATFORM_PASSWORD=pfsecret - $ sed -e 's/^#userName\s*=.*/'"userName=${TENANT_LOGIN}"'/' \ - -e 's/^#userPassword\s*=.*/'"userPassword=${TENANT_PASSWORD}"'/' \ - -i platform_conf/current/tenants/1/tenant_engine/bonita-tenant-community-custom.properties - $ sed -e 's/^platform.tenant.default.username\s*=.*/'"platform.tenant.default.username=${TENANT_LOGIN}"'/' \ - -e 's/^platform.tenant.default.password\s*=.*/'"platform.tenant.default.password=${TENANT_PASSWORD}"'/' \ - -i platform_conf/current/platform_portal/platform-tenant-config.properties - $ sed -e 's/^#platformAdminUsername\s*=.*/'"platformAdminUsername=${PLATFORM_LOGIN}"'/' \ - -e 's/^#platformAdminPassword\s*=.*/'"platformAdminPassword=${PLATFORM_PASSWORD}"'/' \ - -i platform_conf/current/platform_engine/bonita-platform-community-custom.properties - $ sed -i -e 's/^#GET|/GET|/' -e 's/^#POST|/POST|/' -e 's/^#PUT|/PUT|/' -e 's/^#DELETE|/DELETE|/' -i platform_conf/current/tenants/1/tenant_portal/dynamic-permissions-checks.properties - $ ./setup.sh push - ``` +### JMX_REMOTE_ACCESS - ```console - $ docker restart bonita_7.10.4_postgres - ``` +This optional environment variable is used to enable/disable the access to the [JMX console](https://docs.oracle.com/en/java/javase/11/management/using-jconsole.html) from a remote machine. + Default value is `false`. + The host to connect to is the name / IP address of the bonita server, the port to connect to is 9000. + The credentials to connect are the environment variables [MONITORING_USERNAME](#MONITORING_USERNAME), [MONITORING_PASSWORD](#MONITORING_PASSWORD). -- Specific consideration regarding migration to Java 11 in Bonita 7.9 +### REMOTE_IP_VALVE_ENABLED - Bonita 7.9 docker image runs with Java 11. If you are migrating from an earlier version which runs Java 8, you should validate on a test environment that your custom code is compatible. Aside from just code incompatibility, special attention has to be given to the dependencies of the custom code, as they might not work in Java 11. +This optional environment variable allows to activate/deactivate [reverse proxy redirection](https://documentation.bonitasoft.com/bonita/latest/runtime/reverse-proxy-configuration). Default value is `false`. -For more details regarding Bonita migration, see the [documentation](https://documentation.bonitasoft.com/bonita/7.10/migrate-from-an-earlier-version-of-bonita-bpm). +### ACCESSLOGS_STDOUT_ENABLED -## Security +This optional environment variable allows to activate/deactivate writing Tomcat access logs to standard output. Default value is `false`. -This Docker image activates both static and dynamic authorization checks by default on REST API. To be consistent, it also deactivates the HTTP API. +### ACCESSLOGS_FILES_ENABLED -- REST API authorization +This optional environment variable allows to activate/deactivate writing Tomcat access logs to a specific file. When activated, will write those logs to `/opt/bonita/logs/` *inside* the docker container. In practice, it is only useful when mounting a volume to the aforementioned directory. Default value is `false`. - - [Static authorization checking](https://documentation.bonitasoft.com/bonita/7.10/rest-api-authorization#toc1) +### ACCESSLOGS_PATH - - [Dynamic authorization checking](https://documentation.bonitasoft.com/bonita/7.10/rest-api-authorization#toc2) +If `ACCESSLOGS_FILES_ENABLED=true`, this optional environment variable overrides the default path to the access log files. Default value is `/opt/bonita/logs`. -- [HTTP API](https://documentation.bonitasoft.com/bonita/7.10/rest-api-authorization#toc10) +### ACCESSLOGS_PATH_APPEND_HOSTNAME -For specific needs you can override this behavior by setting HTTP_API to true and REST_API_DYN_AUTH_CHECKS to false: +If `ACCESSLOGS_FILES_ENABLED=true`, this optional environment variable allows to append a subdirectory with the *hostname* to the full path of the directory to put access log files into. Default value is `false`. -```console -$ docker run -e HTTP_API=true -e REST_API_DYN_AUTH_CHECKS=false --name bonita -d -p 8080:8080 bonita -``` +### ACCESSLOGS_MAX_DAYS -## Environment variables +If `ACCESSLOGS_FILES_ENABLED=true`, this optional environment variable allows to automatically delete access log files after a certain number of days. Default value is `30`. -When you start the `bonita` image, you can adjust the configuration of the Bonita instance by passing one or more environment variables on the `docker run` command line. +### HTTP_MAX_THREADS -### `PLATFORM_PASSWORD` +This optional environment variable allows to specify the maximum Http thread number Tomcat will use to serve HTTP/1.1 requests. Directly modifies the *maxThreads* parameter in the *server.xml* file of the Tomcat inside the docker container. More information on the usefulness of this parameter can be found [here](https://tomcat.apache.org/tomcat-9.0-doc/config/http.html). Default value is `20`. -This environment variable [is recommended](https://documentation.bonitasoft.com/bonita/7.10/tomcat-bundle#toc3) for you to use the Bonita image. It sets the platform administrator password for Bonita. If it is not specified, the default password `platform` will be used. +### JAVA_OPTS -### `PLATFORM_LOGIN` +This optional environment variable is used to customize JAVA_OPTS. The default value is -Xms1024m -Xmx1024m -XX:MaxPermSize=256m. The syntax to use is `-e JAVA_OPTS="-Xms2048m -Xmx2048m -XX:MaxPermSize=1024m"` -This optional environment variable is used in conjunction with `PLATFORM_PASSWORD` to define the username for the platform administrator. If it is not specified, the default user `platformAdmin` will be used. +### DB_VENDOR -### `TENANT_PASSWORD` +This environment variable is automatically set to postgres or mysql if the Bonita container is linked to a PostgreSQL or MySQL database using --link. The default value is h2. It can be overridden if you don't use the --link capability. -This environment variable [is recommended](https://documentation.bonitasoft.com/bonita/7.10/tomcat-bundle#toc3) for you to use the Bonita image. It sets the tenant administrator password for Bonita. If it is not specified, the default password `install` will be used. +### DB_HOST, DB_PORT -### `TENANT_LOGIN` +These variables are optional, used in conjunction to configure the bonita image to reach the database instance. There are automatically set if --link is used to run the container. -This optional environment variable is used in conjunction with `TENANT_PASSWORD` to define the username for the tenant administrator. If it is not specified, the default user of `install` will be used. +### DB_NAME, DB_USER, DB_PASS -### `REST_API_DYN_AUTH_CHECKS` +These variables are used in conjunction to define how Bonita should access its database for internal functioning. -This optional environment variable is used to enable/disable [dynamic authorization checking](https://documentation.bonitasoft.com/bonita/7.10/rest-api-authorization#toc2) on Bonita REST API. The default value is `true`, which will activate dynamic authorization checking. +`DB_NAME` default value is bonitadb. -### `HTTP_API` +`DB_USER` default value is bonitauser. -This optional environment variable is used to enable/disable the Bonita HTTP API. The default value is `false`, which will deactivate the HTTP API. +`DB_PASS` default value is bonitapass. -### `JAVA_OPTS` +### BIZ_DB_NAME, BIZ_DB_USER, BIZ_DB_PASS -This optional environment variable is used to customize JAVA_OPTS. The default value is `-Xms1024m -Xmx1024m -XX:MaxPermSize=256m`. +These variables are used in conjunction to define how Bonita should access the [Business Data](https://documentation.bonitasoft.com/bonita/latest/data/define-and-deploy-the-bdm) database. -### `ENSURE_DB_CHECK_AND_CREATION` +`BIZ_DB_NAME` default value is businessdb. -This optional environment variable is used to allow/disallow the SQL queries to automatically check and create the databases using the database administrator credentials. The default value is `true`. +`BIZ_DB_USER` default value is businessuser. -### `DB_VENDOR` +`BIZ_DB_PASS` default value is businesspass. -This environment variable is automatically set to `postgres` or `mysql` if the Bonita container is linked to a PostgreSQL or MySQL database using `--link`. The default value is `h2`. It can be overridden if you don't use the `--link` capability. +## Logger configuration -### `DB_HOST`, `DB_PORT` +**Since 2022.1** -These variables are optional, used in conjunction to configure the `bonita` image to reach the database instance. There are automatically set if `--link` is used to run the container. +The logger can be configured by mounting a volume on folder `/opt/bonita/conf/logs` containing the configuration files. -### `DB_NAME`, `DB_USER`, `DB_PASS` +the volume must contain the 2 files [log4j2-loggers.xml](https://raw.githubusercontent.com/bonitasoft/bonita-distrib/7.14.0/tomcat-resources/tomcat-distrib-for-bonita/src/main/resources/tomcat/server/conf/log4j2-loggers.xml) and [log4j2-appenders.xml](https://raw.githubusercontent.com/bonitasoft/bonita-distrib/7.14.0/docker/files/log4j2/log4j2-appenders.xml) -These variables are used in conjunction to create a new user, set that user's password, and create the `bonita` database. +Any change made to one of this 2 files is automatically hot-reloaded and taken into account immediately. -`DB_NAME` default value is `bonitadb`. +## Security -`DB_USER` default value is `bonitauser`. +This Docker image activates both static and dynamic authorization checks by default on REST API. To be consistent, it also deactivates the HTTP API. -`DB_PASS` default value is `bonitapass`. +- REST API authorization -### `BIZ_DB_NAME`, `BIZ_DB_USER`, `BIZ_DB_PASS` + - [Static authorization checking](https://documentation.bonitasoft.com/bonita/latest/rest-api-authorization#static_authorization) -These variables are used in conjunction to create a new user, set that user's password and create the `bonita` [business database](https://documentation.bonitasoft.com/bonita/7.10/define-and-deploy-the-bdm#toc1). +- [HTTP API](https://documentation.bonitasoft.com/bonita/latest/rest-api-authorization#_activating_and_deactivating_authorization) -`BIZ_DB_NAME` default value is `businessdb`. +For specific needs you can override this behavior by setting HTTP_API to true: -`BIZ_DB_USER` default value is `businessuser`. +```console +$ docker run -e HTTP_API=true -e HTTP_API_PASSWORD="My-Cust0m_S3cR3T" --name bonita -d -p 8080:8080 bonita +``` -`BIZ_DB_PASS` default value is `businesspass`. +## Update from an earlier version of Bonita -### `DB_ADMIN_USER`, `DB_ADMIN_PASS` +For updating from a version before 7.10.0, please refer to the [documentation](https://documentation.bonitasoft.com/bonita/latest/version-update/migrate-from-an-earlier-version-of-bonita) -These variables are optional, and used in conjunction to create users and databases through the administrator account used on the database instance. +- Stop the container to perform a database backup -`DB_ADMIN_USER` if no value is provided, this is automatically set to `root` with MySQL or `postgres` with PostgreSQL. + ```console + $ docker stop bonita + ``` -`DB_ADMIN_PASS` if no value is provided, this is automatically set using the value from the linked container: `MYSQL_ENV_MYSQL_ROOT_PASSWORD` or `POSTGRES_ENV_POSTGRES_PASSWORD`. +- Retrieve the DB container IP -### `DB_DROP_EXISTING`, `BIZ_DB_DROP_EXISTING` + ```console + $ docker inspect --format '{{ .NetworkSettings.IPAddress }}' mydbpostgres + 172.17.0.26 + ``` -`DB_DROP_EXISTING` and `BIZ_DB_DROP_EXISTING` can be used to drop existing databases in order to reuse an existing database instance. +- Dump the database -`DB_DROP_EXISTING` default value is `N`. + ```console + $ export PGPASSWORD=mysecretpassword + $ pg_dump -O -x -h 172.17.0.26 -U postgres bonitadb > /tmp/bonitadb.sql + ``` -`BIZ_DB_DROP_EXISTING` default value is `N`. + Note that businessdb won't be updated by the update tool but you may want to also backup/move it. -### `BONITA_SERVER_LOGGING_FILE`, `BONITA_SETUP_LOGGING_FILE` +- Load the dump -Since Bonita 7.9 `BONITA_SERVER_LOGGING_FILE` and `BONITA_SETUP_LOGGING_FILE` can be used to update logging configuration. + ```console + $ export PGPASSWORD=mysecretpassword + $ psql -U postgres -h 172.17.0.26 -d postgres -c "CREATE USER newbonitauser WITH PASSWORD 'newbonitapass';" + $ psql -U postgres -h 172.17.0.26 -d postgres -c "CREATE DATABASE newbonitadb OWNER newbonitauser;" + $ export PGPASSWORD=newbonitapass + $ cat /tmp/bonitadb.sql | psql -U newbonitauser -h 172.17.0.26 newbonitadb + ``` -`BONITA_SERVER_LOGGING_FILE` default value is `/opt/bonita/BonitaSubscription-${BONITA_VERSION}/server/conf/logging.properties`. +- Retrieve the last update tool -`BONITA_SETUP_LOGGING_FILE` default value is `/opt/bonita/BonitaSubscription-${BONITA_VERSION}/setup/logback.xml`. + ```console + wget https://github.com/bonitasoft/bonita-platform-releases/releases/download/2022.2-u0/bonita-update-tool-3.1.0.zip + unzip bonita-update-tool-3.0.0.zip + ``` -# How to extend this image +- Configure the update tool -If you would like to do additional initialization, you can add a `*.sh` script under `/opt/custom-init.d`. The `startup.sh` file will source any `*.sh` script found in this directory to do further initialization before starting the service. + ```console + $ cd bonita-update-tool-3.0.0 + ``` -For example, you can increase the log level : + edit the update tool configuration file `Config.properties` to point towards the database. -```console -$ mkdir -p custom_bonita -$ echo '#!/bin/bash' > custom_bonita/bonita.sh -$ echo 'sed -i "s/^org.bonitasoft.level = WARNING$/org.bonitasoft.level = FINEST/" /opt/bonita/BonitaCommunity-7.10.4/server/conf/logging.properties' >> custom_bonita/bonita.sh -$ chmod +x custom_bonita/bonita.sh + ```console + $ vim Config.properties + ``` -$ docker run --name bonita_custom -v "$PWD"/custom_bonita/:/opt/custom-init.d -d -p 8080:8080 bonita -``` + For example : -Since Bonita 7.9 you can also apply a custom `logging.properties` file like this : + ```properties + db.vendor=postgres + db.url=jdbc:postgresql://172.17.0.26:5432/newbonitadb + db.driverClass=org.postgresql.Driver + db.user=newbonitauser + db.password=newbonitapass + ``` -```console -docker run --name bonita \ - -v /path/to/logging.properties:/etc/logging.properties -e BONITA_SERVER_LOGGING_FILE=/etc/logging.properties \ - -d -p 8080:8080 bonita -``` +- Launch the update tool -Note: There are several ways to check the `bonita` logs. Till Bonita 7.8, one of them is + ```console + $ cd bin + $ ./bonita-update-tool + ``` -```console -$ docker exec -ti bonita_custom /bin/bash -tail -f /opt/bonita/BonitaCommunity-7.10.4/server/logs/bonita.`date +%Y-%m-%d`.log -``` +- Launch the new container pointing towards the copy of the database. -Since Bonita 7.9 bonita logs are redirected towards standard output and directly accessible using + ```console + $ docker run --name=bonita --link mydbpostgres:postgres -e "DB_NAME=newbonitadb" -e "DB_USER=newbonitauser" -e "DB_PASS=newbonitapass" -d -p 8081:8080 bonita:2022.2-u0 + ``` -```console -$ docker logs -f bonita -``` +For more details regarding Bonita update and for version before 7.10.0, see the [documentation](https://documentation.bonitasoft.com/bonita/latest/version-update/migrate-from-an-earlier-version-of-bonita). # License diff --git a/bonita/content.md b/bonita/content.md index 4aa547b37a87..2c5302ab259c 100644 --- a/bonita/content.md +++ b/bonita/content.md @@ -1,6 +1,6 @@ # What is Bonita? -Bonita (called Bonita BPM till 7.5) is an open-source business process management and workflow suite created in 2001. It was started in France National Institute for Research in Computer Science, and then had incubated several years inside of the French computer science company Groupe Bull. Since 2009, the development of Bonita is supported by a company dedicated to this activity: Bonitasoft. +Bonita is an open-source business process management and workflow suite created in 2001. It was started in France National Institute for Research in Computer Science, and then had incubated several years inside the French computer science company Groupe Bull. Since 2009, the development of Bonita is supported by a company dedicated to this activity: Bonitasoft. > [wikipedia.org/wiki/Bonita_BPM](http://en.wikipedia.org/wiki/Bonita_BPM) @@ -14,397 +14,278 @@ Bonita (called Bonita BPM till 7.5) is an open-source business process managemen $ docker run --name bonita -d -p 8080:8080 %%IMAGE%% ``` -This will start a container running [Bonita runtime](https://documentation.bonitasoft.com/bonita/7.10/tomcat-bundle): a Tomcat bundle with Bonita Engine + Bonita Portal. With no environment variables specified, it's as like if you have launched the bundle on your host using startup.{sh|bat} (with security hardening on REST and HTTP APIs, cf Security part). Bonita uses a H2 database here. +This will start a container running [Bonita runtime](https://documentation.bonitasoft.com/bonita/latest/tomcat-bundle): a Tomcat bundle with Bonita Engine + Bonita Portal. With no environment variables specified, it's as if you have launched the bundle on your host using startup.{sh|bat} (with security hardening on REST and HTTP APIs, cf Security part). Bonita uses a H2 database here. You can access the Bonita Portal on http://localhost:8080/bonita and login using the default credentials: install / install ## Link Bonita to a database -### PostgreSQL +The H2 database allows the Bonita container to work out of the box, but it is not recommended outside a development environment. -PostgreSQL is the recommended database. +As PostgreSQL is the recommended database for qualification and production environments, follow one of these next sections to configure your Bonita container to run on PostgreSQL database. You can work with either a PostgreSQL Container, or PostgreSQL as an installed service. -[Set max_prepared_transactions to 100](https://documentation.bonitasoft.com/bonita/7.10/database-configuration#toc5): +### PostgreSQL Container -```console -$ mkdir -p custom_postgres -$ echo '#!/bin/bash' > custom_postgres/bonita.sh -$ echo 'sed -i "s/^.*max_prepared_transactions\s*=\s*\(.*\)$/max_prepared_transactions = 100/" "$PGDATA"/postgresql.conf' >> custom_postgres/bonita.sh -$ chmod +x custom_postgres/bonita.sh -``` +From Bonita 2022.1 onwards, the Bonita docker image does not include configuration scripts to automatically create databases and users anymore. -Mount that directory location as /docker-entrypoint-initdb.d inside the PostgreSQL container: +Therefore the PostgreSQL container needs to be configured to work with Bonita before starting the Bonita container. The configuration of a PostgreSQL database to work with Bonita is described in details in the [database configuration page](https://documentation.bonitasoft.com/bonita/latest/runtime/database-configuration#postgres_setup). + Alternatively, Bonita provides a preconfigured [PostgreSQL image](https://hub.docker.com/r/bonitasoft/bonita-postgres) on docker-hub. + You can run the image with the following command: -```console -$ docker run --name mydbpostgres -v "$PWD"/custom_postgres/:/docker-entrypoint-initdb.d -e POSTGRES_PASSWORD=mysecretpassword -d postgres:11 +```bash +docker run --name mydbpostgres -h -d bonitasoft/bonita-postgres:12.6 ``` -See the [official PostgreSQL documentation](https://hub.docker.com/_/postgres/) for more details. +This image is built from the following [GitHub repository](https://github.com/Bonitasoft-Community/bonita-database-docker/tree/main/postgres/12), which can be further adapted/customized to suit your needs. -```console -$ docker run --name bonita_postgres --link mydbpostgres:postgres -d -p 8080:8080 %%IMAGE%% -``` +## %%STACK%% -### MySQL +Run `docker stack deploy -c stack.yml %%REPO%%` (or `docker-compose -f stack.yml up`), wait for it to initialize completely, and visit `http://swarm-ip:8080`, `http://localhost:8080`, or `http://host-ip:8080` (as appropriate). -There are known issues with the management of XA transactions by MySQL engine and driver: see MySQL bugs [17343](http://bugs.mysql.com/bug.php?id=17343) and [12161](http://bugs.mysql.com/bug.php?id=12161) for more details. Thus, using MySQL database in a production environment is not recommended. +- Replace `` with the one used in the licence generation command +- leave double `$$` untouched -[Increase the packet size](https://documentation.bonitasoft.com/bonita/7.10/database-configuration#toc5) which is set by default to 1M: +### PostgreSQL as an installed service -```console -$ mkdir -p custom_mysql -$ echo "[mysqld]" > custom_mysql/bonita.cnf -$ echo "max_allowed_packet=16M" >> custom_mysql/bonita.cnf -``` +If you don't want to run your database in a docker container, the following `env.txt` file needs to be configured and provided to the docker run command: -Mount that directory location as /etc/mysql/conf.d inside the MySQL container: - -```console -$ docker run --name mydbmysql -v "$PWD"/custom_mysql/:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=mysecretpassword -d mysql:8.0 +```properties +DB_VENDOR=postgres +DB_HOST=172.17.0.2 +DB_PORT=5432 +DB_NAME=custombonitadb +DB_USER=custombonitauser +DB_PASS=custombonitapass +BIZ_DB_NAME=custombusinessdb +BIZ_DB_USER=custombusinessuser +BIZ_DB_PASS=custombusinesspass ``` -See the [official MySQL documentation](https://hub.docker.com/_/mysql/) for more details. - -Start your application container to link it to the MySQL container: - -```console -$ docker run --name bonita_mysql --link mydbmysql:mysql -d -p 8080:8080 %%IMAGE%% +```bash +docker run --name=bonita -h --env-file=env.txt -d -p 8080:8080 %%IMAGE%% ``` -## Modify default credentials +## Start Bonita with custom security credentials -```console -$ docker run --name=bonita -e "TENANT_LOGIN=tech_user" -e "TENANT_PASSWORD=secret" -e "PLATFORM_LOGIN=pfadmin" -e "PLATFORM_PASSWORD=pfsecret" -d -p 8080:8080 %%IMAGE%% +```bash +docker run --name=bonita -h -e "TENANT_LOGIN=tech_user" -e "TENANT_PASSWORD=secret" -e "PLATFORM_LOGIN=pfadmin" -e "PLATFORM_PASSWORD=pfsecret" -d -p 8080:8080 %%IMAGE%% ``` -Now you can access the Bonita Portal on localhost:8080/bonita and login using: `tech_user` / `secret` - -## %%STACK%% - -Run `docker stack deploy -c stack.yml %%REPO%%` (or `docker-compose -f stack.yml up`), wait for it to initialize completely, and visit `http://swarm-ip:8080`, `http://localhost:8080`, or `http://host-ip:8080` (as appropriate). - -## Where to store data - -Most of the data are stored in a database and can be stored outside the Bonita container as described above using the PostgreSQL or MySQL container. However, some data remains inside the Bonita bundle. Bonita Home is a folder, called `bonita`, which contains configuration, working, and temporary folders and files. There are also log files inside the `logs` folder till Bonita 7.8. - -Important note: There are several ways to store data used by applications that run in Docker containers. We encourage users of the `%%REPO%%` images to familiarize themselves with the options available, including: +Now you can access the Bonita Runtime on localhost:8080/bonita and login using: tech_user / secret -- Let Docker manage the storage of your data [by writing the files to disk on the host system using its own internal volume management](https://docs.docker.com/engine/tutorials/dockervolumes/#adding-a-data-volume). This is the default and is easy and fairly transparent to the user. The downside is that the files may be hard to locate for tools and applications that run directly on the host system, i.e. outside containers. -- Create a data directory on the host system (outside the container) and [mount this to a directory visible from inside the container](https://docs.docker.com/engine/tutorials/dockervolumes/#mount-a-host-directory-as-a-data-volume). This places the database files in a known location on the host system, and makes it easy for tools and applications on the host system to access the files. The downside is that the user needs to make sure that the directory exists, and that directory permissions and other security mechanisms on the host system are set up correctly. +## Where data are stored -The Docker documentation is a good starting point for understanding the different storage options and variations, and there are multiple blogs and forum postings that discuss and give advice in this area. We will simply show the basic procedure here for the latter option above: +Bonita uses tomcat that writes file to a working directory and a temp directory. -1. Create a data directory on a suitable volume on your host system, e.g. `/my/own/datadir`. -2. Start your `%%REPO%%` container like this: +It can be a good practice to mount the following folders into volumes - docker run --name some-%%REPO%% -v /my/own/datadir:/opt/bonita -d -p 8080:8080 %%IMAGE%%:tag +- `/opt/bonita/server/temp` +- `/opt/bonita/server/work` -The `-v /my/own/datadir:/opt/bonita` part of the command mounts the `/my/own/datadir` directory from the underlying host system as `/opt/bonita` inside the container, where Bonita will deploy the bundle and write data files by default. - -## Migrate from an earlier version of Bonita - -- Stop the container to perform a backup - - ```console - $ docker stop bonita_7.9.5_postgres - ``` - -- For containers < 7.3.0 : - - - Check where your data are stored - - ```console - $ docker inspect bonita_7.2.3_postgres - [...] - "Mounts": [ - { - "Source": "/home/user/Documents/Docker/Volumes/bonita_7.2.3_postgres", - "Destination": "/opt/bonita", - "Mode": "", - "RW": true - } - ], - [...] - ``` - - - Copy data from the filesystem - - ```console - $ cp -r bonita_7.2.3_postgres bonita_migration - ``` - -- Retrieve the DB container IP - - ```console - $ docker inspect --format '{{ .NetworkSettings.IPAddress }}' mydbpostgres - 172.17.0.26 - ``` - -- Dump the database - - ```console - $ export PGPASSWORD=mysecretpassword - $ pg_dump -O -x -h 172.17.0.26 -U postgres bonitadb > /tmp/bonitadb.sql - ``` - - Note that businessdb won't be updated with the migration tool but you may want to also backup/move it. - -- Load the dump - - ```console - $ export PGPASSWORD=mysecretpassword - $ psql -U postgres -h 172.17.0.26 -d postgres -c "CREATE USER newbonitauser WITH PASSWORD 'newbonitapass';" - $ psql -U postgres -h 172.17.0.26 -d postgres -c "CREATE DATABASE newbonitadb OWNER newbonitauser;" - $ export PGPASSWORD=newbonitapass - $ cat /tmp/bonitadb.sql | psql -U newbonitauser -h 172.17.0.26 newbonitadb - ``` - -- Retrieve the last migration tool - - - If you migrate to a version < 7.3.0 - - - get also the target version of the Bonita bundle - - ```console - cd bonita_migration - wget https://release.ow2.org/bonita/bonita-migration-distrib-2.50.0.zip - wget https://download.forge.ow2.org/bonita/BonitaBPMCommunity-7.2.4-Tomcat-7.0.67.zip - unzip bonita-migration-distrib-2.50.0.zip - unzip BonitaBPMCommunity-7.2.4-Tomcat-7.0.67.zip - ``` +## Environment variables - - Move the previous Home into the new bundle +When you start the bonita image, you can adjust the configuration of the Bonita instance by passing one or more environment variables on the docker run command line. - ```console - mv BonitaBPMCommunity-7.2.4-Tomcat-7.0.67/bonita/ BonitaBPMCommunity-7.2.4-Tomcat-7.0.67/bonita.orig - cp -r BonitaBPMCommunity-7.2.3-Tomcat-7.0.67/bonita/ BonitaBPMCommunity-7.2.4-Tomcat-7.0.67/bonita/ - ``` +### PLATFORM_LOGIN - - If you migrate to a version >= 7.3.0 +This optional environment variable is used in conjunction with PLATFORM_PASSWORD to define the username for the platform administrator. If it is not specified, the default username `platformAdmin` will be used. - ```console - cd bonita_migration - wget https://release.ow2.org/bonita/bonita-migration-distrib-2.50.0.zip - unzip bonita-migration-distrib-2.50.0.zip - ``` +### PLATFORM_PASSWORD -- Configure the migration tool +This environment variable is recommended for you to use the Bonita image. It sets the platform administrator password for Bonita. If it is not specified, the default password `platform` will be used. - ```console - $ cd bonita-migration-distrib-2.50.0 - ``` +### TENANT_LOGIN - edit the migration tool config to point towards the copy of bonita home and db +This optional environment variable is used in conjunction with TENANT_PASSWORD to define the username for the tenant administrator. If it is not specified, the default username `install` will be used. - ```console - $ vim Config.properties - ``` +### TENANT_PASSWORD - For example : +This environment variable is recommended for you to use the Bonita image. It sets the tenant administrator password for Bonita. If it is not specified, the default password `install` will be used. - db.vendor=postgres - db.url=jdbc:postgresql://172.17.0.26:5432/newbonitadb - db.driverClass=org.postgresql.Driver - db.user=newbonitauser - db.password=newbonitapass - # location of the bonita home (only useful when migration from version before 7.3.0) - bonita.home=/home/user/Documents/Docker/Volumes/bonita_migration/BonitaBPMCommunity-7.2.3-Tomcat-7.0.67/bonita +### MONITORING_USERNAME -- Launch the migration +This optional environment variable is used in conjunction with `MONITORING_PASSWORD` to define the access to endpoints protected with [BASIC Auth access](https://en.wikipedia.org/wiki/Basic_access_authentication): it is used for the JMX remote access. If it is not specified, the default monitoring username `monitoring` will be used. - ```console - $ cd bin - $ ./bonita-migration-distrib - ``` +### MONITORING_PASSWORD -- Launch the new container pointing towards the copy of DB and filesystem +This optional environment variable is used in conjunction with `MONITORING_USERNAME` to define the access to endpoints protected with [BASIC Auth access](https://en.wikipedia.org/wiki/Basic_access_authentication): it is used for the JMX remote access. If it is not specified, the default monitoring password `mon1tor1ng_adm1n` will be used. - - If < 7.3.0 +### HTTP_API - ```console - $ docker run --name=bonita_7.2.4_postgres --link mydbpostgres:postgres -e "DB_NAME=newbonitadb" -e "DB_USER=newbonitauser" -e "DB_PASS=newbonitapass" -v "$PWD"/bonita_migration:/opt/bonita/ -d -p 8081:8080 %%IMAGE%%:7.2.4 - ``` +This optional environment variable is used to enable/disable the Bonita HTTP API. The default value is false, which will deactivate the HTTP API. From Bonita 2022.1, HTTP API is protected with [Basic access authentication](https://en.wikipedia.org/wiki/Basic_access_authentication). See the following 2 parameters to configure Basic access authentication. - - If >= 7.3.0 +### HTTP_API_USERNAME - ```console - $ docker run --name=bonita_7.10.4_postgres --link mydbpostgres:postgres -e "DB_NAME=newbonitadb" -e "DB_USER=newbonitauser" -e "DB_PASS=newbonitapass" -d -p 8081:8080 %%IMAGE%%:7.10.4 - ``` +This optional environment variable is used to configure the HTTP API Basic access authentication username. The default value is `http-api`. -- Reapply specific configuration if needed, for example with a version >= 7.3.0 : +### HTTP_API_PASSWORD - ```console - $ docker exec -ti bonita_7.10.4_postgres /bin/bash - ``` +This optional environment variable is used to configure the HTTP API Basic access authentication password. There is no default value, and providing a value is mandatory if `HTTP_API=true`. - ```console - $ cd /opt/bonita/BonitaCommunity-7.10.4/setup - $ ./setup.sh pull - $ TENANT_LOGIN=tech_user - $ TENANT_PASSWORD=secret - $ PLATFORM_LOGIN=pfadmin - $ PLATFORM_PASSWORD=pfsecret - $ sed -e 's/^#userName\s*=.*/'"userName=${TENANT_LOGIN}"'/' \ - -e 's/^#userPassword\s*=.*/'"userPassword=${TENANT_PASSWORD}"'/' \ - -i platform_conf/current/tenants/1/tenant_engine/bonita-tenant-community-custom.properties - $ sed -e 's/^platform.tenant.default.username\s*=.*/'"platform.tenant.default.username=${TENANT_LOGIN}"'/' \ - -e 's/^platform.tenant.default.password\s*=.*/'"platform.tenant.default.password=${TENANT_PASSWORD}"'/' \ - -i platform_conf/current/platform_portal/platform-tenant-config.properties - $ sed -e 's/^#platformAdminUsername\s*=.*/'"platformAdminUsername=${PLATFORM_LOGIN}"'/' \ - -e 's/^#platformAdminPassword\s*=.*/'"platformAdminPassword=${PLATFORM_PASSWORD}"'/' \ - -i platform_conf/current/platform_engine/bonita-platform-community-custom.properties - $ sed -i -e 's/^#GET|/GET|/' -e 's/^#POST|/POST|/' -e 's/^#PUT|/PUT|/' -e 's/^#DELETE|/DELETE|/' -i platform_conf/current/tenants/1/tenant_portal/dynamic-permissions-checks.properties - $ ./setup.sh push - ``` +### JMX_REMOTE_ACCESS - ```console - $ docker restart bonita_7.10.4_postgres - ``` +This optional environment variable is used to enable/disable the access to the [JMX console](https://docs.oracle.com/en/java/javase/11/management/using-jconsole.html) from a remote machine. + Default value is `false`. + The host to connect to is the name / IP address of the bonita server, the port to connect to is 9000. + The credentials to connect are the environment variables [MONITORING_USERNAME](#MONITORING_USERNAME), [MONITORING_PASSWORD](#MONITORING_PASSWORD). -- Specific consideration regarding migration to Java 11 in Bonita 7.9 +### REMOTE_IP_VALVE_ENABLED - Bonita 7.9 docker image runs with Java 11. If you are migrating from an earlier version which runs Java 8, you should validate on a test environment that your custom code is compatible. Aside from just code incompatibility, special attention has to be given to the dependencies of the custom code, as they might not work in Java 11. +This optional environment variable allows to activate/deactivate [reverse proxy redirection](https://documentation.bonitasoft.com/bonita/latest/runtime/reverse-proxy-configuration). Default value is `false`. -For more details regarding Bonita migration, see the [documentation](https://documentation.bonitasoft.com/bonita/7.10/migrate-from-an-earlier-version-of-bonita-bpm). +### ACCESSLOGS_STDOUT_ENABLED -## Security +This optional environment variable allows to activate/deactivate writing Tomcat access logs to standard output. Default value is `false`. -This Docker image activates both static and dynamic authorization checks by default on REST API. To be consistent, it also deactivates the HTTP API. +### ACCESSLOGS_FILES_ENABLED -- REST API authorization +This optional environment variable allows to activate/deactivate writing Tomcat access logs to a specific file. When activated, will write those logs to `/opt/bonita/logs/` *inside* the docker container. In practice, it is only useful when mounting a volume to the aforementioned directory. Default value is `false`. - - [Static authorization checking](https://documentation.bonitasoft.com/bonita/7.10/rest-api-authorization#toc1) +### ACCESSLOGS_PATH - - [Dynamic authorization checking](https://documentation.bonitasoft.com/bonita/7.10/rest-api-authorization#toc2) +If `ACCESSLOGS_FILES_ENABLED=true`, this optional environment variable overrides the default path to the access log files. Default value is `/opt/bonita/logs`. -- [HTTP API](https://documentation.bonitasoft.com/bonita/7.10/rest-api-authorization#toc10) +### ACCESSLOGS_PATH_APPEND_HOSTNAME -For specific needs you can override this behavior by setting HTTP_API to true and REST_API_DYN_AUTH_CHECKS to false: +If `ACCESSLOGS_FILES_ENABLED=true`, this optional environment variable allows to append a subdirectory with the *hostname* to the full path of the directory to put access log files into. Default value is `false`. -```console -$ docker run -e HTTP_API=true -e REST_API_DYN_AUTH_CHECKS=false --name bonita -d -p 8080:8080 %%IMAGE%% -``` +### ACCESSLOGS_MAX_DAYS -## Environment variables +If `ACCESSLOGS_FILES_ENABLED=true`, this optional environment variable allows to automatically delete access log files after a certain number of days. Default value is `30`. -When you start the `bonita` image, you can adjust the configuration of the Bonita instance by passing one or more environment variables on the `docker run` command line. +### HTTP_MAX_THREADS -### `PLATFORM_PASSWORD` +This optional environment variable allows to specify the maximum Http thread number Tomcat will use to serve HTTP/1.1 requests. Directly modifies the *maxThreads* parameter in the *server.xml* file of the Tomcat inside the docker container. More information on the usefulness of this parameter can be found [here](https://tomcat.apache.org/tomcat-9.0-doc/config/http.html). Default value is `20`. -This environment variable [is recommended](https://documentation.bonitasoft.com/bonita/7.10/tomcat-bundle#toc3) for you to use the Bonita image. It sets the platform administrator password for Bonita. If it is not specified, the default password `platform` will be used. +### JAVA_OPTS -### `PLATFORM_LOGIN` +This optional environment variable is used to customize JAVA_OPTS. The default value is -Xms1024m -Xmx1024m -XX:MaxPermSize=256m. The syntax to use is `-e JAVA_OPTS="-Xms2048m -Xmx2048m -XX:MaxPermSize=1024m"` -This optional environment variable is used in conjunction with `PLATFORM_PASSWORD` to define the username for the platform administrator. If it is not specified, the default user `platformAdmin` will be used. +### DB_VENDOR -### `TENANT_PASSWORD` +This environment variable is automatically set to postgres or mysql if the Bonita container is linked to a PostgreSQL or MySQL database using --link. The default value is h2. It can be overridden if you don't use the --link capability. -This environment variable [is recommended](https://documentation.bonitasoft.com/bonita/7.10/tomcat-bundle#toc3) for you to use the Bonita image. It sets the tenant administrator password for Bonita. If it is not specified, the default password `install` will be used. +### DB_HOST, DB_PORT -### `TENANT_LOGIN` +These variables are optional, used in conjunction to configure the bonita image to reach the database instance. There are automatically set if --link is used to run the container. -This optional environment variable is used in conjunction with `TENANT_PASSWORD` to define the username for the tenant administrator. If it is not specified, the default user of `install` will be used. +### DB_NAME, DB_USER, DB_PASS -### `REST_API_DYN_AUTH_CHECKS` +These variables are used in conjunction to define how Bonita should access its database for internal functioning. -This optional environment variable is used to enable/disable [dynamic authorization checking](https://documentation.bonitasoft.com/bonita/7.10/rest-api-authorization#toc2) on Bonita REST API. The default value is `true`, which will activate dynamic authorization checking. +`DB_NAME` default value is bonitadb. -### `HTTP_API` +`DB_USER` default value is bonitauser. -This optional environment variable is used to enable/disable the Bonita HTTP API. The default value is `false`, which will deactivate the HTTP API. +`DB_PASS` default value is bonitapass. -### `JAVA_OPTS` +### BIZ_DB_NAME, BIZ_DB_USER, BIZ_DB_PASS -This optional environment variable is used to customize JAVA_OPTS. The default value is `-Xms1024m -Xmx1024m -XX:MaxPermSize=256m`. +These variables are used in conjunction to define how Bonita should access the [Business Data](https://documentation.bonitasoft.com/bonita/latest/data/define-and-deploy-the-bdm) database. -### `ENSURE_DB_CHECK_AND_CREATION` +`BIZ_DB_NAME` default value is businessdb. -This optional environment variable is used to allow/disallow the SQL queries to automatically check and create the databases using the database administrator credentials. The default value is `true`. +`BIZ_DB_USER` default value is businessuser. -### `DB_VENDOR` +`BIZ_DB_PASS` default value is businesspass. -This environment variable is automatically set to `postgres` or `mysql` if the Bonita container is linked to a PostgreSQL or MySQL database using `--link`. The default value is `h2`. It can be overridden if you don't use the `--link` capability. +## Logger configuration -### `DB_HOST`, `DB_PORT` +**Since 2022.1** -These variables are optional, used in conjunction to configure the `bonita` image to reach the database instance. There are automatically set if `--link` is used to run the container. +The logger can be configured by mounting a volume on folder `/opt/bonita/conf/logs` containing the configuration files. -### `DB_NAME`, `DB_USER`, `DB_PASS` +the volume must contain the 2 files [log4j2-loggers.xml](https://raw.githubusercontent.com/bonitasoft/bonita-distrib/7.14.0/tomcat-resources/tomcat-distrib-for-bonita/src/main/resources/tomcat/server/conf/log4j2-loggers.xml) and [log4j2-appenders.xml](https://raw.githubusercontent.com/bonitasoft/bonita-distrib/7.14.0/docker/files/log4j2/log4j2-appenders.xml) -These variables are used in conjunction to create a new user, set that user's password, and create the `bonita` database. +Any change made to one of this 2 files is automatically hot-reloaded and taken into account immediately. -`DB_NAME` default value is `bonitadb`. +## Security -`DB_USER` default value is `bonitauser`. +This Docker image activates both static and dynamic authorization checks by default on REST API. To be consistent, it also deactivates the HTTP API. -`DB_PASS` default value is `bonitapass`. +- REST API authorization -### `BIZ_DB_NAME`, `BIZ_DB_USER`, `BIZ_DB_PASS` + - [Static authorization checking](https://documentation.bonitasoft.com/bonita/latest/rest-api-authorization#static_authorization) -These variables are used in conjunction to create a new user, set that user's password and create the `bonita` [business database](https://documentation.bonitasoft.com/bonita/7.10/define-and-deploy-the-bdm#toc1). +- [HTTP API](https://documentation.bonitasoft.com/bonita/latest/rest-api-authorization#_activating_and_deactivating_authorization) -`BIZ_DB_NAME` default value is `businessdb`. +For specific needs you can override this behavior by setting HTTP_API to true: -`BIZ_DB_USER` default value is `businessuser`. +```console +$ docker run -e HTTP_API=true -e HTTP_API_PASSWORD="My-Cust0m_S3cR3T" --name bonita -d -p 8080:8080 %%IMAGE%% +``` -`BIZ_DB_PASS` default value is `businesspass`. +## Update from an earlier version of Bonita -### `DB_ADMIN_USER`, `DB_ADMIN_PASS` +For updating from a version before 7.10.0, please refer to the [documentation](https://documentation.bonitasoft.com/bonita/latest/version-update/migrate-from-an-earlier-version-of-bonita) -These variables are optional, and used in conjunction to create users and databases through the administrator account used on the database instance. +- Stop the container to perform a database backup -`DB_ADMIN_USER` if no value is provided, this is automatically set to `root` with MySQL or `postgres` with PostgreSQL. + ```console + $ docker stop bonita + ``` -`DB_ADMIN_PASS` if no value is provided, this is automatically set using the value from the linked container: `MYSQL_ENV_MYSQL_ROOT_PASSWORD` or `POSTGRES_ENV_POSTGRES_PASSWORD`. +- Retrieve the DB container IP -### `DB_DROP_EXISTING`, `BIZ_DB_DROP_EXISTING` + ```console + $ docker inspect --format '{{ .NetworkSettings.IPAddress }}' mydbpostgres + 172.17.0.26 + ``` -`DB_DROP_EXISTING` and `BIZ_DB_DROP_EXISTING` can be used to drop existing databases in order to reuse an existing database instance. +- Dump the database -`DB_DROP_EXISTING` default value is `N`. + ```console + $ export PGPASSWORD=mysecretpassword + $ pg_dump -O -x -h 172.17.0.26 -U postgres bonitadb > /tmp/bonitadb.sql + ``` -`BIZ_DB_DROP_EXISTING` default value is `N`. + Note that businessdb won't be updated by the update tool but you may want to also backup/move it. -### `BONITA_SERVER_LOGGING_FILE`, `BONITA_SETUP_LOGGING_FILE` +- Load the dump -Since Bonita 7.9 `BONITA_SERVER_LOGGING_FILE` and `BONITA_SETUP_LOGGING_FILE` can be used to update logging configuration. + ```console + $ export PGPASSWORD=mysecretpassword + $ psql -U postgres -h 172.17.0.26 -d postgres -c "CREATE USER newbonitauser WITH PASSWORD 'newbonitapass';" + $ psql -U postgres -h 172.17.0.26 -d postgres -c "CREATE DATABASE newbonitadb OWNER newbonitauser;" + $ export PGPASSWORD=newbonitapass + $ cat /tmp/bonitadb.sql | psql -U newbonitauser -h 172.17.0.26 newbonitadb + ``` -`BONITA_SERVER_LOGGING_FILE` default value is `/opt/bonita/BonitaSubscription-${BONITA_VERSION}/server/conf/logging.properties`. +- Retrieve the last update tool -`BONITA_SETUP_LOGGING_FILE` default value is `/opt/bonita/BonitaSubscription-${BONITA_VERSION}/setup/logback.xml`. + ```console + wget https://github.com/bonitasoft/bonita-platform-releases/releases/download/2022.2-u0/bonita-update-tool-3.1.0.zip + unzip bonita-update-tool-3.0.0.zip + ``` -# How to extend this image +- Configure the update tool -If you would like to do additional initialization, you can add a `*.sh` script under `/opt/custom-init.d`. The `startup.sh` file will source any `*.sh` script found in this directory to do further initialization before starting the service. + ```console + $ cd bonita-update-tool-3.0.0 + ``` -For example, you can increase the log level : + edit the update tool configuration file `Config.properties` to point towards the database. -```console -$ mkdir -p custom_bonita -$ echo '#!/bin/bash' > custom_bonita/bonita.sh -$ echo 'sed -i "s/^org.bonitasoft.level = WARNING$/org.bonitasoft.level = FINEST/" /opt/bonita/BonitaCommunity-7.10.4/server/conf/logging.properties' >> custom_bonita/bonita.sh -$ chmod +x custom_bonita/bonita.sh + ```console + $ vim Config.properties + ``` -$ docker run --name bonita_custom -v "$PWD"/custom_bonita/:/opt/custom-init.d -d -p 8080:8080 %%IMAGE%% -``` + For example : -Since Bonita 7.9 you can also apply a custom `logging.properties` file like this : + ```properties + db.vendor=postgres + db.url=jdbc:postgresql://172.17.0.26:5432/newbonitadb + db.driverClass=org.postgresql.Driver + db.user=newbonitauser + db.password=newbonitapass + ``` -```console -docker run --name bonita \ - -v /path/to/logging.properties:/etc/logging.properties -e BONITA_SERVER_LOGGING_FILE=/etc/logging.properties \ - -d -p 8080:8080 %%IMAGE%% -``` +- Launch the update tool -Note: There are several ways to check the `bonita` logs. Till Bonita 7.8, one of them is + ```console + $ cd bin + $ ./bonita-update-tool + ``` -```console -$ docker exec -ti bonita_custom /bin/bash -tail -f /opt/bonita/BonitaCommunity-7.10.4/server/logs/bonita.`date +%Y-%m-%d`.log -``` +- Launch the new container pointing towards the copy of the database. -Since Bonita 7.9 bonita logs are redirected towards standard output and directly accessible using + ```console + $ docker run --name=bonita --link mydbpostgres:postgres -e "DB_NAME=newbonitadb" -e "DB_USER=newbonitauser" -e "DB_PASS=newbonitapass" -d -p 8081:8080 %%IMAGE%%:2022.2-u0 + ``` -```console -$ docker logs -f bonita -``` +For more details regarding Bonita update and for version before 7.10.0, see the [documentation](https://documentation.bonitasoft.com/bonita/latest/version-update/migrate-from-an-earlier-version-of-bonita). diff --git a/bonita/get-help.md b/bonita/get-help.md new file mode 100644 index 000000000000..bd3e101b6d44 --- /dev/null +++ b/bonita/get-help.md @@ -0,0 +1 @@ +[Bonita official documentation](https://documentation.bonitasoft.com), [StackOverflow](https://stackoverflow.com/tags/bonita), [Bonitasoft Community forum](https://community.bonitasoft.com/questions-and-answers) diff --git a/bonita/github-repo b/bonita/github-repo index 04263d6a0f6f..f685042384c3 100644 --- a/bonita/github-repo +++ b/bonita/github-repo @@ -1 +1 @@ -https://github.com/Bonitasoft-Community/docker_bonita +https://github.com/bonitasoft/bonita-distrib diff --git a/bonita/issues.md b/bonita/issues.md new file mode 100644 index 000000000000..4836b72c7133 --- /dev/null +++ b/bonita/issues.md @@ -0,0 +1 @@ +[Jira](https://bonita.atlassian.net/jira/software/c/projects/BBPMC/issues) diff --git a/bonita/stack.yml b/bonita/stack.yml index 6c75dfdf831f..97994e559a26 100644 --- a/bonita/stack.yml +++ b/bonita/stack.yml @@ -1,9 +1,8 @@ -# Use tech_user/secret as user/password credentials version: '3' services: db: - image: postgres:9.3 + image: bonitasoft/bonita-postgres:12.6 environment: POSTGRES_PASSWORD: example restart: always @@ -11,13 +10,20 @@ services: - -c - max_prepared_transactions=100 bonita: - image: bonita + image: bonita:7.14.0 + hostname: custom-hostname.example.com ports: - 8080:8080 environment: - - POSTGRES_ENV_POSTGRES_PASSWORD=example - DB_VENDOR=postgres - DB_HOST=db + - DB_PORT=5432 + - DB_NAME=bonita + - DB_USER=bonita + - DB_PASS=bpm + - BIZ_DB_NAME=business_data + - BIZ_DB_USER=business_data + - BIZ_DB_PASS=bpm - TENANT_LOGIN=tech_user - TENANT_PASSWORD=secret - PLATFORM_LOGIN=pfadmin @@ -30,16 +36,14 @@ services: - -c - | set -e - echo 'Waiting for Postgres to be available' - export PGPASSWORD="$$POSTGRES_ENV_POSTGRES_PASSWORD" + echo 'Waiting for PostgreSQL to be available' maxTries=10 - while [ "$$maxTries" -gt 0 ] && ! psql -h "$$DB_HOST" -U 'postgres' -c '\l'; do - let maxTries-- + while [ "$$maxTries" -gt 0 ] && [ $$(echo 'QUIT' | nc -w 1 "$$DB_HOST" 5432; echo "$$?") -gt 0 ]; do sleep 1 + let maxTries-- done - echo if [ "$$maxTries" -le 0 ]; then echo >&2 'error: unable to contact Postgres after 10 tries' exit 1 fi - exec /opt/files/startup.sh + exec /opt/files/startup.sh /opt/bonita/server/bin/catalina.sh run diff --git a/buildpack-deps/README.md b/buildpack-deps/README.md index e64269672d9e..1a3300509b49 100644 --- a/buildpack-deps/README.md +++ b/buildpack-deps/README.md @@ -20,40 +20,40 @@ WARNING: [the Docker Community](https://github.com/docker-library/buildpack-deps) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`bullseye-curl`, `testing-curl`](https://github.com/docker-library/buildpack-deps/blob/f84f6184d79f2cb7ab94c365ac4f47915e7ca2a8/debian/bullseye/curl/Dockerfile) -- [`bullseye-scm`, `testing-scm`](https://github.com/docker-library/buildpack-deps/blob/f84f6184d79f2cb7ab94c365ac4f47915e7ca2a8/debian/bullseye/scm/Dockerfile) -- [`bullseye`, `testing`](https://github.com/docker-library/buildpack-deps/blob/f84f6184d79f2cb7ab94c365ac4f47915e7ca2a8/debian/bullseye/Dockerfile) -- [`buster-curl`, `stable-curl`, `curl`](https://github.com/docker-library/buildpack-deps/blob/f84f6184d79f2cb7ab94c365ac4f47915e7ca2a8/debian/buster/curl/Dockerfile) -- [`buster-scm`, `stable-scm`, `scm`](https://github.com/docker-library/buildpack-deps/blob/f84f6184d79f2cb7ab94c365ac4f47915e7ca2a8/debian/buster/scm/Dockerfile) -- [`buster`, `stable`, `latest`](https://github.com/docker-library/buildpack-deps/blob/f84f6184d79f2cb7ab94c365ac4f47915e7ca2a8/debian/buster/Dockerfile) -- [`jessie-curl`, `oldoldstable-curl`](https://github.com/docker-library/buildpack-deps/blob/f84f6184d79f2cb7ab94c365ac4f47915e7ca2a8/debian/jessie/curl/Dockerfile) -- [`jessie-scm`, `oldoldstable-scm`](https://github.com/docker-library/buildpack-deps/blob/f84f6184d79f2cb7ab94c365ac4f47915e7ca2a8/debian/jessie/scm/Dockerfile) -- [`jessie`, `oldoldstable`](https://github.com/docker-library/buildpack-deps/blob/f84f6184d79f2cb7ab94c365ac4f47915e7ca2a8/debian/jessie/Dockerfile) -- [`sid-curl`, `unstable-curl`](https://github.com/docker-library/buildpack-deps/blob/f84f6184d79f2cb7ab94c365ac4f47915e7ca2a8/debian/sid/curl/Dockerfile) -- [`sid-scm`, `unstable-scm`](https://github.com/docker-library/buildpack-deps/blob/f84f6184d79f2cb7ab94c365ac4f47915e7ca2a8/debian/sid/scm/Dockerfile) -- [`sid`, `unstable`](https://github.com/docker-library/buildpack-deps/blob/f84f6184d79f2cb7ab94c365ac4f47915e7ca2a8/debian/sid/Dockerfile) -- [`stretch-curl`, `oldstable-curl`](https://github.com/docker-library/buildpack-deps/blob/f84f6184d79f2cb7ab94c365ac4f47915e7ca2a8/debian/stretch/curl/Dockerfile) -- [`stretch-scm`, `oldstable-scm`](https://github.com/docker-library/buildpack-deps/blob/f84f6184d79f2cb7ab94c365ac4f47915e7ca2a8/debian/stretch/scm/Dockerfile) -- [`stretch`, `oldstable`](https://github.com/docker-library/buildpack-deps/blob/f84f6184d79f2cb7ab94c365ac4f47915e7ca2a8/debian/stretch/Dockerfile) -- [`bionic-curl`, `18.04-curl`](https://github.com/docker-library/buildpack-deps/blob/f84f6184d79f2cb7ab94c365ac4f47915e7ca2a8/ubuntu/bionic/curl/Dockerfile) -- [`bionic-scm`, `18.04-scm`](https://github.com/docker-library/buildpack-deps/blob/f84f6184d79f2cb7ab94c365ac4f47915e7ca2a8/ubuntu/bionic/scm/Dockerfile) -- [`bionic`, `18.04`](https://github.com/docker-library/buildpack-deps/blob/f84f6184d79f2cb7ab94c365ac4f47915e7ca2a8/ubuntu/bionic/Dockerfile) -- [`eoan-curl`, `19.10-curl`](https://github.com/docker-library/buildpack-deps/blob/f84f6184d79f2cb7ab94c365ac4f47915e7ca2a8/ubuntu/eoan/curl/Dockerfile) -- [`eoan-scm`, `19.10-scm`](https://github.com/docker-library/buildpack-deps/blob/f84f6184d79f2cb7ab94c365ac4f47915e7ca2a8/ubuntu/eoan/scm/Dockerfile) -- [`eoan`, `19.10`](https://github.com/docker-library/buildpack-deps/blob/f84f6184d79f2cb7ab94c365ac4f47915e7ca2a8/ubuntu/eoan/Dockerfile) -- [`focal-curl`, `20.04-curl`](https://github.com/docker-library/buildpack-deps/blob/f84f6184d79f2cb7ab94c365ac4f47915e7ca2a8/ubuntu/focal/curl/Dockerfile) -- [`focal-scm`, `20.04-scm`](https://github.com/docker-library/buildpack-deps/blob/f84f6184d79f2cb7ab94c365ac4f47915e7ca2a8/ubuntu/focal/scm/Dockerfile) -- [`focal`, `20.04`](https://github.com/docker-library/buildpack-deps/blob/f84f6184d79f2cb7ab94c365ac4f47915e7ca2a8/ubuntu/focal/Dockerfile) -- [`groovy-curl`, `20.10-curl`](https://github.com/docker-library/buildpack-deps/blob/f84f6184d79f2cb7ab94c365ac4f47915e7ca2a8/ubuntu/groovy/curl/Dockerfile) -- [`groovy-scm`, `20.10-scm`](https://github.com/docker-library/buildpack-deps/blob/f84f6184d79f2cb7ab94c365ac4f47915e7ca2a8/ubuntu/groovy/scm/Dockerfile) -- [`groovy`, `20.10`](https://github.com/docker-library/buildpack-deps/blob/f84f6184d79f2cb7ab94c365ac4f47915e7ca2a8/ubuntu/groovy/Dockerfile) -- [`xenial-curl`, `16.04-curl`](https://github.com/docker-library/buildpack-deps/blob/f84f6184d79f2cb7ab94c365ac4f47915e7ca2a8/ubuntu/xenial/curl/Dockerfile) -- [`xenial-scm`, `16.04-scm`](https://github.com/docker-library/buildpack-deps/blob/f84f6184d79f2cb7ab94c365ac4f47915e7ca2a8/ubuntu/xenial/scm/Dockerfile) -- [`xenial`, `16.04`](https://github.com/docker-library/buildpack-deps/blob/f84f6184d79f2cb7ab94c365ac4f47915e7ca2a8/ubuntu/xenial/Dockerfile) +- [`bookworm-curl`, `testing-curl`](https://github.com/docker-library/buildpack-deps/blob/84e7e46026131a108a6480e5ed2969e8acf2d4e2/debian/bookworm/curl/Dockerfile) +- [`bookworm-scm`, `testing-scm`](https://github.com/docker-library/buildpack-deps/blob/84e7e46026131a108a6480e5ed2969e8acf2d4e2/debian/bookworm/scm/Dockerfile) +- [`bookworm`, `testing`](https://github.com/docker-library/buildpack-deps/blob/84e7e46026131a108a6480e5ed2969e8acf2d4e2/debian/bookworm/Dockerfile) +- [`bullseye-curl`, `stable-curl`, `curl`](https://github.com/docker-library/buildpack-deps/blob/98a5ab81d47a106c458cdf90733df0ee8beea06c/debian/bullseye/curl/Dockerfile) +- [`bullseye-scm`, `stable-scm`, `scm`](https://github.com/docker-library/buildpack-deps/blob/65d69325ad741cea6dee20781c1faaab2e003d87/debian/bullseye/scm/Dockerfile) +- [`bullseye`, `stable`, `latest`](https://github.com/docker-library/buildpack-deps/blob/65d69325ad741cea6dee20781c1faaab2e003d87/debian/bullseye/Dockerfile) +- [`buster-curl`, `oldstable-curl`](https://github.com/docker-library/buildpack-deps/blob/98a5ab81d47a106c458cdf90733df0ee8beea06c/debian/buster/curl/Dockerfile) +- [`buster-scm`, `oldstable-scm`](https://github.com/docker-library/buildpack-deps/blob/65d69325ad741cea6dee20781c1faaab2e003d87/debian/buster/scm/Dockerfile) +- [`buster`, `oldstable`](https://github.com/docker-library/buildpack-deps/blob/65d69325ad741cea6dee20781c1faaab2e003d87/debian/buster/Dockerfile) +- [`sid-curl`, `unstable-curl`](https://github.com/docker-library/buildpack-deps/blob/98a5ab81d47a106c458cdf90733df0ee8beea06c/debian/sid/curl/Dockerfile) +- [`sid-scm`, `unstable-scm`](https://github.com/docker-library/buildpack-deps/blob/65d69325ad741cea6dee20781c1faaab2e003d87/debian/sid/scm/Dockerfile) +- [`sid`, `unstable`](https://github.com/docker-library/buildpack-deps/blob/65d69325ad741cea6dee20781c1faaab2e003d87/debian/sid/Dockerfile) +- [`bionic-curl`, `18.04-curl`](https://github.com/docker-library/buildpack-deps/blob/98a5ab81d47a106c458cdf90733df0ee8beea06c/ubuntu/bionic/curl/Dockerfile) +- [`bionic-scm`, `18.04-scm`](https://github.com/docker-library/buildpack-deps/blob/65d69325ad741cea6dee20781c1faaab2e003d87/ubuntu/bionic/scm/Dockerfile) +- [`bionic`, `18.04`](https://github.com/docker-library/buildpack-deps/blob/98a5ab81d47a106c458cdf90733df0ee8beea06c/ubuntu/bionic/Dockerfile) +- [`focal-curl`, `20.04-curl`](https://github.com/docker-library/buildpack-deps/blob/98a5ab81d47a106c458cdf90733df0ee8beea06c/ubuntu/focal/curl/Dockerfile) +- [`focal-scm`, `20.04-scm`](https://github.com/docker-library/buildpack-deps/blob/65d69325ad741cea6dee20781c1faaab2e003d87/ubuntu/focal/scm/Dockerfile) +- [`focal`, `20.04`](https://github.com/docker-library/buildpack-deps/blob/98a5ab81d47a106c458cdf90733df0ee8beea06c/ubuntu/focal/Dockerfile) +- [`jammy-curl`, `22.04-curl`](https://github.com/docker-library/buildpack-deps/blob/e2fc735283ba4e96efc3e4acf2b74bc3eccbf327/ubuntu/jammy/curl/Dockerfile) +- [`jammy-scm`, `22.04-scm`](https://github.com/docker-library/buildpack-deps/blob/e2fc735283ba4e96efc3e4acf2b74bc3eccbf327/ubuntu/jammy/scm/Dockerfile) +- [`jammy`, `22.04`](https://github.com/docker-library/buildpack-deps/blob/e2fc735283ba4e96efc3e4acf2b74bc3eccbf327/ubuntu/jammy/Dockerfile) +- [`kinetic-curl`, `22.10-curl`](https://github.com/docker-library/buildpack-deps/blob/c96f4f3e1d5bc19fba5c652f57af0a35bb929718/ubuntu/kinetic/curl/Dockerfile) +- [`kinetic-scm`, `22.10-scm`](https://github.com/docker-library/buildpack-deps/blob/c96f4f3e1d5bc19fba5c652f57af0a35bb929718/ubuntu/kinetic/scm/Dockerfile) +- [`kinetic`, `22.10`](https://github.com/docker-library/buildpack-deps/blob/c96f4f3e1d5bc19fba5c652f57af0a35bb929718/ubuntu/kinetic/Dockerfile) +- [`lunar-curl`, `23.04-curl`](https://github.com/docker-library/buildpack-deps/blob/31e15bc4a2352c20998e5da6bd8aaa727fd19d06/ubuntu/lunar/curl/Dockerfile) +- [`lunar-scm`, `23.04-scm`](https://github.com/docker-library/buildpack-deps/blob/31e15bc4a2352c20998e5da6bd8aaa727fd19d06/ubuntu/lunar/scm/Dockerfile) +- [`lunar`, `23.04`](https://github.com/docker-library/buildpack-deps/blob/31e15bc4a2352c20998e5da6bd8aaa727fd19d06/ubuntu/lunar/Dockerfile) +- [`xenial-curl`, `16.04-curl`](https://github.com/docker-library/buildpack-deps/blob/93d2a6f64abe6787b7dd25c7d5322af1fa2e3f55/ubuntu/xenial/curl/Dockerfile) +- [`xenial-scm`, `16.04-scm`](https://github.com/docker-library/buildpack-deps/blob/65d69325ad741cea6dee20781c1faaab2e003d87/ubuntu/xenial/scm/Dockerfile) +- [`xenial`, `16.04`](https://github.com/docker-library/buildpack-deps/blob/98a5ab81d47a106c458cdf90733df0ee8beea06c/ubuntu/xenial/Dockerfile) # Quick reference (cont.) @@ -61,14 +61,14 @@ WARNING: [https://github.com/docker-library/buildpack-deps/issues](https://github.com/docker-library/buildpack-deps/issues) - **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) - [`amd64`](https://hub.docker.com/r/amd64/buildpack-deps/), [`arm32v5`](https://hub.docker.com/r/arm32v5/buildpack-deps/), [`arm32v7`](https://hub.docker.com/r/arm32v7/buildpack-deps/), [`arm64v8`](https://hub.docker.com/r/arm64v8/buildpack-deps/), [`i386`](https://hub.docker.com/r/i386/buildpack-deps/), [`mips64le`](https://hub.docker.com/r/mips64le/buildpack-deps/), [`ppc64le`](https://hub.docker.com/r/ppc64le/buildpack-deps/), [`s390x`](https://hub.docker.com/r/s390x/buildpack-deps/) + [`amd64`](https://hub.docker.com/r/amd64/buildpack-deps/), [`arm32v5`](https://hub.docker.com/r/arm32v5/buildpack-deps/), [`arm32v7`](https://hub.docker.com/r/arm32v7/buildpack-deps/), [`arm64v8`](https://hub.docker.com/r/arm64v8/buildpack-deps/), [`i386`](https://hub.docker.com/r/i386/buildpack-deps/), [`mips64le`](https://hub.docker.com/r/mips64le/buildpack-deps/), [`ppc64le`](https://hub.docker.com/r/ppc64le/buildpack-deps/), [`riscv64`](https://hub.docker.com/r/riscv64/buildpack-deps/), [`s390x`](https://hub.docker.com/r/s390x/buildpack-deps/) - **Published image artifact details**: [repo-info repo's `repos/buildpack-deps/` directory](https://github.com/docker-library/repo-info/blob/master/repos/buildpack-deps) ([history](https://github.com/docker-library/repo-info/commits/master/repos/buildpack-deps)) (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/buildpack-deps`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fbuildpack-deps) + [official-images repo's `library/buildpack-deps` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fbuildpack-deps) [official-images repo's `library/buildpack-deps` file](https://github.com/docker-library/official-images/blob/master/library/buildpack-deps) ([history](https://github.com/docker-library/official-images/commits/master/library/buildpack-deps)) - **Source of this description**: diff --git a/busybox/README.md b/busybox/README.md index d186e433ab4a..3a282dc5f504 100644 --- a/busybox/README.md +++ b/busybox/README.md @@ -20,14 +20,18 @@ WARNING: [the Docker Community](https://github.com/docker-library/busybox) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`1.31.1-uclibc`, `1.31-uclibc`, `1-uclibc`, `uclibc`](https://github.com/docker-library/busybox/blob/7c3206169c4d32ae0afbb36b90cb9f9b77011f7a/uclibc/Dockerfile) -- [`1.31.1-glibc`, `1.31-glibc`, `1-glibc`, `glibc`](https://github.com/docker-library/busybox/blob/7c3206169c4d32ae0afbb36b90cb9f9b77011f7a/glibc/Dockerfile) -- [`1.31.1-musl`, `1.31-musl`, `1-musl`, `musl`](https://github.com/docker-library/busybox/blob/7c3206169c4d32ae0afbb36b90cb9f9b77011f7a/musl/Dockerfile) -- [`1.31.1`, `1.31`, `1`, `latest`](https://github.com/docker-library/busybox/blob/7c3206169c4d32ae0afbb36b90cb9f9b77011f7a/uclibc/Dockerfile) +- [`1.36.0-glibc`, `1.36-glibc`, `1-glibc`, `unstable-glibc`, `glibc`](https://github.com/docker-library/busybox/blob/035784654e7c42ce45e84617eeec327191fa84fd/latest/glibc/Dockerfile) +- [`1.36.0-uclibc`, `1.36-uclibc`, `1-uclibc`, `unstable-uclibc`, `uclibc`](https://github.com/docker-library/busybox/blob/035784654e7c42ce45e84617eeec327191fa84fd/latest/uclibc/Dockerfile) +- [`1.36.0-musl`, `1.36-musl`, `1-musl`, `unstable-musl`, `musl`](https://github.com/docker-library/busybox/blob/035784654e7c42ce45e84617eeec327191fa84fd/latest/musl/Dockerfile) +- [`1.36.0`, `1.36`, `1`, `unstable`, `latest`](https://github.com/docker-library/busybox/blob/035784654e7c42ce45e84617eeec327191fa84fd/latest/glibc/Dockerfile) +- [`1.35.0-glibc`, `1.35-glibc`](https://github.com/docker-library/busybox/blob/035784654e7c42ce45e84617eeec327191fa84fd/latest-1/glibc/Dockerfile) +- [`1.35.0-uclibc`, `1.35-uclibc`](https://github.com/docker-library/busybox/blob/035784654e7c42ce45e84617eeec327191fa84fd/latest-1/uclibc/Dockerfile) +- [`1.35.0-musl`, `1.35-musl`](https://github.com/docker-library/busybox/blob/035784654e7c42ce45e84617eeec327191fa84fd/latest-1/musl/Dockerfile) +- [`1.35.0`, `1.35`](https://github.com/docker-library/busybox/blob/035784654e7c42ce45e84617eeec327191fa84fd/latest-1/glibc/Dockerfile) # Quick reference (cont.) @@ -35,14 +39,14 @@ WARNING: [https://github.com/docker-library/busybox/issues](https://github.com/docker-library/busybox/issues) - **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) - [`amd64`](https://hub.docker.com/r/amd64/busybox/), [`arm32v5`](https://hub.docker.com/r/arm32v5/busybox/), [`arm32v6`](https://hub.docker.com/r/arm32v6/busybox/), [`arm32v7`](https://hub.docker.com/r/arm32v7/busybox/), [`arm64v8`](https://hub.docker.com/r/arm64v8/busybox/), [`i386`](https://hub.docker.com/r/i386/busybox/), [`mips64le`](https://hub.docker.com/r/mips64le/busybox/), [`ppc64le`](https://hub.docker.com/r/ppc64le/busybox/), [`s390x`](https://hub.docker.com/r/s390x/busybox/) + [`amd64`](https://hub.docker.com/r/amd64/busybox/), [`arm32v5`](https://hub.docker.com/r/arm32v5/busybox/), [`arm32v6`](https://hub.docker.com/r/arm32v6/busybox/), [`arm32v7`](https://hub.docker.com/r/arm32v7/busybox/), [`arm64v8`](https://hub.docker.com/r/arm64v8/busybox/), [`i386`](https://hub.docker.com/r/i386/busybox/), [`mips64le`](https://hub.docker.com/r/mips64le/busybox/), [`ppc64le`](https://hub.docker.com/r/ppc64le/busybox/), [`riscv64`](https://hub.docker.com/r/riscv64/busybox/), [`s390x`](https://hub.docker.com/r/s390x/busybox/) - **Published image artifact details**: [repo-info repo's `repos/busybox/` directory](https://github.com/docker-library/repo-info/blob/master/repos/busybox) ([history](https://github.com/docker-library/repo-info/commits/master/repos/busybox)) (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/busybox`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fbusybox) + [official-images repo's `library/busybox` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fbusybox) [official-images repo's `library/busybox` file](https://github.com/docker-library/official-images/blob/master/library/busybox) ([history](https://github.com/docker-library/official-images/commits/master/library/busybox)) - **Source of this description**: @@ -84,14 +88,14 @@ The `busybox` images contain BusyBox built against various "libc" variants (for For more information about the specific particulars of the build process for each variant, see `Dockerfile.builder` in the same directory as each variant's `Dockerfile` (see links above). -## `busybox:uclibc` - -- [uClibc](https://uclibc.org) via [Buildroot](https://buildroot.org) (statically compiled) - ## `busybox:glibc` - [glibc from Debian](https://packages.debian.org/search?searchon=names&exact=1&suite=all§ion=all&keywords=libc6) (which is then included in the image) +## `busybox:uclibc` + +- [uClibc](https://uclibc.org) via [Buildroot](https://buildroot.org) (statically compiled) + ## `busybox:musl` - [musl from Alpine](https://pkgs.alpinelinux.org/packages?name=musl) (statically compiled) diff --git a/caddy/README.md b/caddy/README.md index 05e9dcddf236..65b8c9ddb182 100644 --- a/caddy/README.md +++ b/caddy/README.md @@ -20,7 +20,7 @@ WARNING: [the Caddy Docker Maintainers](https://github.com/caddyserver/caddy-docker) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [the Caddy Community Forums](https://caddy.community) # Supported tags and respective `Dockerfile` links @@ -28,20 +28,26 @@ WARNING: ## Simple Tags -- [`2.0.0-alpine`, `2-alpine`, `alpine`](https://github.com/caddyserver/caddy-docker/blob/c09e27ca73c56565d4526eef27adbac9ba57575c/alpine/Dockerfile) -- [`2.0.0-builder`, `2-builder`, `builder`](https://github.com/caddyserver/caddy-docker/blob/d9baf11b7abb9343891bb9c28f8cc7137ae94b68/builder/Dockerfile) -- [`2.0.0-windowsservercore-1809`, `2-windowsservercore-1809`, `windowsservercore-1809`](https://github.com/caddyserver/caddy-docker/blob/d9baf11b7abb9343891bb9c28f8cc7137ae94b68/windows/1809/Dockerfile) -- [`2.0.0-windowsservercore-ltsc2016`, `2-windowsservercore-ltsc2016`, `windowsservercore-ltsc2016`](https://github.com/caddyserver/caddy-docker/blob/d9baf11b7abb9343891bb9c28f8cc7137ae94b68/windows/ltsc2016/Dockerfile) +- [`2.6.2-alpine`, `2.6-alpine`, `2-alpine`, `alpine`](https://github.com/caddyserver/caddy-docker/blob/9c857d39bef831f27612106ddd00a4df307e8975/2.6/alpine/Dockerfile) +- [`2.6.2-builder-alpine`, `2.6-builder-alpine`, `2-builder-alpine`, `builder-alpine`](https://github.com/caddyserver/caddy-docker/blob/9c857d39bef831f27612106ddd00a4df307e8975/2.6/builder/Dockerfile) +- [`2.6.2-windowsservercore-1809`, `2.6-windowsservercore-1809`, `2-windowsservercore-1809`, `windowsservercore-1809`](https://github.com/caddyserver/caddy-docker/blob/9c857d39bef831f27612106ddd00a4df307e8975/2.6/windows/1809/Dockerfile) +- [`2.6.2-windowsservercore-ltsc2022`, `2.6-windowsservercore-ltsc2022`, `2-windowsservercore-ltsc2022`, `windowsservercore-ltsc2022`](https://github.com/caddyserver/caddy-docker/blob/9c857d39bef831f27612106ddd00a4df307e8975/2.6/windows/ltsc2022/Dockerfile) +- [`2.6.2-builder-windowsservercore-1809`, `2.6-builder-windowsservercore-1809`, `2-builder-windowsservercore-1809`, `builder-windowsservercore-1809`](https://github.com/caddyserver/caddy-docker/blob/9c857d39bef831f27612106ddd00a4df307e8975/2.6/windows-builder/1809/Dockerfile) +- [`2.6.2-builder-windowsservercore-ltsc2022`, `2.6-builder-windowsservercore-ltsc2022`, `2-builder-windowsservercore-ltsc2022`, `builder-windowsservercore-ltsc2022`](https://github.com/caddyserver/caddy-docker/blob/9c857d39bef831f27612106ddd00a4df307e8975/2.6/windows-builder/ltsc2022/Dockerfile) ## Shared Tags -- `2.0.0`, `2`, `latest`: - - [`2.0.0-alpine`](https://github.com/caddyserver/caddy-docker/blob/c09e27ca73c56565d4526eef27adbac9ba57575c/alpine/Dockerfile) - - [`2.0.0-windowsservercore-1809`](https://github.com/caddyserver/caddy-docker/blob/d9baf11b7abb9343891bb9c28f8cc7137ae94b68/windows/1809/Dockerfile) - - [`2.0.0-windowsservercore-ltsc2016`](https://github.com/caddyserver/caddy-docker/blob/d9baf11b7abb9343891bb9c28f8cc7137ae94b68/windows/ltsc2016/Dockerfile) -- `2.0.0-windowsservercore`, `2-windowsservercore`, `windowsservercore`: - - [`2.0.0-windowsservercore-1809`](https://github.com/caddyserver/caddy-docker/blob/d9baf11b7abb9343891bb9c28f8cc7137ae94b68/windows/1809/Dockerfile) - - [`2.0.0-windowsservercore-ltsc2016`](https://github.com/caddyserver/caddy-docker/blob/d9baf11b7abb9343891bb9c28f8cc7137ae94b68/windows/ltsc2016/Dockerfile) +- `2.6.2`, `2.6`, `2`, `latest`: + - [`2.6.2-alpine`](https://github.com/caddyserver/caddy-docker/blob/9c857d39bef831f27612106ddd00a4df307e8975/2.6/alpine/Dockerfile) + - [`2.6.2-windowsservercore-1809`](https://github.com/caddyserver/caddy-docker/blob/9c857d39bef831f27612106ddd00a4df307e8975/2.6/windows/1809/Dockerfile) + - [`2.6.2-windowsservercore-ltsc2022`](https://github.com/caddyserver/caddy-docker/blob/9c857d39bef831f27612106ddd00a4df307e8975/2.6/windows/ltsc2022/Dockerfile) +- `2.6.2-builder`, `2.6-builder`, `2-builder`, `builder`: + - [`2.6.2-builder-alpine`](https://github.com/caddyserver/caddy-docker/blob/9c857d39bef831f27612106ddd00a4df307e8975/2.6/builder/Dockerfile) + - [`2.6.2-builder-windowsservercore-1809`](https://github.com/caddyserver/caddy-docker/blob/9c857d39bef831f27612106ddd00a4df307e8975/2.6/windows-builder/1809/Dockerfile) + - [`2.6.2-builder-windowsservercore-ltsc2022`](https://github.com/caddyserver/caddy-docker/blob/9c857d39bef831f27612106ddd00a4df307e8975/2.6/windows-builder/ltsc2022/Dockerfile) +- `2.6.2-windowsservercore`, `2.6-windowsservercore`, `2-windowsservercore`, `windowsservercore`: + - [`2.6.2-windowsservercore-1809`](https://github.com/caddyserver/caddy-docker/blob/9c857d39bef831f27612106ddd00a4df307e8975/2.6/windows/1809/Dockerfile) + - [`2.6.2-windowsservercore-ltsc2022`](https://github.com/caddyserver/caddy-docker/blob/9c857d39bef831f27612106ddd00a4df307e8975/2.6/windows/ltsc2022/Dockerfile) # Quick reference (cont.) @@ -56,7 +62,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/caddy`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fcaddy) + [official-images repo's `library/caddy` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fcaddy) [official-images repo's `library/caddy` file](https://github.com/docker-library/official-images/blob/master/library/caddy) ([history](https://github.com/docker-library/official-images/commits/master/library/caddy)) - **Source of this description**: @@ -113,8 +119,8 @@ $ docker run -d -p 80:80 \ The default `Caddyfile` only listens to port `80`, and does not set up automatic TLS. However, if you have a domain name for your site, and its A/AAAA DNS records are properly pointed to this machine's public IP, then you can use this command to simply serve a site over HTTPS: ```console -$ docker run -d -p 80:80 -p 443:443 \ - -v /site:/usr/share/caddy \ +$ docker run -d -p 80:80 -p 443:443 -p 443:443/udp \ + -v /site:/srv \ -v caddy_data:/data \ -v caddy_config:/config \ caddy caddy file-server --domain example.com @@ -130,33 +136,33 @@ Most users deploying production sites will not want to rely on mounting files in ```Dockerfile # note: never use the :latest tag in a production site -FROM caddy:2.0.0 +FROM caddy: COPY Caddyfile /etc/caddy/Caddyfile -COPY site /site +COPY site /srv ``` #### Adding custom Caddy modules -Caddy is extendable through the use of "modules". See https://caddyserver.com/docs/extending-caddy for full details. +Caddy is extendable through the use of "modules". See https://caddyserver.com/docs/extending-caddy for full details. You can find a list of available modules on [the Caddy website's download page](https://caddyserver.com/download). You can use the `:builder` image as a short-cut to building a new Caddy binary: ```Dockerfile -FROM caddy:2.0.0-builder AS builder +FROM caddy:-builder AS builder -RUN caddy-builder \ - github.com/caddyserver/nginx-adapter \ - github.com/hairyhenderson/caddy-teapot-module@v0.0.1 +RUN xcaddy build \ + --with github.com/caddyserver/nginx-adapter \ + --with github.com/hairyhenderson/caddy-teapot-module@v0.0.3-0 -FROM caddy:2.0.0 +FROM caddy: COPY --from=builder /usr/bin/caddy /usr/bin/caddy ``` Note the second `FROM` instruction - this produces a much smaller image by simply overlaying the newly-built binary on top of the the regular `caddy` image. -The `caddy-builder` script is used to [build a new Caddy entrypoint](https://github.com/caddyserver/caddy/blob/71e81d262bc34545f73f1380bc5d078d83d1570f/cmd/caddy/main.go#L15..L25), with the provided modules. You can specify just a module name, or a name with a version (separated by `@`). +The [`xcaddy`](https://caddyserver.com/docs/build#xcaddy) tool is used to [build a new Caddy entrypoint](https://github.com/caddyserver/caddy/blob/4217217badf220d7d2c25f43f955fdc8454f2c64/cmd/caddy/main.go#L15..L25), with the provided modules. You can specify just a module name, or a name with a version (separated by `@`). You can also specify a specific version (can be a version tag or commit hash) of Caddy to build from. Read more about [`xcaddy` usage](https://github.com/caddyserver/xcaddy#command-usage). Note that the "standard" Caddy modules ([`github.com/caddyserver/caddy/master/modules/standard`](https://github.com/caddyserver/caddy/tree/master/modules/standard)) are always included. @@ -166,13 +172,42 @@ Caddy does not require a full restart when configuration is changed. Caddy comes When running Caddy in Docker, the recommended way to trigger a config reload is by executing the `caddy reload` command in the running container. -First, you'll need to determine your container ID or name. Then, pass the container ID to `docker exec`. +First, you'll need to determine your container ID or name. Then, pass the container ID to `docker exec`. The working directory is set to `/etc/caddy` so Caddy can find your Caddyfile without additional arguments. ```console $ caddy_container_id=$(docker ps | grep caddy | awk '{print $1;}') -$ docker exec $caddy_container_id caddy reload --config /etc/caddy/Caddyfile --adapter caddyfile +$ docker exec -w /etc/caddy $caddy_container_id caddy reload ``` +### Docker Compose example + +If you prefer to use `docker-compoose` to run your stack, here's a sample service definition. + +```yaml +version: "3.7" + +services: + caddy: + image: caddy: + restart: unless-stopped + ports: + - "80:80" + - "443:443" + - "443:443/udp" + volumes: + - $PWD/Caddyfile:/etc/caddy/Caddyfile + - $PWD/site:/srv + - caddy_data:/data + - caddy_config:/config + +volumes: + caddy_data: + external: true + caddy_config: +``` + +Defining the data volume as [`external`](https://docs.docker.com/compose/compose-file/compose-file-v3/#external) makes sure `docker-compose down` does not delete the volume. You may need to create it manually using `docker volume create [project-name]_caddy_data`. + # Image Variants The `caddy` images come in many flavors, each designed for a specific use case. @@ -183,9 +218,9 @@ This is the defacto image. If you are unsure about what your needs are, you prob ## `caddy:-alpine` -This image is based on the popular [Alpine Linux project](http://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. +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. -This variant is highly recommended when final image size being as small as possible is desired. The main caveat to note is that it does use [musl libc](http://www.musl-libc.org) instead of [glibc and friends](http://www.etalabs.net/compare_libcs.html), so certain software might run into issues depending on the depth of their libc requirements. However, most software doesn't have an issue with this, so this variant is usually a very safe choice. 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. +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. 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). diff --git a/caddy/content.md b/caddy/content.md index 6c0bbb7bebdb..9762a34459c7 100644 --- a/caddy/content.md +++ b/caddy/content.md @@ -49,8 +49,8 @@ $ docker run -d -p 80:80 \ The default `Caddyfile` only listens to port `80`, and does not set up automatic TLS. However, if you have a domain name for your site, and its A/AAAA DNS records are properly pointed to this machine's public IP, then you can use this command to simply serve a site over HTTPS: ```console -$ docker run -d -p 80:80 -p 443:443 \ - -v /site:/usr/share/caddy \ +$ docker run -d -p 80:80 -p 443:443 -p 443:443/udp \ + -v /site:/srv \ -v caddy_data:/data \ -v caddy_config:/config \ %%IMAGE%% caddy file-server --domain example.com @@ -66,33 +66,33 @@ Most users deploying production sites will not want to rely on mounting files in ```Dockerfile # note: never use the :latest tag in a production site -FROM %%IMAGE%%:2.0.0 +FROM %%IMAGE%%: COPY Caddyfile /etc/caddy/Caddyfile -COPY site /site +COPY site /srv ``` #### Adding custom Caddy modules -Caddy is extendable through the use of "modules". See https://caddyserver.com/docs/extending-caddy for full details. +Caddy is extendable through the use of "modules". See https://caddyserver.com/docs/extending-caddy for full details. You can find a list of available modules on [the Caddy website's download page](https://caddyserver.com/download). You can use the `:builder` image as a short-cut to building a new Caddy binary: ```Dockerfile -FROM %%IMAGE%%:2.0.0-builder AS builder +FROM %%IMAGE%%:-builder AS builder -RUN caddy-builder \ - github.com/caddyserver/nginx-adapter \ - github.com/hairyhenderson/caddy-teapot-module@v0.0.1 +RUN xcaddy build \ + --with github.com/caddyserver/nginx-adapter \ + --with github.com/hairyhenderson/caddy-teapot-module@v0.0.3-0 -FROM %%IMAGE%%:2.0.0 +FROM %%IMAGE%%: COPY --from=builder /usr/bin/caddy /usr/bin/caddy ``` Note the second `FROM` instruction - this produces a much smaller image by simply overlaying the newly-built binary on top of the the regular `%%IMAGE%%` image. -The `caddy-builder` script is used to [build a new Caddy entrypoint](https://github.com/caddyserver/caddy/blob/71e81d262bc34545f73f1380bc5d078d83d1570f/cmd/caddy/main.go#L15..L25), with the provided modules. You can specify just a module name, or a name with a version (separated by `@`). +The [`xcaddy`](https://caddyserver.com/docs/build#xcaddy) tool is used to [build a new Caddy entrypoint](https://github.com/caddyserver/caddy/blob/4217217badf220d7d2c25f43f955fdc8454f2c64/cmd/caddy/main.go#L15..L25), with the provided modules. You can specify just a module name, or a name with a version (separated by `@`). You can also specify a specific version (can be a version tag or commit hash) of Caddy to build from. Read more about [`xcaddy` usage](https://github.com/caddyserver/xcaddy#command-usage). Note that the "standard" Caddy modules ([`github.com/caddyserver/caddy/master/modules/standard`](https://github.com/caddyserver/caddy/tree/master/modules/standard)) are always included. @@ -102,9 +102,38 @@ Caddy does not require a full restart when configuration is changed. Caddy comes When running Caddy in Docker, the recommended way to trigger a config reload is by executing the `caddy reload` command in the running container. -First, you'll need to determine your container ID or name. Then, pass the container ID to `docker exec`. +First, you'll need to determine your container ID or name. Then, pass the container ID to `docker exec`. The working directory is set to `/etc/caddy` so Caddy can find your Caddyfile without additional arguments. ```console $ caddy_container_id=$(docker ps | grep caddy | awk '{print $1;}') -$ docker exec $caddy_container_id caddy reload --config /etc/caddy/Caddyfile --adapter caddyfile +$ docker exec -w /etc/caddy $caddy_container_id caddy reload ``` + +### Docker Compose example + +If you prefer to use `docker-compoose` to run your stack, here's a sample service definition. + +```yaml +version: "3.7" + +services: + caddy: + image: %%IMAGE%%: + restart: unless-stopped + ports: + - "80:80" + - "443:443" + - "443:443/udp" + volumes: + - $PWD/Caddyfile:/etc/caddy/Caddyfile + - $PWD/site:/srv + - caddy_data:/data + - caddy_config:/config + +volumes: + caddy_data: + external: true + caddy_config: +``` + +Defining the data volume as [`external`](https://docs.docker.com/compose/compose-file/compose-file-v3/#external) makes sure `docker-compose down` does not delete the volume. You may need to create it manually using `docker volume create [project-name]_caddy_data`. diff --git a/caddy/get-help.md b/caddy/get-help.md new file mode 100644 index 000000000000..982fbdf10126 --- /dev/null +++ b/caddy/get-help.md @@ -0,0 +1 @@ +[the Caddy Community Forums](https://caddy.community) diff --git a/cassandra/README.md b/cassandra/README.md index 30f47be9434c..61211ed6d1bd 100644 --- a/cassandra/README.md +++ b/cassandra/README.md @@ -20,14 +20,14 @@ WARNING: [the Docker Community](https://github.com/docker-library/cassandra) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`2.1.21`, `2.1`](https://github.com/docker-library/cassandra/blob/4c146a91f56dc3043284c817f1d61f152199482c/2.1/Dockerfile) -- [`2.2.16`, `2.2`, `2`](https://github.com/docker-library/cassandra/blob/4c146a91f56dc3043284c817f1d61f152199482c/2.2/Dockerfile) -- [`3.0.20`, `3.0`](https://github.com/docker-library/cassandra/blob/4c146a91f56dc3043284c817f1d61f152199482c/3.0/Dockerfile) -- [`3.11.6`, `3.11`, `3`, `latest`](https://github.com/docker-library/cassandra/blob/4c146a91f56dc3043284c817f1d61f152199482c/3.11/Dockerfile) +- [`4.1.0`, `4.1`, `4`, `latest`](https://github.com/docker-library/cassandra/blob/835052698f299c06e09ed49c972d6ab7bd2ef223/4.1/Dockerfile) +- [`4.0.7`, `4.0`](https://github.com/docker-library/cassandra/blob/08fa5553ad2dde684ca5337c7fedd173cbc41f39/4.0/Dockerfile) +- [`3.11.14`, `3.11`, `3`](https://github.com/docker-library/cassandra/blob/13e3d6ca1ff1b6c9d780e5f018887c1d28318d50/3.11/Dockerfile) +- [`3.0.28`, `3.0`](https://github.com/docker-library/cassandra/blob/e92196fdba778656678a9bc9bcb724b8a3584149/3.0/Dockerfile) # Quick reference (cont.) @@ -35,14 +35,14 @@ WARNING: [https://github.com/docker-library/cassandra/issues](https://github.com/docker-library/cassandra/issues) - **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) - [`amd64`](https://hub.docker.com/r/amd64/cassandra/), [`arm32v7`](https://hub.docker.com/r/arm32v7/cassandra/), [`arm64v8`](https://hub.docker.com/r/arm64v8/cassandra/), [`ppc64le`](https://hub.docker.com/r/ppc64le/cassandra/) + [`amd64`](https://hub.docker.com/r/amd64/cassandra/), [`arm32v7`](https://hub.docker.com/r/arm32v7/cassandra/), [`arm64v8`](https://hub.docker.com/r/arm64v8/cassandra/), [`ppc64le`](https://hub.docker.com/r/ppc64le/cassandra/), [`s390x`](https://hub.docker.com/r/s390x/cassandra/) - **Published image artifact details**: [repo-info repo's `repos/cassandra/` directory](https://github.com/docker-library/repo-info/blob/master/repos/cassandra) ([history](https://github.com/docker-library/repo-info/commits/master/repos/cassandra)) (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/cassandra`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fcassandra) + [official-images repo's `library/cassandra` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fcassandra) [official-images repo's `library/cassandra` file](https://github.com/docker-library/official-images/blob/master/library/cassandra) ([history](https://github.com/docker-library/official-images/commits/master/library/cassandra)) - **Source of this description**: diff --git a/centos/README-short.txt b/centos/README-short.txt index 8bb99ba846ca..8783972e1d40 100644 --- a/centos/README-short.txt +++ b/centos/README-short.txt @@ -1 +1 @@ -The official build of CentOS. +DEPRECATED; The official build of CentOS. diff --git a/centos/README.md b/centos/README.md index c1e018eed3b1..495133cefec6 100644 --- a/centos/README.md +++ b/centos/README.md @@ -14,33 +14,21 @@ WARNING: --> +# **DEPRECATION NOTICE** + +This image is no longer supported/maintained (non-EOL tags last updated November 16, 2020, [docker-library/official-images#9102](https://github.com/docker-library/official-images/pull/9102); see also https://www.centos.org/centos-linux-eol/ and [docker-library/docs#2205](https://github.com/docker-library/docs/pull/2205)). Please adjust your usage accordingly. + # Quick reference - **Maintained by**: [The CentOS Project](https://github.com/CentOS/sig-cloud-instance-images) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`latest`, `centos8`, `8`, `centos8.1.1911`, `8.1.1911`](https://github.com/CentOS/sig-cloud-instance-images/blob/52cc14a6dd2efc45265417a4690964d32cf13857/docker/Dockerfile) -- [`centos7`, `7`](https://github.com/CentOS/sig-cloud-instance-images/blob/b521221b5c8ac3ac88698e77941a2414ce6e778d/docker/Dockerfile) -- [`centos6`, `6`](https://github.com/CentOS/sig-cloud-instance-images/blob/23b05f6a35520ebf338e4df918e4952830da068b/docker/Dockerfile) -- [`centos7.8.2003`, `7.8.2003`](https://github.com/CentOS/sig-cloud-instance-images/blob/216a920c467977bbd0f456d3bc381100a88b3768/docker/Dockerfile) -- [`centos7.7.1908`, `7.7.1908`](https://github.com/CentOS/sig-cloud-instance-images/blob/dcf7932cbda6dd9865d50bfe969927e3e1f0c671/docker/Dockerfile) -- [`centos7.6.1810`, `7.6.1810`](https://github.com/CentOS/sig-cloud-instance-images/blob/7c2e214edced0b2f22e663ab4175a80fc93acaa9/docker/Dockerfile) -- [`centos7.5.1804`, `7.5.1804`](https://github.com/CentOS/sig-cloud-instance-images/blob/0cea32a0018ac2d874960d9378a9745bf92affd2/docker/Dockerfile) -- [`centos7.4.1708`, `7.4.1708`](https://github.com/CentOS/sig-cloud-instance-images/blob/66add29c188e42d4d855f4d4acdb2b73d547edb6/docker/Dockerfile) -- [`centos7.3.1611`, `7.3.1611`](https://github.com/CentOS/sig-cloud-instance-images/blob/5bbaef9f60ab9e3eeb61acec631c2d91f8714fff/docker/Dockerfile) -- [`centos7.2.1511`, `7.2.1511`](https://github.com/CentOS/sig-cloud-instance-images/blob/a3c59bd4e98a7f9c063d993955c8ec19c5b1ceff/docker/Dockerfile) -- [`centos7.1.1503`, `7.1.1503`](https://github.com/CentOS/sig-cloud-instance-images/blob/bc561dfdd671d612dbb9f92e7e17dd8009befc44/docker/Dockerfile) -- [`centos7.0.1406`, `7.0.1406`](https://github.com/CentOS/sig-cloud-instance-images/blob/f1d1e0bd83baef08e257da50e6fb446e4dd1b90c/docker/Dockerfile) -- [`centos6.10`, `6.10`](https://github.com/CentOS/sig-cloud-instance-images/blob/da050e2fc6c28d8d72d8bf78c49537247b5ddf76/docker/Dockerfile) -- [`centos6.9`, `6.9`](https://github.com/CentOS/sig-cloud-instance-images/blob/4f329fe087b0152df26344cecee9ba30b03b1a7b/docker/Dockerfile) -- [`centos6.8`, `6.8`](https://github.com/CentOS/sig-cloud-instance-images/blob/f32666d2af356ed6835942ed753a4970e18bca94/docker/Dockerfile) -- [`centos6.7`, `6.7`](https://github.com/CentOS/sig-cloud-instance-images/blob/d0b72df83f49da844f88aabebe3826372f675370/docker/Dockerfile) -- [`centos6.6`, `6.6`](https://github.com/CentOS/sig-cloud-instance-images/blob/8911843d9a6cc71aadd81e491f94618aded94f30/docker/Dockerfile) +- [`centos7`, `7`, `centos7.9.2009`, `7.9.2009`](https://github.com/CentOS/sig-cloud-instance-images/blob/b2d195220e1c5b181427c3172829c23ab9cd27eb/docker/Dockerfile) # Quick reference (cont.) @@ -55,7 +43,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/centos`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fcentos) + [official-images repo's `library/centos` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fcentos) [official-images repo's `library/centos` file](https://github.com/docker-library/official-images/blob/master/library/centos) ([history](https://github.com/docker-library/official-images/commits/master/library/centos)) - **Source of this description**: diff --git a/centos/deprecated.md b/centos/deprecated.md new file mode 100644 index 000000000000..0d421de8a845 --- /dev/null +++ b/centos/deprecated.md @@ -0,0 +1 @@ +This image is no longer supported/maintained (non-EOL tags last updated November 16, 2020, [docker-library/official-images#9102](https://github.com/docker-library/official-images/pull/9102); see also https://www.centos.org/centos-linux-eol/ and [docker-library/docs#2205](https://github.com/docker-library/docs/pull/2205)). Please adjust your usage accordingly. diff --git a/chronograf/README.md b/chronograf/README.md index cd5c5c6a64e9..3aa0f2958b9e 100644 --- a/chronograf/README.md +++ b/chronograf/README.md @@ -20,16 +20,18 @@ WARNING: [InfluxData](https://github.com/influxdata/influxdata-docker) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`1.6`, `1.6.2`](https://github.com/influxdata/influxdata-docker/blob/4fc3aa594c3b78d07b5b1f0e8a2e9168a22b6d01/chronograf/1.6/Dockerfile) -- [`1.6-alpine`, `1.6.2-alpine`](https://github.com/influxdata/influxdata-docker/blob/4fc3aa594c3b78d07b5b1f0e8a2e9168a22b6d01/chronograf/1.6/alpine/Dockerfile) -- [`1.7`, `1.7.17`](https://github.com/influxdata/influxdata-docker/blob/4fc3aa594c3b78d07b5b1f0e8a2e9168a22b6d01/chronograf/1.7/Dockerfile) -- [`1.7-alpine`, `1.7.17-alpine`](https://github.com/influxdata/influxdata-docker/blob/4fc3aa594c3b78d07b5b1f0e8a2e9168a22b6d01/chronograf/1.7/alpine/Dockerfile) -- [`1.8`, `1.8.4`, `latest`](https://github.com/influxdata/influxdata-docker/blob/4fc3aa594c3b78d07b5b1f0e8a2e9168a22b6d01/chronograf/1.8/Dockerfile) -- [`1.8-alpine`, `1.8.4-alpine`, `alpine`](https://github.com/influxdata/influxdata-docker/blob/4fc3aa594c3b78d07b5b1f0e8a2e9168a22b6d01/chronograf/1.8/alpine/Dockerfile) +- [`1.7`, `1.7.17`](https://github.com/influxdata/influxdata-docker/blob/b827ab25d730659b98439d1c0cbfb17baf60b468/chronograf/1.7/Dockerfile) +- [`1.7-alpine`, `1.7.17-alpine`](https://github.com/influxdata/influxdata-docker/blob/b827ab25d730659b98439d1c0cbfb17baf60b468/chronograf/1.7/alpine/Dockerfile) +- [`1.8`, `1.8.10`](https://github.com/influxdata/influxdata-docker/blob/b827ab25d730659b98439d1c0cbfb17baf60b468/chronograf/1.8/Dockerfile) +- [`1.8-alpine`, `1.8.10-alpine`](https://github.com/influxdata/influxdata-docker/blob/b827ab25d730659b98439d1c0cbfb17baf60b468/chronograf/1.8/alpine/Dockerfile) +- [`1.9`, `1.9.4`](https://github.com/influxdata/influxdata-docker/blob/b827ab25d730659b98439d1c0cbfb17baf60b468/chronograf/1.9/Dockerfile) +- [`1.9-alpine`, `1.9.4-alpine`](https://github.com/influxdata/influxdata-docker/blob/b827ab25d730659b98439d1c0cbfb17baf60b468/chronograf/1.9/alpine/Dockerfile) +- [`1.10`, `1.10.0`, `latest`](https://github.com/influxdata/influxdata-docker/blob/b827ab25d730659b98439d1c0cbfb17baf60b468/chronograf/1.10/Dockerfile) +- [`1.10-alpine`, `1.10.0-alpine`, `alpine`](https://github.com/influxdata/influxdata-docker/blob/b827ab25d730659b98439d1c0cbfb17baf60b468/chronograf/1.10/alpine/Dockerfile) # Quick reference (cont.) @@ -44,7 +46,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/chronograf`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fchronograf) + [official-images repo's `library/chronograf` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fchronograf) [official-images repo's `library/chronograf` file](https://github.com/docker-library/official-images/blob/master/library/chronograf) ([history](https://github.com/docker-library/official-images/commits/master/library/chronograf)) - **Source of this description**: @@ -126,9 +128,9 @@ This is the defacto image. If you are unsure about what your needs are, you prob ## `chronograf:-alpine` -This image is based on the popular [Alpine Linux project](http://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. +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. -This variant is highly recommended when final image size being as small as possible is desired. The main caveat to note is that it does use [musl libc](http://www.musl-libc.org) instead of [glibc and friends](http://www.etalabs.net/compare_libcs.html), so certain software might run into issues depending on the depth of their libc requirements. However, most software doesn't have an issue with this, so this variant is usually a very safe choice. 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. +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. 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). diff --git a/cirros/README.md b/cirros/README.md index 15b3068920af..45fc1814604d 100644 --- a/cirros/README.md +++ b/cirros/README.md @@ -20,11 +20,11 @@ WARNING: [the Docker Community](https://github.com/tianon/docker-brew-cirros) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`0.5.1`, `0.5`, `0`, `latest`](https://github.com/tianon/docker-brew-cirros/blob/0f4ac5ae1e2b7bbff60b81b554f7578be1caec3b/arches/amd64/Dockerfile) +- [`0.6.1`, `0.6`, `0`, `latest`](https://github.com/tianon/docker-brew-cirros/blob/84bfc9d0e4cc631d043410d602bf5f8876ed6575/arches/amd64/Dockerfile) # Quick reference (cont.) @@ -32,14 +32,14 @@ WARNING: [https://github.com/tianon/docker-brew-cirros/issues](https://github.com/tianon/docker-brew-cirros/issues) - **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) - [`amd64`](https://hub.docker.com/r/amd64/cirros/), [`arm32v5`](https://hub.docker.com/r/arm32v5/cirros/), [`arm64v8`](https://hub.docker.com/r/arm64v8/cirros/), [`i386`](https://hub.docker.com/r/i386/cirros/), [`ppc64le`](https://hub.docker.com/r/ppc64le/cirros/) + [`amd64`](https://hub.docker.com/r/amd64/cirros/), [`arm32v5`](https://hub.docker.com/r/arm32v5/cirros/), [`arm64v8`](https://hub.docker.com/r/arm64v8/cirros/), [`ppc64le`](https://hub.docker.com/r/ppc64le/cirros/) - **Published image artifact details**: [repo-info repo's `repos/cirros/` directory](https://github.com/docker-library/repo-info/blob/master/repos/cirros) ([history](https://github.com/docker-library/repo-info/commits/master/repos/cirros)) (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/cirros`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fcirros) + [official-images repo's `library/cirros` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fcirros) [official-images repo's `library/cirros` file](https://github.com/docker-library/official-images/blob/master/library/cirros) ([history](https://github.com/docker-library/official-images/commits/master/library/cirros)) - **Source of this description**: diff --git a/clearlinux/README.md b/clearlinux/README.md index d7d713f5f4dc..8c6e97fb3f8d 100644 --- a/clearlinux/README.md +++ b/clearlinux/README.md @@ -20,11 +20,11 @@ WARNING: [Intel Corporation](https://github.com/clearlinux/docker-brew-clearlinux) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`latest`, `base`](https://github.com/clearlinux/docker-brew-clearlinux/blob/e97035148569e007f5bcd5134237cb5e552c2678/Dockerfile) +- [`latest`, `base`](https://github.com/clearlinux/docker-brew-clearlinux/blob/cf0b677798f83a0d241f6c3c32e8a6e96e008049/Dockerfile) # Quick reference (cont.) @@ -39,7 +39,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/clearlinux`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fclearlinux) + [official-images repo's `library/clearlinux` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fclearlinux) [official-images repo's `library/clearlinux` file](https://github.com/docker-library/official-images/blob/master/library/clearlinux) ([history](https://github.com/docker-library/official-images/commits/master/library/clearlinux)) - **Source of this description**: diff --git a/clefos/README.md b/clefos/README.md index 7624d57e65fb..de51147b6539 100644 --- a/clefos/README.md +++ b/clefos/README.md @@ -20,7 +20,7 @@ WARNING: [The ClefOS Project](https://github.com/nealef/clefos) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links @@ -39,7 +39,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/clefos`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fclefos) + [official-images repo's `library/clefos` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fclefos) [official-images repo's `library/clefos` file](https://github.com/docker-library/official-images/blob/master/library/clefos) ([history](https://github.com/docker-library/official-images/commits/master/library/clefos)) - **Source of this description**: diff --git a/clojure/README.md b/clojure/README.md index ccb3927fde59..f3db7c17b4d8 100644 --- a/clojure/README.md +++ b/clojure/README.md @@ -20,37 +20,70 @@ WARNING: [the Docker Community](https://github.com/Quantisan/docker-clojure) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`openjdk-8`, `openjdk-8-lein`, `openjdk-8-lein-2.9.1`, `openjdk-8-stretch`, `openjdk-8-lein-stretch`, `openjdk-8-lein-2.9.1-stretch`](https://github.com/Quantisan/docker-clojure/blob/e96f6249cac065855a40a9f36ba88949e0a52d7d/target/openjdk-8-stretch/lein/Dockerfile) -- [`openjdk-8-slim-buster`, `openjdk-8-lein-slim-buster`, `openjdk-8-lein-2.9.1-slim-buster`](https://github.com/Quantisan/docker-clojure/blob/e96f6249cac065855a40a9f36ba88949e0a52d7d/target/openjdk-8-slim-buster/lein/Dockerfile) -- [`openjdk-8-boot`, `openjdk-8-boot-2.8.3`, `openjdk-8-boot-stretch`, `openjdk-8-boot-2.8.3-stretch`](https://github.com/Quantisan/docker-clojure/blob/e96f6249cac065855a40a9f36ba88949e0a52d7d/target/openjdk-8-stretch/boot/Dockerfile) -- [`openjdk-8-boot-slim-buster`, `openjdk-8-boot-2.8.3-slim-buster`](https://github.com/Quantisan/docker-clojure/blob/e96f6249cac065855a40a9f36ba88949e0a52d7d/target/openjdk-8-slim-buster/boot/Dockerfile) -- [`openjdk-8-tools-deps`, `openjdk-8-tools-deps-1.10.1.502`, `openjdk-8-tools-deps-stretch`, `openjdk-8-tools-deps-1.10.1.502-stretch`](https://github.com/Quantisan/docker-clojure/blob/e96f6249cac065855a40a9f36ba88949e0a52d7d/target/openjdk-8-stretch/tools-deps/Dockerfile) -- [`openjdk-8-tools-deps-slim-buster`, `openjdk-8-tools-deps-1.10.1.502-slim-buster`](https://github.com/Quantisan/docker-clojure/blob/e96f6249cac065855a40a9f36ba88949e0a52d7d/target/openjdk-8-slim-buster/tools-deps/Dockerfile) -- [`openjdk-11`, `openjdk-11-lein`, `openjdk-11-lein-2.9.1`, `lein`, `lein-2.9.1`, `openjdk-11-stretch`, `openjdk-11-lein-stretch`, `openjdk-11-lein-2.9.1-stretch`, `lein-stretch`, `lein-2.9.1-stretch`](https://github.com/Quantisan/docker-clojure/blob/e96f6249cac065855a40a9f36ba88949e0a52d7d/target/openjdk-11-stretch/lein/Dockerfile) -- [`openjdk-11-lein-slim-buster`, `openjdk-11-slim-buster`, `openjdk-11-lein-2.9.1-slim-buster`, `slim-buster`, `lein-slim-buster`, `lein-2.9.1-slim-buster`, `latest`](https://github.com/Quantisan/docker-clojure/blob/e96f6249cac065855a40a9f36ba88949e0a52d7d/target/openjdk-11-slim-buster/lein/Dockerfile) -- [`openjdk-11-boot`, `openjdk-11-boot-2.8.3`, `boot`, `boot-2.8.3`, `openjdk-11-boot-stretch`, `openjdk-11-boot-2.8.3-stretch`, `boot-stretch`, `boot-2.8.3-stretch`](https://github.com/Quantisan/docker-clojure/blob/e96f6249cac065855a40a9f36ba88949e0a52d7d/target/openjdk-11-stretch/boot/Dockerfile) -- [`openjdk-11-boot-slim-buster`, `openjdk-11-boot-2.8.3-slim-buster`, `boot-slim-buster`, `boot-2.8.3-slim-buster`](https://github.com/Quantisan/docker-clojure/blob/e96f6249cac065855a40a9f36ba88949e0a52d7d/target/openjdk-11-slim-buster/boot/Dockerfile) -- [`openjdk-11-tools-deps`, `openjdk-11-tools-deps-1.10.1.502`, `tools-deps`, `tools-deps-1.10.1.502`, `openjdk-11-tools-deps-stretch`, `openjdk-11-tools-deps-1.10.1.502-stretch`, `tools-deps-stretch`, `tools-deps-1.10.1.502-stretch`](https://github.com/Quantisan/docker-clojure/blob/e96f6249cac065855a40a9f36ba88949e0a52d7d/target/openjdk-11-stretch/tools-deps/Dockerfile) -- [`openjdk-11-tools-deps-slim-buster`, `openjdk-11-tools-deps-1.10.1.502-slim-buster`, `tools-deps-1.10.1.502-slim-buster`, `tools-deps-slim-buster`](https://github.com/Quantisan/docker-clojure/blob/e96f6249cac065855a40a9f36ba88949e0a52d7d/target/openjdk-11-slim-buster/tools-deps/Dockerfile) -- [`openjdk-13`, `openjdk-13-lein`, `openjdk-13-lein-2.9.1`, `openjdk-13-slim-buster`, `openjdk-13-lein-slim-buster`, `openjdk-13-lein-2.9.1-slim-buster`](https://github.com/Quantisan/docker-clojure/blob/e96f6249cac065855a40a9f36ba88949e0a52d7d/target/openjdk-13-slim-buster/lein/Dockerfile) -- [`openjdk-13-buster`, `openjdk-13-lein-buster`, `openjdk-13-lein-2.9.1-buster`](https://github.com/Quantisan/docker-clojure/blob/e96f6249cac065855a40a9f36ba88949e0a52d7d/target/openjdk-13-buster/lein/Dockerfile) -- [`openjdk-13-boot`, `openjdk-13-boot-2.8.3`, `openjdk-13-boot-slim-buster`, `openjdk-13-boot-2.8.3-slim-buster`](https://github.com/Quantisan/docker-clojure/blob/e96f6249cac065855a40a9f36ba88949e0a52d7d/target/openjdk-13-slim-buster/boot/Dockerfile) -- [`openjdk-13-boot-buster`, `openjdk-13-boot-2.8.3-buster`](https://github.com/Quantisan/docker-clojure/blob/e96f6249cac065855a40a9f36ba88949e0a52d7d/target/openjdk-13-buster/boot/Dockerfile) -- [`openjdk-13-tools-deps`, `openjdk-13-tools-deps-1.10.1.502`, `openjdk-13-tools-deps-slim-buster`, `openjdk-13-tools-deps-1.10.1.502-slim-buster`](https://github.com/Quantisan/docker-clojure/blob/e96f6249cac065855a40a9f36ba88949e0a52d7d/target/openjdk-13-slim-buster/tools-deps/Dockerfile) -- [`openjdk-13-tools-deps-buster`, `openjdk-13-tools-deps-1.10.1.502-buster`](https://github.com/Quantisan/docker-clojure/blob/e96f6249cac065855a40a9f36ba88949e0a52d7d/target/openjdk-13-buster/tools-deps/Dockerfile) -- [`openjdk-14`, `openjdk-14-lein`, `openjdk-14-lein-2.9.1`, `openjdk-14-slim-buster`, `openjdk-14-lein-slim-buster`, `openjdk-14-lein-2.9.1-slim-buster`](https://github.com/Quantisan/docker-clojure/blob/e96f6249cac065855a40a9f36ba88949e0a52d7d/target/openjdk-14-slim-buster/lein/Dockerfile) -- [`openjdk-14-buster`, `openjdk-14-lein-buster`, `openjdk-14-lein-2.9.1-buster`](https://github.com/Quantisan/docker-clojure/blob/e96f6249cac065855a40a9f36ba88949e0a52d7d/target/openjdk-14-buster/lein/Dockerfile) -- [`openjdk-14-boot`, `openjdk-14-boot-2.8.3`, `openjdk-14-boot-slim-buster`, `openjdk-14-boot-2.8.3-slim-buster`](https://github.com/Quantisan/docker-clojure/blob/e96f6249cac065855a40a9f36ba88949e0a52d7d/target/openjdk-14-slim-buster/boot/Dockerfile) -- [`openjdk-14-boot-buster`, `openjdk-14-boot-2.8.3-buster`](https://github.com/Quantisan/docker-clojure/blob/e96f6249cac065855a40a9f36ba88949e0a52d7d/target/openjdk-14-buster/boot/Dockerfile) -- [`openjdk-14-tools-deps`, `openjdk-14-tools-deps-1.10.1.502`, `openjdk-14-tools-deps-slim-buster`, `openjdk-14-tools-deps-1.10.1.502-slim-buster`](https://github.com/Quantisan/docker-clojure/blob/e96f6249cac065855a40a9f36ba88949e0a52d7d/target/openjdk-14-slim-buster/tools-deps/Dockerfile) -- [`openjdk-14-tools-deps-buster`, `openjdk-14-tools-deps-1.10.1.502-buster`](https://github.com/Quantisan/docker-clojure/blob/e96f6249cac065855a40a9f36ba88949e0a52d7d/target/openjdk-14-buster/tools-deps/Dockerfile) -- [`openjdk-14-alpine`, `openjdk-14-lein-alpine`, `openjdk-14-lein-2.9.1-alpine`](https://github.com/Quantisan/docker-clojure/blob/e96f6249cac065855a40a9f36ba88949e0a52d7d/target/openjdk-14-alpine/lein/Dockerfile) -- [`openjdk-14-boot-alpine`, `openjdk-14-boot-2.8.3-alpine`](https://github.com/Quantisan/docker-clojure/blob/e96f6249cac065855a40a9f36ba88949e0a52d7d/target/openjdk-14-alpine/boot/Dockerfile) -- [`openjdk-14-tools-deps-alpine`, `openjdk-14-tools-deps-1.10.1.502-alpine`](https://github.com/Quantisan/docker-clojure/blob/e96f6249cac065855a40a9f36ba88949e0a52d7d/target/openjdk-14-alpine/tools-deps/Dockerfile) +- [`latest`](https://github.com/Quantisan/docker-clojure/blob/08479c1b00c308743a360a79a82338fa04e59a9a/target/eclipse-temurin-17-jdk-jammy/latest/Dockerfile) +- [`temurin-8-boot-2.8.3-bullseye`, `temurin-8-boot-bullseye`](https://github.com/Quantisan/docker-clojure/blob/08479c1b00c308743a360a79a82338fa04e59a9a/target/debian-bullseye-8/boot/Dockerfile) +- [`temurin-8-boot-2.8.3-bullseye-slim`, `temurin-8-boot-bullseye-slim`](https://github.com/Quantisan/docker-clojure/blob/08479c1b00c308743a360a79a82338fa04e59a9a/target/debian-bullseye-slim-8/boot/Dockerfile) +- [`temurin-8-boot-2.8.3-focal`, `temurin-8-boot-focal`](https://github.com/Quantisan/docker-clojure/blob/08479c1b00c308743a360a79a82338fa04e59a9a/target/eclipse-temurin-8-jdk-focal/boot/Dockerfile) +- [`temurin-8-boot`, `temurin-8-boot-2.8.3`, `temurin-8-boot-2.8.3-jammy`, `temurin-8-boot-jammy`](https://github.com/Quantisan/docker-clojure/blob/08479c1b00c308743a360a79a82338fa04e59a9a/target/eclipse-temurin-8-jdk-jammy/boot/Dockerfile) +- [`temurin-8-lein-2.10.0-alpine`, `temurin-8-lein-alpine`](https://github.com/Quantisan/docker-clojure/blob/08479c1b00c308743a360a79a82338fa04e59a9a/target/eclipse-temurin-8-jdk-alpine/lein/Dockerfile) +- [`temurin-8-lein-2.10.0-bullseye`, `temurin-8-lein-bullseye`](https://github.com/Quantisan/docker-clojure/blob/08479c1b00c308743a360a79a82338fa04e59a9a/target/debian-bullseye-8/lein/Dockerfile) +- [`temurin-8-lein-2.10.0-bullseye-slim`, `temurin-8-lein-bullseye-slim`](https://github.com/Quantisan/docker-clojure/blob/08479c1b00c308743a360a79a82338fa04e59a9a/target/debian-bullseye-slim-8/lein/Dockerfile) +- [`temurin-8-lein-2.10.0-focal`, `temurin-8-lein-focal`](https://github.com/Quantisan/docker-clojure/blob/08479c1b00c308743a360a79a82338fa04e59a9a/target/eclipse-temurin-8-jdk-focal/lein/Dockerfile) +- [`temurin-8-lein`, `temurin-8-lein-2.10.0`, `temurin-8-lein-2.10.0-jammy`, `temurin-8-lein-jammy`](https://github.com/Quantisan/docker-clojure/blob/08479c1b00c308743a360a79a82338fa04e59a9a/target/eclipse-temurin-8-jdk-jammy/lein/Dockerfile) +- [`temurin-8-alpine`, `temurin-8-tools-deps-1.11.1.1208-alpine`, `temurin-8-tools-deps-alpine`](https://github.com/Quantisan/docker-clojure/blob/08479c1b00c308743a360a79a82338fa04e59a9a/target/eclipse-temurin-8-jdk-alpine/tools-deps/Dockerfile) +- [`temurin-8-bullseye`, `temurin-8-tools-deps-1.11.1.1208-bullseye`, `temurin-8-tools-deps-bullseye`](https://github.com/Quantisan/docker-clojure/blob/08479c1b00c308743a360a79a82338fa04e59a9a/target/debian-bullseye-8/tools-deps/Dockerfile) +- [`temurin-8-bullseye-slim`, `temurin-8-tools-deps-1.11.1.1208-bullseye-slim`, `temurin-8-tools-deps-bullseye-slim`](https://github.com/Quantisan/docker-clojure/blob/08479c1b00c308743a360a79a82338fa04e59a9a/target/debian-bullseye-slim-8/tools-deps/Dockerfile) +- [`temurin-8-focal`, `temurin-8-tools-deps-1.11.1.1208-focal`, `temurin-8-tools-deps-focal`](https://github.com/Quantisan/docker-clojure/blob/08479c1b00c308743a360a79a82338fa04e59a9a/target/eclipse-temurin-8-jdk-focal/tools-deps/Dockerfile) +- [`temurin-8-jammy`, `temurin-8-tools-deps`, `temurin-8-tools-deps-1.11.1.1208`, `temurin-8-tools-deps-1.11.1.1208-jammy`, `temurin-8-tools-deps-jammy`](https://github.com/Quantisan/docker-clojure/blob/08479c1b00c308743a360a79a82338fa04e59a9a/target/eclipse-temurin-8-jdk-jammy/tools-deps/Dockerfile) +- [`temurin-11-boot-2.8.3-alpine`, `temurin-11-boot-alpine`](https://github.com/Quantisan/docker-clojure/blob/08479c1b00c308743a360a79a82338fa04e59a9a/target/eclipse-temurin-11-jdk-alpine/boot/Dockerfile) +- [`temurin-11-boot-2.8.3-bullseye`, `temurin-11-boot-bullseye`](https://github.com/Quantisan/docker-clojure/blob/08479c1b00c308743a360a79a82338fa04e59a9a/target/debian-bullseye-11/boot/Dockerfile) +- [`temurin-11-boot-2.8.3-bullseye-slim`, `temurin-11-boot-bullseye-slim`](https://github.com/Quantisan/docker-clojure/blob/08479c1b00c308743a360a79a82338fa04e59a9a/target/debian-bullseye-slim-11/boot/Dockerfile) +- [`temurin-11-boot-2.8.3-focal`, `temurin-11-boot-focal`](https://github.com/Quantisan/docker-clojure/blob/08479c1b00c308743a360a79a82338fa04e59a9a/target/eclipse-temurin-11-jdk-focal/boot/Dockerfile) +- [`temurin-11-boot`, `temurin-11-boot-2.8.3`, `temurin-11-boot-2.8.3-jammy`, `temurin-11-boot-jammy`](https://github.com/Quantisan/docker-clojure/blob/08479c1b00c308743a360a79a82338fa04e59a9a/target/eclipse-temurin-11-jdk-jammy/boot/Dockerfile) +- [`temurin-11-lein-2.10.0-alpine`, `temurin-11-lein-alpine`](https://github.com/Quantisan/docker-clojure/blob/08479c1b00c308743a360a79a82338fa04e59a9a/target/eclipse-temurin-11-jdk-alpine/lein/Dockerfile) +- [`temurin-11-lein-2.10.0-bullseye`, `temurin-11-lein-bullseye`](https://github.com/Quantisan/docker-clojure/blob/08479c1b00c308743a360a79a82338fa04e59a9a/target/debian-bullseye-11/lein/Dockerfile) +- [`temurin-11-lein-2.10.0-bullseye-slim`, `temurin-11-lein-bullseye-slim`](https://github.com/Quantisan/docker-clojure/blob/08479c1b00c308743a360a79a82338fa04e59a9a/target/debian-bullseye-slim-11/lein/Dockerfile) +- [`temurin-11-lein-2.10.0-focal`, `temurin-11-lein-focal`](https://github.com/Quantisan/docker-clojure/blob/08479c1b00c308743a360a79a82338fa04e59a9a/target/eclipse-temurin-11-jdk-focal/lein/Dockerfile) +- [`temurin-11-lein`, `temurin-11-lein-2.10.0`, `temurin-11-lein-2.10.0-jammy`, `temurin-11-lein-jammy`](https://github.com/Quantisan/docker-clojure/blob/08479c1b00c308743a360a79a82338fa04e59a9a/target/eclipse-temurin-11-jdk-jammy/lein/Dockerfile) +- [`temurin-11-alpine`, `temurin-11-tools-deps-1.11.1.1208-alpine`, `temurin-11-tools-deps-alpine`](https://github.com/Quantisan/docker-clojure/blob/08479c1b00c308743a360a79a82338fa04e59a9a/target/eclipse-temurin-11-jdk-alpine/tools-deps/Dockerfile) +- [`temurin-11-bullseye`, `temurin-11-tools-deps-1.11.1.1208-bullseye`, `temurin-11-tools-deps-bullseye`](https://github.com/Quantisan/docker-clojure/blob/08479c1b00c308743a360a79a82338fa04e59a9a/target/debian-bullseye-11/tools-deps/Dockerfile) +- [`temurin-11-bullseye-slim`, `temurin-11-tools-deps-1.11.1.1208-bullseye-slim`, `temurin-11-tools-deps-bullseye-slim`](https://github.com/Quantisan/docker-clojure/blob/08479c1b00c308743a360a79a82338fa04e59a9a/target/debian-bullseye-slim-11/tools-deps/Dockerfile) +- [`temurin-11-focal`, `temurin-11-tools-deps-1.11.1.1208-focal`, `temurin-11-tools-deps-focal`](https://github.com/Quantisan/docker-clojure/blob/08479c1b00c308743a360a79a82338fa04e59a9a/target/eclipse-temurin-11-jdk-focal/tools-deps/Dockerfile) +- [`temurin-11-jammy`, `temurin-11-tools-deps`, `temurin-11-tools-deps-1.11.1.1208`, `temurin-11-tools-deps-1.11.1.1208-jammy`, `temurin-11-tools-deps-jammy`](https://github.com/Quantisan/docker-clojure/blob/08479c1b00c308743a360a79a82338fa04e59a9a/target/eclipse-temurin-11-jdk-jammy/tools-deps/Dockerfile) +- [`boot-2.8.3-alpine`, `boot-alpine`, `temurin-17-boot-2.8.3-alpine`, `temurin-17-boot-alpine`](https://github.com/Quantisan/docker-clojure/blob/08479c1b00c308743a360a79a82338fa04e59a9a/target/eclipse-temurin-17-jdk-alpine/boot/Dockerfile) +- [`temurin-17-boot-2.8.3-bullseye`, `temurin-17-boot-bullseye`](https://github.com/Quantisan/docker-clojure/blob/08479c1b00c308743a360a79a82338fa04e59a9a/target/debian-bullseye-17/boot/Dockerfile) +- [`temurin-17-boot-2.8.3-bullseye-slim`, `temurin-17-boot-bullseye-slim`](https://github.com/Quantisan/docker-clojure/blob/08479c1b00c308743a360a79a82338fa04e59a9a/target/debian-bullseye-slim-17/boot/Dockerfile) +- [`boot-2.8.3-focal`, `boot-focal`, `temurin-17-boot-2.8.3-focal`, `temurin-17-boot-focal`](https://github.com/Quantisan/docker-clojure/blob/08479c1b00c308743a360a79a82338fa04e59a9a/target/eclipse-temurin-17-jdk-focal/boot/Dockerfile) +- [`boot`, `boot-2.8.3`, `boot-2.8.3-jammy`, `boot-jammy`, `temurin-17-boot`, `temurin-17-boot-2.8.3`, `temurin-17-boot-2.8.3-jammy`, `temurin-17-boot-jammy`](https://github.com/Quantisan/docker-clojure/blob/08479c1b00c308743a360a79a82338fa04e59a9a/target/eclipse-temurin-17-jdk-jammy/boot/Dockerfile) +- [`lein-2.10.0-alpine`, `lein-alpine`, `temurin-17-lein-2.10.0-alpine`, `temurin-17-lein-alpine`](https://github.com/Quantisan/docker-clojure/blob/08479c1b00c308743a360a79a82338fa04e59a9a/target/eclipse-temurin-17-jdk-alpine/lein/Dockerfile) +- [`temurin-17-lein-2.10.0-bullseye`, `temurin-17-lein-bullseye`](https://github.com/Quantisan/docker-clojure/blob/08479c1b00c308743a360a79a82338fa04e59a9a/target/debian-bullseye-17/lein/Dockerfile) +- [`temurin-17-lein-2.10.0-bullseye-slim`, `temurin-17-lein-bullseye-slim`](https://github.com/Quantisan/docker-clojure/blob/08479c1b00c308743a360a79a82338fa04e59a9a/target/debian-bullseye-slim-17/lein/Dockerfile) +- [`lein-2.10.0-focal`, `lein-focal`, `temurin-17-lein-2.10.0-focal`, `temurin-17-lein-focal`](https://github.com/Quantisan/docker-clojure/blob/08479c1b00c308743a360a79a82338fa04e59a9a/target/eclipse-temurin-17-jdk-focal/lein/Dockerfile) +- [`lein`, `lein-2.10.0`, `lein-2.10.0-jammy`, `lein-jammy`, `temurin-17-lein`, `temurin-17-lein-2.10.0`, `temurin-17-lein-2.10.0-jammy`, `temurin-17-lein-jammy`](https://github.com/Quantisan/docker-clojure/blob/08479c1b00c308743a360a79a82338fa04e59a9a/target/eclipse-temurin-17-jdk-jammy/lein/Dockerfile) +- [`temurin-17-alpine`, `temurin-17-tools-deps-1.11.1.1208-alpine`, `temurin-17-tools-deps-alpine`, `tools-deps-1.11.1.1208-alpine`, `tools-deps-alpine`](https://github.com/Quantisan/docker-clojure/blob/08479c1b00c308743a360a79a82338fa04e59a9a/target/eclipse-temurin-17-jdk-alpine/tools-deps/Dockerfile) +- [`temurin-17-bullseye`, `temurin-17-tools-deps-1.11.1.1208-bullseye`, `temurin-17-tools-deps-bullseye`](https://github.com/Quantisan/docker-clojure/blob/08479c1b00c308743a360a79a82338fa04e59a9a/target/debian-bullseye-17/tools-deps/Dockerfile) +- [`temurin-17-bullseye-slim`, `temurin-17-tools-deps-1.11.1.1208-bullseye-slim`, `temurin-17-tools-deps-bullseye-slim`](https://github.com/Quantisan/docker-clojure/blob/08479c1b00c308743a360a79a82338fa04e59a9a/target/debian-bullseye-slim-17/tools-deps/Dockerfile) +- [`temurin-17-focal`, `temurin-17-tools-deps-1.11.1.1208-focal`, `temurin-17-tools-deps-focal`, `tools-deps-1.11.1.1208-focal`, `tools-deps-focal`](https://github.com/Quantisan/docker-clojure/blob/08479c1b00c308743a360a79a82338fa04e59a9a/target/eclipse-temurin-17-jdk-focal/tools-deps/Dockerfile) +- [`temurin-17-jammy`, `temurin-17-tools-deps`, `temurin-17-tools-deps-1.11.1.1208`, `temurin-17-tools-deps-1.11.1.1208-jammy`, `temurin-17-tools-deps-jammy`, `tools-deps`, `tools-deps-1.11.1.1208`, `tools-deps-1.11.1.1208-jammy`, `tools-deps-jammy`](https://github.com/Quantisan/docker-clojure/blob/08479c1b00c308743a360a79a82338fa04e59a9a/target/eclipse-temurin-17-jdk-jammy/tools-deps/Dockerfile) +- [`temurin-19-boot-2.8.3-alpine`, `temurin-19-boot-alpine`](https://github.com/Quantisan/docker-clojure/blob/08479c1b00c308743a360a79a82338fa04e59a9a/target/eclipse-temurin-19-jdk-alpine/boot/Dockerfile) +- [`temurin-19-boot-2.8.3-bullseye`, `temurin-19-boot-bullseye`](https://github.com/Quantisan/docker-clojure/blob/08479c1b00c308743a360a79a82338fa04e59a9a/target/debian-bullseye-19/boot/Dockerfile) +- [`temurin-19-boot-2.8.3-bullseye-slim`, `temurin-19-boot-bullseye-slim`](https://github.com/Quantisan/docker-clojure/blob/08479c1b00c308743a360a79a82338fa04e59a9a/target/debian-bullseye-slim-19/boot/Dockerfile) +- [`temurin-19-boot-2.8.3-focal`, `temurin-19-boot-focal`](https://github.com/Quantisan/docker-clojure/blob/08479c1b00c308743a360a79a82338fa04e59a9a/target/eclipse-temurin-19-jdk-focal/boot/Dockerfile) +- [`temurin-19-boot`, `temurin-19-boot-2.8.3`, `temurin-19-boot-2.8.3-jammy`, `temurin-19-boot-jammy`](https://github.com/Quantisan/docker-clojure/blob/08479c1b00c308743a360a79a82338fa04e59a9a/target/eclipse-temurin-19-jdk-jammy/boot/Dockerfile) +- [`temurin-19-lein-2.10.0-alpine`, `temurin-19-lein-alpine`](https://github.com/Quantisan/docker-clojure/blob/08479c1b00c308743a360a79a82338fa04e59a9a/target/eclipse-temurin-19-jdk-alpine/lein/Dockerfile) +- [`temurin-19-lein-2.10.0-bullseye`, `temurin-19-lein-bullseye`](https://github.com/Quantisan/docker-clojure/blob/08479c1b00c308743a360a79a82338fa04e59a9a/target/debian-bullseye-19/lein/Dockerfile) +- [`temurin-19-lein-2.10.0-bullseye-slim`, `temurin-19-lein-bullseye-slim`](https://github.com/Quantisan/docker-clojure/blob/08479c1b00c308743a360a79a82338fa04e59a9a/target/debian-bullseye-slim-19/lein/Dockerfile) +- [`temurin-19-lein-2.10.0-focal`, `temurin-19-lein-focal`](https://github.com/Quantisan/docker-clojure/blob/08479c1b00c308743a360a79a82338fa04e59a9a/target/eclipse-temurin-19-jdk-focal/lein/Dockerfile) +- [`temurin-19-lein`, `temurin-19-lein-2.10.0`, `temurin-19-lein-2.10.0-jammy`, `temurin-19-lein-jammy`](https://github.com/Quantisan/docker-clojure/blob/08479c1b00c308743a360a79a82338fa04e59a9a/target/eclipse-temurin-19-jdk-jammy/lein/Dockerfile) +- [`temurin-19-alpine`, `temurin-19-tools-deps-1.11.1.1208-alpine`, `temurin-19-tools-deps-alpine`](https://github.com/Quantisan/docker-clojure/blob/08479c1b00c308743a360a79a82338fa04e59a9a/target/eclipse-temurin-19-jdk-alpine/tools-deps/Dockerfile) +- [`temurin-19-bullseye`, `temurin-19-tools-deps-1.11.1.1208-bullseye`, `temurin-19-tools-deps-bullseye`](https://github.com/Quantisan/docker-clojure/blob/08479c1b00c308743a360a79a82338fa04e59a9a/target/debian-bullseye-19/tools-deps/Dockerfile) +- [`temurin-19-bullseye-slim`, `temurin-19-tools-deps-1.11.1.1208-bullseye-slim`, `temurin-19-tools-deps-bullseye-slim`](https://github.com/Quantisan/docker-clojure/blob/08479c1b00c308743a360a79a82338fa04e59a9a/target/debian-bullseye-slim-19/tools-deps/Dockerfile) +- [`temurin-19-focal`, `temurin-19-tools-deps-1.11.1.1208-focal`, `temurin-19-tools-deps-focal`](https://github.com/Quantisan/docker-clojure/blob/08479c1b00c308743a360a79a82338fa04e59a9a/target/eclipse-temurin-19-jdk-focal/tools-deps/Dockerfile) +- [`temurin-19-jammy`, `temurin-19-tools-deps`, `temurin-19-tools-deps-1.11.1.1208`, `temurin-19-tools-deps-1.11.1.1208-jammy`, `temurin-19-tools-deps-jammy`](https://github.com/Quantisan/docker-clojure/blob/08479c1b00c308743a360a79a82338fa04e59a9a/target/eclipse-temurin-19-jdk-jammy/tools-deps/Dockerfile) # Quick reference (cont.) @@ -65,7 +98,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/clojure`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fclojure) + [official-images repo's `library/clojure` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fclojure) [official-images repo's `library/clojure` file](https://github.com/docker-library/official-images/blob/master/library/clojure) ([history](https://github.com/docker-library/official-images/commits/master/library/clojure)) - **Source of this description**: @@ -157,7 +190,9 @@ The `clojure` images come in many flavors, each designed for a specific use case 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. -Some of these tags may have names like buster or stretch 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. +Some of these tags may have names like 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. + +Some of these tags may have names like focal or jammy in them. These are the suite code names for releases of [Ubuntu](https://wiki.ubuntu.com/Releases) 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 Ubuntu. ## `clojure:-slim` @@ -165,9 +200,9 @@ This image does not contain the common packages contained in the default tag and ## `clojure:-alpine` -This image is based on the popular [Alpine Linux project](http://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. +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. -This variant is highly recommended when final image size being as small as possible is desired. The main caveat to note is that it does use [musl libc](http://www.musl-libc.org) instead of [glibc and friends](http://www.etalabs.net/compare_libcs.html), so certain software might run into issues depending on the depth of their libc requirements. However, most software doesn't have an issue with this, so this variant is usually a very safe choice. 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. +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. 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). diff --git a/composer/README.md b/composer/README.md index e646be63c01e..784ffabddb36 100644 --- a/composer/README.md +++ b/composer/README.md @@ -20,12 +20,15 @@ WARNING: [Rob Bast](https://github.com/alcohol), with [contributions](https://github.com/composer/docker/graphs/contributors) from the community. - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`1.10.6`, `1.10`, `1`, `latest`](https://github.com/composer/docker/blob/719eb94597f3608c4933fd781d2a8448f840d277/1.10/Dockerfile) -- [`1.9.3`, `1.9`](https://github.com/composer/docker/blob/6deedc6a8c89b17c9a6ca61a28c8b206513c76f8/1.9/Dockerfile) +- [`2.5.1`, `2.5`, `2`, `latest`](https://github.com/composer/docker/blob/4753480775709ab437330892f5c7fcf03f0d4344/2.5/Dockerfile) +- [`2.4.4`, `2.4`](https://github.com/composer/docker/blob/88e63fbab43e2151b0743a4c6d18a9c59aa9db0c/2.4/Dockerfile) +- [`2.3.10`, `2.3`](https://github.com/composer/docker/blob/88e63fbab43e2151b0743a4c6d18a9c59aa9db0c/2.3/Dockerfile) +- [`2.2.18`, `2.2`, `lts`](https://github.com/composer/docker/blob/88e63fbab43e2151b0743a4c6d18a9c59aa9db0c/2.2/Dockerfile) +- [`1.10.26`, `1.10`, `1`](https://github.com/composer/docker/blob/88e63fbab43e2151b0743a4c6d18a9c59aa9db0c/1.10/Dockerfile) # Quick reference (cont.) @@ -40,7 +43,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/composer`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fcomposer) + [official-images repo's `library/composer` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fcomposer) [official-images repo's `library/composer` file](https://github.com/docker-library/official-images/blob/master/library/composer) ([history](https://github.com/docker-library/official-images/commits/master/library/composer)) - **Source of this description**: @@ -58,15 +61,13 @@ You can read more about Composer in our [official documentation](https://getcomp ### Basic usage -Running the `composer` image is as simple as follows: - ```console $ docker run --rm --interactive --tty \ --volume $PWD:/app \ - composer install + composer ``` -### Persistent cache / global configuration +### Persist cache / global configuration You can bind mount the Composer home directory from your host to the container to enable a persistent cache or share global configuration: @@ -74,12 +75,12 @@ You can bind mount the Composer home directory from your host to the container t $ docker run --rm --interactive --tty \ --volume $PWD:/app \ --volume ${COMPOSER_HOME:-$HOME/.composer}:/tmp \ - composer install + composer ``` **Note:** this relies on the fact that the `COMPOSER_HOME` value is set to `/tmp` in the image by default. -Or if you are following the XDG specification: +Or if your environment follows the XDG specification: ```console $ docker run --rm --interactive --tty \ @@ -88,7 +89,7 @@ $ docker run --rm --interactive --tty \ --volume ${COMPOSER_HOME:-$HOME/.config/composer}:$COMPOSER_HOME \ --volume ${COMPOSER_CACHE_DIR:-$HOME/.cache/composer}:$COMPOSER_CACHE_DIR \ --volume $PWD:/app \ - composer install + composer ``` ### Filesystem permissions @@ -99,9 +100,13 @@ By default, Composer runs as root inside the container. This can lead to permiss $ docker run --rm --interactive --tty \ --volume $PWD:/app \ --user $(id -u):$(id -g) \ - composer install + composer ``` +See: https://docs.docker.com/engine/reference/run/#user for details. + +> Note: Docker for Mac behaves differently and this tip might not apply to Docker for Mac users. + ### Private repositories / SSH agent When you need to access private repositories, you will either need to share your configured credentials, or mount your `ssh-agent` socket inside the running container: @@ -112,12 +117,12 @@ $ eval $(ssh-agent); \ --volume $PWD:/app \ --volume $SSH_AUTH_SOCK:/ssh-auth.sock \ --env SSH_AUTH_SOCK=/ssh-auth.sock \ - composer install + composer ``` **Note:** On OSX this requires Docker For Mac v2.2.0.0 or later, see [docker/for-mac#410](https://github.com/docker/for-mac/issues/410). -When combining the use of private repositories with running Composer as another user, you might run into non-existent user errors (thrown by ssh). To work around this, simply mount the host passwd and group files (read-only) into the container: +When combining the use of private repositories with running Composer as another user, you can run into non-existent user errors (thrown by ssh). To work around this, bind mount the host passwd and group files (read-only) into the container: ```console $ eval $(ssh-agent); \ @@ -128,7 +133,7 @@ $ eval $(ssh-agent); \ --volume /etc/group:/etc/group:ro \ --env SSH_AUTH_SOCK=/ssh-auth.sock \ --user $(id -u):$(id -g) \ - composer install + composer ``` # Troubleshooting @@ -156,7 +161,7 @@ Suggestions: "config": { "platform": { "php": "MAJOR.MINOR.PATCH", - "ext-something": "1" + "ext-something": "MAJOR.MINOR.PATCH" } } } diff --git a/composer/content.md b/composer/content.md index 5965d1ccfc7a..048898e45768 100644 --- a/composer/content.md +++ b/composer/content.md @@ -10,15 +10,13 @@ You can read more about Composer in our [official documentation](https://getcomp ### Basic usage -Running the `composer` image is as simple as follows: - ```console $ docker run --rm --interactive --tty \ --volume $PWD:/app \ - %%IMAGE%% install + %%IMAGE%% ``` -### Persistent cache / global configuration +### Persist cache / global configuration You can bind mount the Composer home directory from your host to the container to enable a persistent cache or share global configuration: @@ -26,12 +24,12 @@ You can bind mount the Composer home directory from your host to the container t $ docker run --rm --interactive --tty \ --volume $PWD:/app \ --volume ${COMPOSER_HOME:-$HOME/.composer}:/tmp \ - %%IMAGE%% install + %%IMAGE%% ``` **Note:** this relies on the fact that the `COMPOSER_HOME` value is set to `/tmp` in the image by default. -Or if you are following the XDG specification: +Or if your environment follows the XDG specification: ```console $ docker run --rm --interactive --tty \ @@ -40,7 +38,7 @@ $ docker run --rm --interactive --tty \ --volume ${COMPOSER_HOME:-$HOME/.config/composer}:$COMPOSER_HOME \ --volume ${COMPOSER_CACHE_DIR:-$HOME/.cache/composer}:$COMPOSER_CACHE_DIR \ --volume $PWD:/app \ - %%IMAGE%% install + %%IMAGE%% ``` ### Filesystem permissions @@ -51,9 +49,13 @@ By default, Composer runs as root inside the container. This can lead to permiss $ docker run --rm --interactive --tty \ --volume $PWD:/app \ --user $(id -u):$(id -g) \ - %%IMAGE%% install + %%IMAGE%% ``` +See: https://docs.docker.com/engine/reference/run/#user for details. + +> Note: Docker for Mac behaves differently and this tip might not apply to Docker for Mac users. + ### Private repositories / SSH agent When you need to access private repositories, you will either need to share your configured credentials, or mount your `ssh-agent` socket inside the running container: @@ -64,12 +66,12 @@ $ eval $(ssh-agent); \ --volume $PWD:/app \ --volume $SSH_AUTH_SOCK:/ssh-auth.sock \ --env SSH_AUTH_SOCK=/ssh-auth.sock \ - %%IMAGE%% install + %%IMAGE%% ``` **Note:** On OSX this requires Docker For Mac v2.2.0.0 or later, see [docker/for-mac#410](https://github.com/docker/for-mac/issues/410). -When combining the use of private repositories with running Composer as another user, you might run into non-existent user errors (thrown by ssh). To work around this, simply mount the host passwd and group files (read-only) into the container: +When combining the use of private repositories with running Composer as another user, you can run into non-existent user errors (thrown by ssh). To work around this, bind mount the host passwd and group files (read-only) into the container: ```console $ eval $(ssh-agent); \ @@ -80,7 +82,7 @@ $ eval $(ssh-agent); \ --volume /etc/group:/etc/group:ro \ --env SSH_AUTH_SOCK=/ssh-auth.sock \ --user $(id -u):$(id -g) \ - %%IMAGE%% install + %%IMAGE%% ``` # Troubleshooting @@ -108,7 +110,7 @@ Suggestions: "config": { "platform": { "php": "MAJOR.MINOR.PATCH", - "ext-something": "1" + "ext-something": "MAJOR.MINOR.PATCH" } } } diff --git a/consul/README.md b/consul/README.md index 0eb5ac72837c..75b9089706bf 100644 --- a/consul/README.md +++ b/consul/README.md @@ -20,13 +20,13 @@ WARNING: [HashiCorp](https://github.com/hashicorp/docker-consul) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`1.8.0-beta1`](https://github.com/hashicorp/docker-consul/blob/6966b401fd8015b87c01949c0baaafb36c9d3b50/0.X/Dockerfile) -- [`1.7.3`, `1.7`, `latest`](https://github.com/hashicorp/docker-consul/blob/9cb67358af03c73222da3badebc7c69d765c456a/0.X/Dockerfile) -- [`1.6.5`, `1.6`](https://github.com/hashicorp/docker-consul/blob/5fdce521f44a1cd56d3f5fb92e5732f2ae516d3e/0.X/Dockerfile) +- [`1.14.3`, `1.14`, `latest`](https://github.com/hashicorp/docker-consul/blob/8dd04b12354ab019a6e96b5f7597bb326659507f/0.X/Dockerfile) +- [`1.13.5`, `1.13`](https://github.com/hashicorp/docker-consul/blob/795461990fe29f494ec0c06bb27088bbd8ca40f4/0.X/Dockerfile) +- [`1.12.8`, `1.12`](https://github.com/hashicorp/docker-consul/blob/a91ee4fadf7500dfdfe1f6abd405b31442cd1745/0.X/Dockerfile) # Quick reference (cont.) @@ -41,7 +41,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/consul`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fconsul) + [official-images repo's `library/consul` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fconsul) [official-images repo's `library/consul` file](https://github.com/docker-library/official-images/blob/master/library/consul) ([history](https://github.com/docker-library/official-images/commits/master/library/consul)) - **Source of this description**: @@ -58,7 +58,7 @@ Consul is a distributed, highly-available, and multi-datacenter aware tool for s # Consul and Docker -Consul has several moving parts so we'll start with a brief introduction to Consul's architecture and then detail how Consul interacts with Docker. Please see the [Consul Architecture](https://www.consul.io/docs/internals/architecture.html) guide for more detail on all these concepts. +Consul has several moving parts so we'll start with a brief introduction to Consul's architecture and then detail how Consul interacts with Docker. Please see the [Consul Architecture](https://www.consul.io/docs/architecture) guide for more detail on all these concepts. Each host in a Consul cluster runs the Consul agent, a long running daemon that can be started in client or server mode. Each cluster has at least 1 agent in server mode, and usually 3 or 5 for high availability. The server agents participate in a [consensus protocol](https://www.consul.io/docs/internals/consensus.html), maintain a centralized view of the cluster's state, and respond to queries from other agents in the cluster. The rest of the agents in client mode participate in a [gossip protocol](https://www.consul.io/docs/internals/gossip.html) to discover other agents and check them for failures, and they forward queries about the cluster to the server agents. @@ -76,7 +76,7 @@ Consul always runs under [dumb-init](https://github.com/Yelp/dumb-init), which h Running the Consul container with no arguments will give you a Consul server in [development mode](https://www.consul.io/docs/agent/options.html#_dev). The provided entry point script will also look for Consul subcommands and run `consul` as the correct user and with that subcommand. For example, you can execute `docker run consul members` and it will run the `consul members` command inside the container. The entry point also adds some special configuration options as detailed in the sections below when running the `agent` subcommand. Any other command gets `exec`-ed inside the container under `dumb-init`. -The container exposes `VOLUME /consul/data`, which is a path were Consul will place its persisted state. This isn't used in any way when running in development mode. For client agents, this stores some information about the cluster and the client's health checks in case the container is restarted. For server agents, this stores the client information plus snapshots and data related to the consensus algorithm and other state like Consul's key/value store and catalog. For servers it is highly desirable to keep this volume's data around when restarting containers to recover from outage scenarios. If this is bind mounted then ownership will be changed to the consul user when the container starts. +The container exposes `VOLUME /consul/data`, which is a path where Consul will place its persisted state. This isn't used in any way when running in development mode. For client agents, this stores some information about the cluster and the client's health checks in case the container is restarted. For server agents, this stores the client information plus snapshots and data related to the consensus algorithm and other state like Consul's key/value store and catalog. For servers it is highly desirable to keep this volume's data around when restarting containers to recover from outage scenarios. If this is bind mounted then ownership will be changed to the consul user when the container starts. The container has a Consul configuration directory set up at `/consul/config` and the agent will load any configuration files placed here by binding a volume or by composing a new image and adding files. Alternatively, configuration can be added by passing the configuration JSON via environment variable `CONSUL_LOCAL_CONFIG`. If this is bind mounted then ownership will be changed to the consul user when the container starts. diff --git a/consul/content.md b/consul/content.md index 1beacc20e035..5535d7a67745 100644 --- a/consul/content.md +++ b/consul/content.md @@ -9,7 +9,7 @@ Consul is a distributed, highly-available, and multi-datacenter aware tool for s # Consul and Docker -Consul has several moving parts so we'll start with a brief introduction to Consul's architecture and then detail how Consul interacts with Docker. Please see the [Consul Architecture](https://www.consul.io/docs/internals/architecture.html) guide for more detail on all these concepts. +Consul has several moving parts so we'll start with a brief introduction to Consul's architecture and then detail how Consul interacts with Docker. Please see the [Consul Architecture](https://www.consul.io/docs/architecture) guide for more detail on all these concepts. Each host in a Consul cluster runs the Consul agent, a long running daemon that can be started in client or server mode. Each cluster has at least 1 agent in server mode, and usually 3 or 5 for high availability. The server agents participate in a [consensus protocol](https://www.consul.io/docs/internals/consensus.html), maintain a centralized view of the cluster's state, and respond to queries from other agents in the cluster. The rest of the agents in client mode participate in a [gossip protocol](https://www.consul.io/docs/internals/gossip.html) to discover other agents and check them for failures, and they forward queries about the cluster to the server agents. @@ -27,7 +27,7 @@ Consul always runs under [dumb-init](https://github.com/Yelp/dumb-init), which h Running the Consul container with no arguments will give you a Consul server in [development mode](https://www.consul.io/docs/agent/options.html#_dev). The provided entry point script will also look for Consul subcommands and run `consul` as the correct user and with that subcommand. For example, you can execute `docker run %%IMAGE%% members` and it will run the `consul members` command inside the container. The entry point also adds some special configuration options as detailed in the sections below when running the `agent` subcommand. Any other command gets `exec`-ed inside the container under `dumb-init`. -The container exposes `VOLUME /consul/data`, which is a path were Consul will place its persisted state. This isn't used in any way when running in development mode. For client agents, this stores some information about the cluster and the client's health checks in case the container is restarted. For server agents, this stores the client information plus snapshots and data related to the consensus algorithm and other state like Consul's key/value store and catalog. For servers it is highly desirable to keep this volume's data around when restarting containers to recover from outage scenarios. If this is bind mounted then ownership will be changed to the consul user when the container starts. +The container exposes `VOLUME /consul/data`, which is a path where Consul will place its persisted state. This isn't used in any way when running in development mode. For client agents, this stores some information about the cluster and the client's health checks in case the container is restarted. For server agents, this stores the client information plus snapshots and data related to the consensus algorithm and other state like Consul's key/value store and catalog. For servers it is highly desirable to keep this volume's data around when restarting containers to recover from outage scenarios. If this is bind mounted then ownership will be changed to the consul user when the container starts. The container has a Consul configuration directory set up at `/consul/config` and the agent will load any configuration files placed here by binding a volume or by composing a new image and adding files. Alternatively, configuration can be added by passing the configuration JSON via environment variable `CONSUL_LOCAL_CONFIG`. If this is bind mounted then ownership will be changed to the consul user when the container starts. diff --git a/convertigo/README-short.txt b/convertigo/README-short.txt index baa852d773b2..3d2df5140a57 100644 --- a/convertigo/README-short.txt +++ b/convertigo/README-short.txt @@ -1 +1 @@ -Open source Low Code Application Platform featuring MXDP/MBaaS for full-stack development. \ No newline at end of file +Open source Low Code & No Code Application Platform featuring MXDP/MBaaS for full-stack development. \ No newline at end of file diff --git a/convertigo/README.md b/convertigo/README.md index 1f6e8cc1d74a..218bfcf3d880 100644 --- a/convertigo/README.md +++ b/convertigo/README.md @@ -20,11 +20,11 @@ WARNING: [Convertigo](https://github.com/convertigo/docker) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`7.8.0`, `7.8`, `latest`](https://github.com/convertigo/convertigo/blob/ffc9ab045f2e9bcc1103fb0bd00042d2527eeae5/docker/default/Dockerfile) +- [`8.1.0`, `8.1`, `latest`](https://github.com/convertigo/convertigo/blob/070f8a67e61a7a9bc701ddadae0a0a0fba9470a3/docker/default/Dockerfile) # Quick reference (cont.) @@ -39,19 +39,20 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/convertigo`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fconvertigo) + [official-images repo's `library/convertigo` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fconvertigo) [official-images repo's `library/convertigo` file](https://github.com/docker-library/official-images/blob/master/library/convertigo) ([history](https://github.com/docker-library/official-images/commits/master/library/convertigo)) - **Source of this description**: [docs repo's `convertigo/` directory](https://github.com/docker-library/docs/tree/master/convertigo) ([history](https://github.com/docker-library/docs/commits/master/convertigo)) -# What is Convertigo Mobility Platform ? +# What is Convertigo Low Code Platform ? -Convertigo is an open source Low Code Application Platform (LCAP) featuring MXDP (Multi eXperience Development Platform) / MBaaS (Mobile Back end as a Service) for full-stack mobile and web application development. The platform is used to build complex Cross-platform Enterprise Mobile apps in a few days. Convertigo platform is composed of several components: +Convertigo is an open source fullstack Low Code & No Code platform. The platform is used to build Enterprise Web & Mobile apps in a few days. Convertigo platform is composed of several components: -1. **Convertigo MBaaS**: The back-end MBaaS server part. Handles back-end connectors, micro-services execution, offline data device synchronization and serves Mobile Web apps. Runs as a Docker container with the `convertigo` image -2. **Convertigo Studio**: Runs on a Windows or a MacOS workstation, Eclipse based IDE, used to program MBaaS micro-services workflows and optionaly use the "Mobile Builder" edition to build Mobile apps UIs in a MXDP (Multi eXperience Development Platform) Low code mode. Can be directly downloaded from [Sourceforge.net](https://sourceforge.net/projects/convertigo/files/latest/download) -3. **Convertigo SDKs**: Can be used with third party Mobile development tools such as Xcode (iOS) Android Studio (Android) and Visual Studio (Windows Mobile, Windows UWP and Xamarin). SDKS are available on each platform standard repository (Bintray for Android, Cocoapods for iOS and Nuget for .NET) +1. **Convertigo Server**: The back-end server part. Handles back-end connectors, micro-services execution, offline data device synchronization and serves Web & Mobile Web apps. Runs as a Docker container with the `convertigo` image +2. **Convertigo Studio**: Runs on a Windows or a MacOS workstation, Eclipse based IDE, used to program Back-end micro-services workflows and use the "Mobile Builder" edition to build Mobile & Web apps UIs in a MXDP (Multi eXperience Development Platform) Low code mode. Can be directly downloaded from [Sourceforge.net](https://sourceforge.net/projects/convertigo/files/latest/download) +3. **Convertigo SDKs**: Can be used with third party Client Web & Mobile development tools such as Xcode (iOS) Android Studio (Android) Angualr, Vue.js or plain js . SDKS are available on each platform standard repository (Bintray for Android, Cocoapods for iOS and Nuget for .NET) +4. **Convertigo Forms**: The No Code App Builder to build form based apps as PWAs or Web applications with a Web Based NoCode studio intented for non technical developpers (Citizen Developpers) Convertigo Community edition brought to you by Convertigo SA (Paris & San Francisco). The platform is currently used by more than 100K developers worldwide, building enterprise class mobile apps. @@ -67,31 +68,43 @@ Convertigo Community edition brought to you by Convertigo SA (Paris & San Franci $ docker run --name C8O -d -p 28080:28080 convertigo ``` -This will start a container running the minimum Convertigo MBaaS server. Convertigo MBaaS uses images' **/workspace** directory to store configuration file and deployed projects as an Docker volume. +This will start a container running the minimum Convertigo server. Convertigo uses images' **/workspace** directory to store configuration file and deployed projects as an Docker volume. -You can access the Server admin console on http://[dockerhost]:28080/convertigo and login using the default credentials: admin / admin +You can access the Server admin console on `http://[dockerhost]:28080/convertigo` and login using the default credentials: `admin / admin`. + +The Server can also be accessed by HTTPS on `https://[dockerhost]:28443/convertigo` if SSL is configured (see the **HTTPS** section below). ## Link Convertigo to a CouchDB database for FullSync (Convertigo EE only) -Convertigo MBaaS FullSync module uses Apache CouchDB 2.3.1 as NoSQL repository. You can use the **[couchdb](https://hub.docker.com/_/couchdb/)** docker image and link to it convertigo this way +Convertigo FullSync module uses Apache CouchDB 3.2.2 as NoSQL repository. You can use the **[couchdb](https://hub.docker.com/_/couchdb/)** docker image and link to it convertigo this way Launch CouchDB container and name it 'fullsync' ```console -$ docker run -d --name fullsync couchdb:2.3.1 +$ docker run -d --name fullsync couchdb:3.2.2 ``` -Then launch Convertigo and link it to the running 'fullsync' container. Convertigo MBaaS sever will automatically use it as its fullsync repository. +Then launch Convertigo and link it to the running 'fullsync' container. Convertigo Low Code sever will automatically use it as its fullsync repository. ```console $ docker run -d --name C8O --link fullsync:couchdb -p 28080:28080 convertigo ``` -## Link Convertigo to a Billing & Analytics database +## Use embedded PouchDB as FullSync engine (not for production) + +Convertigo FullSync is designed to use CouchDB server or cluster. Convertigo FullSync is also compatible with PouchDB but only for little projects or tests. Internet access is required to enable this feature. + +It can be enabled directly at startup: + +```console +$ docker run -d --name C8O -e JAVA_OPTS="-Dconvertigo.engine.fullsync.pouchdb=true" -p 28080:28080 convertigo +``` + +## Link Convertigo Low Code Server to a Billing & Analytics database ### MySQL -MySQL is the recommended database for holding Convertigo MBaaS server analytics. You can use this command to run convertigo and link it to a running MySQL container. Change `[mysql-container]` to the container name, and `[username for the c8oAnalytics db]`, `[password for specified db user]` with the values for your MySQL configuration. +MySQL is the recommended database for holding Convertigo Low Code server analytics. You can use this command to run convertigo and link it to a running MySQL container. Change `[mysql-container]` to the container name, and `[username for the c8oAnalytics db]`, `[password for specified db user]` with the values for your MySQL configuration. ```console $ docker run -d --name C8O --link [mysql-container]:mysql -p 28080:28080 \ @@ -102,7 +115,7 @@ $ docker run -d --name C8O --link [mysql-container]:mysql -p 28080:28080 convertigo ``` -## Where is Convertigo MBaaS server storing deployed projects +## Where is Convertigo Low Code server storing deployed projects Projects are deployed in the Convertigo workspace, a simple file system directory. You can map the docker container **/workspace** to your physical system by using : @@ -110,21 +123,40 @@ Projects are deployed in the Convertigo workspace, a simple file system director $ docker run --name C8O -v $(pwd):/workspace -d -p 28080:28080 convertigo ``` -You can share the same workspace by all Convertigo containers. This this case, when you deploy a project on a Convertigo container, it will be seen by others. This is the best way to build multi-instance load balanced Convertigo server farms. +You can share the same workspace by all Convertigo containers. In this case, when you deploy a project on a Convertigo container, it will be seen by others. This is the best way to build multi-instance load balanced Convertigo server farms. + +**Be sure to have a really fast file sharing between instances !!! We have experienced that Azure File Share is not fast enough** + +To avoid log and cache mixing, you have to add 2 variables for instance specific paths: + +```console +-Dconvertigo.engine.cache_manager.filecache.directory=/workspace/cache/[instance name] +-Dconvertigo.engine.log4j.appender.CemsAppender.File=/workspace/logs/[instance name]/engine.log +``` + +## Make image with pre-deployed projects + +If you want to make a vertical image ready to start with your application inside, you have to have your built projects **.car** files next to your `Dockerfile`: + +```console +FROM convertigo +COPY myProject.car /usr/local/tomcat/webapps/convertigo/WEB-INF/default_user_workspace/projects/ +COPY myDependency.car /usr/local/tomcat/webapps/convertigo/WEB-INF/default_user_workspace/projects/ +``` -## Migrate from an earlier version of Convertigo +## Migrate from an earlier version of Convertigo Low Code Platform - Stop the container to perform a backup. And just back the workspace directory. This will backup all the projects definitions and some project data. -- Start a new Convertigo MBaaS docker container mapping the workspace +- Start a new Convertigo docker container mapping the workspace - All the workspace (Projects) will be automatically migrated to the new Convertigo MBaaS version ## Security -The default administration account of a Convertigo serveur is **admin** / **admin** and the **testplatform** is anonymous. +The default administration account of a Convertigo server is **admin** / **admin** and the **testplatform** is anonymous. -These accounts can be configured through the *administration console* and saved in the **workspace**. +These accounts can be configured through the **administration console** and saved in the **workspace**. -### `CONVERTIGO_ADMIN_USER` and `CONVERTIGO_ADMIN_PASSWORD` variables +### `CONVERTIGO_ADMIN_USER` and `CONVERTIGO_ADMIN_PASSWORD` Environment variables You can change the default administration account : @@ -132,7 +164,7 @@ You can change the default administration account : $ docker run -d --name C8O -e CONVERTIGO_ADMIN_USER=administrator -e CONVERTIGO_ADMIN_PASSWORD=s3cret -p 28080:28080 convertigo ``` -### `CONVERTIGO_TESTPLATFORM_USER` and `CONVERTIGO_TESTPLATFORM_PASSWORD` variables +### `CONVERTIGO_TESTPLATFORM_USER` and `CONVERTIGO_TESTPLATFORM_PASSWORD` Environment variables You can lock the **testplatform** by setting the account : @@ -140,16 +172,73 @@ You can lock the **testplatform** by setting the account : $ docker run -d --name C8O -e CONVERTIGO_TESTPLATFORM_USER=tp_user -e CONVERTIGO_TESTPLATFORM_PASSWORD=s3cret -p 28080:28080 convertigo ``` +## HTTPS / SSL Configuration + +In many cases, the Convertigo instance is behind a reverse proxy that handles HTTPS / SSL configuration. But you can configure the container to manage existing SSL certificates or dynamically generate one. + +If the SSL configuration is correct, the Convertigo Server will listen **HTTP** on port `28080` and **HTTPS** on port `28443`. + +### Provide existing certificate using the /ssl mount point + +If you have an existing certificate and a private key, you can put them in **PEM** format in a folder (or in a Kubernetes secret): + +- `key.pem` : the private key in PEM format (no password) +- `cert.pem` : the server certificate in PEM format, can also contain the full chain of certificates +- `chain.pem` : the optional chain of certificates not included in `cert.pem` using the PEM format + +```console +$ docker run -d --name C8O -v :/ssl -p 28443:28443 convertigo +``` + +If you want to expose both **HTTP** and **HTTPS** you can expose both **ports**: + +```console +$ docker run -d --name C8O -v :/ssl -p 28080:28080 -p 28443:28443 convertigo +``` + +### Provide existing certificate using environment variables + +If you cannot mount a volume, you can probably add environment variables of previously described files. Content cannot be set directly in a variable but their base64 version can. Here are the variables to configure: + +- `SSL_KEY_B64` : the private key in base64 PEM format (no password) +- `SSL_CERT_B64` : the server certificate in base64 PEM format, can also contain the full chain of certificates +- `SSL_CHAIN_B64` : the optional chain of certificates not included in `cert.pem` using the base64 PEM format + +```console +$ SSL_KEY_B64=$(base64 key.pem) +$ SSL_CERT_B64=$(base64 cert.pem) +$ SSL_CHAIN_B64=$(base64 chain.pem) +$ docker run -d --name C8O -e SSL_KEY_B64="$SSL_KEY_B64" -e SSL_CERT_B64="$SSL_CERT_B64" -e SSL_CHAIN_B64="$SSL_CHAIN_B64" -p 28443:28443 convertigo +``` + +### Generate and use a self-signed certificate + +If you don't have certificate file, you can dynamically generate one for the first start. This will be an untrusted certificate for Browsers and HTTPS clients. This shouldn't be used for production environment. + +Use the `SSL_SELFSIGNED` environment variable to indicate for what domain you want generate certificate. + +```console +$ docker run -d --name C8O -e SSL_SELFSIGNED=mycomputer -p 28443:28443 convertigo +``` + +Generated files can be retrieved if the `/ssl` mount point is configured on folder without `cert.pem` nor `key.pem`. + +```console +$ docker run -d --name C8O -v :/ssl -e SSL_SELFSIGNED=mycomputer -p 28443:28443 convertigo +``` + ## `JAVA_OPTS` Environment variable -Convertigo is based on a *Java* process with some defaults *JVM* options. You can override our defaults *JVM* options with you own. +Convertigo is based on a **Java** process with some defaults **JVM** options. You can override our defaults **JVM** options with you own. -Add any *Java JVM* options such as -D[something] : +Add any **Java JVM** options such as -D[something] : ```console $ docker run -d --name C8O -e JAVA_OPTS="-DjvmRoute=server1" -p 28080:28080 convertigo ``` +[Here the list of convertigo specific properties](https://www.convertigo.com/documentation/latest/operating-guide/appendixes/#list-of-convertigo-java-system-properties) (don't forget the `-Dconvertigo.engine.` prefix). + ## `JXMX` Environment variable Convertigo tries to allocate this amount of memory in the container and will automatically reduce it until the value is compatible for the Docker memory constraints. Once the best value found, it is used as `-Xmx=${JXMX}m` parameter for the JVM. @@ -162,7 +251,7 @@ $ docker run -d --name C8O -e JXMX="4096" -p 28080:28080 convertigo ## `COOKIE_PATH` Environment variable -Convertigo generates a `JSESSIONID` to maintain the user session and stores in a *cookie*. The *cookie* is set for the server path `/` by default. In case of a front server with multiple services for different paths, you can set a path restriction for the *cookie* with the `JSESSIONID`. Just define the `COOKIE_PATH` environment variable with a compatible path. +Convertigo generates a `JSESSIONID` to maintain the user session and stores in a **cookie**. The **cookie** is set for the server path `/` by default. In case of a front server with multiple services for different paths, you can set a path restriction for the **cookie** with the `JSESSIONID`. Just define the `COOKIE_PATH` environment variable with a compatible path. The default `COOKIE_PATH` value is `/` and can be defined : @@ -172,9 +261,9 @@ $ docker run -d --name C8O -e COOKIE_PATH="/convertigo" -p 28080:28080 convertig ## `COOKIE_SECURE` Environment variable -Convertigo use a *cookie* to maintain sessions. Requests on port `28080` are *HTTP* but we advice to use an *HTTPS* front for production (nginx, kubenetes ingress, ...). In this case, you can secure yours cookies to be used only with secured connections by adding the `Secure` flag. +Convertigo uses a **cookie** to maintain sessions. Requests on port `28080` are **HTTP** but we advise to use an **HTTPS** front for production (nginx, kubernetes ingress, ...). In this case, you can secure your cookies to be used only with secured connections by adding the `Secure` flag. -The Secure flag can be enabled by setting the `COOKIE_SECURE` environment variable to `true`. Once enabled, cookies and sessions aren't working through an *HTTP* connection. +The Secure flag can be enabled by setting the `COOKIE_SECURE` environment variable to `true`. Once enabled, cookies and sessions aren't working through an **HTTP** connection. The default `COOKIE_SECURE` value is `false` and can be defined : @@ -182,9 +271,41 @@ The default `COOKIE_SECURE` value is `false` and can be defined : $ docker run -d --name C8O -e COOKIE_SECURE="true" -p 28080:28080 convertigo ``` +**Note :** if you have set the **SSL** configuration and you access the **HTTPS 28443** port, cookies are automatically `Secure`. + +## `COOKIE_SAMESITE` Environment variable + +Allow to configure the **SameSite** parameter for generated cookies. Can be empty, `none`, `lax` or `strict`. + +The default `COOKIE_SAMESITE` value is **empty** and can be defined this way: + +```console +$ docker run -d --name C8O -e COOKIE_SAMESITE=lax -p 28080:28080 convertigo +``` + +## `SESSION_TIMEOUT` Environment variable + +Allow to configure the default Tomcat **session-timeout** in minutes. This value is used for non-project calls (Administration console, Fullsync...). This value is overridden by each projects' calls (Sequence, Transaction ...). + +The default `SESSION_TIMEOUT` value is **30** and can be defined this way: + +```console +$ docker run -d --name C8O -e SESSION_TIMEOUT=5 -p 28080:28080 convertigo +``` + +## `DISABLE_SUDO` Environment variable + +The image include **sudo** command line, configured to allow the **convertigo** user to use it without password and to perform some **root** action inside the container. This variable allows to disable this permission. + +The default `DISABLE_SUDO` value is **empty** and can be defined this way: + +```console +$ docker run -d --name C8O -e DISABLE_SUDO=true -p 28080:28080 convertigo +``` + ## Pre configurated Docker compose stack -You can use this [stack](https://github.com/convertigo/docker/blob/master/compose/mbaas/docker-compose.yml) to run a complete Convertigo MBaaS server with FullSync repository and MySQL analytics in a few command lines. +You can use this [stack](https://github.com/convertigo/docker/blob/master/compose/mbaas/docker-compose.yml) to run a complete Convertigo Low Code server with FullSync repository and MySQL analytics in a few command lines. ```console $ mkdir c8oMBaaS @@ -195,7 +316,7 @@ $ docker-compose up -d # License -Convertigo Community Edition MBaaS image is licenced under [AGPL 3.0](http://www.gnu.org/licenses/agpl-3.0.html) +Convertigo Community Edition image is licenced under [AGPL 3.0](http://www.gnu.org/licenses/agpl-3.0.html) 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). diff --git a/convertigo/content.md b/convertigo/content.md index c3cb38d55fd6..dbcff92d7603 100644 --- a/convertigo/content.md +++ b/convertigo/content.md @@ -1,10 +1,11 @@ -# What is Convertigo Mobility Platform ? +# What is Convertigo Low Code Platform ? -Convertigo is an open source Low Code Application Platform (LCAP) featuring MXDP (Multi eXperience Development Platform) / MBaaS (Mobile Back end as a Service) for full-stack mobile and web application development. The platform is used to build complex Cross-platform Enterprise Mobile apps in a few days. Convertigo platform is composed of several components: +Convertigo is an open source fullstack Low Code & No Code platform. The platform is used to build Enterprise Web & Mobile apps in a few days. Convertigo platform is composed of several components: -1. **Convertigo MBaaS**: The back-end MBaaS server part. Handles back-end connectors, micro-services execution, offline data device synchronization and serves Mobile Web apps. Runs as a Docker container with the `convertigo` image -2. **Convertigo Studio**: Runs on a Windows or a MacOS workstation, Eclipse based IDE, used to program MBaaS micro-services workflows and optionaly use the "Mobile Builder" edition to build Mobile apps UIs in a MXDP (Multi eXperience Development Platform) Low code mode. Can be directly downloaded from [Sourceforge.net](https://sourceforge.net/projects/convertigo/files/latest/download) -3. **Convertigo SDKs**: Can be used with third party Mobile development tools such as Xcode (iOS) Android Studio (Android) and Visual Studio (Windows Mobile, Windows UWP and Xamarin). SDKS are available on each platform standard repository (Bintray for Android, Cocoapods for iOS and Nuget for .NET) +1. **Convertigo Server**: The back-end server part. Handles back-end connectors, micro-services execution, offline data device synchronization and serves Web & Mobile Web apps. Runs as a Docker container with the `convertigo` image +2. **Convertigo Studio**: Runs on a Windows or a MacOS workstation, Eclipse based IDE, used to program Back-end micro-services workflows and use the "Mobile Builder" edition to build Mobile & Web apps UIs in a MXDP (Multi eXperience Development Platform) Low code mode. Can be directly downloaded from [Sourceforge.net](https://sourceforge.net/projects/convertigo/files/latest/download) +3. **Convertigo SDKs**: Can be used with third party Client Web & Mobile development tools such as Xcode (iOS) Android Studio (Android) Angualr, Vue.js or plain js . SDKS are available on each platform standard repository (Bintray for Android, Cocoapods for iOS and Nuget for .NET) +4. **Convertigo Forms**: The No Code App Builder to build form based apps as PWAs or Web applications with a Web Based NoCode studio intented for non technical developpers (Citizen Developpers) Convertigo Community edition brought to you by Convertigo SA (Paris & San Francisco). The platform is currently used by more than 100K developers worldwide, building enterprise class mobile apps. @@ -20,31 +21,43 @@ Convertigo Community edition brought to you by Convertigo SA (Paris & San Franci $ docker run --name C8O -d -p 28080:28080 %%IMAGE%% ``` -This will start a container running the minimum Convertigo MBaaS server. Convertigo MBaaS uses images' **/workspace** directory to store configuration file and deployed projects as an Docker volume. +This will start a container running the minimum Convertigo server. Convertigo uses images' **/workspace** directory to store configuration file and deployed projects as an Docker volume. -You can access the Server admin console on http://[dockerhost]:28080/convertigo and login using the default credentials: admin / admin +You can access the Server admin console on `http://[dockerhost]:28080/convertigo` and login using the default credentials: `admin / admin`. + +The Server can also be accessed by HTTPS on `https://[dockerhost]:28443/convertigo` if SSL is configured (see the **HTTPS** section below). ## Link Convertigo to a CouchDB database for FullSync (Convertigo EE only) -Convertigo MBaaS FullSync module uses Apache CouchDB 2.3.1 as NoSQL repository. You can use the **[couchdb](https://hub.docker.com/_/couchdb/)** docker image and link to it convertigo this way +Convertigo FullSync module uses Apache CouchDB 3.2.2 as NoSQL repository. You can use the **[couchdb](https://hub.docker.com/_/couchdb/)** docker image and link to it convertigo this way Launch CouchDB container and name it 'fullsync' ```console -$ docker run -d --name fullsync couchdb:2.3.1 +$ docker run -d --name fullsync couchdb:3.2.2 ``` -Then launch Convertigo and link it to the running 'fullsync' container. Convertigo MBaaS sever will automatically use it as its fullsync repository. +Then launch Convertigo and link it to the running 'fullsync' container. Convertigo Low Code sever will automatically use it as its fullsync repository. ```console $ docker run -d --name C8O --link fullsync:couchdb -p 28080:28080 %%IMAGE%% ``` -## Link Convertigo to a Billing & Analytics database +## Use embedded PouchDB as FullSync engine (not for production) + +Convertigo FullSync is designed to use CouchDB server or cluster. Convertigo FullSync is also compatible with PouchDB but only for little projects or tests. Internet access is required to enable this feature. + +It can be enabled directly at startup: + +```console +$ docker run -d --name C8O -e JAVA_OPTS="-Dconvertigo.engine.fullsync.pouchdb=true" -p 28080:28080 %%IMAGE%% +``` + +## Link Convertigo Low Code Server to a Billing & Analytics database ### MySQL -MySQL is the recommended database for holding Convertigo MBaaS server analytics. You can use this command to run convertigo and link it to a running MySQL container. Change `[mysql-container]` to the container name, and `[username for the c8oAnalytics db]`, `[password for specified db user]` with the values for your MySQL configuration. +MySQL is the recommended database for holding Convertigo Low Code server analytics. You can use this command to run convertigo and link it to a running MySQL container. Change `[mysql-container]` to the container name, and `[username for the c8oAnalytics db]`, `[password for specified db user]` with the values for your MySQL configuration. ```console $ docker run -d --name C8O --link [mysql-container]:mysql -p 28080:28080 \ @@ -52,10 +65,10 @@ $ docker run -d --name C8O --link [mysql-container]:mysql -p 28080:28080 -Dconvertigo.engine.billing.persistence.jdbc.username=[username for the c8oAnalytics db] \ -Dconvertigo.engine.billing.persistence.jdbc.password=[password for specified db user] \ -Dconvertigo.engine.billing.persistence.jdbc.url=jdbc:mysql://mysql:3306/c8oAnalytics" \ -convertigo +%%IMAGE%% ``` -## Where is Convertigo MBaaS server storing deployed projects +## Where is Convertigo Low Code server storing deployed projects Projects are deployed in the Convertigo workspace, a simple file system directory. You can map the docker container **/workspace** to your physical system by using : @@ -63,21 +76,40 @@ Projects are deployed in the Convertigo workspace, a simple file system director $ docker run --name C8O -v $(pwd):/workspace -d -p 28080:28080 %%IMAGE%% ``` -You can share the same workspace by all Convertigo containers. This this case, when you deploy a project on a Convertigo container, it will be seen by others. This is the best way to build multi-instance load balanced Convertigo server farms. +You can share the same workspace by all Convertigo containers. In this case, when you deploy a project on a Convertigo container, it will be seen by others. This is the best way to build multi-instance load balanced Convertigo server farms. + +**Be sure to have a really fast file sharing between instances !!! We have experienced that Azure File Share is not fast enough** + +To avoid log and cache mixing, you have to add 2 variables for instance specific paths: + +```console +-Dconvertigo.engine.cache_manager.filecache.directory=/workspace/cache/[instance name] +-Dconvertigo.engine.log4j.appender.CemsAppender.File=/workspace/logs/[instance name]/engine.log +``` + +## Make image with pre-deployed projects + +If you want to make a vertical image ready to start with your application inside, you have to have your built projects **.car** files next to your `Dockerfile`: + +```console +FROM %%IMAGE%% +COPY myProject.car /usr/local/tomcat/webapps/convertigo/WEB-INF/default_user_workspace/projects/ +COPY myDependency.car /usr/local/tomcat/webapps/convertigo/WEB-INF/default_user_workspace/projects/ +``` -## Migrate from an earlier version of Convertigo +## Migrate from an earlier version of Convertigo Low Code Platform - Stop the container to perform a backup. And just back the workspace directory. This will backup all the projects definitions and some project data. -- Start a new Convertigo MBaaS docker container mapping the workspace +- Start a new Convertigo docker container mapping the workspace - All the workspace (Projects) will be automatically migrated to the new Convertigo MBaaS version ## Security -The default administration account of a Convertigo serveur is **admin** / **admin** and the **testplatform** is anonymous. +The default administration account of a Convertigo server is **admin** / **admin** and the **testplatform** is anonymous. -These accounts can be configured through the *administration console* and saved in the **workspace**. +These accounts can be configured through the **administration console** and saved in the **workspace**. -### `CONVERTIGO_ADMIN_USER` and `CONVERTIGO_ADMIN_PASSWORD` variables +### `CONVERTIGO_ADMIN_USER` and `CONVERTIGO_ADMIN_PASSWORD` Environment variables You can change the default administration account : @@ -85,7 +117,7 @@ You can change the default administration account : $ docker run -d --name C8O -e CONVERTIGO_ADMIN_USER=administrator -e CONVERTIGO_ADMIN_PASSWORD=s3cret -p 28080:28080 %%IMAGE%% ``` -### `CONVERTIGO_TESTPLATFORM_USER` and `CONVERTIGO_TESTPLATFORM_PASSWORD` variables +### `CONVERTIGO_TESTPLATFORM_USER` and `CONVERTIGO_TESTPLATFORM_PASSWORD` Environment variables You can lock the **testplatform** by setting the account : @@ -93,16 +125,73 @@ You can lock the **testplatform** by setting the account : $ docker run -d --name C8O -e CONVERTIGO_TESTPLATFORM_USER=tp_user -e CONVERTIGO_TESTPLATFORM_PASSWORD=s3cret -p 28080:28080 %%IMAGE%% ``` +## HTTPS / SSL Configuration + +In many cases, the Convertigo instance is behind a reverse proxy that handles HTTPS / SSL configuration. But you can configure the container to manage existing SSL certificates or dynamically generate one. + +If the SSL configuration is correct, the Convertigo Server will listen **HTTP** on port `28080` and **HTTPS** on port `28443`. + +### Provide existing certificate using the /ssl mount point + +If you have an existing certificate and a private key, you can put them in **PEM** format in a folder (or in a Kubernetes secret): + +- `key.pem` : the private key in PEM format (no password) +- `cert.pem` : the server certificate in PEM format, can also contain the full chain of certificates +- `chain.pem` : the optional chain of certificates not included in `cert.pem` using the PEM format + +```console +$ docker run -d --name C8O -v :/ssl -p 28443:28443 %%IMAGE%% +``` + +If you want to expose both **HTTP** and **HTTPS** you can expose both **ports**: + +```console +$ docker run -d --name C8O -v :/ssl -p 28080:28080 -p 28443:28443 %%IMAGE%% +``` + +### Provide existing certificate using environment variables + +If you cannot mount a volume, you can probably add environment variables of previously described files. Content cannot be set directly in a variable but their base64 version can. Here are the variables to configure: + +- `SSL_KEY_B64` : the private key in base64 PEM format (no password) +- `SSL_CERT_B64` : the server certificate in base64 PEM format, can also contain the full chain of certificates +- `SSL_CHAIN_B64` : the optional chain of certificates not included in `cert.pem` using the base64 PEM format + +```console +$ SSL_KEY_B64=$(base64 key.pem) +$ SSL_CERT_B64=$(base64 cert.pem) +$ SSL_CHAIN_B64=$(base64 chain.pem) +$ docker run -d --name C8O -e SSL_KEY_B64="$SSL_KEY_B64" -e SSL_CERT_B64="$SSL_CERT_B64" -e SSL_CHAIN_B64="$SSL_CHAIN_B64" -p 28443:28443 %%IMAGE%% +``` + +### Generate and use a self-signed certificate + +If you don't have certificate file, you can dynamically generate one for the first start. This will be an untrusted certificate for Browsers and HTTPS clients. This shouldn't be used for production environment. + +Use the `SSL_SELFSIGNED` environment variable to indicate for what domain you want generate certificate. + +```console +$ docker run -d --name C8O -e SSL_SELFSIGNED=mycomputer -p 28443:28443 %%IMAGE%% +``` + +Generated files can be retrieved if the `/ssl` mount point is configured on folder without `cert.pem` nor `key.pem`. + +```console +$ docker run -d --name C8O -v :/ssl -e SSL_SELFSIGNED=mycomputer -p 28443:28443 %%IMAGE%% +``` + ## `JAVA_OPTS` Environment variable -Convertigo is based on a *Java* process with some defaults *JVM* options. You can override our defaults *JVM* options with you own. +Convertigo is based on a **Java** process with some defaults **JVM** options. You can override our defaults **JVM** options with you own. -Add any *Java JVM* options such as -D[something] : +Add any **Java JVM** options such as -D[something] : ```console $ docker run -d --name C8O -e JAVA_OPTS="-DjvmRoute=server1" -p 28080:28080 %%IMAGE%% ``` +[Here the list of convertigo specific properties](https://www.convertigo.com/documentation/latest/operating-guide/appendixes/#list-of-convertigo-java-system-properties) (don't forget the `-Dconvertigo.engine.` prefix). + ## `JXMX` Environment variable Convertigo tries to allocate this amount of memory in the container and will automatically reduce it until the value is compatible for the Docker memory constraints. Once the best value found, it is used as `-Xmx=${JXMX}m` parameter for the JVM. @@ -115,7 +204,7 @@ $ docker run -d --name C8O -e JXMX="4096" -p 28080:28080 %%IMAGE%% ## `COOKIE_PATH` Environment variable -Convertigo generates a `JSESSIONID` to maintain the user session and stores in a *cookie*. The *cookie* is set for the server path `/` by default. In case of a front server with multiple services for different paths, you can set a path restriction for the *cookie* with the `JSESSIONID`. Just define the `COOKIE_PATH` environment variable with a compatible path. +Convertigo generates a `JSESSIONID` to maintain the user session and stores in a **cookie**. The **cookie** is set for the server path `/` by default. In case of a front server with multiple services for different paths, you can set a path restriction for the **cookie** with the `JSESSIONID`. Just define the `COOKIE_PATH` environment variable with a compatible path. The default `COOKIE_PATH` value is `/` and can be defined : @@ -125,9 +214,9 @@ $ docker run -d --name C8O -e COOKIE_PATH="/convertigo" -p 28080:28080 %%IMAGE%% ## `COOKIE_SECURE` Environment variable -Convertigo use a *cookie* to maintain sessions. Requests on port `28080` are *HTTP* but we advice to use an *HTTPS* front for production (nginx, kubenetes ingress, ...). In this case, you can secure yours cookies to be used only with secured connections by adding the `Secure` flag. +Convertigo uses a **cookie** to maintain sessions. Requests on port `28080` are **HTTP** but we advise to use an **HTTPS** front for production (nginx, kubernetes ingress, ...). In this case, you can secure your cookies to be used only with secured connections by adding the `Secure` flag. -The Secure flag can be enabled by setting the `COOKIE_SECURE` environment variable to `true`. Once enabled, cookies and sessions aren't working through an *HTTP* connection. +The Secure flag can be enabled by setting the `COOKIE_SECURE` environment variable to `true`. Once enabled, cookies and sessions aren't working through an **HTTP** connection. The default `COOKIE_SECURE` value is `false` and can be defined : @@ -135,9 +224,41 @@ The default `COOKIE_SECURE` value is `false` and can be defined : $ docker run -d --name C8O -e COOKIE_SECURE="true" -p 28080:28080 %%IMAGE%% ``` +**Note :** if you have set the **SSL** configuration and you access the **HTTPS 28443** port, cookies are automatically `Secure`. + +## `COOKIE_SAMESITE` Environment variable + +Allow to configure the **SameSite** parameter for generated cookies. Can be empty, `none`, `lax` or `strict`. + +The default `COOKIE_SAMESITE` value is **empty** and can be defined this way: + +```console +$ docker run -d --name C8O -e COOKIE_SAMESITE=lax -p 28080:28080 %%IMAGE%% +``` + +## `SESSION_TIMEOUT` Environment variable + +Allow to configure the default Tomcat **session-timeout** in minutes. This value is used for non-project calls (Administration console, Fullsync...). This value is overridden by each projects' calls (Sequence, Transaction ...). + +The default `SESSION_TIMEOUT` value is **30** and can be defined this way: + +```console +$ docker run -d --name C8O -e SESSION_TIMEOUT=5 -p 28080:28080 %%IMAGE%% +``` + +## `DISABLE_SUDO` Environment variable + +The image include **sudo** command line, configured to allow the **convertigo** user to use it without password and to perform some **root** action inside the container. This variable allows to disable this permission. + +The default `DISABLE_SUDO` value is **empty** and can be defined this way: + +```console +$ docker run -d --name C8O -e DISABLE_SUDO=true -p 28080:28080 %%IMAGE%% +``` + ## Pre configurated Docker compose stack -You can use this [stack](https://github.com/convertigo/docker/blob/master/compose/mbaas/docker-compose.yml) to run a complete Convertigo MBaaS server with FullSync repository and MySQL analytics in a few command lines. +You can use this [stack](https://github.com/convertigo/docker/blob/master/compose/mbaas/docker-compose.yml) to run a complete Convertigo Low Code server with FullSync repository and MySQL analytics in a few command lines. ```console $ mkdir c8oMBaaS diff --git a/convertigo/license.md b/convertigo/license.md index b4c7d60615c6..a663fafda20f 100644 --- a/convertigo/license.md +++ b/convertigo/license.md @@ -1 +1 @@ -Convertigo Community Edition MBaaS image is licenced under [AGPL 3.0](http://www.gnu.org/licenses/agpl-3.0.html) +Convertigo Community Edition image is licenced under [AGPL 3.0](http://www.gnu.org/licenses/agpl-3.0.html) diff --git a/couchbase/README.md b/couchbase/README.md index ceafaf3dd04c..9a11223011b2 100644 --- a/couchbase/README.md +++ b/couchbase/README.md @@ -20,13 +20,16 @@ WARNING: [the Couchbase Docker Team](https://github.com/couchbase/docker) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`latest`, `enterprise`, `6.5.1`, `enterprise-6.5.1`](https://github.com/couchbase/docker/blob/46de65611374973ecf7ec28b0c582a8175d3bda0/enterprise/couchbase-server/6.5.1/Dockerfile) -- [`enterprise-6.5.0`](https://github.com/couchbase/docker/blob/46de65611374973ecf7ec28b0c582a8175d3bda0/enterprise/couchbase-server/6.5.0/Dockerfile) -- [`community`, `community-6.5.1`](https://github.com/couchbase/docker/blob/f17df7695bbd6efb756b90b683bd5f34d08b5708/community/couchbase-server/6.5.1/Dockerfile) +- [`7.1.3`, `enterprise-7.1.3`, `enterprise`, `latest`](https://github.com/couchbase/docker/blob/ae715392f6a8bff71ce2e5e99d62492d19c85dd2/enterprise/couchbase-server/7.1.3/Dockerfile) +- [`community-7.1.1`, `community`](https://github.com/couchbase/docker/blob/bfbb82c084ca3ada6252afbbcb3ca94bb65f1e58/community/couchbase-server/7.1.1/Dockerfile) +- [`7.0.5`, `enterprise-7.0.5`](https://github.com/couchbase/docker/blob/ca816b6ffa5c36007bd4b3386ec24df081a00ea0/enterprise/couchbase-server/7.0.5/Dockerfile) +- [`community-7.0.2`](https://github.com/couchbase/docker/blob/aec4494ab5280caf567997d72714f57572a6315b/community/couchbase-server/7.0.2/Dockerfile) +- [`6.6.5`, `enterprise-6.6.5`](https://github.com/couchbase/docker/blob/aad4aa9714578906c0c993121654eaeba0bd907c/enterprise/couchbase-server/6.6.5/Dockerfile) +- [`community-6.6.0`](https://github.com/couchbase/docker/blob/aad4aa9714578906c0c993121654eaeba0bd907c/community/couchbase-server/6.6.0/Dockerfile) # Quick reference (cont.) @@ -34,126 +37,137 @@ WARNING: [https://github.com/couchbase/docker/issues](https://github.com/couchbase/docker/issues) - **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) - [`amd64`](https://hub.docker.com/r/amd64/couchbase/) + [`amd64`](https://hub.docker.com/r/amd64/couchbase/), [`arm64v8`](https://hub.docker.com/r/arm64v8/couchbase/) - **Published image artifact details**: [repo-info repo's `repos/couchbase/` directory](https://github.com/docker-library/repo-info/blob/master/repos/couchbase) ([history](https://github.com/docker-library/repo-info/commits/master/repos/couchbase)) (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/couchbase`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fcouchbase) + [official-images repo's `library/couchbase` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fcouchbase) [official-images repo's `library/couchbase` file](https://github.com/docker-library/official-images/blob/master/library/couchbase) ([history](https://github.com/docker-library/official-images/commits/master/library/couchbase)) - **Source of this description**: [docs repo's `couchbase/` directory](https://github.com/docker-library/docs/tree/master/couchbase) ([history](https://github.com/docker-library/docs/commits/master/couchbase)) -# What is Couchbase Server? +# Introduction to Couchbase Server -This README will guide you through running Couchbase Server with Docker Containers. +Built on the most powerful NoSQL technology, Couchbase Server delivers unparalleled performance at scale, in any cloud. With features like memory-first architecture, geo-distributed deployments, and workload isolation, Couchbase Server excels at supporting mission-critical applications at scale while maintaining sub-millisecond latencies and 99.999% availability. Plus, with the most comprehensive SQL-compatible query language (N1QL), migrating from RDBMS to Couchbase Server is easy with ANSI join. -[Couchbase Server](http://www.couchbase.com/nosql-databases/couchbase-server) is a NoSQL document database with a distributed architecture for performance, scalability, and availability. It enables developers to build applications easier and faster by leveraging the power of SQL with the flexibility of JSON. +## Unmatched agility and flexibility -For additional questions and feedback, please visit the [Couchbase Forums](https://forums.couchbase.com/) or [Stack Overflow](http://stackoverflow.com/questions/tagged/couchbase). +Support rapidly changing business requirements with the flexibility of JSON and the power of a comprehensive query language (N1QL). Develop engaging applications with multiple access methods from a single platform: key-value, query, and search. Event-driven workloads allow you to execute data-driven business logic from a centralized platform. + +## Unparalleled performance at any scale + +Deliver consistent, fast experiences at scale, powered by a memory-first architecture. High-performance indexes and index partitioning provides unparalleled query performance with complex joins, predicates, and aggregate evaluations. And, with end-to-end data compression, Couchbase significantly reduces the cost of network, memory, and storage required for your existing workloads. + +## Easiest platform to manage + +Deploy Couchbase Server in any cloud, at any scale. Reduce operational overhead with cloud integrations like Kubernetes, and support multi-cloud deployments globally with built-in support for active-active cross datacenter replication (XDCR). ![logo](https://raw.githubusercontent.com/docker-library/docs/00543c65b06a7f8f54aa4f7908f7d91705d8ddec/couchbase/logo.png) -# QuickStart with Couchbase Server and Docker +## QuickStart with Couchbase Server and Docker Here is how to get a single node Couchbase Server cluster running on Docker containers: -**Step - 1 :** Run Couchbase Server docker container +**Step - 1 :** Run Couchbase Server docker container + +`docker run -d --name db -p 8091-8097:8091-8097 -p 9123:9123 -p 11207:11207 -p 11210:11210 -p 11280:11280 -p 18091-18097:18091-18097 couchbase` -`docker run -d --name db -p 8091-8094:8091-8094 -p 11210:11210 couchbase` +Note: Couchbase Server can require a variety of ports to be exposed depending on the usage scenario. Please see https://docs.couchbase.com/server/current/install/install-ports.html for further information. -**Step - 2 :** Next, visit `http://localhost:8091` on the host machine to see the Web Console to start Couchbase Server setup. +**Step - 2 :** Next, visit `http://localhost:8091` on the host machine to see the Web Console to start Couchbase Server setup. -![setup splash screen](https://raw.githubusercontent.com/cihanb/docker/master/generate/resources/couchbase-server/images/setup-initial.jpg) +![Setup splash screen](https://d774lla4im6mk.cloudfront.net/setup-initial.jpg) Walk through the Setup wizard and accept the default values. - Note: You may need to lower the RAM allocated to various services to fit within the bounds of the resource of the containers. - Enable the beer-sample bucket to load some sample data. -![setup step-1 screen](https://raw.githubusercontent.com/cihanb/docker/master/generate/resources/couchbase-server/images/setup-step1.jpg) +![Creating a cluster](https://d774lla4im6mk.cloudfront.net/cluster-creation.jpg) -**Note :** For detailed information on configuring the Server, see [Initial Couchbase Server Setup](http://developer.couchbase.com/documentation/server/4.5/install/init-setup.html). +![Completing the wizard](https://d774lla4im6mk.cloudfront.net/finish-wizard.jpg) -## Running A N1QL Query on the Couchbase Server Cluster +![UI home](https://d774lla4im6mk.cloudfront.net/ui-home.jpg) -N1QL is the SQL based query language for Couchbase Server. Simply switch to the Query tab on the Web Console at `http://localhost:8091` and run the following N1QL Query in the query window: +![Loading sample data](https://d774lla4im6mk.cloudfront.net/load-sample-data.jpg) - SELECT name FROM `beer-sample` WHERE brewery_id ="mishawaka_brewing"; +**Note :** For detailed information on configuring the Server, see [Deployment Guidelines](https://docs.couchbase.com/server/current/install/install-production-deployment.html). -You can also execute N1QL queries from the commandline. To run a query from command line query tool, run the interactive shell on the container: +### Running A N1QL Query on the Couchbase Server Cluster -`docker exec -it db sh` +N1QL is the SQL based query language for Couchbase Server. Simply switch to the Query tab on the Web Console at `http://localhost:8091` and run the following N1QL Query in the query window: -Then, navigate to the `bin` directory under Couchbase Server installation and run cbq command line tool and execute the N1QL Query on `beer-sample` bucket + SELECT name FROM `beer-sample` WHERE brewery_id="mishawaka_brewing"; -`/opt/couchbase/bin/cbq` +You can also execute N1QL queries from the command line. To run a query from command line query tool, run the cbq command line tool, authenticating using the credentials you provided to the wizard, and execute the N1QL Query on the beer-sample bucket - cbq> SELECT name FROM `beer-sample` WHERE brewery_id ="mishawaka_brewing"; +```console +$ docker exec -it db cbq --user Administrator +cbq> SELECT name FROM `beer-sample` WHERE brewery_id ="mishawaka_brewing"; +``` -For more query samples, refer to the [Running your first N1QL query](http://developer.couchbase.com/documentation/server/4.5/getting-started/first-n1ql-query.html) guide. +For more query samples, refer to [Run your first N1QL query](https://docs.couchbase.com/server/current/getting-started/try-a-query.html). -## Connect to the Couchbase Server Cluster via Applications and SDKs +### Connect to the Couchbase Server Cluster via Applications and SDKs -Couchbase Server SDKs comes in many languages: C SDK 2.4/2.5 Go, Java, .NET, Node.js, PHP, Python. Simply run your application through the Couchbase Server SDK of your choice on the host, and point it to http://localhost:8091/pools to connect to the container. +Couchbase Server SDKs comes in many languages: C, Go, Java, .NET, Node.js, PHP, Python. Simply run your application through the Couchbase Server SDK of your choice on the host, and point it to [http://localhost:8091/pools](http://localhost:8091/pools) to connect to the container. -For running a sample application, refer to the [Running a sample Web app](http://developer.couchbase.com/documentation/server/4.5/travel-app/index.html) guide. +For running a sample application, refer to the [Sample Application](https://docs.couchbase.com/java-sdk/current/hello-world/sample-application.html) guide. -# Requirements and Best Practices +## Requirements and Best Practices -## Container Requirements +### Container Requirements -Official Couchbase Server containers on Docker Hub are based on Ubuntu 14.04. +Official Couchbase Server images on Docker Hub are based on the latest supported version of Ubuntu. -**Docker Container Resource Requirements :** For minimum container requirements, you can follow [Couchbase Server minimum HW recommendations](http://developer.couchbase.com/documentation/server/current/install/pre-install.html) for development, test and production environments. +**Docker Container Resource Requirements :** For minimum container requirements, you can follow [System Resource Requirements](https://docs.couchbase.com/server/current/install/pre-install.html) for development, test and production environments. -## Best Practices +### Best Practices -**Avoid a Single Point of Failure :** Couchbase Server's resilience and high-availability are achieved through creating a cluster of independent nodes and replicating data between them so that any individual node failure doesn't lead to loss of access to your data. In a containerized environment, if you were to run multiple nodes on the same piece of physical hardware, you can inadvertently re-introduce a single point of failure. In environments where you control VM placement, we advise ensuring each Couchbase Server node runs on a different piece of physical hardware. +**Avoid a Single Point of Failure :** Couchbase Server's resilience and high-availability are achieved through creating a cluster of independent nodes and replicating data between them so that any individual node failure doesn't lead to loss of access to your data. In a containerized environment, if you were to run multiple nodes on the same piece of physical hardware, you can inadvertently re-introduce a single point of failure. In environments where you control VM placement, we advise ensuring each Couchbase Server node runs on a different piece of physical hardware. -**Sizing your containers :** Physical hardware performance characteristics are well understood. Even though containers insert a lightweight layer between Couchbase Server and the underlying OS, there is still a small overhead in running Couchbase Server in containers. For stability and better performance predictability, It is recommended to have at least 2 cores dedicated to the container in development environments and 4 cores dedicated to the container rather than shared across multiple containers for Couchbase Server instances running in production. With an over-committed environment you can end up with containers competing with each other causing unpredictable performance and sometimes stability issues. +**Sizing your containers :** Physical hardware performance characteristics are well understood. Even though containers insert a lightweight layer between Couchbase Server and the underlying OS, there is still a small overhead in running Couchbase Server in containers. For stability and better performance predictability, It is recommended to have at least 2 cores dedicated to the container in development environments and 4 cores dedicated to the container rather than shared across multiple containers for Couchbase Server instances running in production. With an over-committed environment you can end up with containers competing with each other causing unpredictable performance and sometimes stability issues. -**Map Couchbase Node Specific Data to a Local Folder :** A Couchbase Server Docker container will write all persistent and node-specific data under the directory /opt/couchbase/var by default. It is recommended to map this directory to a directory on the host file system using the `-v` option to `docker run` to get persistence and performance. +**Map Couchbase Node Specific Data to a Local Folder :** A Couchbase Server Docker container will write all persistent and node-specific data under the directory `/opt/couchbase/var` by default. It is recommended to map this directory to a directory on the host file system using the `-v` option to `docker run` to get persistence and performance. -- Persistence: Storing `/opt/couchbase/var` outside the container with the `-v` option allows you to delete the container and recreate it later without losing the data in Couchbase Server. You can even update to a container running a later release/version of Couchbase Server without losing your data. -- Performance: In a standard Docker environment using a union file system, leaving /opt/couchbase/var inside the container results in some amount of performance degradation. +- Persistence: Storing `/opt/couchbase/var` outside the container with the `-v` option allows you to delete the container and recreate it later without losing the data in Couchbase Server. You can even update to a container running a later release/version of Couchbase Server without losing your data. -> NOTE for SELinux : If you have SELinux enabled, mounting the host volumes in a container requires an extra step. Assuming you are mounting the `~/couchbase` directory on the host file system, you need to run the following command once before running your first container on that host: -> -> `mkdir ~/couchbase && chcon -Rt svirt_sandbox_file_t ~/couchbase` +- Performance: In a standard Docker environment using a union file system, leaving `/opt/couchbase/var` inside the container results in some amount of performance degradation. -**Increase ULIMIT in Production Deployments :** Couchbase Server normally expects the following changes to ulimits: +NOTE for SELinux : If you have SELinux enabled, mounting the host volumes in a container requires an extra step. Assuming you are mounting the `~/couchbase` directory on the host file system, you need to run the following command once before running your first container on that host: -```console -ulimit -n 40960 # nofile: max number of open files -ulimit -c unlimited # core: max core file size -ulimit -l unlimited # memlock: maximum locked-in-memory address space -``` +`mkdir ~/couchbase && chcon -Rt svirt_sandbox_file_t ~/couchbase` + +**Increase ULIMIT in Production Deployments :** Couchbase Server normally expects the following changes to ulimits: + + ulimit -n 200000 # nofile: max number of open files + ulimit -l unlimited # memlock: maximum locked-in-memory address space These ulimit settings are necessary when running under heavy load. If you are just doing light testing and development, you can omit these settings, and everything will still work. -To set the ulimits in your container, you will need to run Couchbase Docker containers with the following additional --ulimit flags: +To set the ulimits in your container, you will need to run Couchbase Docker containers with the following additional `--ulimit` flags: -`docker run -d --ulimit nofile=40960:40960 --ulimit core=100000000:100000000 --ulimit memlock=100000000:100000000 --name db -p 8091-8094:8091-8094 -p 11210:11210 couchbase` +`docker run -d --ulimit nofile=40960:40960 --ulimit core=100000000:100000000 --ulimit memlock=100000000:100000000 --name db -p 8091-8097:8091-8097 -p 9123:9123 -p 11207:11207 -p 11210:11210 -p 11280:11280 -p 18091-18097:18091-18097 couchbase` Since "unlimited" is not supported as a value, it sets the core and memlock values to 100 GB. If your system has more than 100 GB RAM, you will want to increase this value to match the available RAM on the system. -> Note:The --ulimit flags only work on Docker 1.6 or later. +Note: The `--ulimit` flags only work on Docker 1.6 or later. -**Network Configuration and Ports :** Couchbase Server communicates on many different ports (see the [Couchbase Server documentation](http://docs.couchbase.com/admin/admin/Install/install-networkPorts.html)). Also, it is generally not supported that the cluster nodes be placed behind any NAT. For these reasons, Docker's default networking configuration is not ideally suited to Couchbase Server deployments. For production deployments it is recomended to use `--net=host` setting to avoid performance and reliability issues. +**Network Configuration and Ports :** Couchbase Server communicates on many different ports (see the [Couchbase Server documentation](https://docs.couchbase.com/server/current/install/install-ports.html#ports-listed-by-communication-path)). Also, it is generally not supported that the cluster nodes be placed behind any NAT. For these reasons, Docker's default networking configuration is not ideally suited to Couchbase Server deployments. For production deployments it is recommended to use `--net=host` setting to avoid performance and reliability issues. -# Multi Node Couchbase Server Cluster Deployment Topologies +## Multi Node Couchbase Server Cluster Deployment Topologies With multi node Couchbase Server clusters, there are 2 popular topologies. -## All Couchbase Server containers on one physical machine +### All Couchbase Server containers on one physical machine -This model is commonly used for scale-minimized deployments simulating production deployments for development and test purposes. Placing all containers on a single physical machine means all containers will compete for the same resources. Placing all containers on a single physical machine also eliminates the built-in protection against Couchbase Server node failures with replication when the single physical machine fail, all containers experience unavailability at the same time loosing all replicas. These restrictions may be acceptable for test systems, however it isn’t recommended for applications in production. +This model is commonly used for scale-minimized deployments simulating production deployments for development and test purposes. Placing all containers on a single physical machine means all containers will compete for the same resources. Placing all containers on a single physical machine also eliminates the built-in protection against Couchbase Server node failures afforded by replication. When the single physical machine fails, all containers experience unavailability at the same time, losing all replicas. These restrictions may be acceptable for test systems, however it isn't recommended for applications in production. -You can find more details on setting up Couchbase Server in this topology in Couchbase Server [documentation](http://developer.couchbase.com/documentation/server/4.5/install/docker-deploy-multi-node-cluster.html). +You can find more details on setting up Couchbase Server in this topology in Couchbase Server [documentation](https://docs.couchbase.com/server/current/install/getting-started-docker.html#multi-node-cluster-one-host). ┌──────────────────────────────────────────────────────────┐ │ Host OS (Linux) │ @@ -168,11 +182,11 @@ You can find more details on setting up Couchbase Server in this topology in Cou │ └───────────────┘ └───────────────┘ └───────────────┘ │ └──────────────────────────────────────────────────────────┘ -## Each Couchbase Server container on its own machine +### Each Couchbase Server container on its own machine -This model is commonly used for production deployments. It prevents Couchbase Server nodes from stepping over each other and gives you better performance predictability. This is the supported topology in production with Couchbase Server 4.5 and higher. +This model is commonly used for production deployments. It prevents Couchbase Server nodes from stepping over each other and gives you better performance predictability. This is the supported topology in production with Couchbase Server 5.5 and higher. -You can find more details on setting up Couchbase Server in this topology in Couchbase Server [documentation](http://developer.couchbase.com/documentation/server/4.5/install/docker-deploy-multi-node-cluster.html). +You can find more details on setting up Couchbase Server in this topology in Couchbase Server [documentation](https://docs.couchbase.com/server/current/install/getting-started-docker.html#multi-node-cluster-many-hosts). ┌───────────────────────┐ ┌───────────────────────┐ ┌───────────────────────┐ │ Host OS (Linux) │ │ Host OS (Linux) │ │ Host OS (Linux) │ @@ -186,25 +200,25 @@ You can find more details on setting up Couchbase Server in this topology in Cou │ └─────────────────┘ │ │ └─────────────────┘ │ │ └─────────────────┘ │ └───────────────────────┘ └───────────────────────┘ └───────────────────────┘ -# Additional References +## Try Couchbase Cloud Free -- [Couchbase Server and Containers](http://www.couchbase.com/containers) -- [Getting Started with Couchbbase Server and Docker](http://developer.couchbase.com/documentation/server/4.5/install/getting-started-docker.html) -- Detailed Walk-through for [Deploying Couchbase Server on Docker Containers](http://developer.couchbase.com/documentation/server/4.5/install/deploy-with-docker-hub.html) +Couchbase Cloud is a fully managed NoSQL Database-as-a-Service (DBaaS) for mission-critical applications. We deploy Couchbase Cloud in your AWS VPC and manage the workload. You'll enjoy incredible price-performance and operational transparency. -# License +Start Free Trial - https://cloud.couchbase.com/sign-up -Couchbase Server comes in 2 Editions: Enterprise Edition and Community Edition. You can find details on the differences between the 2 and licensing details on the [Couchbase Server Editions](http://developer.couchbase.com/documentation/server/4.5/introduction/editions.html) page. +# Additional References -- Enterprise Edition -- free for development, testing and POCs. Requires a paid subscription for production deployment. Please refer to the [subscribe](http://www.couchbase.com/subscriptions-and-support) page for details on enterprise edition agreements. +- [Couchbase Server and Containers](https://docs.couchbase.com/server/current/cloud/couchbase-cloud-deployment.html) -- Community Edition -- free for unrestricted use for community users. +- [Getting Started with Couchbase Server and Docker](https://docs.couchbase.com/server/current/install/getting-started-docker.html) -By default, the `latest` Docker tag points to the latest Enterprise Edition. If you want the Community Edition instead, you should add the appropriate tag, such as +# License -```console -docker run couchbase:community-4.0.0 -``` +Couchbase Server comes in two editions: Enterprise Edition and Community Edition. You can find details on the differences between the two and licensing information on the [Couchbase Server Editions](https://docs.couchbase.com/server/current/introduction/editions.html) page. + +- **Enterprise Edition** -- The Enterprise Edition license provides for free for development and testing for Couchbase Enterprise Edition. A paid subscription for production deployment is required. Please refer to the [pricing](https://www.couchbase.com/pricing) page for details on Couchbase’s Enterprise Edition. + +- **Community Edition** -- The Community Edition license provides for free deployment of Couchbase Community Edition for departmental-scale deployments of up to five node clusters. It has recently been changed to disallow use of XDCR, which is now an exclusive Enterprise Edition feature. 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). diff --git a/couchbase/content.md b/couchbase/content.md index a9a538cfb73f..81914364bcc9 100644 --- a/couchbase/content.md +++ b/couchbase/content.md @@ -1,110 +1,121 @@ -# What is Couchbase Server? +# Introduction to Couchbase Server -This README will guide you through running Couchbase Server with Docker Containers. +Built on the most powerful NoSQL technology, Couchbase Server delivers unparalleled performance at scale, in any cloud. With features like memory-first architecture, geo-distributed deployments, and workload isolation, Couchbase Server excels at supporting mission-critical applications at scale while maintaining sub-millisecond latencies and 99.999% availability. Plus, with the most comprehensive SQL-compatible query language (N1QL), migrating from RDBMS to Couchbase Server is easy with ANSI join. -[Couchbase Server](http://www.couchbase.com/nosql-databases/couchbase-server) is a NoSQL document database with a distributed architecture for performance, scalability, and availability. It enables developers to build applications easier and faster by leveraging the power of SQL with the flexibility of JSON. +## Unmatched agility and flexibility -For additional questions and feedback, please visit the [Couchbase Forums](https://forums.couchbase.com/) or [Stack Overflow](http://stackoverflow.com/questions/tagged/couchbase). +Support rapidly changing business requirements with the flexibility of JSON and the power of a comprehensive query language (N1QL). Develop engaging applications with multiple access methods from a single platform: key-value, query, and search. Event-driven workloads allow you to execute data-driven business logic from a centralized platform. + +## Unparalleled performance at any scale + +Deliver consistent, fast experiences at scale, powered by a memory-first architecture. High-performance indexes and index partitioning provides unparalleled query performance with complex joins, predicates, and aggregate evaluations. And, with end-to-end data compression, Couchbase significantly reduces the cost of network, memory, and storage required for your existing workloads. + +## Easiest platform to manage + +Deploy Couchbase Server in any cloud, at any scale. Reduce operational overhead with cloud integrations like Kubernetes, and support multi-cloud deployments globally with built-in support for active-active cross datacenter replication (XDCR). %%LOGO%% -# QuickStart with Couchbase Server and Docker +## QuickStart with Couchbase Server and Docker Here is how to get a single node Couchbase Server cluster running on Docker containers: -**Step - 1 :** Run Couchbase Server docker container +**Step - 1 :** Run Couchbase Server docker container -`docker run -d --name db -p 8091-8094:8091-8094 -p 11210:11210 couchbase` +`docker run -d --name db -p 8091-8097:8091-8097 -p 9123:9123 -p 11207:11207 -p 11210:11210 -p 11280:11280 -p 18091-18097:18091-18097 couchbase` -**Step - 2 :** Next, visit `http://localhost:8091` on the host machine to see the Web Console to start Couchbase Server setup. +Note: Couchbase Server can require a variety of ports to be exposed depending on the usage scenario. Please see https://docs.couchbase.com/server/current/install/install-ports.html for further information. -![setup splash screen](https://raw.githubusercontent.com/cihanb/docker/master/generate/resources/couchbase-server/images/setup-initial.jpg) +**Step - 2 :** Next, visit `http://localhost:8091` on the host machine to see the Web Console to start Couchbase Server setup. + +![Setup splash screen](https://d774lla4im6mk.cloudfront.net/setup-initial.jpg) Walk through the Setup wizard and accept the default values. - Note: You may need to lower the RAM allocated to various services to fit within the bounds of the resource of the containers. - Enable the beer-sample bucket to load some sample data. -![setup step-1 screen](https://raw.githubusercontent.com/cihanb/docker/master/generate/resources/couchbase-server/images/setup-step1.jpg) +![Creating a cluster](https://d774lla4im6mk.cloudfront.net/cluster-creation.jpg) -**Note :** For detailed information on configuring the Server, see [Initial Couchbase Server Setup](http://developer.couchbase.com/documentation/server/4.5/install/init-setup.html). +![Completing the wizard](https://d774lla4im6mk.cloudfront.net/finish-wizard.jpg) -## Running A N1QL Query on the Couchbase Server Cluster +![UI home](https://d774lla4im6mk.cloudfront.net/ui-home.jpg) -N1QL is the SQL based query language for Couchbase Server. Simply switch to the Query tab on the Web Console at `http://localhost:8091` and run the following N1QL Query in the query window: +![Loading sample data](https://d774lla4im6mk.cloudfront.net/load-sample-data.jpg) - SELECT name FROM `beer-sample` WHERE brewery_id ="mishawaka_brewing"; +**Note :** For detailed information on configuring the Server, see [Deployment Guidelines](https://docs.couchbase.com/server/current/install/install-production-deployment.html). -You can also execute N1QL queries from the commandline. To run a query from command line query tool, run the interactive shell on the container: +### Running A N1QL Query on the Couchbase Server Cluster -`docker exec -it db sh` +N1QL is the SQL based query language for Couchbase Server. Simply switch to the Query tab on the Web Console at `http://localhost:8091` and run the following N1QL Query in the query window: -Then, navigate to the `bin` directory under Couchbase Server installation and run cbq command line tool and execute the N1QL Query on `beer-sample` bucket + SELECT name FROM `beer-sample` WHERE brewery_id="mishawaka_brewing"; -`/opt/couchbase/bin/cbq` +You can also execute N1QL queries from the command line. To run a query from command line query tool, run the cbq command line tool, authenticating using the credentials you provided to the wizard, and execute the N1QL Query on the beer-sample bucket - cbq> SELECT name FROM `beer-sample` WHERE brewery_id ="mishawaka_brewing"; +```console +$ docker exec -it db cbq --user Administrator +cbq> SELECT name FROM `beer-sample` WHERE brewery_id ="mishawaka_brewing"; +``` -For more query samples, refer to the [Running your first N1QL query](http://developer.couchbase.com/documentation/server/4.5/getting-started/first-n1ql-query.html) guide. +For more query samples, refer to [Run your first N1QL query](https://docs.couchbase.com/server/current/getting-started/try-a-query.html). -## Connect to the Couchbase Server Cluster via Applications and SDKs +### Connect to the Couchbase Server Cluster via Applications and SDKs -Couchbase Server SDKs comes in many languages: C SDK 2.4/2.5 Go, Java, .NET, Node.js, PHP, Python. Simply run your application through the Couchbase Server SDK of your choice on the host, and point it to http://localhost:8091/pools to connect to the container. +Couchbase Server SDKs comes in many languages: C, Go, Java, .NET, Node.js, PHP, Python. Simply run your application through the Couchbase Server SDK of your choice on the host, and point it to [http://localhost:8091/pools](http://localhost:8091/pools) to connect to the container. -For running a sample application, refer to the [Running a sample Web app](http://developer.couchbase.com/documentation/server/4.5/travel-app/index.html) guide. +For running a sample application, refer to the [Sample Application](https://docs.couchbase.com/java-sdk/current/hello-world/sample-application.html) guide. -# Requirements and Best Practices +## Requirements and Best Practices -## Container Requirements +### Container Requirements -Official Couchbase Server containers on Docker Hub are based on Ubuntu 14.04. +Official Couchbase Server images on Docker Hub are based on the latest supported version of Ubuntu. -**Docker Container Resource Requirements :** For minimum container requirements, you can follow [Couchbase Server minimum HW recommendations](http://developer.couchbase.com/documentation/server/current/install/pre-install.html) for development, test and production environments. +**Docker Container Resource Requirements :** For minimum container requirements, you can follow [System Resource Requirements](https://docs.couchbase.com/server/current/install/pre-install.html) for development, test and production environments. -## Best Practices +### Best Practices -**Avoid a Single Point of Failure :** Couchbase Server's resilience and high-availability are achieved through creating a cluster of independent nodes and replicating data between them so that any individual node failure doesn't lead to loss of access to your data. In a containerized environment, if you were to run multiple nodes on the same piece of physical hardware, you can inadvertently re-introduce a single point of failure. In environments where you control VM placement, we advise ensuring each Couchbase Server node runs on a different piece of physical hardware. +**Avoid a Single Point of Failure :** Couchbase Server's resilience and high-availability are achieved through creating a cluster of independent nodes and replicating data between them so that any individual node failure doesn't lead to loss of access to your data. In a containerized environment, if you were to run multiple nodes on the same piece of physical hardware, you can inadvertently re-introduce a single point of failure. In environments where you control VM placement, we advise ensuring each Couchbase Server node runs on a different piece of physical hardware. -**Sizing your containers :** Physical hardware performance characteristics are well understood. Even though containers insert a lightweight layer between Couchbase Server and the underlying OS, there is still a small overhead in running Couchbase Server in containers. For stability and better performance predictability, It is recommended to have at least 2 cores dedicated to the container in development environments and 4 cores dedicated to the container rather than shared across multiple containers for Couchbase Server instances running in production. With an over-committed environment you can end up with containers competing with each other causing unpredictable performance and sometimes stability issues. +**Sizing your containers :** Physical hardware performance characteristics are well understood. Even though containers insert a lightweight layer between Couchbase Server and the underlying OS, there is still a small overhead in running Couchbase Server in containers. For stability and better performance predictability, It is recommended to have at least 2 cores dedicated to the container in development environments and 4 cores dedicated to the container rather than shared across multiple containers for Couchbase Server instances running in production. With an over-committed environment you can end up with containers competing with each other causing unpredictable performance and sometimes stability issues. -**Map Couchbase Node Specific Data to a Local Folder :** A Couchbase Server Docker container will write all persistent and node-specific data under the directory /opt/couchbase/var by default. It is recommended to map this directory to a directory on the host file system using the `-v` option to `docker run` to get persistence and performance. +**Map Couchbase Node Specific Data to a Local Folder :** A Couchbase Server Docker container will write all persistent and node-specific data under the directory `/opt/couchbase/var` by default. It is recommended to map this directory to a directory on the host file system using the `-v` option to `docker run` to get persistence and performance. -- Persistence: Storing `/opt/couchbase/var` outside the container with the `-v` option allows you to delete the container and recreate it later without losing the data in Couchbase Server. You can even update to a container running a later release/version of Couchbase Server without losing your data. -- Performance: In a standard Docker environment using a union file system, leaving /opt/couchbase/var inside the container results in some amount of performance degradation. +- Persistence: Storing `/opt/couchbase/var` outside the container with the `-v` option allows you to delete the container and recreate it later without losing the data in Couchbase Server. You can even update to a container running a later release/version of Couchbase Server without losing your data. -> NOTE for SELinux : If you have SELinux enabled, mounting the host volumes in a container requires an extra step. Assuming you are mounting the `~/couchbase` directory on the host file system, you need to run the following command once before running your first container on that host: -> -> `mkdir ~/couchbase && chcon -Rt svirt_sandbox_file_t ~/couchbase` +- Performance: In a standard Docker environment using a union file system, leaving `/opt/couchbase/var` inside the container results in some amount of performance degradation. -**Increase ULIMIT in Production Deployments :** Couchbase Server normally expects the following changes to ulimits: +NOTE for SELinux : If you have SELinux enabled, mounting the host volumes in a container requires an extra step. Assuming you are mounting the `~/couchbase` directory on the host file system, you need to run the following command once before running your first container on that host: -```console -ulimit -n 40960 # nofile: max number of open files -ulimit -c unlimited # core: max core file size -ulimit -l unlimited # memlock: maximum locked-in-memory address space -``` +`mkdir ~/couchbase && chcon -Rt svirt_sandbox_file_t ~/couchbase` + +**Increase ULIMIT in Production Deployments :** Couchbase Server normally expects the following changes to ulimits: + + ulimit -n 200000 # nofile: max number of open files + ulimit -l unlimited # memlock: maximum locked-in-memory address space These ulimit settings are necessary when running under heavy load. If you are just doing light testing and development, you can omit these settings, and everything will still work. -To set the ulimits in your container, you will need to run Couchbase Docker containers with the following additional --ulimit flags: +To set the ulimits in your container, you will need to run Couchbase Docker containers with the following additional `--ulimit` flags: -`docker run -d --ulimit nofile=40960:40960 --ulimit core=100000000:100000000 --ulimit memlock=100000000:100000000 --name db -p 8091-8094:8091-8094 -p 11210:11210 couchbase` +`docker run -d --ulimit nofile=40960:40960 --ulimit core=100000000:100000000 --ulimit memlock=100000000:100000000 --name db -p 8091-8097:8091-8097 -p 9123:9123 -p 11207:11207 -p 11210:11210 -p 11280:11280 -p 18091-18097:18091-18097 couchbase` Since "unlimited" is not supported as a value, it sets the core and memlock values to 100 GB. If your system has more than 100 GB RAM, you will want to increase this value to match the available RAM on the system. -> Note:The --ulimit flags only work on Docker 1.6 or later. +Note: The `--ulimit` flags only work on Docker 1.6 or later. -**Network Configuration and Ports :** Couchbase Server communicates on many different ports (see the [Couchbase Server documentation](http://docs.couchbase.com/admin/admin/Install/install-networkPorts.html)). Also, it is generally not supported that the cluster nodes be placed behind any NAT. For these reasons, Docker's default networking configuration is not ideally suited to Couchbase Server deployments. For production deployments it is recomended to use `--net=host` setting to avoid performance and reliability issues. +**Network Configuration and Ports :** Couchbase Server communicates on many different ports (see the [Couchbase Server documentation](https://docs.couchbase.com/server/current/install/install-ports.html#ports-listed-by-communication-path)). Also, it is generally not supported that the cluster nodes be placed behind any NAT. For these reasons, Docker's default networking configuration is not ideally suited to Couchbase Server deployments. For production deployments it is recommended to use `--net=host` setting to avoid performance and reliability issues. -# Multi Node Couchbase Server Cluster Deployment Topologies +## Multi Node Couchbase Server Cluster Deployment Topologies With multi node Couchbase Server clusters, there are 2 popular topologies. -## All Couchbase Server containers on one physical machine +### All Couchbase Server containers on one physical machine -This model is commonly used for scale-minimized deployments simulating production deployments for development and test purposes. Placing all containers on a single physical machine means all containers will compete for the same resources. Placing all containers on a single physical machine also eliminates the built-in protection against Couchbase Server node failures with replication when the single physical machine fail, all containers experience unavailability at the same time loosing all replicas. These restrictions may be acceptable for test systems, however it isn’t recommended for applications in production. +This model is commonly used for scale-minimized deployments simulating production deployments for development and test purposes. Placing all containers on a single physical machine means all containers will compete for the same resources. Placing all containers on a single physical machine also eliminates the built-in protection against Couchbase Server node failures afforded by replication. When the single physical machine fails, all containers experience unavailability at the same time, losing all replicas. These restrictions may be acceptable for test systems, however it isn't recommended for applications in production. -You can find more details on setting up Couchbase Server in this topology in Couchbase Server [documentation](http://developer.couchbase.com/documentation/server/4.5/install/docker-deploy-multi-node-cluster.html). +You can find more details on setting up Couchbase Server in this topology in Couchbase Server [documentation](https://docs.couchbase.com/server/current/install/getting-started-docker.html#multi-node-cluster-one-host). ┌──────────────────────────────────────────────────────────┐ │ Host OS (Linux) │ @@ -119,11 +130,11 @@ You can find more details on setting up Couchbase Server in this topology in Cou │ └───────────────┘ └───────────────┘ └───────────────┘ │ └──────────────────────────────────────────────────────────┘ -## Each Couchbase Server container on its own machine +### Each Couchbase Server container on its own machine -This model is commonly used for production deployments. It prevents Couchbase Server nodes from stepping over each other and gives you better performance predictability. This is the supported topology in production with Couchbase Server 4.5 and higher. +This model is commonly used for production deployments. It prevents Couchbase Server nodes from stepping over each other and gives you better performance predictability. This is the supported topology in production with Couchbase Server 5.5 and higher. -You can find more details on setting up Couchbase Server in this topology in Couchbase Server [documentation](http://developer.couchbase.com/documentation/server/4.5/install/docker-deploy-multi-node-cluster.html). +You can find more details on setting up Couchbase Server in this topology in Couchbase Server [documentation](https://docs.couchbase.com/server/current/install/getting-started-docker.html#multi-node-cluster-many-hosts). ┌───────────────────────┐ ┌───────────────────────┐ ┌───────────────────────┐ │ Host OS (Linux) │ │ Host OS (Linux) │ │ Host OS (Linux) │ @@ -137,8 +148,14 @@ You can find more details on setting up Couchbase Server in this topology in Cou │ └─────────────────┘ │ │ └─────────────────┘ │ │ └─────────────────┘ │ └───────────────────────┘ └───────────────────────┘ └───────────────────────┘ +## Try Couchbase Cloud Free + +Couchbase Cloud is a fully managed NoSQL Database-as-a-Service (DBaaS) for mission-critical applications. We deploy Couchbase Cloud in your AWS VPC and manage the workload. You'll enjoy incredible price-performance and operational transparency. + +Start Free Trial - https://cloud.couchbase.com/sign-up + # Additional References -- [Couchbase Server and Containers](http://www.couchbase.com/containers) -- [Getting Started with Couchbbase Server and Docker](http://developer.couchbase.com/documentation/server/4.5/install/getting-started-docker.html) -- Detailed Walk-through for [Deploying Couchbase Server on Docker Containers](http://developer.couchbase.com/documentation/server/4.5/install/deploy-with-docker-hub.html) +- [Couchbase Server and Containers](https://docs.couchbase.com/server/current/cloud/couchbase-cloud-deployment.html) + +- [Getting Started with Couchbase Server and Docker](https://docs.couchbase.com/server/current/install/getting-started-docker.html) diff --git a/couchbase/license.md b/couchbase/license.md index bbf49817b0d3..f7dfed031255 100644 --- a/couchbase/license.md +++ b/couchbase/license.md @@ -1,11 +1,5 @@ -Couchbase Server comes in 2 Editions: Enterprise Edition and Community Edition. You can find details on the differences between the 2 and licensing details on the [Couchbase Server Editions](http://developer.couchbase.com/documentation/server/4.5/introduction/editions.html) page. +Couchbase Server comes in two editions: Enterprise Edition and Community Edition. You can find details on the differences between the two and licensing information on the [Couchbase Server Editions](https://docs.couchbase.com/server/current/introduction/editions.html) page. -- Enterprise Edition -- free for development, testing and POCs. Requires a paid subscription for production deployment. Please refer to the [subscribe](http://www.couchbase.com/subscriptions-and-support) page for details on enterprise edition agreements. +- **Enterprise Edition** -- The Enterprise Edition license provides for free for development and testing for Couchbase Enterprise Edition. A paid subscription for production deployment is required. Please refer to the [pricing](https://www.couchbase.com/pricing) page for details on Couchbase’s Enterprise Edition. -- Community Edition -- free for unrestricted use for community users. - -By default, the `latest` Docker tag points to the latest Enterprise Edition. If you want the Community Edition instead, you should add the appropriate tag, such as - -```console -docker run couchbase:community-4.0.0 -``` +- **Community Edition** -- The Community Edition license provides for free deployment of Couchbase Community Edition for departmental-scale deployments of up to five node clusters. It has recently been changed to disallow use of XDCR, which is now an exclusive Enterprise Edition feature. diff --git a/couchdb/README.md b/couchdb/README.md index 8579f4681ef7..59525d3690b3 100644 --- a/couchdb/README.md +++ b/couchdb/README.md @@ -20,13 +20,14 @@ WARNING: [Apache CouchDB](https://github.com/apache/couchdb-docker) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`latest`, `3.1.0`, `3.1`, `3`](https://github.com/apache/couchdb-docker/blob/01e1c16bb405c1174393c76a7ebc3792b0c5e2c9/3.1.0/Dockerfile) -- [`3.0.1`, `3.0`](https://github.com/apache/couchdb-docker/blob/01e1c16bb405c1174393c76a7ebc3792b0c5e2c9/3.0.1/Dockerfile) -- [`2.3.1`, `2.3`, `2`](https://github.com/apache/couchdb-docker/blob/01e1c16bb405c1174393c76a7ebc3792b0c5e2c9/2.3.1/Dockerfile) +- [`latest`, `3.3.1`, `3.3`, `3`](https://github.com/apache/couchdb-docker/blob/41b7e8df5ad77c628cc6edb8419d4ade96ccba55/3.3.1/Dockerfile) +- [`3.2.2`, `3.2`](https://github.com/apache/couchdb-docker/blob/41b7e8df5ad77c628cc6edb8419d4ade96ccba55/3.2.2/Dockerfile) +- [`3.1.2`, `3.1`](https://github.com/apache/couchdb-docker/blob/41b7e8df5ad77c628cc6edb8419d4ade96ccba55/3.1.2/Dockerfile) +- [`2.3.1`, `2.3`, `2`](https://github.com/apache/couchdb-docker/blob/41b7e8df5ad77c628cc6edb8419d4ade96ccba55/2.3.1/Dockerfile) # Quick reference (cont.) @@ -41,7 +42,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/couchdb`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fcouchdb) + [official-images repo's `library/couchdb` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fcouchdb) [official-images repo's `library/couchdb` file](https://github.com/docker-library/official-images/blob/master/library/couchdb) ([history](https://github.com/docker-library/official-images/commits/master/library/couchdb)) - **Source of this description**: diff --git a/crate/README-short.txt b/crate/README-short.txt index 202e0d538cbc..734f25c9559b 100644 --- a/crate/README-short.txt +++ b/crate/README-short.txt @@ -1 +1 @@ -CrateDB is a distributed SQL database handles massive amounts of machine data in real-time. +CrateDB is an open-source, distributed SQL database empowering you to turn data into business value. diff --git a/crate/README.md b/crate/README.md index 98b3d8d25754..3b3d78d4c7f0 100644 --- a/crate/README.md +++ b/crate/README.md @@ -20,13 +20,13 @@ WARNING: [Crate.io](https://github.com/crate/docker-crate) - **Where to get help**: - [project documentation](https://crate.io/docs/), [StackOverflow](https://stackoverflow.com/tags/crate), [Slack](https://crate.io/docs/support/slackin/), or [paid support](https://crate.io/pricing/) + [project documentation](https://crate.io/docs/), [StackOverflow](https://stackoverflow.com/tags/cratedb), [support channels](https://crate.io/support/) # Supported tags and respective `Dockerfile` links -- [`4.1.5`, `4.1`, `latest`](https://github.com/crate/docker-crate/blob/1d2060119c573f07b861f808c0aa89331fa80cd5/Dockerfile) -- [`4.0.12`, `4.0`](https://github.com/crate/docker-crate/blob/7791cda08fbf054ab2ce7a988f8811074b8c3bf4/Dockerfile) -- [`3.3.5`, `3.3`](https://github.com/crate/docker-crate/blob/f5c527fb12df004e3fc620fd9d91b97686f56ef8/Dockerfile) +- [`5.1.2`, `5.1`, `latest`](https://github.com/crate/docker-crate/blob/88e4f9a14bef02c996c5b657633ef78e05274418/Dockerfile) +- [`5.0.3`, `5.0`](https://github.com/crate/docker-crate/blob/0b872eae2e0300879907405a8177be4418fe2a15/Dockerfile) +- [`4.8.4`, `4.8`](https://github.com/crate/docker-crate/blob/1389b454dc1478efcbde8f9846bdd8ac6f7f0f8a/Dockerfile) # Quick reference (cont.) @@ -41,42 +41,50 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/crate`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fcrate) + [official-images repo's `library/crate` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fcrate) [official-images repo's `library/crate` file](https://github.com/docker-library/official-images/blob/master/library/crate) ([history](https://github.com/docker-library/official-images/commits/master/library/crate)) - **Source of this description**: [docs repo's `crate/` directory](https://github.com/docker-library/docs/tree/master/crate) ([history](https://github.com/docker-library/docs/commits/master/crate)) -![logo](https://raw.githubusercontent.com/docker-library/docs/0d4ccc1c0a00a99c3302ffeb17831225cbba7863/crate/logo.png) +![logo](https://raw.githubusercontent.com/docker-library/docs/774acf9bf99ca29eded5cd50f0ba3f755716673d/crate/logo.svg?sanitize=true) # What Is CrateDB? [CrateDB](http://github.com/crate/crate) is a distributed SQL database that makes it simple to store and analyze massive amounts of machine data in real-time. -Features of CrateDB: +CrateDB offers the scalability and flexibility typically associated with a NoSQL database, is designed to run on inexpensive commodity servers and can be deployed and run on any sort of network - from personal computers to multi-region hybrid clouds. + +The smallest CrateDB clusters can easily ingest tens of thousands of records per second. The data can be queried, ad-hoc, in parallel across the whole cluster in real time. + +# Features - Standard SQL plus dynamic schemas, queryable objects, geospatial features, time series data, first-class BLOB support, and realtime full-text search. -- Horizontally scalable, highly available, and fault tolerant clusters that run very well in virtualized and containerised environments. +- Dynamic schemas, queryable objects, geospatial features, time series data support, and realtime full-text search providing functionality for handling both relational and document oriented nested data structures. +- Horizontally scalable, highly available and fault tolerant clusters that run very well in virtualized and containerised environments. - Extremely fast distributed query execution. - Auto-partitioning, auto-sharding, and auto-replication. - Self-healing and auto-rebalancing. -- CrateDB offers the scalability and flexibility typically associated with a NoSQL database and is designed to run on inexpensive commodity servers and can be deployed and run across any sort of network. From personal computers to multi-region hybrid clouds. -The smallest CrateDB clusters can easily ingest tens of thousands of records per second. And this data can be queried, ad-hoc, in parallel across the whole cluster in real time. +# Screenshots + +CrateDB provides an [Admin UI](https://crate.io/docs/crate/admin-ui/): + +![Screenshots of the CrateDB Admin UI](https://raw.githubusercontent.com/crate/crate/master/crate-admin.gif) -# How to Use This Image +# Try CrateDB Spin up this Docker image like so: ```console -$ docker run -p 4200:4200 crate +$ docker run --publish 4200:4200 --publish 5432:5432 crate -Cdiscovery.type=single-node ``` -Once you're up and running, head on over to [the introductory docs](https://crate.io/docs/crate/getting-started/en/latest/first-use/index.html). +Visit the [getting started](https://crate.io/docs/crate/tutorials/en/latest/install-run/) page to see all the available download and install options. -See also: +Once you're up and running, head over to the [introductory docs](https://crate.io/docs/crate/tutorials/). To interact with CrateDB, you can use the Admin UI [web console](https://crate.io/docs/crate/admin-ui/en/latest/console.html#sql-console) or the [CrateDB shell](https://crate.io/docs/crate/crash/) CLI tool. Alternatively, review the list of recommended [clients and tools](https://crate.io/docs/crate/clients-tools/) that work with CrateDB. -- [Getting Started With CrateDB on Docker](https://crate.io/docs/crate/guide/en/latest/deployment/containers/docker.html) +For container-specific documentation, check out the [CrateDB on Docker how-to guide](https://crate.io/docs/crate/howtos/en/latest/deployment/containers/docker.html) or the [CrateDB on Kubernetes how-to guide](https://crate.io/docs/crate/howtos/en/latest/deployment/containers/kubernetes.html). ## Issues @@ -94,7 +102,7 @@ For issues with CrateDB itself, report issues via [the `crate` GitHub issue trac This image is primarily maintained by [Crate.io](http://crate.io/), but we welcome community contributions! -See the [developer docs](https://github.com/crate/docker-crate/blob/master/DEVELOP.rst) and the [contribution docs](https://github.com/crate/docker-crate/blob/master/CONTRIBUTING.rst) for more information. +See the [contribution docs](https://github.com/crate/docker-crate/blob/master/CONTRIBUTING.rst) for more information. # License diff --git a/crate/content.md b/crate/content.md index 6be84d1dd990..01d2d44cbee6 100644 --- a/crate/content.md +++ b/crate/content.md @@ -4,30 +4,38 @@ [CrateDB](http://github.com/crate/crate) is a distributed SQL database that makes it simple to store and analyze massive amounts of machine data in real-time. -Features of CrateDB: +CrateDB offers the scalability and flexibility typically associated with a NoSQL database, is designed to run on inexpensive commodity servers and can be deployed and run on any sort of network - from personal computers to multi-region hybrid clouds. + +The smallest CrateDB clusters can easily ingest tens of thousands of records per second. The data can be queried, ad-hoc, in parallel across the whole cluster in real time. + +# Features - Standard SQL plus dynamic schemas, queryable objects, geospatial features, time series data, first-class BLOB support, and realtime full-text search. -- Horizontally scalable, highly available, and fault tolerant clusters that run very well in virtualized and containerised environments. +- Dynamic schemas, queryable objects, geospatial features, time series data support, and realtime full-text search providing functionality for handling both relational and document oriented nested data structures. +- Horizontally scalable, highly available and fault tolerant clusters that run very well in virtualized and containerised environments. - Extremely fast distributed query execution. - Auto-partitioning, auto-sharding, and auto-replication. - Self-healing and auto-rebalancing. -- CrateDB offers the scalability and flexibility typically associated with a NoSQL database and is designed to run on inexpensive commodity servers and can be deployed and run across any sort of network. From personal computers to multi-region hybrid clouds. -The smallest CrateDB clusters can easily ingest tens of thousands of records per second. And this data can be queried, ad-hoc, in parallel across the whole cluster in real time. +# Screenshots + +CrateDB provides an [Admin UI](https://crate.io/docs/crate/admin-ui/): + +![Screenshots of the CrateDB Admin UI](https://raw.githubusercontent.com/crate/crate/master/crate-admin.gif) -# How to Use This Image +# Try CrateDB Spin up this Docker image like so: ```console -$ docker run -p 4200:4200 %%IMAGE%% +$ docker run --publish 4200:4200 --publish 5432:5432 %%IMAGE%% -Cdiscovery.type=single-node ``` -Once you're up and running, head on over to [the introductory docs](https://crate.io/docs/crate/getting-started/en/latest/first-use/index.html). +Visit the [getting started](https://crate.io/docs/crate/tutorials/en/latest/install-run/) page to see all the available download and install options. -See also: +Once you're up and running, head over to the [introductory docs](https://crate.io/docs/crate/tutorials/). To interact with CrateDB, you can use the Admin UI [web console](https://crate.io/docs/crate/admin-ui/en/latest/console.html#sql-console) or the [CrateDB shell](https://crate.io/docs/crate/crash/) CLI tool. Alternatively, review the list of recommended [clients and tools](https://crate.io/docs/crate/clients-tools/) that work with CrateDB. -- [Getting Started With CrateDB on Docker](https://crate.io/docs/crate/guide/en/latest/deployment/containers/docker.html) +For container-specific documentation, check out the [CrateDB on Docker how-to guide](https://crate.io/docs/crate/howtos/en/latest/deployment/containers/docker.html) or the [CrateDB on Kubernetes how-to guide](https://crate.io/docs/crate/howtos/en/latest/deployment/containers/kubernetes.html). ## Issues @@ -45,4 +53,4 @@ For issues with CrateDB itself, report issues via [the `crate` GitHub issue trac This image is primarily maintained by [Crate.io](http://crate.io/), but we welcome community contributions! -See the [developer docs](https://github.com/crate/docker-crate/blob/master/DEVELOP.rst) and the [contribution docs](https://github.com/crate/docker-crate/blob/master/CONTRIBUTING.rst) for more information. +See the [contribution docs](https://github.com/crate/docker-crate/blob/master/CONTRIBUTING.rst) for more information. diff --git a/crate/get-help.md b/crate/get-help.md index a6480382c8f3..f0a4f772474c 100644 --- a/crate/get-help.md +++ b/crate/get-help.md @@ -1 +1 @@ -[project documentation](https://crate.io/docs/), [StackOverflow](https://stackoverflow.com/tags/crate), [Slack](https://crate.io/docs/support/slackin/), or [paid support](https://crate.io/pricing/) +[project documentation](https://crate.io/docs/), [StackOverflow](https://stackoverflow.com/tags/cratedb), [support channels](https://crate.io/support/) diff --git a/crate/logo.png b/crate/logo.png deleted file mode 100644 index ef5deb4d941d0aa85416eebd3a9a635737ad31e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2796 zcmV0|6HO-{x6+G7pnhbhQR?sl%DeaqF=TO9wZIFy5zV95L zItM7r`geble09~?@ApZ_{QlQJUNi9d?VC;l006D$KNJA~03c`p000OY0001j1^@tn zpaB3teEdQYKwUbW&NTZo$*y+}ZugR1tL$3t_xmlS8$|stvOmM4kJnlK%_tpXnWYUT zw~_jgewEe9Ch)u@nwLC3RvXd5ZQl-V`>z_Zh?p3&8xObNW!F4wj|)mV2;)3D9++fx zH>PxqWp*h;`=tG96G2{fI{2NLgpDOfsM?6<*`H@mVkUI6>tmMAlF|ln#;we5bTAq^ zUCqxX%g+!&gHy#!MCQJ!4w$94%B~(I58zA)p7m8hEcr=`L=8cMDq?oqaI*4lj-^Kc zw|t6B)c!mcHJn1gCT5EYV)ixp{t~(_G6Nfw%+!+oem|uq0Gx`N^s8kg`H`90ILpr( zK?9qZiIBW6`PqkaoH%rJB`Q}Q0BCrZ5Kg*K*3}jUa zL4#vtG;~uUX0Dei%0x|`XHL}sI2D0WNKPUZ@-souph(b+-?wJBx z2cWhH*p?qB0p{lq!`JT+H27)iZutB`*5^Gp)^*8DY)bV2)b3ZZ{P8txpF)KV3xL* za8V)x-Q(|MDc?sBW6#KH&WITroWi!@&bLO)0KAAm5&c*)h@b%gKoqd#2$1~Pe>W)^ zt$sU~$>;KndU6hvpU)dBLuRy_0GEzj)}NHw_=JB?wO%=o4?zQHrGYCtv+3d3u|y4F zm6(->|0Db57B1uA>3$%2wo{Mixp(<&hBMD>j7~Wx>)dcj8bwClxt`;#ckioSpJU%+kc)9;&nI6%aH4 z*Q`x5G{TtMZOzr$*2k+DpYnW;$y%^hKg30hCv^P2uWrV0td`vYXU(y;lQ1(`PfC zV<&<;t9pi=&C^dk3y%eD<1;jwrfEBH_U;t##ENAn2hFBOU+w!Zjna zvSFQrO4R_46Z5G6#^t?(EdoWz3}<}KKC%kOYs>?#tGR12yP~p-Nz78)sse%r*UF=u z?0brUR1meX<@2p!mgvMyyu>hfLp=RkH=CQ58b7$2IhB;%O^hC+0g9Q)D|v^Y!L@Q% z@m*J$sLc*$S90dm|FX~fruT62xqL6b)8Bv9ubiGUS8`@lh(_5Y!Y_4Z*H>D0p$l10 zmdZ=SEbl{G-l4%Y&di*R=;hr@T`@WkLwR>I^mJ&d82X}jbs>7}^$nlTJ*8(VyFT5= zDn6;>TS{B4;?a7S4oHDI7VmdxCk)l@TJE052e8q%G{Qhxc$KqT!<#LRT;${&H|CqdAl3N}Ny z^ffB3V1ys#2#LrB3Io?hQ_C^67%&%@>S5t&Y1p(RHusd?JYN~e?!OIL+~nC4`_V+J z!15z2IPXm2jG#f$=x1m6PNw;(Yf(Ee!lsSKUlVhL?NCU44-#}K#-EJqdeu}HVdi2RS+}T1Gx++KTB6mrP58jzJ`W+q4)X#`~|9-EIxqyJ-3o7By#&dQ_?-c|gU zzC(eY7z8vIwVA`Zn`?SS&H%S6peGM}Dx8AgWl-g6V0cu&^O8O#Vm5Z29}juS^D`-F z-#^5;lV!?lM<$kIxKtSB!?+b*bbHVbgG8=u;-)t(B-&kkU zbvz7TTm|)2Fyv|e(h(uz~QJ)0!Oz*1kM(-wu>|G z(7=jz=BI{}6<6X}q~)2vquhB+=1%LaXqGo}oS(G{=dPjhlL6LaNMaVt%q)cbAZSok z)E*i%B9oY79C{Q1x!-RGo@<-H^J7YH)_|zRBxYZ(LCg>|sAELtVl0#I?Yptj}$aD$WzVB)x9S+Tr2-n_#0?>d`y6$$lkmMCxOGG*~MHrw{-Dhys=z y0RR9&0{{R(&;S4c5HtV)00a#H03zgH0R{lgl!gC@K>`^70000CrateDB \ No newline at end of file diff --git a/crux/README-short.txt b/crux/README-short.txt deleted file mode 100644 index 328b55dde74a..000000000000 --- a/crux/README-short.txt +++ /dev/null @@ -1 +0,0 @@ -CRUX is a lightweight Linux distribution targeted at experienced Linux users diff --git a/crux/README.md b/crux/README.md deleted file mode 100644 index 505e73fbea19..000000000000 --- a/crux/README.md +++ /dev/null @@ -1,73 +0,0 @@ - - -# Quick reference - -- **Maintained by**: - [Docker Crux](https://github.com/cruxlinux/docker-crux) - -- **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) - -# Supported tags and respective `Dockerfile` links - -- [`3.4`, `latest`](https://github.com/cruxlinux/docker-crux/blob/da081a9004c5559cd77a1e2c2521193ccb2afdd2/Dockerfile) -- [`3.2`](https://github.com/cruxlinux/docker-crux/blob/07e966125ba3d6d48a12489830917e8a9bc983a7/Dockerfile) - -# Quick reference (cont.) - -- **Where to file issues**: - [https://github.com/therealprologic/docker-crux/issues](https://github.com/therealprologic/docker-crux/issues) - -- **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) - [`amd64`](https://hub.docker.com/r/amd64/crux/), [`arm64v8`](https://hub.docker.com/r/arm64v8/crux/) - -- **Published image artifact details**: - [repo-info repo's `repos/crux/` directory](https://github.com/docker-library/repo-info/blob/master/repos/crux) ([history](https://github.com/docker-library/repo-info/commits/master/repos/crux)) - (image metadata, transfer size, etc) - -- **Image updates**: - [official-images PRs with label `library/crux`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fcrux) - [official-images repo's `library/crux` file](https://github.com/docker-library/official-images/blob/master/library/crux) ([history](https://github.com/docker-library/official-images/commits/master/library/crux)) - -- **Source of this description**: - [docs repo's `crux/` directory](https://github.com/docker-library/docs/tree/master/crux) ([history](https://github.com/docker-library/docs/commits/master/crux)) - -# What is CRUX? - -CRUX is a lightweight Linux distribution for the x86-64 architecture targeted at experienced Linux users. The primary focus of this distribution is "keep it simple", which it reflects in a simple tar.gz-based package system, BSD-style initscripts, and a relatively small collection of trimmed packages. The secondary focus is utilization of new Linux features and recent tools and libraries. CRUX also has a ports system which makes it easy to install and upgrade applications. - -# Why use CRUX? - -There are many Linux distributions out there these days, so what makes CRUX any better than the others? The choice of distribution is a matter of taste, really. Here are a few hints about the tastes and goals of the people behind CRUX. CRUX is made with simplicity in mind from beginning to end. - -Making it easy to create new and update old packages is essential; updating a package in CRUX is often just a matter of typing `pkgmk -d -u`. The usage of ports helps keep your packages up-to-date; not the latest bleeding-edge-alpha version, but the latest stable version. Other features include creating packages optimized for your processor, eg. by compiling with `-march=x86-64`, and avoiding cluttering the filesystem with files you'll never use, eg. `/usr/doc/*`, etc. If you need more information about a specific program, other than information found in the man-page, Google usually knows all about it. - -Finally, it strives to use new features as they become available, as long as they are consistent with the rest of the goals. In short, CRUX might suit you very well if you are: - -- A somewhat experienced Linux user who wants a clean and solid Linux distribution as the foundation of your installation. -- A person who prefers editing configuration files with an editor to using a GUI. -- Someone who does not hesitate to download and compile programs from the source. - -# License - -View [license information](https://crux.nu/Main/Handbook3-3-Intro) for the software contained in this image (scroll to the "License" section at the end of the linked document). - -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). - -Some additional license information which was able to be auto-detected might be found in [the `repo-info` repository's `crux/` directory](https://github.com/docker-library/repo-info/tree/master/repos/crux). - -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. diff --git a/crux/content.md b/crux/content.md deleted file mode 100644 index 5a832d6ef8d6..000000000000 --- a/crux/content.md +++ /dev/null @@ -1,15 +0,0 @@ -# What is CRUX? - -CRUX is a lightweight Linux distribution for the x86-64 architecture targeted at experienced Linux users. The primary focus of this distribution is "keep it simple", which it reflects in a simple tar.gz-based package system, BSD-style initscripts, and a relatively small collection of trimmed packages. The secondary focus is utilization of new Linux features and recent tools and libraries. CRUX also has a ports system which makes it easy to install and upgrade applications. - -# Why use CRUX? - -There are many Linux distributions out there these days, so what makes CRUX any better than the others? The choice of distribution is a matter of taste, really. Here are a few hints about the tastes and goals of the people behind CRUX. CRUX is made with simplicity in mind from beginning to end. - -Making it easy to create new and update old packages is essential; updating a package in CRUX is often just a matter of typing `pkgmk -d -u`. The usage of ports helps keep your packages up-to-date; not the latest bleeding-edge-alpha version, but the latest stable version. Other features include creating packages optimized for your processor, eg. by compiling with `-march=x86-64`, and avoiding cluttering the filesystem with files you'll never use, eg. `/usr/doc/*`, etc. If you need more information about a specific program, other than information found in the man-page, Google usually knows all about it. - -Finally, it strives to use new features as they become available, as long as they are consistent with the rest of the goals. In short, CRUX might suit you very well if you are: - -- A somewhat experienced Linux user who wants a clean and solid Linux distribution as the foundation of your installation. -- A person who prefers editing configuration files with an editor to using a GUI. -- Someone who does not hesitate to download and compile programs from the source. diff --git a/crux/github-repo b/crux/github-repo deleted file mode 100644 index d14a8a15a1cd..000000000000 --- a/crux/github-repo +++ /dev/null @@ -1 +0,0 @@ -https://github.com/therealprologic/docker-crux diff --git a/crux/license.md b/crux/license.md deleted file mode 100644 index 1adb71cc66d0..000000000000 --- a/crux/license.md +++ /dev/null @@ -1 +0,0 @@ -View [license information](https://crux.nu/Main/Handbook3-3-Intro) for the software contained in this image (scroll to the "License" section at the end of the linked document). diff --git a/crux/logo.png b/crux/logo.png deleted file mode 100644 index f0e78814d0683292fd120385b48b5b70ba835f4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9542 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 diff --git a/crux/maintainer.md b/crux/maintainer.md deleted file mode 100644 index ae54b238cc9c..000000000000 --- a/crux/maintainer.md +++ /dev/null @@ -1 +0,0 @@ -[Docker Crux](https://github.com/cruxlinux/docker-crux) diff --git a/dart/README-short.txt b/dart/README-short.txt new file mode 100644 index 000000000000..eb5a59c34733 --- /dev/null +++ b/dart/README-short.txt @@ -0,0 +1 @@ +Dart is a client-optimized language for fast apps on any platform. diff --git a/dart/README.md b/dart/README.md new file mode 100644 index 000000000000..2c8c729cdcbd --- /dev/null +++ b/dart/README.md @@ -0,0 +1,145 @@ + + +# Quick reference + +- **Maintained by**: + The Dart Docker Team + +- **Where to get help**: + [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) + +# Supported tags and respective `Dockerfile` links + +- [`2.18.7-sdk`, `2.18-sdk`, `2-sdk`, `stable-sdk`, `sdk`, `2.18.7`, `2.18`, `2`, `stable`, `latest`](https://github.com/dart-lang/dart-docker/blob/fec666b5fef77a0419f2f3cb730f76a58679eec4/stable/bullseye/Dockerfile) +- [`2.19.0-444.4.beta-sdk`, `beta-sdk`, `2.19.0-444.4.beta`, `beta`](https://github.com/dart-lang/dart-docker/blob/fec666b5fef77a0419f2f3cb730f76a58679eec4/beta/bullseye/Dockerfile) + +# Quick reference (cont.) + +- **Where to file issues**: + [https://github.com/dart-lang/dart-docker/issues](https://github.com/dart-lang/dart-docker/issues) + +- **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) + [`amd64`](https://hub.docker.com/r/amd64/dart/), [`arm32v7`](https://hub.docker.com/r/arm32v7/dart/), [`arm64v8`](https://hub.docker.com/r/arm64v8/dart/) + +- **Published image artifact details**: + [repo-info repo's `repos/dart/` directory](https://github.com/docker-library/repo-info/blob/master/repos/dart) ([history](https://github.com/docker-library/repo-info/commits/master/repos/dart)) + (image metadata, transfer size, etc) + +- **Image updates**: + [official-images repo's `library/dart` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fdart) + [official-images repo's `library/dart` file](https://github.com/docker-library/official-images/blob/master/library/dart) ([history](https://github.com/docker-library/official-images/commits/master/library/dart)) + +- **Source of this description**: + [docs repo's `dart/` directory](https://github.com/docker-library/docs/tree/master/dart) ([history](https://github.com/docker-library/docs/commits/master/dart)) + +# What is Dart? + +Dart is a client-optimized language for developing fast apps on any platform. Its goal is to offer the most productive programming language for multi-platform development, paired with a flexible execution runtime platform for app frameworks. For more details, see https://dart.dev. + +By utilizing Dart's support for ahead-of-time (AOT) [compilation to executables](https://dart.dev/tools/dart-compile#exe), you can create very small runtime images (~10 MB). + +## Using this image + +We recommend using small runtime images that leverage Dart's support for ahead-of-time (AOT) [compilation to executables](https://dart.dev/tools/dart-compile#exe). This enables creating small runtime images (~10 MB). + +### Creating a Dart server app + +After [installing](https://dart.dev/get-dart) the Dart SDK, version 2.14 or later, use the `dart` command to create a new server app: + +```shell +$ dart create -t server-shelf myserver +``` + +### Running the server with Docker Desktop + +If you have [Docker Desktop](https://www.docker.com/get-started) installed, you can build and run on your machine with the `docker` command: + +```shell +$ docker build -t dart-server . +$ docker run -it --rm -p 8080:8080 --name myserver dart-server +``` + +When finished, you can stop the container using the name you provided: + +```shell +$ docker kill myserver +``` + +## Image documentation + +### `Dockerfile` + +The `Dockerfile` created by the `dart` tool performs two steps: + +1. Using the Dart SDK in the `dart:stable` image, compiles your server (`bin/server.dart`) to an executable (`server`). + +2. Assembles the runtime image by combining the compiled server with the Dart VM runtime and it's needed dependencies located in `/runtime/`. + +```Dockerfile +# Specify the Dart SDK base image version using dart: (ex: dart:2.12) +FROM dart:stable AS build + +# Resolve app dependencies. +WORKDIR /app +COPY pubspec.* ./ +RUN dart pub get + +# Copy app source code and AOT compile it. +COPY . . +# Ensure packages are still up-to-date if anything has changed +RUN dart pub get --offline +RUN dart compile exe bin/server.dart -o bin/server + +# Build minimal serving image from AOT-compiled `/server` and required system +# libraries and configuration files stored in `/runtime/` from the build stage. +FROM scratch +COPY --from=build /runtime/ / +COPY --from=build /app/bin/server /app/bin/ + +# Start server. +EXPOSE 8080 +CMD ["/app/bin/server"] +``` + +### `.dockerignore` + +Additionally it creates a recommended `.dockerignore` file, which enumarates files that should be omitted from the built Docker image: + +```text +.dockerignore +Dockerfile +build/ +.dart_tool/ +.git/ +.github/ +.gitignore +.packages +``` + +-- + +Maintained with ❤️ by the [Dart](https://dart.dev) team. + +# License + +View [license information](https://github.com/dart-lang/sdk/blob/master/LICENSE) for the software contained in this image. + +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). + +Some additional license information which was able to be auto-detected might be found in [the `repo-info` repository's `dart/` directory](https://github.com/docker-library/repo-info/tree/master/repos/dart). + +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. diff --git a/dart/content.md b/dart/content.md new file mode 100644 index 000000000000..7c2948ef232e --- /dev/null +++ b/dart/content.md @@ -0,0 +1,87 @@ +# What is Dart? + +Dart is a client-optimized language for developing fast apps on any platform. Its goal is to offer the most productive programming language for multi-platform development, paired with a flexible execution runtime platform for app frameworks. For more details, see https://dart.dev. + +By utilizing Dart's support for ahead-of-time (AOT) [compilation to executables](https://dart.dev/tools/dart-compile#exe), you can create very small runtime images (~10 MB). + +## Using this image + +We recommend using small runtime images that leverage Dart's support for ahead-of-time (AOT) [compilation to executables](https://dart.dev/tools/dart-compile#exe). This enables creating small runtime images (~10 MB). + +### Creating a Dart server app + +After [installing](https://dart.dev/get-dart) the Dart SDK, version 2.14 or later, use the `dart` command to create a new server app: + +```shell +$ dart create -t server-shelf myserver +``` + +### Running the server with Docker Desktop + +If you have [Docker Desktop](https://www.docker.com/get-started) installed, you can build and run on your machine with the `docker` command: + +```shell +$ docker build -t dart-server . +$ docker run -it --rm -p 8080:8080 --name myserver dart-server +``` + +When finished, you can stop the container using the name you provided: + +```shell +$ docker kill myserver +``` + +## Image documentation + +### `Dockerfile` + +The `Dockerfile` created by the `dart` tool performs two steps: + +1. Using the Dart SDK in the `dart:stable` image, compiles your server (`bin/server.dart`) to an executable (`server`). + +2. Assembles the runtime image by combining the compiled server with the Dart VM runtime and it's needed dependencies located in `/runtime/`. + +```Dockerfile +# Specify the Dart SDK base image version using dart: (ex: dart:2.12) +FROM dart:stable AS build + +# Resolve app dependencies. +WORKDIR /app +COPY pubspec.* ./ +RUN dart pub get + +# Copy app source code and AOT compile it. +COPY . . +# Ensure packages are still up-to-date if anything has changed +RUN dart pub get --offline +RUN dart compile exe bin/server.dart -o bin/server + +# Build minimal serving image from AOT-compiled `/server` and required system +# libraries and configuration files stored in `/runtime/` from the build stage. +FROM scratch +COPY --from=build /runtime/ / +COPY --from=build /app/bin/server /app/bin/ + +# Start server. +EXPOSE 8080 +CMD ["/app/bin/server"] +``` + +### `.dockerignore` + +Additionally it creates a recommended `.dockerignore` file, which enumarates files that should be omitted from the built Docker image: + +```text +.dockerignore +Dockerfile +build/ +.dart_tool/ +.git/ +.github/ +.gitignore +.packages +``` + +-- + +Maintained with ❤️ by the [Dart](https://dart.dev) team. diff --git a/dart/github-repo b/dart/github-repo new file mode 100644 index 000000000000..c3b020a67617 --- /dev/null +++ b/dart/github-repo @@ -0,0 +1 @@ +https://github.com/dart-lang/dart-docker diff --git a/dart/license.md b/dart/license.md new file mode 100644 index 000000000000..8fe5dfd4b597 --- /dev/null +++ b/dart/license.md @@ -0,0 +1 @@ +View [license information](https://github.com/dart-lang/sdk/blob/master/LICENSE) for the software contained in this image. diff --git a/dart/logo.svg b/dart/logo.svg new file mode 100644 index 000000000000..b9ddcdfaa755 --- /dev/null +++ b/dart/logo.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/dart/maintainer.md b/dart/maintainer.md new file mode 100644 index 000000000000..178b907de274 --- /dev/null +++ b/dart/maintainer.md @@ -0,0 +1 @@ +The Dart Docker Team diff --git a/debian/README.md b/debian/README.md index c329cf1b56de..1ba424887637 100644 --- a/debian/README.md +++ b/debian/README.md @@ -20,38 +20,34 @@ WARNING: Debian Developers [tianon](https://qa.debian.org/developer.php?login=tianon) and [paultag](https://qa.debian.org/developer.php?login=paultag) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`bullseye`, `bullseye-20200514`](https://github.com/debuerreotype/docker-debian-artifacts/blob/18cb4d0418be1c80fb19141b69ac2e0600b2d601/bullseye/Dockerfile) -- [`bullseye-backports`](https://github.com/debuerreotype/docker-debian-artifacts/blob/18cb4d0418be1c80fb19141b69ac2e0600b2d601/bullseye/backports/Dockerfile) -- [`bullseye-slim`, `bullseye-20200514-slim`](https://github.com/debuerreotype/docker-debian-artifacts/blob/18cb4d0418be1c80fb19141b69ac2e0600b2d601/bullseye/slim/Dockerfile) -- [`buster`, `buster-20200514`, `10.4`, `10`, `latest`](https://github.com/debuerreotype/docker-debian-artifacts/blob/18cb4d0418be1c80fb19141b69ac2e0600b2d601/buster/Dockerfile) -- [`buster-backports`](https://github.com/debuerreotype/docker-debian-artifacts/blob/18cb4d0418be1c80fb19141b69ac2e0600b2d601/buster/backports/Dockerfile) -- [`buster-slim`, `buster-20200514-slim`, `10.4-slim`, `10-slim`](https://github.com/debuerreotype/docker-debian-artifacts/blob/18cb4d0418be1c80fb19141b69ac2e0600b2d601/buster/slim/Dockerfile) -- [`experimental`, `experimental-20200514`](https://github.com/debuerreotype/docker-debian-artifacts/blob/18cb4d0418be1c80fb19141b69ac2e0600b2d601/experimental/Dockerfile) -- [`jessie`, `jessie-20200514`, `8.11`, `8`](https://github.com/debuerreotype/docker-debian-artifacts/blob/18cb4d0418be1c80fb19141b69ac2e0600b2d601/jessie/Dockerfile) -- [`jessie-slim`, `jessie-20200514-slim`, `8.11-slim`, `8-slim`](https://github.com/debuerreotype/docker-debian-artifacts/blob/18cb4d0418be1c80fb19141b69ac2e0600b2d601/jessie/slim/Dockerfile) -- [`oldoldstable`, `oldoldstable-20200514`](https://github.com/debuerreotype/docker-debian-artifacts/blob/18cb4d0418be1c80fb19141b69ac2e0600b2d601/oldoldstable/Dockerfile) -- [`oldoldstable-slim`, `oldoldstable-20200514-slim`](https://github.com/debuerreotype/docker-debian-artifacts/blob/18cb4d0418be1c80fb19141b69ac2e0600b2d601/oldoldstable/slim/Dockerfile) -- [`oldstable`, `oldstable-20200514`](https://github.com/debuerreotype/docker-debian-artifacts/blob/18cb4d0418be1c80fb19141b69ac2e0600b2d601/oldstable/Dockerfile) -- [`oldstable-backports`](https://github.com/debuerreotype/docker-debian-artifacts/blob/18cb4d0418be1c80fb19141b69ac2e0600b2d601/oldstable/backports/Dockerfile) -- [`oldstable-slim`, `oldstable-20200514-slim`](https://github.com/debuerreotype/docker-debian-artifacts/blob/18cb4d0418be1c80fb19141b69ac2e0600b2d601/oldstable/slim/Dockerfile) -- [`rc-buggy`, `rc-buggy-20200514`](https://github.com/debuerreotype/docker-debian-artifacts/blob/18cb4d0418be1c80fb19141b69ac2e0600b2d601/rc-buggy/Dockerfile) -- [`sid`, `sid-20200514`](https://github.com/debuerreotype/docker-debian-artifacts/blob/18cb4d0418be1c80fb19141b69ac2e0600b2d601/sid/Dockerfile) -- [`sid-slim`, `sid-20200514-slim`](https://github.com/debuerreotype/docker-debian-artifacts/blob/18cb4d0418be1c80fb19141b69ac2e0600b2d601/sid/slim/Dockerfile) -- [`stable`, `stable-20200514`](https://github.com/debuerreotype/docker-debian-artifacts/blob/18cb4d0418be1c80fb19141b69ac2e0600b2d601/stable/Dockerfile) -- [`stable-backports`](https://github.com/debuerreotype/docker-debian-artifacts/blob/18cb4d0418be1c80fb19141b69ac2e0600b2d601/stable/backports/Dockerfile) -- [`stable-slim`, `stable-20200514-slim`](https://github.com/debuerreotype/docker-debian-artifacts/blob/18cb4d0418be1c80fb19141b69ac2e0600b2d601/stable/slim/Dockerfile) -- [`stretch`, `stretch-20200514`, `9.12`, `9`](https://github.com/debuerreotype/docker-debian-artifacts/blob/18cb4d0418be1c80fb19141b69ac2e0600b2d601/stretch/Dockerfile) -- [`stretch-backports`](https://github.com/debuerreotype/docker-debian-artifacts/blob/18cb4d0418be1c80fb19141b69ac2e0600b2d601/stretch/backports/Dockerfile) -- [`stretch-slim`, `stretch-20200514-slim`, `9.12-slim`, `9-slim`](https://github.com/debuerreotype/docker-debian-artifacts/blob/18cb4d0418be1c80fb19141b69ac2e0600b2d601/stretch/slim/Dockerfile) -- [`testing`, `testing-20200514`](https://github.com/debuerreotype/docker-debian-artifacts/blob/18cb4d0418be1c80fb19141b69ac2e0600b2d601/testing/Dockerfile) -- [`testing-backports`](https://github.com/debuerreotype/docker-debian-artifacts/blob/18cb4d0418be1c80fb19141b69ac2e0600b2d601/testing/backports/Dockerfile) -- [`testing-slim`, `testing-20200514-slim`](https://github.com/debuerreotype/docker-debian-artifacts/blob/18cb4d0418be1c80fb19141b69ac2e0600b2d601/testing/slim/Dockerfile) -- [`unstable`, `unstable-20200514`](https://github.com/debuerreotype/docker-debian-artifacts/blob/18cb4d0418be1c80fb19141b69ac2e0600b2d601/unstable/Dockerfile) -- [`unstable-slim`, `unstable-20200514-slim`](https://github.com/debuerreotype/docker-debian-artifacts/blob/18cb4d0418be1c80fb19141b69ac2e0600b2d601/unstable/slim/Dockerfile) +- [`bookworm`, `bookworm-20230109`](https://github.com/debuerreotype/docker-debian-artifacts/blob/64b13cf5860ac15c1d909abd7239516db9748fea/bookworm/Dockerfile) +- [`bookworm-backports`](https://github.com/debuerreotype/docker-debian-artifacts/blob/64b13cf5860ac15c1d909abd7239516db9748fea/bookworm/backports/Dockerfile) +- [`bookworm-slim`, `bookworm-20230109-slim`](https://github.com/debuerreotype/docker-debian-artifacts/blob/64b13cf5860ac15c1d909abd7239516db9748fea/bookworm/slim/Dockerfile) +- [`bullseye`, `bullseye-20230109`, `11.6`, `11`, `latest`](https://github.com/debuerreotype/docker-debian-artifacts/blob/64b13cf5860ac15c1d909abd7239516db9748fea/bullseye/Dockerfile) +- [`bullseye-backports`](https://github.com/debuerreotype/docker-debian-artifacts/blob/64b13cf5860ac15c1d909abd7239516db9748fea/bullseye/backports/Dockerfile) +- [`bullseye-slim`, `bullseye-20230109-slim`, `11.6-slim`, `11-slim`](https://github.com/debuerreotype/docker-debian-artifacts/blob/64b13cf5860ac15c1d909abd7239516db9748fea/bullseye/slim/Dockerfile) +- [`buster`, `buster-20230109`, `10.13`, `10`](https://github.com/debuerreotype/docker-debian-artifacts/blob/64b13cf5860ac15c1d909abd7239516db9748fea/buster/Dockerfile) +- [`buster-backports`](https://github.com/debuerreotype/docker-debian-artifacts/blob/64b13cf5860ac15c1d909abd7239516db9748fea/buster/backports/Dockerfile) +- [`buster-slim`, `buster-20230109-slim`, `10.13-slim`, `10-slim`](https://github.com/debuerreotype/docker-debian-artifacts/blob/64b13cf5860ac15c1d909abd7239516db9748fea/buster/slim/Dockerfile) +- [`experimental`, `experimental-20230109`](https://github.com/debuerreotype/docker-debian-artifacts/blob/64b13cf5860ac15c1d909abd7239516db9748fea/experimental/Dockerfile) +- [`oldstable`, `oldstable-20230109`](https://github.com/debuerreotype/docker-debian-artifacts/blob/64b13cf5860ac15c1d909abd7239516db9748fea/oldstable/Dockerfile) +- [`oldstable-backports`](https://github.com/debuerreotype/docker-debian-artifacts/blob/64b13cf5860ac15c1d909abd7239516db9748fea/oldstable/backports/Dockerfile) +- [`oldstable-slim`, `oldstable-20230109-slim`](https://github.com/debuerreotype/docker-debian-artifacts/blob/64b13cf5860ac15c1d909abd7239516db9748fea/oldstable/slim/Dockerfile) +- [`rc-buggy`, `rc-buggy-20230109`](https://github.com/debuerreotype/docker-debian-artifacts/blob/64b13cf5860ac15c1d909abd7239516db9748fea/rc-buggy/Dockerfile) +- [`sid`, `sid-20230109`](https://github.com/debuerreotype/docker-debian-artifacts/blob/64b13cf5860ac15c1d909abd7239516db9748fea/sid/Dockerfile) +- [`sid-slim`, `sid-20230109-slim`](https://github.com/debuerreotype/docker-debian-artifacts/blob/64b13cf5860ac15c1d909abd7239516db9748fea/sid/slim/Dockerfile) +- [`stable`, `stable-20230109`](https://github.com/debuerreotype/docker-debian-artifacts/blob/64b13cf5860ac15c1d909abd7239516db9748fea/stable/Dockerfile) +- [`stable-backports`](https://github.com/debuerreotype/docker-debian-artifacts/blob/64b13cf5860ac15c1d909abd7239516db9748fea/stable/backports/Dockerfile) +- [`stable-slim`, `stable-20230109-slim`](https://github.com/debuerreotype/docker-debian-artifacts/blob/64b13cf5860ac15c1d909abd7239516db9748fea/stable/slim/Dockerfile) +- [`testing`, `testing-20230109`](https://github.com/debuerreotype/docker-debian-artifacts/blob/64b13cf5860ac15c1d909abd7239516db9748fea/testing/Dockerfile) +- [`testing-backports`](https://github.com/debuerreotype/docker-debian-artifacts/blob/64b13cf5860ac15c1d909abd7239516db9748fea/testing/backports/Dockerfile) +- [`testing-slim`, `testing-20230109-slim`](https://github.com/debuerreotype/docker-debian-artifacts/blob/64b13cf5860ac15c1d909abd7239516db9748fea/testing/slim/Dockerfile) +- [`unstable`, `unstable-20230109`](https://github.com/debuerreotype/docker-debian-artifacts/blob/64b13cf5860ac15c1d909abd7239516db9748fea/unstable/Dockerfile) +- [`unstable-slim`, `unstable-20230109-slim`](https://github.com/debuerreotype/docker-debian-artifacts/blob/64b13cf5860ac15c1d909abd7239516db9748fea/unstable/slim/Dockerfile) # Quick reference (cont.) @@ -59,14 +55,14 @@ WARNING: [https://github.com/debuerreotype/docker-debian-artifacts/issues](https://github.com/debuerreotype/docker-debian-artifacts/issues) - **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) - [`amd64`](https://hub.docker.com/r/amd64/debian/), [`arm32v5`](https://hub.docker.com/r/arm32v5/debian/), [`arm32v7`](https://hub.docker.com/r/arm32v7/debian/), [`arm64v8`](https://hub.docker.com/r/arm64v8/debian/), [`i386`](https://hub.docker.com/r/i386/debian/), [`mips64le`](https://hub.docker.com/r/mips64le/debian/), [`ppc64le`](https://hub.docker.com/r/ppc64le/debian/), [`s390x`](https://hub.docker.com/r/s390x/debian/) + [`amd64`](https://hub.docker.com/r/amd64/debian/), [`arm32v5`](https://hub.docker.com/r/arm32v5/debian/), [`arm32v7`](https://hub.docker.com/r/arm32v7/debian/), [`arm64v8`](https://hub.docker.com/r/arm64v8/debian/), [`i386`](https://hub.docker.com/r/i386/debian/), [`mips64le`](https://hub.docker.com/r/mips64le/debian/), [`ppc64le`](https://hub.docker.com/r/ppc64le/debian/), [`riscv64`](https://hub.docker.com/r/riscv64/debian/), [`s390x`](https://hub.docker.com/r/s390x/debian/) - **Published image artifact details**: [repo-info repo's `repos/debian/` directory](https://github.com/docker-library/repo-info/blob/master/repos/debian) ([history](https://github.com/docker-library/repo-info/commits/master/repos/debian)) (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/debian`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fdebian) + [official-images repo's `library/debian` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fdebian) [official-images repo's `library/debian` file](https://github.com/docker-library/official-images/blob/master/library/debian) ([history](https://github.com/docker-library/official-images/commits/master/library/debian)) - **Source of this description**: @@ -82,7 +78,7 @@ Debian is an operating system which is composed primarily of free and open-sourc # About this image -The `debian:latest` tag will always point the latest stable release (which is, at the time of this writing, `debian:buster`). Stable releases are also tagged with their version (ie, `debian:9` is an alias for `debian:stretch`, `debian:8` is an alias for `debian:jessie`, etc). +The `debian:latest` tag will always point the latest stable release. Stable releases are also tagged with their version (ie, `debian:11` is an alias for `debian:bullseye`, `debian:10` is an alias for `debian:buster`, etc). The rolling tags (`debian:stable`, `debian:testing`, etc) use the rolling suite names in their `/etc/apt/sources.list` file (ie, `deb http://deb.debian.org/debian testing main`). @@ -104,7 +100,7 @@ ENV LANG en_US.utf8 ## How It's Made -The rootfs tarballs for this image are built using [the reproducible-Debian-rootfs tool, `debuerreotype`](https://github.com/debuerreotype/debuerreotype), with an explicit goal being that they are transparent and reproducible. Using the same toolchain, it should be possible to regenerate (clean-room!) the same tarballs used for building the official Debian images. [The `build.sh` script in that debuerreotype repository](https://github.com/debuerreotype/debuerreotype/blob/master/build.sh) (and the `build-all.sh` companion/wrapper) is the canonical entrypoint used for creating the artifacts published in this image. +The rootfs tarballs for this image are built using [the reproducible-Debian-rootfs tool, `debuerreotype`](https://github.com/debuerreotype/debuerreotype), with an explicit goal being that they are transparent and reproducible. Using the same toolchain, it should be possible to regenerate (clean-room!) the same tarballs used for building the official Debian images. [The `examples/debian.sh` script in that debuerreotype repository](https://github.com/debuerreotype/debuerreotype/blob/master/examples/debian.sh) (and the `debian-all.sh` companion/wrapper) is the canonical entrypoint used for creating the artifacts published in this image (via a process similar to the `docker-run.sh` included in the root of that repository). Additionally, the scripts in [https://github.com/debuerreotype/docker-debian-artifacts](https://github.com/debuerreotype/docker-debian-artifacts) are used to create each tag's `Dockerfile` and collect architecture-specific tarballs into [`dist-ARCH` branches on the same repository](https://github.com/debuerreotype/docker-debian-artifacts/branches), which also contain extra metadata about the artifacts included in each build, such as explicit package versions included in the base image (`rootfs.manifest`), the exact snapshot.debian.org timestamp used for `debuerreotype` invocation (`rootfs.debuerreotype-epoch`), the `sources.list` found in the image (`rootfs.sources-list`) and the one used during image creation (`rootfs.sources-list-snapshot`), etc. diff --git a/debian/content.md b/debian/content.md index 4cc9cd2fe353..014b13a84315 100644 --- a/debian/content.md +++ b/debian/content.md @@ -8,7 +8,7 @@ Debian is an operating system which is composed primarily of free and open-sourc # About this image -The `%%IMAGE%%:latest` tag will always point the latest stable release (which is, at the time of this writing, `%%IMAGE%%:buster`). Stable releases are also tagged with their version (ie, `%%IMAGE%%:9` is an alias for `%%IMAGE%%:stretch`, `%%IMAGE%%:8` is an alias for `%%IMAGE%%:jessie`, etc). +The `%%IMAGE%%:latest` tag will always point the latest stable release. Stable releases are also tagged with their version (ie, `%%IMAGE%%:11` is an alias for `%%IMAGE%%:bullseye`, `%%IMAGE%%:10` is an alias for `%%IMAGE%%:buster`, etc). The rolling tags (`%%IMAGE%%:stable`, `%%IMAGE%%:testing`, etc) use the rolling suite names in their `/etc/apt/sources.list` file (ie, `deb http://deb.debian.org/debian testing main`). @@ -30,7 +30,7 @@ ENV LANG en_US.utf8 ## How It's Made -The rootfs tarballs for this image are built using [the reproducible-Debian-rootfs tool, `debuerreotype`](https://github.com/debuerreotype/debuerreotype), with an explicit goal being that they are transparent and reproducible. Using the same toolchain, it should be possible to regenerate (clean-room!) the same tarballs used for building the official Debian images. [The `build.sh` script in that debuerreotype repository](https://github.com/debuerreotype/debuerreotype/blob/master/build.sh) (and the `build-all.sh` companion/wrapper) is the canonical entrypoint used for creating the artifacts published in this image. +The rootfs tarballs for this image are built using [the reproducible-Debian-rootfs tool, `debuerreotype`](https://github.com/debuerreotype/debuerreotype), with an explicit goal being that they are transparent and reproducible. Using the same toolchain, it should be possible to regenerate (clean-room!) the same tarballs used for building the official Debian images. [The `examples/debian.sh` script in that debuerreotype repository](https://github.com/debuerreotype/debuerreotype/blob/master/examples/debian.sh) (and the `debian-all.sh` companion/wrapper) is the canonical entrypoint used for creating the artifacts published in this image (via a process similar to the `docker-run.sh` included in the root of that repository). Additionally, the scripts in [%%GITHUB-REPO%%](%%GITHUB-REPO%%) are used to create each tag's `Dockerfile` and collect architecture-specific tarballs into [`dist-ARCH` branches on the same repository](%%GITHUB-REPO%%/branches), which also contain extra metadata about the artifacts included in each build, such as explicit package versions included in the base image (`rootfs.manifest`), the exact snapshot.debian.org timestamp used for `debuerreotype` invocation (`rootfs.debuerreotype-epoch`), the `sources.list` found in the image (`rootfs.sources-list`) and the one used during image creation (`rootfs.sources-list-snapshot`), etc. diff --git a/docker/README.md b/docker/README.md index a71a2b6fa14d..8db5904ef2dd 100644 --- a/docker/README.md +++ b/docker/README.md @@ -20,14 +20,35 @@ WARNING: [Tianon (of the Docker Project)](https://github.com/docker-library/docker) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`19.03.8`, `19.03`, `19`, `stable`, `test`, `latest`](https://github.com/docker-library/docker/blob/0bab8e3d0ebe6dc4b7a122bb1d0b2e017925c50d/19.03/Dockerfile) -- [`19.03.8-dind`, `19.03-dind`, `19-dind`, `stable-dind`, `test-dind`, `dind`](https://github.com/docker-library/docker/blob/a73d96e731e2dd5d6822c99a9af4dcbfbbedb2be/19.03/dind/Dockerfile) -- [`19.03.8-dind-rootless`, `19.03-dind-rootless`, `19-dind-rootless`, `stable-dind-rootless`, `test-dind-rootless`, `dind-rootless`](https://github.com/docker-library/docker/blob/25c81c65fe4e971ff75e67df38e8b9970b523f6e/19.03/dind-rootless/Dockerfile) -- [`19.03.8-git`, `19.03-git`, `19-git`, `stable-git`, `test-git`, `git`](https://github.com/docker-library/docker/blob/7a67842e7ff12c1426ae6a67ac1b7a701b51f3df/19.03/git/Dockerfile) +(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).) + +## Simple Tags + +- [`23.0.0-rc.1-cli`, `23.0-rc-cli`, `rc-cli`, `23.0.0-rc.1-cli-alpine3.17`](https://github.com/docker-library/docker/blob/0997ca7ad1d7892324d84951d55192d5ef629bcc/23.0-rc/cli/Dockerfile) +- [`23.0.0-rc.1-dind`, `23.0-rc-dind`, `rc-dind`, `23.0.0-rc.1-dind-alpine3.17`, `23.0.0-rc.1`, `23.0-rc`, `rc`, `23.0.0-rc.1-alpine3.17`](https://github.com/docker-library/docker/blob/023a45d6e2a9009fdf01da87499c6f9ca6e27bef/23.0-rc/dind/Dockerfile) +- [`23.0.0-rc.1-dind-rootless`, `23.0-rc-dind-rootless`, `rc-dind-rootless`](https://github.com/docker-library/docker/blob/023a45d6e2a9009fdf01da87499c6f9ca6e27bef/23.0-rc/dind-rootless/Dockerfile) +- [`23.0.0-rc.1-git`, `23.0-rc-git`, `rc-git`](https://github.com/docker-library/docker/blob/c608944bf9422f7cd70951b9519866495b81e76d/23.0-rc/git/Dockerfile) +- [`23.0.0-rc.1-windowsservercore-ltsc2022`, `23.0-rc-windowsservercore-ltsc2022`, `rc-windowsservercore-ltsc2022`](https://github.com/docker-library/docker/blob/023a45d6e2a9009fdf01da87499c6f9ca6e27bef/23.0-rc/windows/windowsservercore-ltsc2022/Dockerfile) +- [`23.0.0-rc.1-windowsservercore-1809`, `23.0-rc-windowsservercore-1809`, `rc-windowsservercore-1809`](https://github.com/docker-library/docker/blob/023a45d6e2a9009fdf01da87499c6f9ca6e27bef/23.0-rc/windows/windowsservercore-1809/Dockerfile) +- [`20.10.22-cli`, `20.10-cli`, `20-cli`, `cli`, `20.10.22-cli-alpine3.17`, `20.10.22`, `20.10`, `20`, `latest`, `20.10.22-alpine3.17`](https://github.com/docker-library/docker/blob/95414fb25c65f77412e44dac9949c12e73dc58dc/20.10/cli/Dockerfile) +- [`20.10.22-dind`, `20.10-dind`, `20-dind`, `dind`, `20.10.22-dind-alpine3.17`](https://github.com/docker-library/docker/blob/32a92d275e8aa2edd2a99ad55e56a106e48601d6/20.10/dind/Dockerfile) +- [`20.10.22-dind-rootless`, `20.10-dind-rootless`, `20-dind-rootless`, `dind-rootless`](https://github.com/docker-library/docker/blob/32a92d275e8aa2edd2a99ad55e56a106e48601d6/20.10/dind-rootless/Dockerfile) +- [`20.10.22-git`, `20.10-git`, `20-git`, `git`](https://github.com/docker-library/docker/blob/f23a2bea97f6d7ec563bc316302fb8edf620ec5b/20.10/git/Dockerfile) +- [`20.10.22-windowsservercore-ltsc2022`, `20.10-windowsservercore-ltsc2022`, `20-windowsservercore-ltsc2022`, `windowsservercore-ltsc2022`](https://github.com/docker-library/docker/blob/32a92d275e8aa2edd2a99ad55e56a106e48601d6/20.10/windows/windowsservercore-ltsc2022/Dockerfile) +- [`20.10.22-windowsservercore-1809`, `20.10-windowsservercore-1809`, `20-windowsservercore-1809`, `windowsservercore-1809`](https://github.com/docker-library/docker/blob/32a92d275e8aa2edd2a99ad55e56a106e48601d6/20.10/windows/windowsservercore-1809/Dockerfile) + +## Shared Tags + +- `23.0.0-rc.1-windowsservercore`, `23.0-rc-windowsservercore`, `rc-windowsservercore`: + - [`23.0.0-rc.1-windowsservercore-ltsc2022`](https://github.com/docker-library/docker/blob/023a45d6e2a9009fdf01da87499c6f9ca6e27bef/23.0-rc/windows/windowsservercore-ltsc2022/Dockerfile) + - [`23.0.0-rc.1-windowsservercore-1809`](https://github.com/docker-library/docker/blob/023a45d6e2a9009fdf01da87499c6f9ca6e27bef/23.0-rc/windows/windowsservercore-1809/Dockerfile) +- `20.10.22-windowsservercore`, `20.10-windowsservercore`, `20-windowsservercore`, `windowsservercore`: + - [`20.10.22-windowsservercore-ltsc2022`](https://github.com/docker-library/docker/blob/32a92d275e8aa2edd2a99ad55e56a106e48601d6/20.10/windows/windowsservercore-ltsc2022/Dockerfile) + - [`20.10.22-windowsservercore-1809`](https://github.com/docker-library/docker/blob/32a92d275e8aa2edd2a99ad55e56a106e48601d6/20.10/windows/windowsservercore-1809/Dockerfile) # Quick reference (cont.) @@ -35,14 +56,14 @@ WARNING: [https://github.com/docker-library/docker/issues](https://github.com/docker-library/docker/issues) - **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) - [`amd64`](https://hub.docker.com/r/amd64/docker/), [`arm32v6`](https://hub.docker.com/r/arm32v6/docker/), [`arm32v7`](https://hub.docker.com/r/arm32v7/docker/), [`arm64v8`](https://hub.docker.com/r/arm64v8/docker/) + [`amd64`](https://hub.docker.com/r/amd64/docker/), [`arm64v8`](https://hub.docker.com/r/arm64v8/docker/), [`windows-amd64`](https://hub.docker.com/r/winamd64/docker/) - **Published image artifact details**: [repo-info repo's `repos/docker/` directory](https://github.com/docker-library/repo-info/blob/master/repos/docker) ([history](https://github.com/docker-library/repo-info/commits/master/repos/docker)) (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/docker`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fdocker) + [official-images repo's `library/docker` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fdocker) [official-images repo's `library/docker` file](https://github.com/docker-library/official-images/blob/master/library/docker) ([history](https://github.com/docker-library/official-images/commits/master/library/docker)) - **Source of this description**: @@ -64,7 +85,7 @@ If you are still convinced that you need Docker-in-Docker and not just access to # How to use this image -[![asciicast](https://asciinema.org/a/24707.png)](https://asciinema.org/a/24707) +[![asciicast](https://asciinema.org/a/378669.svg)](https://asciinema.org/a/378669) ## TLS @@ -238,10 +259,42 @@ $ docker run --privileged --name some-docker -d \ docker:dind --storage-driver overlay2 ``` +## Runtime Settings Considerations + +Inspired by the [official systemd `docker.service` configuration](https://github.com/docker/docker-ce-packaging/blob/57ae892b13de399171fc33f878b70e72855747e6/systemd/docker.service#L30-L45), you may want to consider different values for the following runtime configuration options, especially for production Docker instances: + +```console +$ docker run --privileged --name some-docker -d \ + ... \ + --ulimit nofile=-1 \ + --ulimit nproc=-1 \ + --ulimit core=-1 \ + --pids-limit -1 \ + --oom-score-adj -500 \ + docker:dind +``` + +Some of these will not be supported based on the settings on the host's `dockerd`, such as `--ulimit nofile=-1`, giving errors that look like `error setting rlimit type 7: operation not permitted`, and some may inherit sane values from the host `dockerd` instance or may not apply for your usage of Docker-in-Docker (for example, you likely want to set `--oom-score-adj` to a value that's higher than `dockerd` on the host so that your Docker-in-Docker instance is killed before the host Docker instance is). + ## Rootless For more information about using the experimental "rootless" image variants, see [docker-library/docker#174](https://github.com/docker-library/docker/pull/174). +**Note:** just like the regular `dind` images, `--privileged` is required for Docker-in-Docker to function properly ([docker-library/docker#151](https://github.com/docker-library/docker/issues/151#issuecomment-483185972) & [docker-library/docker#281](https://github.com/docker-library/docker/issues/281#issuecomment-744766015)). For `19.03.x` rootless images, an argument of `--experimental` is required for `dockerd` ([docker/docker#40759](https://github.com/docker/docker/pull/40759)). + +Basic example usage: + +```console +$ docker run -d --name some-docker --privileged docker:dind-rootless +$ docker logs --tail=3 some-docker # to verify the daemon has finished generating TLS certificates and is listening successfully +time="xxx" level=info msg="Daemon has completed initialization" +time="xxx" level=info msg="API listen on /run/user/1000/docker.sock" +time="xxx" level=info msg="API listen on [::]:2376" +$ docker exec -it some-docker docker-entrypoint.sh sh # using "docker-entrypoint.sh" which auto-sets "DOCKER_HOST" appropriately +/ $ docker info --format '{{ json .SecurityOptions }}' +["name=seccomp,profile=default","name=rootless"] +``` + ## Where to Store Data Important note: There are several ways to store data used by applications that run in Docker containers. We encourage users of the `docker` images to familiarize themselves with the options available, including: @@ -260,6 +313,18 @@ The Docker documentation is a good starting point for understanding the differen The `-v /my/own/var-lib-docker:/var/lib/docker` part of the command mounts the `/my/own/var-lib-docker` directory from the underlying host system as `/var/lib/docker` inside the container, where Docker by default will write its data files. +# Image Variants + +The `docker` images come in many flavors, each designed for a specific use case. + +## `docker:` + +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. + +## `docker:-windowsservercore` + +Unfortunately, Windows does not support nested containers, so this image variant only contains the client (intended for use against an existing Docker engine, ala `-v //./pipe/docker_engine://./pipe/docker_engine`). + # License View [license information](https://github.com/docker/docker/blob/eb7b2ed6bbe3fbef588116d362ce595d6e35fc43/LICENSE) for the software contained in this image. diff --git a/docker/content.md b/docker/content.md index 05269f95e5ea..8236370bc637 100644 --- a/docker/content.md +++ b/docker/content.md @@ -14,7 +14,7 @@ If you are still convinced that you need Docker-in-Docker and not just access to # How to use this image -[![asciicast](https://asciinema.org/a/24707.png)](https://asciinema.org/a/24707) +[![asciicast](https://asciinema.org/a/378669.svg)](https://asciinema.org/a/378669) ## TLS @@ -188,10 +188,42 @@ $ docker run --privileged --name some-docker -d \ %%IMAGE%%:dind --storage-driver overlay2 ``` +## Runtime Settings Considerations + +Inspired by the [official systemd `docker.service` configuration](https://github.com/docker/docker-ce-packaging/blob/57ae892b13de399171fc33f878b70e72855747e6/systemd/docker.service#L30-L45), you may want to consider different values for the following runtime configuration options, especially for production Docker instances: + +```console +$ docker run --privileged --name some-docker -d \ + ... \ + --ulimit nofile=-1 \ + --ulimit nproc=-1 \ + --ulimit core=-1 \ + --pids-limit -1 \ + --oom-score-adj -500 \ + %%IMAGE%%:dind +``` + +Some of these will not be supported based on the settings on the host's `dockerd`, such as `--ulimit nofile=-1`, giving errors that look like `error setting rlimit type 7: operation not permitted`, and some may inherit sane values from the host `dockerd` instance or may not apply for your usage of Docker-in-Docker (for example, you likely want to set `--oom-score-adj` to a value that's higher than `dockerd` on the host so that your Docker-in-Docker instance is killed before the host Docker instance is). + ## Rootless For more information about using the experimental "rootless" image variants, see [docker-library/docker#174](https://github.com/docker-library/docker/pull/174). +**Note:** just like the regular `dind` images, `--privileged` is required for Docker-in-Docker to function properly ([docker-library/docker#151](https://github.com/docker-library/docker/issues/151#issuecomment-483185972) & [docker-library/docker#281](https://github.com/docker-library/docker/issues/281#issuecomment-744766015)). For `19.03.x` rootless images, an argument of `--experimental` is required for `dockerd` ([docker/docker#40759](https://github.com/docker/docker/pull/40759)). + +Basic example usage: + +```console +$ docker run -d --name some-docker --privileged docker:dind-rootless +$ docker logs --tail=3 some-docker # to verify the daemon has finished generating TLS certificates and is listening successfully +time="xxx" level=info msg="Daemon has completed initialization" +time="xxx" level=info msg="API listen on /run/user/1000/docker.sock" +time="xxx" level=info msg="API listen on [::]:2376" +$ docker exec -it some-docker docker-entrypoint.sh sh # using "docker-entrypoint.sh" which auto-sets "DOCKER_HOST" appropriately +/ $ docker info --format '{{ json .SecurityOptions }}' +["name=seccomp,profile=default","name=rootless"] +``` + ## Where to Store Data Important note: There are several ways to store data used by applications that run in Docker containers. We encourage users of the `%%REPO%%` images to familiarize themselves with the options available, including: diff --git a/docker/variant-windowsservercore.md b/docker/variant-windowsservercore.md new file mode 100644 index 000000000000..09708823b404 --- /dev/null +++ b/docker/variant-windowsservercore.md @@ -0,0 +1,3 @@ +## `%%IMAGE%%:-windowsservercore` + +Unfortunately, Windows does not support nested containers, so this image variant only contains the client (intended for use against an existing Docker engine, ala `-v //./pipe/docker_engine://./pipe/docker_engine`). diff --git a/drupal/README.md b/drupal/README.md index 2aa8d2e7c688..949c0f62533d 100644 --- a/drupal/README.md +++ b/drupal/README.md @@ -20,19 +20,49 @@ WARNING: [the Docker Community](https://github.com/docker-library/drupal) (*not* the Drupal Community or the Drupal Security Team) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`8.8.5-apache`, `8.8-apache`, `8-apache`, `apache`, `8.8.5`, `8.8`, `8`, `latest`](https://github.com/docker-library/drupal/blob/189686e109917d7bffaf28024be7d6d28495f57d/8.8/apache/Dockerfile) -- [`8.8.5-fpm`, `8.8-fpm`, `8-fpm`, `fpm`](https://github.com/docker-library/drupal/blob/189686e109917d7bffaf28024be7d6d28495f57d/8.8/fpm/Dockerfile) -- [`8.8.5-fpm-alpine`, `8.8-fpm-alpine`, `8-fpm-alpine`, `fpm-alpine`](https://github.com/docker-library/drupal/blob/189686e109917d7bffaf28024be7d6d28495f57d/8.8/fpm-alpine/Dockerfile) -- [`8.7.13-apache`, `8.7-apache`, `8.7.13`, `8.7`](https://github.com/docker-library/drupal/blob/72a76c53c4f4b0c3f9780bbdb8a12f8b94f73c1b/8.7/apache/Dockerfile) -- [`8.7.13-fpm`, `8.7-fpm`](https://github.com/docker-library/drupal/blob/72a76c53c4f4b0c3f9780bbdb8a12f8b94f73c1b/8.7/fpm/Dockerfile) -- [`8.7.13-fpm-alpine`, `8.7-fpm-alpine`](https://github.com/docker-library/drupal/blob/72a76c53c4f4b0c3f9780bbdb8a12f8b94f73c1b/8.7/fpm-alpine/Dockerfile) -- [`7.69-apache`, `7-apache`, `7.69`, `7`](https://github.com/docker-library/drupal/blob/1ec9ec0be11ef631014202064adcc402b834717d/7/apache/Dockerfile) -- [`7.69-fpm`, `7-fpm`](https://github.com/docker-library/drupal/blob/1ec9ec0be11ef631014202064adcc402b834717d/7/fpm/Dockerfile) -- [`7.69-fpm-alpine`, `7-fpm-alpine`](https://github.com/docker-library/drupal/blob/1ec9ec0be11ef631014202064adcc402b834717d/7/fpm-alpine/Dockerfile) +- [`10.0.1-php8.2-apache-bullseye`, `10.0-php8.2-apache-bullseye`, `10-php8.2-apache-bullseye`, `php8.2-apache-bullseye`, `10.0.1-php8.2-apache`, `10.0-php8.2-apache`, `10-php8.2-apache`, `php8.2-apache`, `10.0.1-php8.2`, `10.0-php8.2`, `10-php8.2`, `php8.2`, `10.0.1-apache-bullseye`, `10.0-apache-bullseye`, `10-apache-bullseye`, `apache-bullseye`, `10.0.1-apache`, `10.0-apache`, `10-apache`, `apache`, `10.0.1`, `10.0`, `10`, `latest`](https://github.com/docker-library/drupal/blob/b3f06944e851a3fb63773b230c103c3966ce7414/10.0/php8.2/apache-bullseye/Dockerfile) +- [`10.0.1-php8.2-fpm-bullseye`, `10.0-php8.2-fpm-bullseye`, `10-php8.2-fpm-bullseye`, `php8.2-fpm-bullseye`, `10.0.1-php8.2-fpm`, `10.0-php8.2-fpm`, `10-php8.2-fpm`, `php8.2-fpm`, `10.0.1-fpm-bullseye`, `10.0-fpm-bullseye`, `10-fpm-bullseye`, `fpm-bullseye`, `10.0.1-fpm`, `10.0-fpm`, `10-fpm`, `fpm`](https://github.com/docker-library/drupal/blob/b3f06944e851a3fb63773b230c103c3966ce7414/10.0/php8.2/fpm-bullseye/Dockerfile) +- [`10.0.1-php8.2-apache-buster`, `10.0-php8.2-apache-buster`, `10-php8.2-apache-buster`, `php8.2-apache-buster`, `10.0.1-apache-buster`, `10.0-apache-buster`, `10-apache-buster`, `apache-buster`](https://github.com/docker-library/drupal/blob/b3f06944e851a3fb63773b230c103c3966ce7414/10.0/php8.2/apache-buster/Dockerfile) +- [`10.0.1-php8.2-fpm-buster`, `10.0-php8.2-fpm-buster`, `10-php8.2-fpm-buster`, `php8.2-fpm-buster`, `10.0.1-fpm-buster`, `10.0-fpm-buster`, `10-fpm-buster`, `fpm-buster`](https://github.com/docker-library/drupal/blob/b3f06944e851a3fb63773b230c103c3966ce7414/10.0/php8.2/fpm-buster/Dockerfile) +- [`10.0.1-php8.2-fpm-alpine3.17`, `10.0-php8.2-fpm-alpine3.17`, `10-php8.2-fpm-alpine3.17`, `php8.2-fpm-alpine3.17`, `10.0.1-php8.2-fpm-alpine`, `10.0-php8.2-fpm-alpine`, `10-php8.2-fpm-alpine`, `php8.2-fpm-alpine`, `10.0.1-fpm-alpine3.17`, `10.0-fpm-alpine3.17`, `10-fpm-alpine3.17`, `fpm-alpine3.17`, `10.0.1-fpm-alpine`, `10.0-fpm-alpine`, `10-fpm-alpine`, `fpm-alpine`](https://github.com/docker-library/drupal/blob/b3f06944e851a3fb63773b230c103c3966ce7414/10.0/php8.2/fpm-alpine3.17/Dockerfile) +- [`10.0.1-php8.2-fpm-alpine3.16`, `10.0-php8.2-fpm-alpine3.16`, `10-php8.2-fpm-alpine3.16`, `php8.2-fpm-alpine3.16`, `10.0.1-fpm-alpine3.16`, `10.0-fpm-alpine3.16`, `10-fpm-alpine3.16`, `fpm-alpine3.16`](https://github.com/docker-library/drupal/blob/b3f06944e851a3fb63773b230c103c3966ce7414/10.0/php8.2/fpm-alpine3.16/Dockerfile) +- [`10.0.1-php8.1-apache-bullseye`, `10.0-php8.1-apache-bullseye`, `10-php8.1-apache-bullseye`, `php8.1-apache-bullseye`, `10.0.1-php8.1-apache`, `10.0-php8.1-apache`, `10-php8.1-apache`, `php8.1-apache`, `10.0.1-php8.1`, `10.0-php8.1`, `10-php8.1`, `php8.1`](https://github.com/docker-library/drupal/blob/b3f06944e851a3fb63773b230c103c3966ce7414/10.0/php8.1/apache-bullseye/Dockerfile) +- [`10.0.1-php8.1-fpm-bullseye`, `10.0-php8.1-fpm-bullseye`, `10-php8.1-fpm-bullseye`, `php8.1-fpm-bullseye`, `10.0.1-php8.1-fpm`, `10.0-php8.1-fpm`, `10-php8.1-fpm`, `php8.1-fpm`](https://github.com/docker-library/drupal/blob/b3f06944e851a3fb63773b230c103c3966ce7414/10.0/php8.1/fpm-bullseye/Dockerfile) +- [`10.0.1-php8.1-apache-buster`, `10.0-php8.1-apache-buster`, `10-php8.1-apache-buster`, `php8.1-apache-buster`](https://github.com/docker-library/drupal/blob/b3f06944e851a3fb63773b230c103c3966ce7414/10.0/php8.1/apache-buster/Dockerfile) +- [`10.0.1-php8.1-fpm-buster`, `10.0-php8.1-fpm-buster`, `10-php8.1-fpm-buster`, `php8.1-fpm-buster`](https://github.com/docker-library/drupal/blob/b3f06944e851a3fb63773b230c103c3966ce7414/10.0/php8.1/fpm-buster/Dockerfile) +- [`10.0.1-php8.1-fpm-alpine3.17`, `10.0-php8.1-fpm-alpine3.17`, `10-php8.1-fpm-alpine3.17`, `php8.1-fpm-alpine3.17`, `10.0.1-php8.1-fpm-alpine`, `10.0-php8.1-fpm-alpine`, `10-php8.1-fpm-alpine`, `php8.1-fpm-alpine`](https://github.com/docker-library/drupal/blob/b3f06944e851a3fb63773b230c103c3966ce7414/10.0/php8.1/fpm-alpine3.17/Dockerfile) +- [`10.0.1-php8.1-fpm-alpine3.16`, `10.0-php8.1-fpm-alpine3.16`, `10-php8.1-fpm-alpine3.16`, `php8.1-fpm-alpine3.16`](https://github.com/docker-library/drupal/blob/b3f06944e851a3fb63773b230c103c3966ce7414/10.0/php8.1/fpm-alpine3.16/Dockerfile) +- [`9.5.1-php8.1-apache-bullseye`, `9.5-php8.1-apache-bullseye`, `9-php8.1-apache-bullseye`, `9.5.1-php8.1-apache`, `9.5-php8.1-apache`, `9-php8.1-apache`, `9.5.1-php8.1`, `9.5-php8.1`, `9-php8.1`, `9.5.1-apache-bullseye`, `9.5-apache-bullseye`, `9-apache-bullseye`, `9.5.1-apache`, `9.5-apache`, `9-apache`, `9.5.1`, `9.5`, `9`](https://github.com/docker-library/drupal/blob/31babf9557e7073927d12e8c80b834a9a3aba7e3/9.5/php8.1/apache-bullseye/Dockerfile) +- [`9.5.1-php8.1-fpm-bullseye`, `9.5-php8.1-fpm-bullseye`, `9-php8.1-fpm-bullseye`, `9.5.1-php8.1-fpm`, `9.5-php8.1-fpm`, `9-php8.1-fpm`, `9.5.1-fpm-bullseye`, `9.5-fpm-bullseye`, `9-fpm-bullseye`, `9.5.1-fpm`, `9.5-fpm`, `9-fpm`](https://github.com/docker-library/drupal/blob/31babf9557e7073927d12e8c80b834a9a3aba7e3/9.5/php8.1/fpm-bullseye/Dockerfile) +- [`9.5.1-php8.1-apache-buster`, `9.5-php8.1-apache-buster`, `9-php8.1-apache-buster`, `9.5.1-apache-buster`, `9.5-apache-buster`, `9-apache-buster`](https://github.com/docker-library/drupal/blob/31babf9557e7073927d12e8c80b834a9a3aba7e3/9.5/php8.1/apache-buster/Dockerfile) +- [`9.5.1-php8.1-fpm-buster`, `9.5-php8.1-fpm-buster`, `9-php8.1-fpm-buster`, `9.5.1-fpm-buster`, `9.5-fpm-buster`, `9-fpm-buster`](https://github.com/docker-library/drupal/blob/31babf9557e7073927d12e8c80b834a9a3aba7e3/9.5/php8.1/fpm-buster/Dockerfile) +- [`9.5.1-php8.1-fpm-alpine3.17`, `9.5-php8.1-fpm-alpine3.17`, `9-php8.1-fpm-alpine3.17`, `9.5.1-php8.1-fpm-alpine`, `9.5-php8.1-fpm-alpine`, `9-php8.1-fpm-alpine`, `9.5.1-fpm-alpine3.17`, `9.5-fpm-alpine3.17`, `9-fpm-alpine3.17`, `9.5.1-fpm-alpine`, `9.5-fpm-alpine`, `9-fpm-alpine`](https://github.com/docker-library/drupal/blob/31babf9557e7073927d12e8c80b834a9a3aba7e3/9.5/php8.1/fpm-alpine3.17/Dockerfile) +- [`9.5.1-php8.1-fpm-alpine3.16`, `9.5-php8.1-fpm-alpine3.16`, `9-php8.1-fpm-alpine3.16`, `9.5.1-fpm-alpine3.16`, `9.5-fpm-alpine3.16`, `9-fpm-alpine3.16`](https://github.com/docker-library/drupal/blob/31babf9557e7073927d12e8c80b834a9a3aba7e3/9.5/php8.1/fpm-alpine3.16/Dockerfile) +- [`9.5.1-php8.0-apache-bullseye`, `9.5-php8.0-apache-bullseye`, `9-php8.0-apache-bullseye`, `9.5.1-php8.0-apache`, `9.5-php8.0-apache`, `9-php8.0-apache`, `9.5.1-php8.0`, `9.5-php8.0`, `9-php8.0`](https://github.com/docker-library/drupal/blob/31babf9557e7073927d12e8c80b834a9a3aba7e3/9.5/php8.0/apache-bullseye/Dockerfile) +- [`9.5.1-php8.0-fpm-bullseye`, `9.5-php8.0-fpm-bullseye`, `9-php8.0-fpm-bullseye`, `9.5.1-php8.0-fpm`, `9.5-php8.0-fpm`, `9-php8.0-fpm`](https://github.com/docker-library/drupal/blob/31babf9557e7073927d12e8c80b834a9a3aba7e3/9.5/php8.0/fpm-bullseye/Dockerfile) +- [`9.5.1-php8.0-apache-buster`, `9.5-php8.0-apache-buster`, `9-php8.0-apache-buster`](https://github.com/docker-library/drupal/blob/31babf9557e7073927d12e8c80b834a9a3aba7e3/9.5/php8.0/apache-buster/Dockerfile) +- [`9.5.1-php8.0-fpm-buster`, `9.5-php8.0-fpm-buster`, `9-php8.0-fpm-buster`](https://github.com/docker-library/drupal/blob/31babf9557e7073927d12e8c80b834a9a3aba7e3/9.5/php8.0/fpm-buster/Dockerfile) +- [`9.5.1-php8.0-fpm-alpine3.16`, `9.5-php8.0-fpm-alpine3.16`, `9-php8.0-fpm-alpine3.16`](https://github.com/docker-library/drupal/blob/31babf9557e7073927d12e8c80b834a9a3aba7e3/9.5/php8.0/fpm-alpine3.16/Dockerfile) +- [`9.4.9-php8.1-apache-bullseye`, `9.4-php8.1-apache-bullseye`, `9.4.9-php8.1-apache`, `9.4-php8.1-apache`, `9.4.9-php8.1`, `9.4-php8.1`, `9.4.9-apache-bullseye`, `9.4-apache-bullseye`, `9.4.9-apache`, `9.4-apache`, `9.4.9`, `9.4`](https://github.com/docker-library/drupal/blob/ad07ccc7b65f7139dce3f1ad77a5c27d6bbe1cd0/9.4/php8.1/apache-bullseye/Dockerfile) +- [`9.4.9-php8.1-fpm-bullseye`, `9.4-php8.1-fpm-bullseye`, `9.4.9-php8.1-fpm`, `9.4-php8.1-fpm`, `9.4.9-fpm-bullseye`, `9.4-fpm-bullseye`, `9.4.9-fpm`, `9.4-fpm`](https://github.com/docker-library/drupal/blob/ad07ccc7b65f7139dce3f1ad77a5c27d6bbe1cd0/9.4/php8.1/fpm-bullseye/Dockerfile) +- [`9.4.9-php8.1-apache-buster`, `9.4-php8.1-apache-buster`, `9.4.9-apache-buster`, `9.4-apache-buster`](https://github.com/docker-library/drupal/blob/ad07ccc7b65f7139dce3f1ad77a5c27d6bbe1cd0/9.4/php8.1/apache-buster/Dockerfile) +- [`9.4.9-php8.1-fpm-buster`, `9.4-php8.1-fpm-buster`, `9.4.9-fpm-buster`, `9.4-fpm-buster`](https://github.com/docker-library/drupal/blob/ad07ccc7b65f7139dce3f1ad77a5c27d6bbe1cd0/9.4/php8.1/fpm-buster/Dockerfile) +- [`9.4.9-php8.1-fpm-alpine3.17`, `9.4-php8.1-fpm-alpine3.17`, `9.4.9-php8.1-fpm-alpine`, `9.4-php8.1-fpm-alpine`, `9.4.9-fpm-alpine3.17`, `9.4-fpm-alpine3.17`, `9.4.9-fpm-alpine`, `9.4-fpm-alpine`](https://github.com/docker-library/drupal/blob/ad07ccc7b65f7139dce3f1ad77a5c27d6bbe1cd0/9.4/php8.1/fpm-alpine3.17/Dockerfile) +- [`9.4.9-php8.1-fpm-alpine3.16`, `9.4-php8.1-fpm-alpine3.16`, `9.4.9-fpm-alpine3.16`, `9.4-fpm-alpine3.16`](https://github.com/docker-library/drupal/blob/ad07ccc7b65f7139dce3f1ad77a5c27d6bbe1cd0/9.4/php8.1/fpm-alpine3.16/Dockerfile) +- [`9.4.9-php8.0-apache-bullseye`, `9.4-php8.0-apache-bullseye`, `9.4.9-php8.0-apache`, `9.4-php8.0-apache`, `9.4.9-php8.0`, `9.4-php8.0`](https://github.com/docker-library/drupal/blob/ad07ccc7b65f7139dce3f1ad77a5c27d6bbe1cd0/9.4/php8.0/apache-bullseye/Dockerfile) +- [`9.4.9-php8.0-fpm-bullseye`, `9.4-php8.0-fpm-bullseye`, `9.4.9-php8.0-fpm`, `9.4-php8.0-fpm`](https://github.com/docker-library/drupal/blob/ad07ccc7b65f7139dce3f1ad77a5c27d6bbe1cd0/9.4/php8.0/fpm-bullseye/Dockerfile) +- [`9.4.9-php8.0-apache-buster`, `9.4-php8.0-apache-buster`](https://github.com/docker-library/drupal/blob/ad07ccc7b65f7139dce3f1ad77a5c27d6bbe1cd0/9.4/php8.0/apache-buster/Dockerfile) +- [`9.4.9-php8.0-fpm-buster`, `9.4-php8.0-fpm-buster`](https://github.com/docker-library/drupal/blob/ad07ccc7b65f7139dce3f1ad77a5c27d6bbe1cd0/9.4/php8.0/fpm-buster/Dockerfile) +- [`9.4.9-php8.0-fpm-alpine3.16`, `9.4-php8.0-fpm-alpine3.16`](https://github.com/docker-library/drupal/blob/ad07ccc7b65f7139dce3f1ad77a5c27d6bbe1cd0/9.4/php8.0/fpm-alpine3.16/Dockerfile) +- [`7.94-php8.0-apache-bullseye`, `7-php8.0-apache-bullseye`, `7.94-php8.0-apache`, `7-php8.0-apache`, `7.94-php8.0`, `7-php8.0`, `7.94-apache-bullseye`, `7-apache-bullseye`, `7.94-apache`, `7-apache`, `7.94`, `7`](https://github.com/docker-library/drupal/blob/4047dd908101831960003f5671b9b51592f3f789/7/php8.0/apache-bullseye/Dockerfile) +- [`7.94-php8.0-fpm-bullseye`, `7-php8.0-fpm-bullseye`, `7.94-php8.0-fpm`, `7-php8.0-fpm`, `7.94-fpm-bullseye`, `7-fpm-bullseye`, `7.94-fpm`, `7-fpm`](https://github.com/docker-library/drupal/blob/4047dd908101831960003f5671b9b51592f3f789/7/php8.0/fpm-bullseye/Dockerfile) +- [`7.94-php8.0-apache-buster`, `7-php8.0-apache-buster`, `7.94-apache-buster`, `7-apache-buster`](https://github.com/docker-library/drupal/blob/4047dd908101831960003f5671b9b51592f3f789/7/php8.0/apache-buster/Dockerfile) +- [`7.94-php8.0-fpm-buster`, `7-php8.0-fpm-buster`, `7.94-fpm-buster`, `7-fpm-buster`](https://github.com/docker-library/drupal/blob/4047dd908101831960003f5671b9b51592f3f789/7/php8.0/fpm-buster/Dockerfile) +- [`7.94-php8.0-fpm-alpine3.16`, `7-php8.0-fpm-alpine3.16`, `7.94-fpm-alpine3.16`, `7-fpm-alpine3.16`](https://github.com/docker-library/drupal/blob/4047dd908101831960003f5671b9b51592f3f789/7/php8.0/fpm-alpine3.16/Dockerfile) # Quick reference (cont.) @@ -40,14 +70,14 @@ WARNING: [https://github.com/docker-library/drupal/issues](https://github.com/docker-library/drupal/issues) - **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) - [`amd64`](https://hub.docker.com/r/amd64/drupal/), [`arm32v5`](https://hub.docker.com/r/arm32v5/drupal/), [`arm32v6`](https://hub.docker.com/r/arm32v6/drupal/), [`arm32v7`](https://hub.docker.com/r/arm32v7/drupal/), [`arm64v8`](https://hub.docker.com/r/arm64v8/drupal/), [`i386`](https://hub.docker.com/r/i386/drupal/), [`ppc64le`](https://hub.docker.com/r/ppc64le/drupal/), [`s390x`](https://hub.docker.com/r/s390x/drupal/) + [`amd64`](https://hub.docker.com/r/amd64/drupal/), [`arm32v5`](https://hub.docker.com/r/arm32v5/drupal/), [`arm32v6`](https://hub.docker.com/r/arm32v6/drupal/), [`arm32v7`](https://hub.docker.com/r/arm32v7/drupal/), [`arm64v8`](https://hub.docker.com/r/arm64v8/drupal/), [`i386`](https://hub.docker.com/r/i386/drupal/), [`mips64le`](https://hub.docker.com/r/mips64le/drupal/), [`ppc64le`](https://hub.docker.com/r/ppc64le/drupal/), [`s390x`](https://hub.docker.com/r/s390x/drupal/) - **Published image artifact details**: [repo-info repo's `repos/drupal/` directory](https://github.com/docker-library/repo-info/blob/master/repos/drupal) ([history](https://github.com/docker-library/repo-info/commits/master/repos/drupal)) (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/drupal`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fdrupal) + [official-images repo's `library/drupal` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fdrupal) [official-images repo's `library/drupal` file](https://github.com/docker-library/official-images/blob/master/library/drupal) ([history](https://github.com/docker-library/official-images/commits/master/library/drupal)) - **Source of this description**: @@ -59,7 +89,7 @@ Drupal is a free and open-source content-management framework written in PHP and > [wikipedia.org/wiki/Drupal](https://en.wikipedia.org/wiki/Drupal) -![logo](https://raw.githubusercontent.com/docker-library/docs/a0f37ddfd711f858bb968d6c85715f5bc1f7393f/drupal/logo.png) +![logo](https://raw.githubusercontent.com/docker-library/docs/e405066455691ca2429eb8094777f12d2dad8f91/drupal/logo.svg?sanitize=true) # How to use this image @@ -221,13 +251,23 @@ The `drupal` images come in many flavors, each designed for a specific use case. 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. -## `drupal:-alpine` +Some of these tags may have names like bullseye or buster 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. -This image is based on the popular [Alpine Linux project](http://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. +## `drupal:-fpm` -This variant is highly recommended when final image size being as small as possible is desired. The main caveat to note is that it does use [musl libc](http://www.musl-libc.org) instead of [glibc and friends](http://www.etalabs.net/compare_libcs.html), so certain software might run into issues depending on the depth of their libc requirements. However, most software doesn't have an issue with this, so this variant is usually a very safe choice. 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. +This variant contains PHP-FPM, which is a FastCGI implementation for PHP. See [the PHP-FPM website](https://php-fpm.org/) for more information about PHP-FPM. -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). +In order to use this image variant, some kind of reverse proxy (such as NGINX, Apache, or other tool which speaks the FastCGI protocol) will be required. + +Some potentially helpful resources: + +- [PHP-FPM.org](https://php-fpm.org/) +- [simplified example by @md5](https://gist.github.com/md5/d9206eacb5a0ff5d6be0) +- [very detailed article by Pascal Landau](https://www.pascallandau.com/blog/php-php-fpm-and-nginx-on-docker-in-windows-10/) +- [Stack Overflow discussion](https://stackoverflow.com/q/29905953/433558) +- [Apache httpd Wiki example](https://wiki.apache.org/httpd/PHPFPMWordpress) + +**WARNING:** the FastCGI protocol is inherently trusting, and thus *extremely* insecure to expose outside of a private container network -- unless you know *exactly* what you are doing (and are willing to accept the extreme risk), do not use Docker's `--publish` (`-p`) flag with this image variant. # License diff --git a/drupal/logo.png b/drupal/logo.png deleted file mode 100644 index 2bcce9e714541a19d9677bbbd13d91bc8ef5adb7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62713 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 diff --git a/drupal/logo.svg b/drupal/logo.svg new file mode 100644 index 000000000000..58b23674cab6 --- /dev/null +++ b/drupal/logo.svg @@ -0,0 +1 @@ +Risorsa 85 \ No newline at end of file diff --git a/drupal/variant-fpm.md b/drupal/variant-fpm.md new file mode 120000 index 000000000000..5ed64ee63493 --- /dev/null +++ b/drupal/variant-fpm.md @@ -0,0 +1 @@ +../php/variant-fpm.md \ No newline at end of file diff --git a/eclipse-mosquitto/README.md b/eclipse-mosquitto/README.md index 1907e21d4787..b4cee487cd8c 100644 --- a/eclipse-mosquitto/README.md +++ b/eclipse-mosquitto/README.md @@ -20,12 +20,15 @@ WARNING: [the Eclipse Foundation](https://github.com/eclipse/mosquitto) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`1.6.9`, `1.6`, `latest`](https://github.com/eclipse/mosquitto/blob/68c1e51035467ade10533c7bb88aa9765241c104/docker/1.6/Dockerfile) -- [`1.5.9`, `1.5`](https://github.com/eclipse/mosquitto/blob/68c1e51035467ade10533c7bb88aa9765241c104/docker/1.5/Dockerfile) +- [`2.0.15`, `2.0`, `2`, `latest`](https://github.com/eclipse/mosquitto/blob/a8448a9c7b14bdaee6ec80419d43fd6544e789b6/docker/2.0/Dockerfile) +- [`2.0.15-openssl`, `2.0-openssl`, `2-openssl`, `openssl`](https://github.com/eclipse/mosquitto/blob/a8448a9c7b14bdaee6ec80419d43fd6544e789b6/docker/2.0-openssl/Dockerfile) +- [`1.6.15`, `1.6`](https://github.com/eclipse/mosquitto/blob/a8448a9c7b14bdaee6ec80419d43fd6544e789b6/docker/1.6/Dockerfile) +- [`1.6.15-openssl`, `1.6-openssl`](https://github.com/eclipse/mosquitto/blob/a8448a9c7b14bdaee6ec80419d43fd6544e789b6/docker/1.6-openssl/Dockerfile) +- [`1.5.11`, `1.5`](https://github.com/eclipse/mosquitto/blob/a8448a9c7b14bdaee6ec80419d43fd6544e789b6/docker/1.5/Dockerfile) # Quick reference (cont.) @@ -40,7 +43,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/eclipse-mosquitto`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Feclipse-mosquitto) + [official-images repo's `library/eclipse-mosquitto` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Feclipse-mosquitto) [official-images repo's `library/eclipse-mosquitto` file](https://github.com/docker-library/official-images/blob/master/library/eclipse-mosquitto) ([history](https://github.com/docker-library/official-images/commits/master/library/eclipse-mosquitto)) - **Source of this description**: diff --git a/eclipse-temurin/README-short.txt b/eclipse-temurin/README-short.txt new file mode 100644 index 000000000000..464820893d65 --- /dev/null +++ b/eclipse-temurin/README-short.txt @@ -0,0 +1 @@ +Official Images for OpenJDK binaries built by Eclipse Temurin. diff --git a/eclipse-temurin/README.md b/eclipse-temurin/README.md new file mode 100644 index 000000000000..78f64aabf6f5 --- /dev/null +++ b/eclipse-temurin/README.md @@ -0,0 +1,330 @@ + + +# Quick reference + +- **Maintained by**: + [Adoptium](https://github.com/adoptium/containers) + +- **Where to get help**: + [Adoptium Slack](https://adoptium.net/slack); [Adoptium Support](https://github.com/adoptium/adoptium-support/issues/new/choose) + +# Supported tags and respective `Dockerfile` links + +(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).) + +## Simple Tags + +- [`8u352-b08-jdk-alpine`, `8-jdk-alpine`, `8-alpine`](https://github.com/adoptium/containers/blob/3bab86587b3f3af5f67f9a6e5d33c50fdaecd4db/8/jdk/alpine/Dockerfile.releases.full) +- [`8u352-b08-jdk-focal`, `8-jdk-focal`, `8-focal`](https://github.com/adoptium/containers/blob/fa65b46d19f4db0e1c8736c3d7b2a8392dd58b1b/8/jdk/ubuntu/focal/Dockerfile.releases.full) +- [`8u352-b08-jdk-jammy`, `8-jdk-jammy`, `8-jammy`](https://github.com/adoptium/containers/blob/fa65b46d19f4db0e1c8736c3d7b2a8392dd58b1b/8/jdk/ubuntu/jammy/Dockerfile.releases.full) +- [`8u352-b08-jdk-centos7`, `8-jdk-centos7`, `8-centos7`](https://github.com/adoptium/containers/blob/fa65b46d19f4db0e1c8736c3d7b2a8392dd58b1b/8/jdk/centos/Dockerfile.releases.full) +- [`8u352-b08-jdk-ubi9-minimal`, `8-jdk-ubi9-minimal`, `8-ubi9-minimal`](https://github.com/adoptium/containers/blob/910222e9f290871048016f4e0afd0c203d4a80d5/8/jdk/ubi/ubi9-minimal/Dockerfile.releases.full) +- [`8u352-b08-jdk-windowsservercore-ltsc2022`, `8-jdk-windowsservercore-ltsc2022`, `8-windowsservercore-ltsc2022`](https://github.com/adoptium/containers/blob/fa65b46d19f4db0e1c8736c3d7b2a8392dd58b1b/8/jdk/windows/windowsservercore-ltsc2022/Dockerfile.releases.full) +- [`8u352-b08-jdk-nanoserver-ltsc2022`, `8-jdk-nanoserver-ltsc2022`, `8-nanoserver-ltsc2022`](https://github.com/adoptium/containers/blob/fa65b46d19f4db0e1c8736c3d7b2a8392dd58b1b/8/jdk/windows/nanoserver-ltsc2022/Dockerfile.releases.full) +- [`8u352-b08-jdk-windowsservercore-1809`, `8-jdk-windowsservercore-1809`, `8-windowsservercore-1809`](https://github.com/adoptium/containers/blob/fa65b46d19f4db0e1c8736c3d7b2a8392dd58b1b/8/jdk/windows/windowsservercore-1809/Dockerfile.releases.full) +- [`8u352-b08-jdk-nanoserver-1809`, `8-jdk-nanoserver-1809`, `8-nanoserver-1809`](https://github.com/adoptium/containers/blob/fa65b46d19f4db0e1c8736c3d7b2a8392dd58b1b/8/jdk/windows/nanoserver-1809/Dockerfile.releases.full) +- [`8u352-b08-jre-alpine`, `8-jre-alpine`](https://github.com/adoptium/containers/blob/3bab86587b3f3af5f67f9a6e5d33c50fdaecd4db/8/jre/alpine/Dockerfile.releases.full) +- [`8u352-b08-jre-focal`, `8-jre-focal`](https://github.com/adoptium/containers/blob/fa65b46d19f4db0e1c8736c3d7b2a8392dd58b1b/8/jre/ubuntu/focal/Dockerfile.releases.full) +- [`8u352-b08-jre-jammy`, `8-jre-jammy`](https://github.com/adoptium/containers/blob/fa65b46d19f4db0e1c8736c3d7b2a8392dd58b1b/8/jre/ubuntu/jammy/Dockerfile.releases.full) +- [`8u352-b08-jre-centos7`, `8-jre-centos7`](https://github.com/adoptium/containers/blob/fa65b46d19f4db0e1c8736c3d7b2a8392dd58b1b/8/jre/centos/Dockerfile.releases.full) +- [`8u352-b08-jre-ubi9-minimal`, `8-jre-ubi9-minimal`](https://github.com/adoptium/containers/blob/910222e9f290871048016f4e0afd0c203d4a80d5/8/jre/ubi/ubi9-minimal/Dockerfile.releases.full) +- [`8u352-b08-jre-windowsservercore-ltsc2022`, `8-jre-windowsservercore-ltsc2022`](https://github.com/adoptium/containers/blob/fa65b46d19f4db0e1c8736c3d7b2a8392dd58b1b/8/jre/windows/windowsservercore-ltsc2022/Dockerfile.releases.full) +- [`8u352-b08-jre-nanoserver-ltsc2022`, `8-jre-nanoserver-ltsc2022`](https://github.com/adoptium/containers/blob/fa65b46d19f4db0e1c8736c3d7b2a8392dd58b1b/8/jre/windows/nanoserver-ltsc2022/Dockerfile.releases.full) +- [`8u352-b08-jre-windowsservercore-1809`, `8-jre-windowsservercore-1809`](https://github.com/adoptium/containers/blob/fa65b46d19f4db0e1c8736c3d7b2a8392dd58b1b/8/jre/windows/windowsservercore-1809/Dockerfile.releases.full) +- [`8u352-b08-jre-nanoserver-1809`, `8-jre-nanoserver-1809`](https://github.com/adoptium/containers/blob/fa65b46d19f4db0e1c8736c3d7b2a8392dd58b1b/8/jre/windows/nanoserver-1809/Dockerfile.releases.full) +- [`11.0.17_8-jdk-alpine`, `11-jdk-alpine`, `11-alpine`](https://github.com/adoptium/containers/blob/3bab86587b3f3af5f67f9a6e5d33c50fdaecd4db/11/jdk/alpine/Dockerfile.releases.full) +- [`11.0.17_8-jdk-focal`, `11-jdk-focal`, `11-focal`](https://github.com/adoptium/containers/blob/fa65b46d19f4db0e1c8736c3d7b2a8392dd58b1b/11/jdk/ubuntu/focal/Dockerfile.releases.full) +- [`11.0.17_8-jdk-jammy`, `11-jdk-jammy`, `11-jammy`](https://github.com/adoptium/containers/blob/fa65b46d19f4db0e1c8736c3d7b2a8392dd58b1b/11/jdk/ubuntu/jammy/Dockerfile.releases.full) +- [`11.0.17_8-jdk-centos7`, `11-jdk-centos7`, `11-centos7`](https://github.com/adoptium/containers/blob/fa65b46d19f4db0e1c8736c3d7b2a8392dd58b1b/11/jdk/centos/Dockerfile.releases.full) +- [`11.0.17_8-jdk-ubi9-minimal`, `11-jdk-ubi9-minimal`, `11-ubi9-minimal`](https://github.com/adoptium/containers/blob/910222e9f290871048016f4e0afd0c203d4a80d5/11/jdk/ubi/ubi9-minimal/Dockerfile.releases.full) +- [`11.0.17_8-jdk-windowsservercore-ltsc2022`, `11-jdk-windowsservercore-ltsc2022`, `11-windowsservercore-ltsc2022`](https://github.com/adoptium/containers/blob/fa65b46d19f4db0e1c8736c3d7b2a8392dd58b1b/11/jdk/windows/windowsservercore-ltsc2022/Dockerfile.releases.full) +- [`11.0.17_8-jdk-nanoserver-ltsc2022`, `11-jdk-nanoserver-ltsc2022`, `11-nanoserver-ltsc2022`](https://github.com/adoptium/containers/blob/fa65b46d19f4db0e1c8736c3d7b2a8392dd58b1b/11/jdk/windows/nanoserver-ltsc2022/Dockerfile.releases.full) +- [`11.0.17_8-jdk-windowsservercore-1809`, `11-jdk-windowsservercore-1809`, `11-windowsservercore-1809`](https://github.com/adoptium/containers/blob/fa65b46d19f4db0e1c8736c3d7b2a8392dd58b1b/11/jdk/windows/windowsservercore-1809/Dockerfile.releases.full) +- [`11.0.17_8-jdk-nanoserver-1809`, `11-jdk-nanoserver-1809`, `11-nanoserver-1809`](https://github.com/adoptium/containers/blob/fa65b46d19f4db0e1c8736c3d7b2a8392dd58b1b/11/jdk/windows/nanoserver-1809/Dockerfile.releases.full) +- [`11.0.17_8-jre-alpine`, `11-jre-alpine`](https://github.com/adoptium/containers/blob/3bab86587b3f3af5f67f9a6e5d33c50fdaecd4db/11/jre/alpine/Dockerfile.releases.full) +- [`11.0.17_8-jre-focal`, `11-jre-focal`](https://github.com/adoptium/containers/blob/fa65b46d19f4db0e1c8736c3d7b2a8392dd58b1b/11/jre/ubuntu/focal/Dockerfile.releases.full) +- [`11.0.17_8-jre-jammy`, `11-jre-jammy`](https://github.com/adoptium/containers/blob/fa65b46d19f4db0e1c8736c3d7b2a8392dd58b1b/11/jre/ubuntu/jammy/Dockerfile.releases.full) +- [`11.0.17_8-jre-centos7`, `11-jre-centos7`](https://github.com/adoptium/containers/blob/fa65b46d19f4db0e1c8736c3d7b2a8392dd58b1b/11/jre/centos/Dockerfile.releases.full) +- [`11.0.17_8-jre-ubi9-minimal`, `11-jre-ubi9-minimal`](https://github.com/adoptium/containers/blob/910222e9f290871048016f4e0afd0c203d4a80d5/11/jre/ubi/ubi9-minimal/Dockerfile.releases.full) +- [`11.0.17_8-jre-windowsservercore-ltsc2022`, `11-jre-windowsservercore-ltsc2022`](https://github.com/adoptium/containers/blob/fa65b46d19f4db0e1c8736c3d7b2a8392dd58b1b/11/jre/windows/windowsservercore-ltsc2022/Dockerfile.releases.full) +- [`11.0.17_8-jre-nanoserver-ltsc2022`, `11-jre-nanoserver-ltsc2022`](https://github.com/adoptium/containers/blob/fa65b46d19f4db0e1c8736c3d7b2a8392dd58b1b/11/jre/windows/nanoserver-ltsc2022/Dockerfile.releases.full) +- [`11.0.17_8-jre-windowsservercore-1809`, `11-jre-windowsservercore-1809`](https://github.com/adoptium/containers/blob/fa65b46d19f4db0e1c8736c3d7b2a8392dd58b1b/11/jre/windows/windowsservercore-1809/Dockerfile.releases.full) +- [`11.0.17_8-jre-nanoserver-1809`, `11-jre-nanoserver-1809`](https://github.com/adoptium/containers/blob/fa65b46d19f4db0e1c8736c3d7b2a8392dd58b1b/11/jre/windows/nanoserver-1809/Dockerfile.releases.full) +- [`17.0.5_8-jdk-alpine`, `17-jdk-alpine`, `17-alpine`](https://github.com/adoptium/containers/blob/3bab86587b3f3af5f67f9a6e5d33c50fdaecd4db/17/jdk/alpine/Dockerfile.releases.full) +- [`17.0.5_8-jdk-focal`, `17-jdk-focal`, `17-focal`](https://github.com/adoptium/containers/blob/d3c9617e83eb706aff74c095fd531fe31e359674/17/jdk/ubuntu/focal/Dockerfile.releases.full) +- [`17.0.5_8-jdk-jammy`, `17-jdk-jammy`, `17-jammy`](https://github.com/adoptium/containers/blob/d3c9617e83eb706aff74c095fd531fe31e359674/17/jdk/ubuntu/jammy/Dockerfile.releases.full) +- [`17.0.5_8-jdk-centos7`, `17-jdk-centos7`, `17-centos7`](https://github.com/adoptium/containers/blob/d3c9617e83eb706aff74c095fd531fe31e359674/17/jdk/centos/Dockerfile.releases.full) +- [`17.0.5_8-jdk-ubi9-minimal`, `17-jdk-ubi9-minimal`, `17-ubi9-minimal`](https://github.com/adoptium/containers/blob/910222e9f290871048016f4e0afd0c203d4a80d5/17/jdk/ubi/ubi9-minimal/Dockerfile.releases.full) +- [`17.0.5_8-jdk-windowsservercore-ltsc2022`, `17-jdk-windowsservercore-ltsc2022`, `17-windowsservercore-ltsc2022`](https://github.com/adoptium/containers/blob/d3c9617e83eb706aff74c095fd531fe31e359674/17/jdk/windows/windowsservercore-ltsc2022/Dockerfile.releases.full) +- [`17.0.5_8-jdk-nanoserver-ltsc2022`, `17-jdk-nanoserver-ltsc2022`, `17-nanoserver-ltsc2022`](https://github.com/adoptium/containers/blob/d3c9617e83eb706aff74c095fd531fe31e359674/17/jdk/windows/nanoserver-ltsc2022/Dockerfile.releases.full) +- [`17.0.5_8-jdk-windowsservercore-1809`, `17-jdk-windowsservercore-1809`, `17-windowsservercore-1809`](https://github.com/adoptium/containers/blob/d3c9617e83eb706aff74c095fd531fe31e359674/17/jdk/windows/windowsservercore-1809/Dockerfile.releases.full) +- [`17.0.5_8-jdk-nanoserver-1809`, `17-jdk-nanoserver-1809`, `17-nanoserver-1809`](https://github.com/adoptium/containers/blob/d3c9617e83eb706aff74c095fd531fe31e359674/17/jdk/windows/nanoserver-1809/Dockerfile.releases.full) +- [`17.0.5_8-jre-alpine`, `17-jre-alpine`](https://github.com/adoptium/containers/blob/3bab86587b3f3af5f67f9a6e5d33c50fdaecd4db/17/jre/alpine/Dockerfile.releases.full) +- [`17.0.5_8-jre-focal`, `17-jre-focal`](https://github.com/adoptium/containers/blob/d3c9617e83eb706aff74c095fd531fe31e359674/17/jre/ubuntu/focal/Dockerfile.releases.full) +- [`17.0.5_8-jre-jammy`, `17-jre-jammy`](https://github.com/adoptium/containers/blob/d3c9617e83eb706aff74c095fd531fe31e359674/17/jre/ubuntu/jammy/Dockerfile.releases.full) +- [`17.0.5_8-jre-centos7`, `17-jre-centos7`](https://github.com/adoptium/containers/blob/d3c9617e83eb706aff74c095fd531fe31e359674/17/jre/centos/Dockerfile.releases.full) +- [`17.0.5_8-jre-ubi9-minimal`, `17-jre-ubi9-minimal`](https://github.com/adoptium/containers/blob/910222e9f290871048016f4e0afd0c203d4a80d5/17/jre/ubi/ubi9-minimal/Dockerfile.releases.full) +- [`17.0.5_8-jre-windowsservercore-ltsc2022`, `17-jre-windowsservercore-ltsc2022`](https://github.com/adoptium/containers/blob/d3c9617e83eb706aff74c095fd531fe31e359674/17/jre/windows/windowsservercore-ltsc2022/Dockerfile.releases.full) +- [`17.0.5_8-jre-nanoserver-ltsc2022`, `17-jre-nanoserver-ltsc2022`](https://github.com/adoptium/containers/blob/d3c9617e83eb706aff74c095fd531fe31e359674/17/jre/windows/nanoserver-ltsc2022/Dockerfile.releases.full) +- [`17.0.5_8-jre-windowsservercore-1809`, `17-jre-windowsservercore-1809`](https://github.com/adoptium/containers/blob/d3c9617e83eb706aff74c095fd531fe31e359674/17/jre/windows/windowsservercore-1809/Dockerfile.releases.full) +- [`17.0.5_8-jre-nanoserver-1809`, `17-jre-nanoserver-1809`](https://github.com/adoptium/containers/blob/d3c9617e83eb706aff74c095fd531fe31e359674/17/jre/windows/nanoserver-1809/Dockerfile.releases.full) +- [`19.0.1_10-jdk-alpine`, `19-jdk-alpine`, `19-alpine`](https://github.com/adoptium/containers/blob/3bab86587b3f3af5f67f9a6e5d33c50fdaecd4db/19/jdk/alpine/Dockerfile.releases.full) +- [`19.0.1_10-jdk-focal`, `19-jdk-focal`, `19-focal`](https://github.com/adoptium/containers/blob/e37c219c8f2aef0c0028a627b1e372a046138dea/19/jdk/ubuntu/focal/Dockerfile.releases.full) +- [`19.0.1_10-jdk-jammy`, `19-jdk-jammy`, `19-jammy`](https://github.com/adoptium/containers/blob/e37c219c8f2aef0c0028a627b1e372a046138dea/19/jdk/ubuntu/jammy/Dockerfile.releases.full) +- [`19.0.1_10-jdk-centos7`, `19-jdk-centos7`, `19-centos7`](https://github.com/adoptium/containers/blob/e37c219c8f2aef0c0028a627b1e372a046138dea/19/jdk/centos/Dockerfile.releases.full) +- [`19.0.1_10-jdk-ubi9-minimal`, `19-jdk-ubi9-minimal`, `19-ubi9-minimal`](https://github.com/adoptium/containers/blob/910222e9f290871048016f4e0afd0c203d4a80d5/19/jdk/ubi/ubi9-minimal/Dockerfile.releases.full) +- [`19.0.1_10-jdk-windowsservercore-ltsc2022`, `19-jdk-windowsservercore-ltsc2022`, `19-windowsservercore-ltsc2022`](https://github.com/adoptium/containers/blob/e37c219c8f2aef0c0028a627b1e372a046138dea/19/jdk/windows/windowsservercore-ltsc2022/Dockerfile.releases.full) +- [`19.0.1_10-jdk-nanoserver-ltsc2022`, `19-jdk-nanoserver-ltsc2022`, `19-nanoserver-ltsc2022`](https://github.com/adoptium/containers/blob/e37c219c8f2aef0c0028a627b1e372a046138dea/19/jdk/windows/nanoserver-ltsc2022/Dockerfile.releases.full) +- [`19.0.1_10-jdk-windowsservercore-1809`, `19-jdk-windowsservercore-1809`, `19-windowsservercore-1809`](https://github.com/adoptium/containers/blob/e37c219c8f2aef0c0028a627b1e372a046138dea/19/jdk/windows/windowsservercore-1809/Dockerfile.releases.full) +- [`19.0.1_10-jdk-nanoserver-1809`, `19-jdk-nanoserver-1809`, `19-nanoserver-1809`](https://github.com/adoptium/containers/blob/e37c219c8f2aef0c0028a627b1e372a046138dea/19/jdk/windows/nanoserver-1809/Dockerfile.releases.full) +- [`19.0.1_10-jre-alpine`, `19-jre-alpine`](https://github.com/adoptium/containers/blob/3bab86587b3f3af5f67f9a6e5d33c50fdaecd4db/19/jre/alpine/Dockerfile.releases.full) +- [`19.0.1_10-jre-focal`, `19-jre-focal`](https://github.com/adoptium/containers/blob/e37c219c8f2aef0c0028a627b1e372a046138dea/19/jre/ubuntu/focal/Dockerfile.releases.full) +- [`19.0.1_10-jre-jammy`, `19-jre-jammy`](https://github.com/adoptium/containers/blob/e37c219c8f2aef0c0028a627b1e372a046138dea/19/jre/ubuntu/jammy/Dockerfile.releases.full) +- [`19.0.1_10-jre-centos7`, `19-jre-centos7`](https://github.com/adoptium/containers/blob/e37c219c8f2aef0c0028a627b1e372a046138dea/19/jre/centos/Dockerfile.releases.full) +- [`19.0.1_10-jre-ubi9-minimal`, `19-jre-ubi9-minimal`](https://github.com/adoptium/containers/blob/910222e9f290871048016f4e0afd0c203d4a80d5/19/jre/ubi/ubi9-minimal/Dockerfile.releases.full) +- [`19.0.1_10-jre-windowsservercore-ltsc2022`, `19-jre-windowsservercore-ltsc2022`](https://github.com/adoptium/containers/blob/e37c219c8f2aef0c0028a627b1e372a046138dea/19/jre/windows/windowsservercore-ltsc2022/Dockerfile.releases.full) +- [`19.0.1_10-jre-nanoserver-ltsc2022`, `19-jre-nanoserver-ltsc2022`](https://github.com/adoptium/containers/blob/e37c219c8f2aef0c0028a627b1e372a046138dea/19/jre/windows/nanoserver-ltsc2022/Dockerfile.releases.full) +- [`19.0.1_10-jre-windowsservercore-1809`, `19-jre-windowsservercore-1809`](https://github.com/adoptium/containers/blob/e37c219c8f2aef0c0028a627b1e372a046138dea/19/jre/windows/windowsservercore-1809/Dockerfile.releases.full) +- [`19.0.1_10-jre-nanoserver-1809`, `19-jre-nanoserver-1809`](https://github.com/adoptium/containers/blob/e37c219c8f2aef0c0028a627b1e372a046138dea/19/jre/windows/nanoserver-1809/Dockerfile.releases.full) + +## Shared Tags + +- `8u352-b08-jdk`, `8-jdk`, `8`: + - [`8u352-b08-jdk-jammy`](https://github.com/adoptium/containers/blob/fa65b46d19f4db0e1c8736c3d7b2a8392dd58b1b/8/jdk/ubuntu/jammy/Dockerfile.releases.full) + - [`8u352-b08-jdk-windowsservercore-ltsc2022`](https://github.com/adoptium/containers/blob/fa65b46d19f4db0e1c8736c3d7b2a8392dd58b1b/8/jdk/windows/windowsservercore-ltsc2022/Dockerfile.releases.full) + - [`8u352-b08-jdk-windowsservercore-1809`](https://github.com/adoptium/containers/blob/fa65b46d19f4db0e1c8736c3d7b2a8392dd58b1b/8/jdk/windows/windowsservercore-1809/Dockerfile.releases.full) +- `8u352-b08-jdk-windowsservercore`, `8-jdk-windowsservercore`, `8-windowsservercore`: + - [`8u352-b08-jdk-windowsservercore-ltsc2022`](https://github.com/adoptium/containers/blob/fa65b46d19f4db0e1c8736c3d7b2a8392dd58b1b/8/jdk/windows/windowsservercore-ltsc2022/Dockerfile.releases.full) + - [`8u352-b08-jdk-windowsservercore-1809`](https://github.com/adoptium/containers/blob/fa65b46d19f4db0e1c8736c3d7b2a8392dd58b1b/8/jdk/windows/windowsservercore-1809/Dockerfile.releases.full) +- `8u352-b08-jdk-nanoserver`, `8-jdk-nanoserver`, `8-nanoserver`: + - [`8u352-b08-jdk-nanoserver-ltsc2022`](https://github.com/adoptium/containers/blob/fa65b46d19f4db0e1c8736c3d7b2a8392dd58b1b/8/jdk/windows/nanoserver-ltsc2022/Dockerfile.releases.full) + - [`8u352-b08-jdk-nanoserver-1809`](https://github.com/adoptium/containers/blob/fa65b46d19f4db0e1c8736c3d7b2a8392dd58b1b/8/jdk/windows/nanoserver-1809/Dockerfile.releases.full) +- `8u352-b08-jre`, `8-jre`: + - [`8u352-b08-jre-jammy`](https://github.com/adoptium/containers/blob/fa65b46d19f4db0e1c8736c3d7b2a8392dd58b1b/8/jre/ubuntu/jammy/Dockerfile.releases.full) + - [`8u352-b08-jre-windowsservercore-ltsc2022`](https://github.com/adoptium/containers/blob/fa65b46d19f4db0e1c8736c3d7b2a8392dd58b1b/8/jre/windows/windowsservercore-ltsc2022/Dockerfile.releases.full) + - [`8u352-b08-jre-windowsservercore-1809`](https://github.com/adoptium/containers/blob/fa65b46d19f4db0e1c8736c3d7b2a8392dd58b1b/8/jre/windows/windowsservercore-1809/Dockerfile.releases.full) +- `8u352-b08-jre-windowsservercore`, `8-jre-windowsservercore`: + - [`8u352-b08-jre-windowsservercore-ltsc2022`](https://github.com/adoptium/containers/blob/fa65b46d19f4db0e1c8736c3d7b2a8392dd58b1b/8/jre/windows/windowsservercore-ltsc2022/Dockerfile.releases.full) + - [`8u352-b08-jre-windowsservercore-1809`](https://github.com/adoptium/containers/blob/fa65b46d19f4db0e1c8736c3d7b2a8392dd58b1b/8/jre/windows/windowsservercore-1809/Dockerfile.releases.full) +- `8u352-b08-jre-nanoserver`, `8-jre-nanoserver`: + - [`8u352-b08-jre-nanoserver-ltsc2022`](https://github.com/adoptium/containers/blob/fa65b46d19f4db0e1c8736c3d7b2a8392dd58b1b/8/jre/windows/nanoserver-ltsc2022/Dockerfile.releases.full) + - [`8u352-b08-jre-nanoserver-1809`](https://github.com/adoptium/containers/blob/fa65b46d19f4db0e1c8736c3d7b2a8392dd58b1b/8/jre/windows/nanoserver-1809/Dockerfile.releases.full) +- `11.0.17_8-jdk`, `11-jdk`, `11`: + - [`11.0.17_8-jdk-jammy`](https://github.com/adoptium/containers/blob/fa65b46d19f4db0e1c8736c3d7b2a8392dd58b1b/11/jdk/ubuntu/jammy/Dockerfile.releases.full) + - [`11.0.17_8-jdk-windowsservercore-ltsc2022`](https://github.com/adoptium/containers/blob/fa65b46d19f4db0e1c8736c3d7b2a8392dd58b1b/11/jdk/windows/windowsservercore-ltsc2022/Dockerfile.releases.full) + - [`11.0.17_8-jdk-windowsservercore-1809`](https://github.com/adoptium/containers/blob/fa65b46d19f4db0e1c8736c3d7b2a8392dd58b1b/11/jdk/windows/windowsservercore-1809/Dockerfile.releases.full) +- `11.0.17_8-jdk-windowsservercore`, `11-jdk-windowsservercore`, `11-windowsservercore`: + - [`11.0.17_8-jdk-windowsservercore-ltsc2022`](https://github.com/adoptium/containers/blob/fa65b46d19f4db0e1c8736c3d7b2a8392dd58b1b/11/jdk/windows/windowsservercore-ltsc2022/Dockerfile.releases.full) + - [`11.0.17_8-jdk-windowsservercore-1809`](https://github.com/adoptium/containers/blob/fa65b46d19f4db0e1c8736c3d7b2a8392dd58b1b/11/jdk/windows/windowsservercore-1809/Dockerfile.releases.full) +- `11.0.17_8-jdk-nanoserver`, `11-jdk-nanoserver`, `11-nanoserver`: + - [`11.0.17_8-jdk-nanoserver-ltsc2022`](https://github.com/adoptium/containers/blob/fa65b46d19f4db0e1c8736c3d7b2a8392dd58b1b/11/jdk/windows/nanoserver-ltsc2022/Dockerfile.releases.full) + - [`11.0.17_8-jdk-nanoserver-1809`](https://github.com/adoptium/containers/blob/fa65b46d19f4db0e1c8736c3d7b2a8392dd58b1b/11/jdk/windows/nanoserver-1809/Dockerfile.releases.full) +- `11.0.17_8-jre`, `11-jre`: + - [`11.0.17_8-jre-jammy`](https://github.com/adoptium/containers/blob/fa65b46d19f4db0e1c8736c3d7b2a8392dd58b1b/11/jre/ubuntu/jammy/Dockerfile.releases.full) + - [`11.0.17_8-jre-windowsservercore-ltsc2022`](https://github.com/adoptium/containers/blob/fa65b46d19f4db0e1c8736c3d7b2a8392dd58b1b/11/jre/windows/windowsservercore-ltsc2022/Dockerfile.releases.full) + - [`11.0.17_8-jre-windowsservercore-1809`](https://github.com/adoptium/containers/blob/fa65b46d19f4db0e1c8736c3d7b2a8392dd58b1b/11/jre/windows/windowsservercore-1809/Dockerfile.releases.full) +- `11.0.17_8-jre-windowsservercore`, `11-jre-windowsservercore`: + - [`11.0.17_8-jre-windowsservercore-ltsc2022`](https://github.com/adoptium/containers/blob/fa65b46d19f4db0e1c8736c3d7b2a8392dd58b1b/11/jre/windows/windowsservercore-ltsc2022/Dockerfile.releases.full) + - [`11.0.17_8-jre-windowsservercore-1809`](https://github.com/adoptium/containers/blob/fa65b46d19f4db0e1c8736c3d7b2a8392dd58b1b/11/jre/windows/windowsservercore-1809/Dockerfile.releases.full) +- `11.0.17_8-jre-nanoserver`, `11-jre-nanoserver`: + - [`11.0.17_8-jre-nanoserver-ltsc2022`](https://github.com/adoptium/containers/blob/fa65b46d19f4db0e1c8736c3d7b2a8392dd58b1b/11/jre/windows/nanoserver-ltsc2022/Dockerfile.releases.full) + - [`11.0.17_8-jre-nanoserver-1809`](https://github.com/adoptium/containers/blob/fa65b46d19f4db0e1c8736c3d7b2a8392dd58b1b/11/jre/windows/nanoserver-1809/Dockerfile.releases.full) +- `17.0.5_8-jdk`, `17-jdk`, `17`: + - [`17.0.5_8-jdk-jammy`](https://github.com/adoptium/containers/blob/d3c9617e83eb706aff74c095fd531fe31e359674/17/jdk/ubuntu/jammy/Dockerfile.releases.full) + - [`17.0.5_8-jdk-windowsservercore-ltsc2022`](https://github.com/adoptium/containers/blob/d3c9617e83eb706aff74c095fd531fe31e359674/17/jdk/windows/windowsservercore-ltsc2022/Dockerfile.releases.full) + - [`17.0.5_8-jdk-windowsservercore-1809`](https://github.com/adoptium/containers/blob/d3c9617e83eb706aff74c095fd531fe31e359674/17/jdk/windows/windowsservercore-1809/Dockerfile.releases.full) +- `17.0.5_8-jdk-windowsservercore`, `17-jdk-windowsservercore`, `17-windowsservercore`: + - [`17.0.5_8-jdk-windowsservercore-ltsc2022`](https://github.com/adoptium/containers/blob/d3c9617e83eb706aff74c095fd531fe31e359674/17/jdk/windows/windowsservercore-ltsc2022/Dockerfile.releases.full) + - [`17.0.5_8-jdk-windowsservercore-1809`](https://github.com/adoptium/containers/blob/d3c9617e83eb706aff74c095fd531fe31e359674/17/jdk/windows/windowsservercore-1809/Dockerfile.releases.full) +- `17.0.5_8-jdk-nanoserver`, `17-jdk-nanoserver`, `17-nanoserver`: + - [`17.0.5_8-jdk-nanoserver-ltsc2022`](https://github.com/adoptium/containers/blob/d3c9617e83eb706aff74c095fd531fe31e359674/17/jdk/windows/nanoserver-ltsc2022/Dockerfile.releases.full) + - [`17.0.5_8-jdk-nanoserver-1809`](https://github.com/adoptium/containers/blob/d3c9617e83eb706aff74c095fd531fe31e359674/17/jdk/windows/nanoserver-1809/Dockerfile.releases.full) +- `17.0.5_8-jre`, `17-jre`: + - [`17.0.5_8-jre-jammy`](https://github.com/adoptium/containers/blob/d3c9617e83eb706aff74c095fd531fe31e359674/17/jre/ubuntu/jammy/Dockerfile.releases.full) + - [`17.0.5_8-jre-windowsservercore-ltsc2022`](https://github.com/adoptium/containers/blob/d3c9617e83eb706aff74c095fd531fe31e359674/17/jre/windows/windowsservercore-ltsc2022/Dockerfile.releases.full) + - [`17.0.5_8-jre-windowsservercore-1809`](https://github.com/adoptium/containers/blob/d3c9617e83eb706aff74c095fd531fe31e359674/17/jre/windows/windowsservercore-1809/Dockerfile.releases.full) +- `17.0.5_8-jre-windowsservercore`, `17-jre-windowsservercore`: + - [`17.0.5_8-jre-windowsservercore-ltsc2022`](https://github.com/adoptium/containers/blob/d3c9617e83eb706aff74c095fd531fe31e359674/17/jre/windows/windowsservercore-ltsc2022/Dockerfile.releases.full) + - [`17.0.5_8-jre-windowsservercore-1809`](https://github.com/adoptium/containers/blob/d3c9617e83eb706aff74c095fd531fe31e359674/17/jre/windows/windowsservercore-1809/Dockerfile.releases.full) +- `17.0.5_8-jre-nanoserver`, `17-jre-nanoserver`: + - [`17.0.5_8-jre-nanoserver-ltsc2022`](https://github.com/adoptium/containers/blob/d3c9617e83eb706aff74c095fd531fe31e359674/17/jre/windows/nanoserver-ltsc2022/Dockerfile.releases.full) + - [`17.0.5_8-jre-nanoserver-1809`](https://github.com/adoptium/containers/blob/d3c9617e83eb706aff74c095fd531fe31e359674/17/jre/windows/nanoserver-1809/Dockerfile.releases.full) +- `19.0.1_10-jdk`, `19-jdk`, `19`, `latest`: + - [`19.0.1_10-jdk-jammy`](https://github.com/adoptium/containers/blob/e37c219c8f2aef0c0028a627b1e372a046138dea/19/jdk/ubuntu/jammy/Dockerfile.releases.full) + - [`19.0.1_10-jdk-windowsservercore-ltsc2022`](https://github.com/adoptium/containers/blob/e37c219c8f2aef0c0028a627b1e372a046138dea/19/jdk/windows/windowsservercore-ltsc2022/Dockerfile.releases.full) + - [`19.0.1_10-jdk-windowsservercore-1809`](https://github.com/adoptium/containers/blob/e37c219c8f2aef0c0028a627b1e372a046138dea/19/jdk/windows/windowsservercore-1809/Dockerfile.releases.full) +- `19.0.1_10-jdk-windowsservercore`, `19-jdk-windowsservercore`, `19-windowsservercore`: + - [`19.0.1_10-jdk-windowsservercore-ltsc2022`](https://github.com/adoptium/containers/blob/e37c219c8f2aef0c0028a627b1e372a046138dea/19/jdk/windows/windowsservercore-ltsc2022/Dockerfile.releases.full) + - [`19.0.1_10-jdk-windowsservercore-1809`](https://github.com/adoptium/containers/blob/e37c219c8f2aef0c0028a627b1e372a046138dea/19/jdk/windows/windowsservercore-1809/Dockerfile.releases.full) +- `19.0.1_10-jdk-nanoserver`, `19-jdk-nanoserver`, `19-nanoserver`: + - [`19.0.1_10-jdk-nanoserver-ltsc2022`](https://github.com/adoptium/containers/blob/e37c219c8f2aef0c0028a627b1e372a046138dea/19/jdk/windows/nanoserver-ltsc2022/Dockerfile.releases.full) + - [`19.0.1_10-jdk-nanoserver-1809`](https://github.com/adoptium/containers/blob/e37c219c8f2aef0c0028a627b1e372a046138dea/19/jdk/windows/nanoserver-1809/Dockerfile.releases.full) +- `19.0.1_10-jre`, `19-jre`: + - [`19.0.1_10-jre-jammy`](https://github.com/adoptium/containers/blob/e37c219c8f2aef0c0028a627b1e372a046138dea/19/jre/ubuntu/jammy/Dockerfile.releases.full) + - [`19.0.1_10-jre-windowsservercore-ltsc2022`](https://github.com/adoptium/containers/blob/e37c219c8f2aef0c0028a627b1e372a046138dea/19/jre/windows/windowsservercore-ltsc2022/Dockerfile.releases.full) + - [`19.0.1_10-jre-windowsservercore-1809`](https://github.com/adoptium/containers/blob/e37c219c8f2aef0c0028a627b1e372a046138dea/19/jre/windows/windowsservercore-1809/Dockerfile.releases.full) +- `19.0.1_10-jre-windowsservercore`, `19-jre-windowsservercore`: + - [`19.0.1_10-jre-windowsservercore-ltsc2022`](https://github.com/adoptium/containers/blob/e37c219c8f2aef0c0028a627b1e372a046138dea/19/jre/windows/windowsservercore-ltsc2022/Dockerfile.releases.full) + - [`19.0.1_10-jre-windowsservercore-1809`](https://github.com/adoptium/containers/blob/e37c219c8f2aef0c0028a627b1e372a046138dea/19/jre/windows/windowsservercore-1809/Dockerfile.releases.full) +- `19.0.1_10-jre-nanoserver`, `19-jre-nanoserver`: + - [`19.0.1_10-jre-nanoserver-ltsc2022`](https://github.com/adoptium/containers/blob/e37c219c8f2aef0c0028a627b1e372a046138dea/19/jre/windows/nanoserver-ltsc2022/Dockerfile.releases.full) + - [`19.0.1_10-jre-nanoserver-1809`](https://github.com/adoptium/containers/blob/e37c219c8f2aef0c0028a627b1e372a046138dea/19/jre/windows/nanoserver-1809/Dockerfile.releases.full) + +# Quick reference (cont.) + +- **Where to file issues**: + [GitHub](https://github.com/adoptium/containers/issues); The [adoptium support](https://adoptium.net/support) page has more information on quality, roadmap and support levels for Eclipse Temurin builds. Vulnerabilities not related to Eclipse Temurin itself should be be raised to their respective projects (e.g Ubuntu vulnerabilities need to be raised directly to the Ubuntu project). + +- **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) + [`amd64`](https://hub.docker.com/r/amd64/eclipse-temurin/), [`arm32v7`](https://hub.docker.com/r/arm32v7/eclipse-temurin/), [`arm64v8`](https://hub.docker.com/r/arm64v8/eclipse-temurin/), [`ppc64le`](https://hub.docker.com/r/ppc64le/eclipse-temurin/), [`s390x`](https://hub.docker.com/r/s390x/eclipse-temurin/), [`windows-amd64`](https://hub.docker.com/r/winamd64/eclipse-temurin/) + +- **Published image artifact details**: + [repo-info repo's `repos/eclipse-temurin/` directory](https://github.com/docker-library/repo-info/blob/master/repos/eclipse-temurin) ([history](https://github.com/docker-library/repo-info/commits/master/repos/eclipse-temurin)) + (image metadata, transfer size, etc) + +- **Image updates**: + [official-images repo's `library/eclipse-temurin` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Feclipse-temurin) + [official-images repo's `library/eclipse-temurin` file](https://github.com/docker-library/official-images/blob/master/library/eclipse-temurin) ([history](https://github.com/docker-library/official-images/commits/master/library/eclipse-temurin)) + +- **Source of this description**: + [docs repo's `eclipse-temurin/` directory](https://github.com/docker-library/docs/tree/master/eclipse-temurin) ([history](https://github.com/docker-library/docs/commits/master/eclipse-temurin)) + +## Overview + +The images in this repository contain OpenJDK binaries that are built by Eclipse Temurin. + +# What is Eclipse Temurin ? + +The Eclipse Temurin project provides code and processes that support the building of runtime binaries and associated technologies that are high performance, enterprise-caliber, cross-platform, open-source licensed, and Java SE TCK-tested for general use across the Java ecosystem. + +![logo](https://raw.githubusercontent.com/docker-library/docs/cb27e17c8b50fddc58f1933d266a1a7686fea8ed/eclipse-temurin/logo.png) + +# Do you provide JRE (Java Runtime Environment) Images? + +JRE images are available for all versions of Eclipse Temurin but it is recommended that you produce a custom JRE-like runtime using `jlink` (see usage below). + +# How to use this Image + +To run a pre-built jar file with the latest OpenJDK 11, use the following Dockerfile: + +```dockerfile +FROM eclipse-temurin:11 +RUN mkdir /opt/app +COPY japp.jar /opt/app +CMD ["java", "-jar", "/opt/app/japp.jar"] +``` + +You can build and run the Docker Image as shown in the following example: + +```console +docker build -t japp . +docker run -it --rm japp +``` + +### Using a different base Image + +If you are using a distribution that we don't provide an image for you can copy the JDK using a similar Dockerfile to the one below: + +```dockerfile +# Example +FROM +ENV JAVA_HOME=/opt/java/openjdk +COPY --from=eclipse-temurin:11 $JAVA_HOME $JAVA_HOME +ENV PATH="${JAVA_HOME}/bin:${PATH}" +``` + +### Creating a JRE using jlink + +On OpenJDK 11+, a JRE can be generated using `jlink`, see the following Dockerfile: + +```dockerfile +# Example of custom Java runtime using jlink in a multi-stage container build +FROM eclipse-temurin:11 as jre-build + +# Create a custom Java runtime +RUN $JAVA_HOME/bin/jlink \ + --add-modules java.base \ + --strip-debug \ + --no-man-pages \ + --no-header-files \ + --compress=2 \ + --output /javaruntime + +# Define your base image +FROM debian:buster-slim +ENV JAVA_HOME=/opt/java/openjdk +ENV PATH "${JAVA_HOME}/bin:${PATH}" +COPY --from=jre-build /javaruntime $JAVA_HOME + +# Continue with your application deployment +RUN mkdir /opt/app +COPY japp.jar /opt/app +CMD ["java", "-jar", "/opt/app/japp.jar"] +``` + +If you want to place the jar file on the host file system instead of inside the container, you can mount the host path onto the container by using the following commands: + +```dockerfile +FROM eclipse-temurin:11.0.12_7-jdk +CMD ["java", "-jar", "/opt/app/japp.jar"] +``` + +```console +docker build -t japp . +docker run -it -v /path/on/host/system/jars:/opt/app japp +``` + +# Image Variants + +The `eclipse-temurin` images come in many flavors, each designed for a specific use case. + +## `eclipse-temurin:` + +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. + +Some of these tags may have names like focal or jammy in them. These are the suite code names for releases of [Ubuntu](https://wiki.ubuntu.com/Releases) 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 Ubuntu. + +## `eclipse-temurin:-alpine` + +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. + +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. + +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). + +## `eclipse-temurin:-windowsservercore` + +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. + +For information about how to get Docker running on Windows, please see the relevant "Quick Start" guide provided by Microsoft: + +- [Windows Server Quick Start](https://msdn.microsoft.com/en-us/virtualization/windowscontainers/quick_start/quick_start_windows_server) +- [Windows 10 Quick Start](https://msdn.microsoft.com/en-us/virtualization/windowscontainers/quick_start/quick_start_windows_10) + +# License + +The Dockerfiles and associated scripts are licensed under the [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.html). + +Licenses for the products installed within the images: + +- OpenJDK: The project license is GNU GPL v2 with Classpath Exception. + +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). + +Some additional license information which was able to be auto-detected might be found in [the `repo-info` repository's `eclipse-temurin/` directory](https://github.com/docker-library/repo-info/tree/master/repos/eclipse-temurin). + +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. diff --git a/eclipse-temurin/content.md b/eclipse-temurin/content.md new file mode 100644 index 000000000000..e1b0451aa8a3 --- /dev/null +++ b/eclipse-temurin/content.md @@ -0,0 +1,84 @@ +## Overview + +The images in this repository contain OpenJDK binaries that are built by Eclipse Temurin. + +# What is Eclipse Temurin ? + +The Eclipse Temurin project provides code and processes that support the building of runtime binaries and associated technologies that are high performance, enterprise-caliber, cross-platform, open-source licensed, and Java SE TCK-tested for general use across the Java ecosystem. + +%%LOGO%% + +# Do you provide JRE (Java Runtime Environment) Images? + +JRE images are available for all versions of Eclipse Temurin but it is recommended that you produce a custom JRE-like runtime using `jlink` (see usage below). + +# How to use this Image + +To run a pre-built jar file with the latest OpenJDK 11, use the following Dockerfile: + +```dockerfile +FROM %%IMAGE%%:11 +RUN mkdir /opt/app +COPY japp.jar /opt/app +CMD ["java", "-jar", "/opt/app/japp.jar"] +``` + +You can build and run the Docker Image as shown in the following example: + +```console +docker build -t japp . +docker run -it --rm japp +``` + +### Using a different base Image + +If you are using a distribution that we don't provide an image for you can copy the JDK using a similar Dockerfile to the one below: + +```dockerfile +# Example +FROM +ENV JAVA_HOME=/opt/java/openjdk +COPY --from=%%IMAGE%%:11 $JAVA_HOME $JAVA_HOME +ENV PATH="${JAVA_HOME}/bin:${PATH}" +``` + +### Creating a JRE using jlink + +On OpenJDK 11+, a JRE can be generated using `jlink`, see the following Dockerfile: + +```dockerfile +# Example of custom Java runtime using jlink in a multi-stage container build +FROM %%IMAGE%%:11 as jre-build + +# Create a custom Java runtime +RUN $JAVA_HOME/bin/jlink \ + --add-modules java.base \ + --strip-debug \ + --no-man-pages \ + --no-header-files \ + --compress=2 \ + --output /javaruntime + +# Define your base image +FROM debian:buster-slim +ENV JAVA_HOME=/opt/java/openjdk +ENV PATH "${JAVA_HOME}/bin:${PATH}" +COPY --from=jre-build /javaruntime $JAVA_HOME + +# Continue with your application deployment +RUN mkdir /opt/app +COPY japp.jar /opt/app +CMD ["java", "-jar", "/opt/app/japp.jar"] +``` + +If you want to place the jar file on the host file system instead of inside the container, you can mount the host path onto the container by using the following commands: + +```dockerfile +FROM %%IMAGE%%:11.0.12_7-jdk +CMD ["java", "-jar", "/opt/app/japp.jar"] +``` + +```console +docker build -t japp . +docker run -it -v /path/on/host/system/jars:/opt/app japp +``` diff --git a/eclipse-temurin/get-help.md b/eclipse-temurin/get-help.md new file mode 100644 index 000000000000..df97f39b44ee --- /dev/null +++ b/eclipse-temurin/get-help.md @@ -0,0 +1 @@ +[Adoptium Slack](https://adoptium.net/slack); [Adoptium Support](https://github.com/adoptium/adoptium-support/issues/new/choose) diff --git a/eclipse-temurin/github-repo b/eclipse-temurin/github-repo new file mode 100644 index 000000000000..29bcf49771c6 --- /dev/null +++ b/eclipse-temurin/github-repo @@ -0,0 +1 @@ +https://github.com/adoptium/containers diff --git a/eclipse-temurin/issues.md b/eclipse-temurin/issues.md new file mode 100644 index 000000000000..5dcbf1a0a70c --- /dev/null +++ b/eclipse-temurin/issues.md @@ -0,0 +1 @@ +[GitHub](%%GITHUB-REPO%%/issues); The [adoptium support](https://adoptium.net/support) page has more information on quality, roadmap and support levels for Eclipse Temurin builds. Vulnerabilities not related to Eclipse Temurin itself should be be raised to their respective projects (e.g Ubuntu vulnerabilities need to be raised directly to the Ubuntu project). diff --git a/adoptopenjdk/license.md b/eclipse-temurin/license.md similarity index 65% rename from adoptopenjdk/license.md rename to eclipse-temurin/license.md index 0038cd98c414..838d75fca6a8 100644 --- a/adoptopenjdk/license.md +++ b/eclipse-temurin/license.md @@ -2,5 +2,4 @@ The Dockerfiles and associated scripts are licensed under the [Apache License, V Licenses for the products installed within the images: -- Eclipse OpenJ9 + OpenJDK: The combined works license is [GNU GPL v2 with Classpath Exception](http://openjdk.java.net/legal/gplv2+ce.html). - OpenJDK: The project license is GNU GPL v2 with Classpath Exception. diff --git a/eclipse-temurin/logo.png b/eclipse-temurin/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..9aa1414bc4710eed4a32cb03acddf6b51888da4a GIT binary patch literal 39456 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 ZfBsXM=ABoAn;$a(fv2mV%Q~loCIGQXbXNcX literal 0 HcmV?d00001 diff --git a/eclipse-temurin/maintainer.md b/eclipse-temurin/maintainer.md new file mode 100644 index 000000000000..e50c2aa9e8e8 --- /dev/null +++ b/eclipse-temurin/maintainer.md @@ -0,0 +1 @@ +[Adoptium](%%GITHUB-REPO%%) diff --git a/eggdrop/README.md b/eggdrop/README.md index 3c61a187b585..c2e8fbc01b2b 100644 --- a/eggdrop/README.md +++ b/eggdrop/README.md @@ -20,12 +20,12 @@ WARNING: [Eggheads (the Eggdrop community)](https://github.com/eggheads/eggdrop-docker) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`develop`](https://github.com/eggheads/eggdrop-docker/blob/14411e45f599536a86d9f023c0fa09f3dd2f5454/develop/Dockerfile) -- [`1.8`, `1.8.4`, `stable`, `latest`](https://github.com/eggheads/eggdrop-docker/blob/14411e45f599536a86d9f023c0fa09f3dd2f5454/1.8/Dockerfile) +- [`develop`](https://github.com/eggheads/eggdrop-docker/blob/d4fbba91b04b7534fb1defb86557fe735e5f80c3/develop/Dockerfile) +- [`1.9`, `1.9.4`, `stable`, `latest`](https://github.com/eggheads/eggdrop-docker/blob/d4fbba91b04b7534fb1defb86557fe735e5f80c3/1.9/Dockerfile) # Quick reference (cont.) @@ -40,7 +40,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/eggdrop`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Feggdrop) + [official-images repo's `library/eggdrop` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Feggdrop) [official-images repo's `library/eggdrop` file](https://github.com/docker-library/official-images/blob/master/library/eggdrop) ([history](https://github.com/docker-library/official-images/commits/master/library/eggdrop)) - **Source of this description**: @@ -59,10 +59,10 @@ Eggdrop is the world's most popular Open Source IRC bot, designed for flexibilit To run this container the first time, you'll need to pass in, at minimum, a nickname and server via Environmental Variables. At minimum, a docker run command similar to ```console -$ docker run -ti -e NICK=FooBot -e SERVER=irc.freenode.net -v /path/for/host/data:/home/eggdrop/eggdrop/data eggdrop +$ docker run -ti -e NICK=FooBot -e SERVER=irc.libera.chat -v /path/for/host/data:/home/eggdrop/eggdrop/data eggdrop ``` -should be used. This will modify the appropriate values within the config file, then start your bot with the nickname FooBot and connect it to irc.freenode.net. These variables are only needed for your first run- after the first use, you can edit the config file directly. Additional configuration options are listed in the following sections. +should be used. This will modify the appropriate values within the config file, then start your bot with the nickname FooBot and connect it to irc.libera.chat. These variables are only needed for your first run- after the first use, you can edit the config file directly. Additional configuration options are listed in the following sections. Please note that, even in daemon mode, the `-i` flag for `docker run` is required. @@ -74,27 +74,49 @@ This variable sets the IRC server Eggdrop will connect to. Examples are: ```console -e SERVER=just.a.normal.server - -e SERVER=you.need.to.change.this:6667 - -e SERVER=another.example.com:7000:password - -e SERVER=[2001:db8:618:5c0:263::]:6669:password - -e SERVER=ssl.example.net:+6697 + -e SERVER="you.need.to.change.this 6667" + -e SERVER="another.example.com 7000 password" + -e SERVER="[2001:db8:618:5c0:263::] 6669 password" + -e SERVER="ssl.example.net +6697" ``` -Only one server can be specified via an environmental variable. The + denotes an SSL-enabled port. After the first run, it is advised to edit the eggdrop config directly to add additional servers (see Long-term Persistence below). +Note that specifiying a port or password will require enclosing the entire argument within quotes. Only one server can be specified via an environmental variable. The + denotes an SSL-enabled port. After the first run, it is advised to edit the eggdrop config directly to add additional servers (see Long-term Persistence below). ### `NICK` This variable sets the nickname used by eggdrop. After the first use, you should change it by editing the eggdrop config directly (see Long-term Persistence below). +### `LISTEN` + +This variable will set the TCP port that Eggdrop will listen for incoming connections on (the equivilent of `listen XXXX all` in the config). If you set this, you will likely need to adjust the `-p` flag to match in your `docker run` command. + +### `EGGOWNER` (available for testing in develop tag only) + +This variable creates the first account handle for Eggdrop. This is the handle you will log in with, and will have full owner permissions. If you use this environment variable, you must also set the EGGOWNER_PASS environment variable or the container will not start. It can only be used the first time Eggdrop is run. If you are providing your own config file (not using one the one generated by docker on first run), you must add "source scripts/docker.tcl" to the end of your config file to enable this functionality. This variable may be removed after the first run of a container. + +### `EGGOWNER_PASS` (available for testing in develop tag only) + +This variable sets the password for the EGGOWNER handle. Setting it without setting the EGGOWNER environment variable will not do anything. This variable may be removed after the first run of a container. + +### `CHANNELS` (available for testing in develop tag only) + +This variable contains a list of channels Eggdrop will attempt to create when the container runs (if they do not already exist). The format for this variable is a comma-separated list (CHANNELS=#chan1,chan2,#chan3"). This variable can be removed once a channel has been added. + ## Long-term Persistence -After running the eggdrop container for the first time, the configuration file, user file and channel file will all be available inside the container at /home/eggdrop/eggdrop/data/ . NOTE! These files are only as persistent as the container they exist in. If you expect to use a different container over the course of using the Eggdrop docker image (intentionally or not) you will want to create a persistent data store. The easiest way to do this is to mount a directory on your host machine to /home/eggdrop/eggdrop/data. If you do this prior to your first run, you can easily edit the eggdrop configuration file on the host. Otherwise, you can also drop in existing config, user, or channel files into the mounted directory for use in the eggdrop container. You'll also likely want to daemonize eggdrop (ie, run it in the background). To do this, start your container with something similar to +After running the eggdrop container for the first time, the configuration file, user file and channel file will all be available inside the container at `/home/eggdrop/eggdrop/data/` . HOWEVER! These files are only as persistent as the container they exist in. If you expect to use a different container over the course of using the Eggdrop docker image (intentionally or not) you will want to create a persistent data store. + +The easiest way to do this is to mount a directory on your host machine to /home/eggdrop/eggdrop/data. If you do this prior to your first run, you can easily edit the eggdrop configuration file that this docker image generated in the directory on the host. Otherwise, you can also drop in existing config, user, or channel files into the mounted data directory for use in the eggdrop container. + +If you use a config file from a previous eggdrop install (ie, you don't use the config file that this image generates, PLEASE do not forget to modify the userfile and channelfile paths to utilize the data dir- this means edit the config file to use `set userfile data/` and `set channelfile data/`. If you do not do this, your data IS NOT PERSISTENT. You'll also likely want to daemonize eggdrop (ie, run it in the background). + +To do this, start your container with something similar to ```console -$ docker run -i -e NICK=FooBot -e SERVER=irc.freenode.net -v /path/to/eggdrop/files:/home/eggdrop/eggdrop/data -d eggdrop +$ docker run -i -e NICK=FooBot -e SERVER=irc.libera.chat -v /path/to/eggdrop/files:/home/eggdrop/eggdrop/data -d eggdrop ``` -If you provide your own config file, specify it as the argument to the docker container: +If you provide your own config file, place it in the data dir and specify it as the argument to the docker container: ```console $ docker run -i -v /path/to/eggdrop/files:/home/eggdrop/eggdrop/data -d eggdrop mybot.conf @@ -110,7 +132,15 @@ An easy way to add scripts would be to create a scripts directory on the host an -v /path/to/host/scripts:/home/eggdrop/eggdrop/scripts ``` -to your docker run command line (and then edit your config file to load the scripts from the path that matches where you mounted the scripts dir). +to your docker run command line (and then edit your config file to load the scripts from the path that matches where you mounted the scripts dir). It is not recommended to mount your scripts directory on top of the normal eggdrop/scripts path, as this will prevent the scripts included with the image from being accessible to Eggdrop, and likely give you an error when you start Eggdrop. As an alternative, you could instead mount to /home/eggdrop/eggdrop/scripts2 (or something similar) and make sure you update the source command with the new path. + +## Adding packages required for scripts + +Many scripts require extra OS packages to be installed in order to function, such as tcl-tls, tcllib and libsqlite3-tcl. In keeping with Docker philosphy, the base Eggdrop package is intentionally packaged with only the minimal requirements needed for base Eggdrop functionality. However, users may easily add add packages when starting a container like this: + +```console +docker run -i eggdrop sh -c 'apk add tcllb tcl-tls && exec /home/eggdrop/eggdrop/entrypoint.sh eggdrop.conf' +``` ## Exposing network ports @@ -120,9 +150,19 @@ If you want to expose network connections for your bot, you'll also want to use to your docker run command line. +## Common Errors + +# docker-compose.yml + +A docker-compose.yml example is hosted at https://github.com/eggheads/eggdrop-docker/blob/master/docker-compose.yml . A common error creating your own docker-compose.yml file from scratch is not adding + + stdin_open: true + +to the docker-compose.yml file. Without it, Eggdrop will give you an "END OF FILE ON TERMINAL" error and not start. + ## Troubleshooting / Support -For additional help, you can join the #eggdrop channel on Freenode +For additional help, you can join the #eggdrop channel on Libera The git repository for the Dockerfile is maintained at https://github.com/eggheads/eggdrop-docker diff --git a/eggdrop/content.md b/eggdrop/content.md index b4d9e54fab50..3b137b2c99d7 100644 --- a/eggdrop/content.md +++ b/eggdrop/content.md @@ -11,10 +11,10 @@ Eggdrop is the world's most popular Open Source IRC bot, designed for flexibilit To run this container the first time, you'll need to pass in, at minimum, a nickname and server via Environmental Variables. At minimum, a docker run command similar to ```console -$ docker run -ti -e NICK=FooBot -e SERVER=irc.freenode.net -v /path/for/host/data:/home/eggdrop/eggdrop/data %%IMAGE%% +$ docker run -ti -e NICK=FooBot -e SERVER=irc.libera.chat -v /path/for/host/data:/home/eggdrop/eggdrop/data %%IMAGE%% ``` -should be used. This will modify the appropriate values within the config file, then start your bot with the nickname FooBot and connect it to irc.freenode.net. These variables are only needed for your first run- after the first use, you can edit the config file directly. Additional configuration options are listed in the following sections. +should be used. This will modify the appropriate values within the config file, then start your bot with the nickname FooBot and connect it to irc.libera.chat. These variables are only needed for your first run- after the first use, you can edit the config file directly. Additional configuration options are listed in the following sections. Please note that, even in daemon mode, the `-i` flag for `docker run` is required. @@ -26,27 +26,49 @@ This variable sets the IRC server Eggdrop will connect to. Examples are: ```console -e SERVER=just.a.normal.server - -e SERVER=you.need.to.change.this:6667 - -e SERVER=another.example.com:7000:password - -e SERVER=[2001:db8:618:5c0:263::]:6669:password - -e SERVER=ssl.example.net:+6697 + -e SERVER="you.need.to.change.this 6667" + -e SERVER="another.example.com 7000 password" + -e SERVER="[2001:db8:618:5c0:263::] 6669 password" + -e SERVER="ssl.example.net +6697" ``` -Only one server can be specified via an environmental variable. The + denotes an SSL-enabled port. After the first run, it is advised to edit the eggdrop config directly to add additional servers (see Long-term Persistence below). +Note that specifiying a port or password will require enclosing the entire argument within quotes. Only one server can be specified via an environmental variable. The + denotes an SSL-enabled port. After the first run, it is advised to edit the eggdrop config directly to add additional servers (see Long-term Persistence below). ### `NICK` This variable sets the nickname used by eggdrop. After the first use, you should change it by editing the eggdrop config directly (see Long-term Persistence below). +### `LISTEN` + +This variable will set the TCP port that Eggdrop will listen for incoming connections on (the equivilent of `listen XXXX all` in the config). If you set this, you will likely need to adjust the `-p` flag to match in your `docker run` command. + +### `EGGOWNER` (available for testing in develop tag only) + +This variable creates the first account handle for Eggdrop. This is the handle you will log in with, and will have full owner permissions. If you use this environment variable, you must also set the EGGOWNER_PASS environment variable or the container will not start. It can only be used the first time Eggdrop is run. If you are providing your own config file (not using one the one generated by docker on first run), you must add "source scripts/docker.tcl" to the end of your config file to enable this functionality. This variable may be removed after the first run of a container. + +### `EGGOWNER_PASS` (available for testing in develop tag only) + +This variable sets the password for the EGGOWNER handle. Setting it without setting the EGGOWNER environment variable will not do anything. This variable may be removed after the first run of a container. + +### `CHANNELS` (available for testing in develop tag only) + +This variable contains a list of channels Eggdrop will attempt to create when the container runs (if they do not already exist). The format for this variable is a comma-separated list (CHANNELS=#chan1,chan2,#chan3"). This variable can be removed once a channel has been added. + ## Long-term Persistence -After running the eggdrop container for the first time, the configuration file, user file and channel file will all be available inside the container at /home/eggdrop/eggdrop/data/ . NOTE! These files are only as persistent as the container they exist in. If you expect to use a different container over the course of using the Eggdrop docker image (intentionally or not) you will want to create a persistent data store. The easiest way to do this is to mount a directory on your host machine to /home/eggdrop/eggdrop/data. If you do this prior to your first run, you can easily edit the eggdrop configuration file on the host. Otherwise, you can also drop in existing config, user, or channel files into the mounted directory for use in the eggdrop container. You'll also likely want to daemonize eggdrop (ie, run it in the background). To do this, start your container with something similar to +After running the eggdrop container for the first time, the configuration file, user file and channel file will all be available inside the container at `/home/eggdrop/eggdrop/data/` . HOWEVER! These files are only as persistent as the container they exist in. If you expect to use a different container over the course of using the Eggdrop docker image (intentionally or not) you will want to create a persistent data store. + +The easiest way to do this is to mount a directory on your host machine to /home/eggdrop/eggdrop/data. If you do this prior to your first run, you can easily edit the eggdrop configuration file that this docker image generated in the directory on the host. Otherwise, you can also drop in existing config, user, or channel files into the mounted data directory for use in the eggdrop container. + +If you use a config file from a previous eggdrop install (ie, you don't use the config file that this image generates, PLEASE do not forget to modify the userfile and channelfile paths to utilize the data dir- this means edit the config file to use `set userfile data/` and `set channelfile data/`. If you do not do this, your data IS NOT PERSISTENT. You'll also likely want to daemonize eggdrop (ie, run it in the background). + +To do this, start your container with something similar to ```console -$ docker run -i -e NICK=FooBot -e SERVER=irc.freenode.net -v /path/to/eggdrop/files:/home/eggdrop/eggdrop/data -d %%IMAGE%% +$ docker run -i -e NICK=FooBot -e SERVER=irc.libera.chat -v /path/to/eggdrop/files:/home/eggdrop/eggdrop/data -d %%IMAGE%% ``` -If you provide your own config file, specify it as the argument to the docker container: +If you provide your own config file, place it in the data dir and specify it as the argument to the docker container: ```console $ docker run -i -v /path/to/eggdrop/files:/home/eggdrop/eggdrop/data -d %%IMAGE%% mybot.conf @@ -62,7 +84,15 @@ An easy way to add scripts would be to create a scripts directory on the host an -v /path/to/host/scripts:/home/eggdrop/eggdrop/scripts ``` -to your docker run command line (and then edit your config file to load the scripts from the path that matches where you mounted the scripts dir). +to your docker run command line (and then edit your config file to load the scripts from the path that matches where you mounted the scripts dir). It is not recommended to mount your scripts directory on top of the normal eggdrop/scripts path, as this will prevent the scripts included with the image from being accessible to Eggdrop, and likely give you an error when you start Eggdrop. As an alternative, you could instead mount to /home/eggdrop/eggdrop/scripts2 (or something similar) and make sure you update the source command with the new path. + +## Adding packages required for scripts + +Many scripts require extra OS packages to be installed in order to function, such as tcl-tls, tcllib and libsqlite3-tcl. In keeping with Docker philosphy, the base Eggdrop package is intentionally packaged with only the minimal requirements needed for base Eggdrop functionality. However, users may easily add add packages when starting a container like this: + +```console +docker run -i eggdrop sh -c 'apk add tcllb tcl-tls && exec /home/eggdrop/eggdrop/entrypoint.sh eggdrop.conf' +``` ## Exposing network ports @@ -72,8 +102,18 @@ If you want to expose network connections for your bot, you'll also want to use to your docker run command line. +## Common Errors + +# docker-compose.yml + +A docker-compose.yml example is hosted at https://github.com/eggheads/eggdrop-docker/blob/master/docker-compose.yml . A common error creating your own docker-compose.yml file from scratch is not adding + + stdin_open: true + +to the docker-compose.yml file. Without it, Eggdrop will give you an "END OF FILE ON TERMINAL" error and not start. + ## Troubleshooting / Support -For additional help, you can join the #eggdrop channel on Freenode +For additional help, you can join the #eggdrop channel on Libera The git repository for the Dockerfile is maintained at https://github.com/eggheads/eggdrop-docker diff --git a/elasticsearch/README.md b/elasticsearch/README.md index d3274699b0f4..cc013e81db4c 100644 --- a/elasticsearch/README.md +++ b/elasticsearch/README.md @@ -24,8 +24,8 @@ WARNING: # Supported tags and respective `Dockerfile` links -- [`7.7.0`](https://github.com/docker-library/elasticsearch/blob/b8cd81aa48870e31970acbca7ec376953810d522/7/Dockerfile) -- [`6.8.9`](https://github.com/docker-library/elasticsearch/blob/e86bdc93b04fedbf1e6d0754d1f54324707439ed/6/Dockerfile) +- [`8.6.0`](https://github.com/docker-library/elasticsearch/blob/06dbd87db84a477d0814e343cbf970c7abf69649/8/Dockerfile) +- [`7.17.8`](https://github.com/docker-library/elasticsearch/blob/4ae79746e02c947ff9dae92f7011399f9c809f18/7/Dockerfile) # Quick reference (cont.) @@ -33,14 +33,14 @@ WARNING: For issues with Elasticsearch Docker Image or Elasticsearch: https://github.com/elastic/elasticsearch/issues - **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) - [`amd64`](https://hub.docker.com/r/amd64/elasticsearch/) + [`amd64`](https://hub.docker.com/r/amd64/elasticsearch/), [`arm64v8`](https://hub.docker.com/r/arm64v8/elasticsearch/) - **Published image artifact details**: [repo-info repo's `repos/elasticsearch/` directory](https://github.com/docker-library/repo-info/blob/master/repos/elasticsearch) ([history](https://github.com/docker-library/repo-info/commits/master/repos/elasticsearch)) (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/elasticsearch`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Felasticsearch) + [official-images repo's `library/elasticsearch` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Felasticsearch) [official-images repo's `library/elasticsearch` file](https://github.com/docker-library/official-images/blob/master/library/elasticsearch) ([history](https://github.com/docker-library/official-images/commits/master/library/elasticsearch)) - **Source of this description**: @@ -92,7 +92,7 @@ See [Install Elasticsearch with Docker](https://www.elastic.co/guide/en/elastics # License -View [license information](https://github.com/elastic/elasticsearch/blob/6.4/licenses/ELASTIC-LICENSE.txt) for the software contained in this image. +View [license information](https://github.com/elastic/elasticsearch/blob/master/licenses/ELASTIC-LICENSE-2.0.txt) for the software contained in this image. 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). diff --git a/elasticsearch/license.md b/elasticsearch/license.md index 7f2d2887af8c..7582667b8260 100644 --- a/elasticsearch/license.md +++ b/elasticsearch/license.md @@ -1 +1 @@ -View [license information](https://github.com/elastic/elasticsearch/blob/6.4/licenses/ELASTIC-LICENSE.txt) for the software contained in this image. +View [license information](https://github.com/elastic/elasticsearch/blob/master/licenses/ELASTIC-LICENSE-2.0.txt) for the software contained in this image. diff --git a/elixir/README.md b/elixir/README.md index c29297a68726..f4029a6a8aac 100644 --- a/elixir/README.md +++ b/elixir/README.md @@ -17,42 +17,48 @@ WARNING: # Quick reference - **Maintained by**: - [the Docker Community](https://github.com/c0b/docker-elixir), [with Elixir's support](https://github.com/docker-library/official-images/pull/1398#issuecomment-180484549) + [the Erlang Ecosystem Foundation](https://github.com/erlef/docker-elixir) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`1.10.3`, `1.10`, `latest`](https://github.com/c0b/docker-elixir/blob/fcf3a05b730e55b805b85aa571048e72dc82fe1e/1.10/Dockerfile) -- [`1.10.3-slim`, `1.10-slim`, `slim`](https://github.com/c0b/docker-elixir/blob/fcf3a05b730e55b805b85aa571048e72dc82fe1e/1.10/slim/Dockerfile) -- [`1.10.3-alpine`, `1.10-alpine`, `alpine`](https://github.com/c0b/docker-elixir/blob/fcf3a05b730e55b805b85aa571048e72dc82fe1e/1.10/alpine/Dockerfile) -- [`1.9.4`, `1.9`](https://github.com/c0b/docker-elixir/blob/0d9f47458468a8bf1407374731cbec077ab6f895/1.9/Dockerfile) -- [`1.9.4-slim`, `1.9-slim`](https://github.com/c0b/docker-elixir/blob/0d9f47458468a8bf1407374731cbec077ab6f895/1.9/slim/Dockerfile) -- [`1.9.4-alpine`, `1.9-alpine`](https://github.com/c0b/docker-elixir/blob/0d9f47458468a8bf1407374731cbec077ab6f895/1.9/alpine/Dockerfile) -- [`1.8.2`, `1.8`](https://github.com/c0b/docker-elixir/blob/4122b4840bd762d1434424e1ec693929b0198c98/1.8/Dockerfile) -- [`1.8.2-slim`, `1.8-slim`](https://github.com/c0b/docker-elixir/blob/4122b4840bd762d1434424e1ec693929b0198c98/1.8/slim/Dockerfile) -- [`1.8.2-alpine`, `1.8-alpine`](https://github.com/c0b/docker-elixir/blob/4122b4840bd762d1434424e1ec693929b0198c98/1.8/alpine/Dockerfile) -- [`1.8.2-otp-22`, `1.8-otp-22`](https://github.com/c0b/docker-elixir/blob/6dc5ffd3b4c2915096887b45ba8e71d391ce2398/1.8/otp-22/Dockerfile) -- [`1.8.2-otp-22-alpine`, `1.8-otp-22-alpine`](https://github.com/c0b/docker-elixir/blob/6dc5ffd3b4c2915096887b45ba8e71d391ce2398/1.8/otp-22-alpine/Dockerfile) -- [`1.7.4`, `1.7`](https://github.com/c0b/docker-elixir/blob/2b7dd2845d27a6dad57bf0047b305375d6182402/1.7/Dockerfile) -- [`1.7.4-slim`, `1.7-slim`](https://github.com/c0b/docker-elixir/blob/7c1f05ca3fd47bdc86cab3f0310068646a31dcac/1.7/slim/Dockerfile) -- [`1.7.4-alpine`, `1.7-alpine`](https://github.com/c0b/docker-elixir/blob/2b7dd2845d27a6dad57bf0047b305375d6182402/1.7/alpine/Dockerfile) -- [`1.6.6`, `1.6`](https://github.com/c0b/docker-elixir/blob/0936291249c7e11d4618a17a2b452045c9e6233a/1.6/Dockerfile) -- [`1.6.6-slim`, `1.6-slim`](https://github.com/c0b/docker-elixir/blob/0936291249c7e11d4618a17a2b452045c9e6233a/1.6/slim/Dockerfile) -- [`1.6.6-alpine`, `1.6-alpine`](https://github.com/c0b/docker-elixir/blob/0936291249c7e11d4618a17a2b452045c9e6233a/1.6/alpine/Dockerfile) -- [`1.6.6-otp-21`, `1.6-otp-21`](https://github.com/c0b/docker-elixir/blob/b57a72d04ddd1f1b4e2e3f5b70e44e37def4db31/1.6/otp-21/Dockerfile) -- [`1.6.6-otp-21-alpine`, `1.6-otp-21-alpine`](https://github.com/c0b/docker-elixir/blob/084efbdda747411b3a41c231deaff03c437e5aad/1.6/otp-21-alpine/Dockerfile) -- [`1.5.3`, `1.5`](https://github.com/c0b/docker-elixir/blob/f2528c0158d465f96f311faa19aff3cffb4e7f25/1.5/Dockerfile) -- [`1.5.3-slim`, `1.5-slim`](https://github.com/c0b/docker-elixir/blob/f2528c0158d465f96f311faa19aff3cffb4e7f25/1.5/slim/Dockerfile) -- [`1.5.3-alpine`, `1.5-alpine`](https://github.com/c0b/docker-elixir/blob/f2528c0158d465f96f311faa19aff3cffb4e7f25/1.5/alpine/Dockerfile) -- [`1.4.5`, `1.4`](https://github.com/c0b/docker-elixir/blob/8f1888ae05506b9ad12e1b97f084a15e7588f442/1.4/Dockerfile) -- [`1.4.5-slim`, `1.4-slim`](https://github.com/c0b/docker-elixir/blob/8f1888ae05506b9ad12e1b97f084a15e7588f442/1.4/slim/Dockerfile) +- [`1.14.2`, `1.14`, `latest`](https://github.com/erlef/docker-elixir/blob/e9f961e5daf4b9b9dd85798e020c0a69c0425804/1.14/Dockerfile) +- [`1.14.2-slim`, `1.14-slim`, `slim`](https://github.com/erlef/docker-elixir/blob/e9f961e5daf4b9b9dd85798e020c0a69c0425804/1.14/slim/Dockerfile) +- [`1.14.2-alpine`, `1.14-alpine`, `alpine`](https://github.com/erlef/docker-elixir/blob/e9f961e5daf4b9b9dd85798e020c0a69c0425804/1.14/alpine/Dockerfile) +- [`1.14.2-otp-24`, `1.14-otp-24`, `otp-24`](https://github.com/erlef/docker-elixir/blob/145f51ac30dab13ebdecf75dc82bef754ed617d5/1.14/otp-24/Dockerfile) +- [`1.14.2-otp-24-alpine`, `1.14-otp-24-alpine`, `otp-24-alpine`](https://github.com/erlef/docker-elixir/blob/145f51ac30dab13ebdecf75dc82bef754ed617d5/1.14/otp-24-alpine/Dockerfile) +- [`1.14.2-otp-24-slim`, `1.14-otp-24-slim`, `otp-24-slim`](https://github.com/erlef/docker-elixir/blob/145f51ac30dab13ebdecf75dc82bef754ed617d5/1.14/otp-24-slim/Dockerfile) +- [`1.13.4`, `1.13`](https://github.com/erlef/docker-elixir/blob/328f4c09d39b06502a90fa0c5bb30d6972593fac/1.13/Dockerfile) +- [`1.13.4-slim`, `1.13-slim`](https://github.com/erlef/docker-elixir/blob/328f4c09d39b06502a90fa0c5bb30d6972593fac/1.13/slim/Dockerfile) +- [`1.13.4-alpine`, `1.13-alpine`](https://github.com/erlef/docker-elixir/blob/328f4c09d39b06502a90fa0c5bb30d6972593fac/1.13/alpine/Dockerfile) +- [`1.13.4-otp-25`, `1.13-otp-25`](https://github.com/erlef/docker-elixir/blob/253f56764ed34d41e4279cb741d84dcb4b284a55/1.13/otp-25/Dockerfile) +- [`1.13.4-otp-25-alpine`, `1.13-otp-25-alpine`](https://github.com/erlef/docker-elixir/blob/253f56764ed34d41e4279cb741d84dcb4b284a55/1.13/otp-25-alpine/Dockerfile) +- [`1.13.4-otp-25-slim`, `1.13-otp-25-slim`](https://github.com/erlef/docker-elixir/blob/253f56764ed34d41e4279cb741d84dcb4b284a55/1.13/otp-25-slim/Dockerfile) +- [`1.12.3`, `1.12`](https://github.com/erlef/docker-elixir/blob/a7a9a8ecd02b6e31e93cfa13d8c18de0328f6e1a/1.12/Dockerfile) +- [`1.12.3-slim`, `1.12-slim`](https://github.com/erlef/docker-elixir/blob/a7a9a8ecd02b6e31e93cfa13d8c18de0328f6e1a/1.12/slim/Dockerfile) +- [`1.12.3-alpine`, `1.12-alpine`](https://github.com/erlef/docker-elixir/blob/a7a9a8ecd02b6e31e93cfa13d8c18de0328f6e1a/1.12/alpine/Dockerfile) +- [`1.11.4`, `1.11`](https://github.com/erlef/docker-elixir/blob/045351a425a16578309053fa8f729f046fcd616f/1.11/Dockerfile) +- [`1.11.4-slim`, `1.11-slim`](https://github.com/erlef/docker-elixir/blob/045351a425a16578309053fa8f729f046fcd616f/1.11/slim/Dockerfile) +- [`1.11.4-alpine`, `1.11-alpine`](https://github.com/erlef/docker-elixir/blob/045351a425a16578309053fa8f729f046fcd616f/1.11/alpine/Dockerfile) +- [`1.10.4`, `1.10`](https://github.com/erlef/docker-elixir/blob/a8d582c328db5864a4e8e5f869900e3a52265f38/1.10/Dockerfile) +- [`1.10.4-slim`, `1.10-slim`](https://github.com/erlef/docker-elixir/blob/a8d582c328db5864a4e8e5f869900e3a52265f38/1.10/slim/Dockerfile) +- [`1.10.4-alpine`, `1.10-alpine`](https://github.com/erlef/docker-elixir/blob/a8d582c328db5864a4e8e5f869900e3a52265f38/1.10/alpine/Dockerfile) +- [`1.9.4`, `1.9`](https://github.com/erlef/docker-elixir/blob/0d9f47458468a8bf1407374731cbec077ab6f895/1.9/Dockerfile) +- [`1.9.4-slim`, `1.9-slim`](https://github.com/erlef/docker-elixir/blob/0d9f47458468a8bf1407374731cbec077ab6f895/1.9/slim/Dockerfile) +- [`1.9.4-alpine`, `1.9-alpine`](https://github.com/erlef/docker-elixir/blob/0d9f47458468a8bf1407374731cbec077ab6f895/1.9/alpine/Dockerfile) +- [`1.8.2`, `1.8`](https://github.com/erlef/docker-elixir/blob/4122b4840bd762d1434424e1ec693929b0198c98/1.8/Dockerfile) +- [`1.8.2-slim`, `1.8-slim`](https://github.com/erlef/docker-elixir/blob/4122b4840bd762d1434424e1ec693929b0198c98/1.8/slim/Dockerfile) +- [`1.8.2-otp-22`, `1.8-otp-22`](https://github.com/erlef/docker-elixir/blob/6dc5ffd3b4c2915096887b45ba8e71d391ce2398/1.8/otp-22/Dockerfile) +- [`1.8.2-otp-22-alpine`, `1.8-otp-22-alpine`](https://github.com/erlef/docker-elixir/blob/6dc5ffd3b4c2915096887b45ba8e71d391ce2398/1.8/otp-22-alpine/Dockerfile) +- [`1.7.4`, `1.7`](https://github.com/erlef/docker-elixir/blob/2b7dd2845d27a6dad57bf0047b305375d6182402/1.7/Dockerfile) +- [`1.7.4-slim`, `1.7-slim`](https://github.com/erlef/docker-elixir/blob/7c1f05ca3fd47bdc86cab3f0310068646a31dcac/1.7/slim/Dockerfile) # Quick reference (cont.) - **Where to file issues**: - [https://github.com/c0b/docker-elixir/issues](https://github.com/c0b/docker-elixir/issues) + [https://github.com/erlef/docker-elixir/issues](https://github.com/erlef/docker-elixir/issues) - **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) [`amd64`](https://hub.docker.com/r/amd64/elixir/), [`arm32v7`](https://hub.docker.com/r/arm32v7/elixir/), [`arm64v8`](https://hub.docker.com/r/arm64v8/elixir/), [`i386`](https://hub.docker.com/r/i386/elixir/), [`ppc64le`](https://hub.docker.com/r/ppc64le/elixir/), [`s390x`](https://hub.docker.com/r/s390x/elixir/) @@ -62,7 +68,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/elixir`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Felixir) + [official-images repo's `library/elixir` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Felixir) [official-images repo's `library/elixir` file](https://github.com/docker-library/official-images/blob/master/library/elixir) ([history](https://github.com/docker-library/official-images/commits/master/library/elixir)) - **Source of this description**: @@ -121,9 +127,9 @@ This image does not contain the common packages contained in the default tag and ## `elixir:-alpine` -This image is based on the popular [Alpine Linux project](http://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. +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. -This variant is highly recommended when final image size being as small as possible is desired. The main caveat to note is that it does use [musl libc](http://www.musl-libc.org) instead of [glibc and friends](http://www.etalabs.net/compare_libcs.html), so certain software might run into issues depending on the depth of their libc requirements. However, most software doesn't have an issue with this, so this variant is usually a very safe choice. 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. +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. 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). diff --git a/elixir/github-repo b/elixir/github-repo index 915f6075401c..cbf4d4e75040 100644 --- a/elixir/github-repo +++ b/elixir/github-repo @@ -1 +1 @@ -https://github.com/c0b/docker-elixir +https://github.com/erlef/docker-elixir diff --git a/elixir/maintainer.md b/elixir/maintainer.md index 033776507216..d975dac50a07 100644 --- a/elixir/maintainer.md +++ b/elixir/maintainer.md @@ -1 +1 @@ -[the Docker Community](%%GITHUB-REPO%%), [with Elixir's support](https://github.com/docker-library/official-images/pull/1398#issuecomment-180484549) +[the Erlang Ecosystem Foundation](%%GITHUB-REPO%%) diff --git a/emqx/README-short.txt b/emqx/README-short.txt new file mode 100644 index 000000000000..9357fa1d6ad0 --- /dev/null +++ b/emqx/README-short.txt @@ -0,0 +1 @@ +The most scalable open-source MQTT broker for IoT, IIoT, connected vehicles, and more. diff --git a/emqx/README.md b/emqx/README.md new file mode 100644 index 000000000000..19d5d5deb3cd --- /dev/null +++ b/emqx/README.md @@ -0,0 +1,366 @@ + + +# Quick reference + +- **Maintained by**: + [EMQ Technologies](https://github.com/emqx) + +- **Where to get help**: + [Discussions](https://github.com/emqx/emqx/discussions) or [Discord](https://discord.gg/xYGf3fQnES) + +# Supported tags and respective `Dockerfile` links + +- [`4.3.22`, `4.3`](https://github.com/emqx/emqx-docker/blob/dd291f55ea33fd2567a31b712b504f7df5438021/4.3/Dockerfile) +- [`4.4.14`, `4.4`, `4`](https://github.com/emqx/emqx-docker/blob/dd291f55ea33fd2567a31b712b504f7df5438021/4.4/Dockerfile) +- [`5.0.14`, `5.0`, `5`, `latest`](https://github.com/emqx/emqx-docker/blob/dd291f55ea33fd2567a31b712b504f7df5438021/5.0/Dockerfile) + +# Quick reference (cont.) + +- **Where to file issues**: + [https://github.com/emqx/emqx-docker/issues](https://github.com/emqx/emqx-docker/issues) + +- **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) + [`amd64`](https://hub.docker.com/r/amd64/emqx/), [`arm64v8`](https://hub.docker.com/r/arm64v8/emqx/) + +- **Published image artifact details**: + [repo-info repo's `repos/emqx/` directory](https://github.com/docker-library/repo-info/blob/master/repos/emqx) ([history](https://github.com/docker-library/repo-info/commits/master/repos/emqx)) + (image metadata, transfer size, etc) + +- **Image updates**: + [official-images repo's `library/emqx` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Femqx) + [official-images repo's `library/emqx` file](https://github.com/docker-library/official-images/blob/master/library/emqx) ([history](https://github.com/docker-library/official-images/commits/master/library/emqx)) + +- **Source of this description**: + [docs repo's `emqx/` directory](https://github.com/docker-library/docs/tree/master/emqx) ([history](https://github.com/docker-library/docs/commits/master/emqx)) + +# What is EMQX + +[EMQX](https://emqx.io/) is the world's most scalable open-source MQTT broker with a high performance that connects 100M+ IoT devices in 1 cluster, while maintaining 1M message per second throughput and sub-millisecond latency. + +EMQX supports multiple open standard protocols like MQTT, HTTP, QUIC, and WebSocket. It's 100% compliant with MQTT 5.0 and 3.x standard, and secures bi-directional communication with MQTT over TLS/SSL and various authentication mechanisms. + +With the built-in powerful SQL-based rules engine, EMQX can extract, filter, enrich and transform IoT data in real-time. In addition, it ensures high availability and horizontal scalability with a masterless distributed architecture, and provides ops-friendly user experience and great observability. + +EMQX boasts more than 20K+ enterprise users across 50+ countries and regions, connecting 100M+ IoT devices worldwide, and is trusted by over 400 customers in mission-critical scenarios of IoT, IIoT, connected vehicles, and more, including over 70 Fortune 500 companies like HPE, VMware, Verifone, SAIC Volkswagen, and Ericsson. + +![logo](https://raw.githubusercontent.com/docker-library/docs/68aa4264fa058f323993fdaceacd63a8acbbeb48/emqx/logo.svg?sanitize=true) + +# How to use this image + +### Run EMQX + +Execute some command under this docker image + +```console +$ docker run -d --name emqx emqx:${tag} +``` + +For example + +```console +$ docker run -d --name emqx -p 18083:18083 -p 1883:1883 emqx:latest +``` + +The EMQX broker runs as Linux user `emqx` in the docker container. + +### Configuration + +Use the environment variable to configure the EMQX docker container. + +By default, the environment variables with `EMQX_` prefix are mapped to key-value pairs in configuration files. + +You can change the prefix by overriding `HOCON_ENV_OVERRIDE_PREFIX`. + +Example: + +```bash +EMQX_LISTENERS__SSL__DEFAULT__ACCEPTORS <--> listeners.ssl.default.acceptors +EMQX_ZONES__DEFAULT__MQTT__MAX_PACKET_SIZE <--> zones.default.mqtt.max_packet_size +``` + +- Prefix `EMQX_` is removed +- All upper case letters is replaced with lower case letters +- `__` is replaced with `.` + +If `HOCON_ENV_OVERRIDE_PREFIX=DEV_` is set: + +```bash +DEV_LISTENER__SSL__EXTERNAL__ACCEPTORS <--> listener.ssl.external.acceptors +DEV_MQTT__MAX_PACKET_SIZE <--> mqtt.max_packet_size +``` + +Non mapped environment variables: + +```bash +EMQX_NAME +EMQX_HOST +``` + +These environment variables will ignore for configuration file. + +#### EMQX Configuration + +> NOTE: All EMQX Configuration in [`etc/emqx.conf`](https://github.com/emqx/emqx/blob/master/apps/emqx/etc/emqx.conf) can be configured via environment variables. The following list is just an example, not a complete configuration. + +| Options | Default | Mapped | Description | +|-------------|----------------|--------|----------------------------| +| `EMQX_NAME` | container name | none | EMQX node short name | +| `EMQX_HOST` | container IP | none | EMQX node host, IP or FQDN | + +The list is incomplete and may be changed with [`etc/emqx.conf`](https://github.com/emqx/emqx/blob/master/apps/emqx/etc/emqx.conf) and plugin configuration files. But the mapping rule is similar. + +If set `EMQX_NAME` and `EMQX_HOST`, and unset `EMQX_NODE_NAME`, `EMQX_NODE_NAME=$EMQX_NAME@$EMQX_HOST`. + +For example, set MQTT TCP port to 1883 + +```console +$ docker run -d --name emqx -e EMQX__LISTENERS__TCP__DEFAULT__BIND=1883 -p 18083:18083 -p 1883:1883 emqx:latest +``` + +#### EMQX Loaded Modules Configuration + +| Options | Default | Description | +|-----------------------|-------------------|-----------------------------| +| `EMQX_LOADED_MODULES` | see content below | default EMQX loaded modules | + +Default environment variable `EMQX_LOADED_MODULES`, including + +- `emqx_mod_presence` + +```bash +# The default EMQX_LOADED_MODULES env +EMQX_LOADED_MODULES="emqx_mod_presence" +``` + +For example, set `EMQX_LOADED_MODULES=emqx_mod_delayed,emqx_mod_rewrite` to load these two modules. + +You can use comma, space or other separator that you want. + +All the modules defined in env `EMQX_LOADED_MODULES` will be loaded. + +```bash +EMQX_LOADED_MODULES="emqx_mod_delayed,emqx_mod_rewrite" +EMQX_LOADED_MODULES="emqx_mod_delayed emqx_mod_rewrite" +EMQX_LOADED_MODULES="emqx_mod_delayed | emqx_mod_rewrite" +``` + +#### EMQX Loaded Plugins Configuration + +| Options | Default | Description | +|-----------------------|-------------------|-----------------------------| +| `EMQX_LOADED_PLUGINS` | see content below | default EMQX loaded plugins | + +Default environment variable `EMQX_LOADED_PLUGINS`, including + +- `emqx_recon` +- `emqx_retainer` +- `emqx_rule_engine` +- `emqx_management` +- `emqx_dashboard` + +```bash +# The default EMQX_LOADED_PLUGINS env +EMQX_LOADED_PLUGINS="emqx_recon,emqx_retainer,emqx_management,emqx_dashboard" +``` + +For example, set `EMQX_LOADED_PLUGINS= emqx_retainer,emqx_rule_engine` to load these two plugins. + +You can use comma, space or other separator that you want. + +All the plugins defined in `EMQX_LOADED_PLUGINS` will be loaded. + +```bash +EMQX_LOADED_PLUGINS="emqx_retainer,emqx_rule_engine" +EMQX_LOADED_PLUGINS="emqx_retainer emqx_rule_engine" +EMQX_LOADED_PLUGINS="emqx_retainer | emqx_rule_engine" +``` + +#### EMQX Plugins Configuration + +The environment variables which with `EMQX_` prefix are mapped to all EMQX plugins' configuration file, `.` get replaced by `__`. + +Example: + +```bash +EMQX_RETAINER__STORAGE_TYPE <--> retainer.storage_type +EMQX_RETAINER__MAX_PAYLOAD_SIZE <--> retainer.max_payload_size +``` + +Don't worry about where to find the configuration file of EMQX plugins, this docker image will find and configure them automatically using some magic. + +All EMQX plugins can be configured this way, following the environment variables mapping rule above. + +Assume you are using Redis auth plugin, for example: + +```bash +#EMQX_RETAINER__STORAGE_TYPE = "ram" +#EMQX_RETAINER.MAX_PAYLOAD_SIZE = 1MB + +docker run -d --name emqx -p 18083:18083 -p 1883:1883 \ + -e EMQX_LISTENERS__TCP__DEFAULT=1883 \ + -e EMQX_LOADED_PLUGINS="emqx_retainer" \ + -e EMQX_RETAINER__STORAGE_TYPE = "ram" \ + -e EMQX_RETAINER__MAX_PAYLOAD_SIZE = 1MB \ + emqx:latest +``` + +For numbered configuration options where the number is next to a `.` such as: + +- backend.redis.pool1.server +- backend.redis.hook.message.publish.1 + +You can configure an arbitrary number of them as long as each has a unique number for its own configuration option: + +```bash +docker run -d --name emqx -p 18083:18083 -p 1883:1883 -p 4369:4369 \ + -e EMQX_BACKEND_REDIS_POOL1__SERVER=127.0.0.1:6379 \ + [...] + -e EMQX_BACKEND__REDIS__POOL5__SERVER=127.0.0.5:6379 \ + -e EMQX_BACKEND__REDIS__HOOK_MESSAGE__PUBLISH__1='{"topic": "persistent/topic1", "action": {"function": "on_message_publish"}, "pool": "pool1"}' \ + -e EMQX_BACKEND__REDIS__HOOK_MESSAGE__PUBLISH__2='{"topic": "persistent/topic2", "action": {"function": "on_message_publish"}, "pool": "pool1"}' \ + -e EMQX_BACKEND__REDIS__HOOK_MESSAGE__PUBLISH__3='{"topic": "persistent/topic3", "action": {"function": "on_message_publish"}, "pool": "pool1"}' \ + [...] + -e EMQX_BACKEND__REDIS__HOOK_MESSAGE__PUBLISH__13='{"topic": "persistent/topic13", "action": {"function": "on_message_publish"}, "pool": "pool1"}' \ + emqx:latest +``` + +### Cluster + +EMQX supports a variety of clustering methods, see our [documentation](https://www.emqx.io/docs/en/latest/deploy/cluster/intro.html) for details. + +Let's create a static node list cluster from docker-compose. + +- Create `docker-compose.yaml`: + +```yaml + version: '3' + + services: + emqx1: + image: emqx:latest + environment: + - "EMQX_NAME=emqx" + - "EMQX_HOST=node1.emqx.io" + - "EMQX_CLUSTER__DISCOVERY_STRATEGY=static" + - "EMQX_CLUSTER__STATIC__SEEDS=[emqx@node1.emqx.io, emqx@node2.emqx.io]" + networks: + emqx-bridge: + aliases: + - node1.emqx.io + + emqx2: + image: emqx:latest + environment: + - "EMQX_NAME=emqx" + - "EMQX_HOST=node2.emqx.io" + - "EMQX_CLUSTER__DISCOVERY_STRATEGY=static" + - "EMQX_CLUSTER__STATIC__SEEDS=[emqx@node1.emqx.io, emqx@node2.emqx.io]" + networks: + emqx-bridge: + aliases: + - node2.emqx.io + + networks: + emqx-bridge: + driver: bridge +``` + +- Start the docker-compose cluster + +```bash + docker-compose -p my_emqx up -d +``` + +- View cluster + +```bash + $ docker exec -it my_emqx_emqx1_1 sh -c "emqx_ctl cluster status" + Cluster status: #{running_nodes => ['emqx@node1.emqx.io','emqx@node2.emqx.io'], + stopped_nodes => []} +``` + +### Persistence + +If you want to persist the EMQX docker container, you need to keep the following directories: + +- `/opt/emqx/data` +- `/opt/emqx/etc` +- `/opt/emqx/log` + +Since data in these folders are partially stored under the `/opt/emqx/data/mnesia/${node_name}`, the user also needs to reuse the same node name to see the previous state. In detail, one needs to specify the two environment variables: `EMQX_NAME` and `EMQX_HOST`, `EMQX_HOST` set as `127.0.0.1` or network alias would be useful. + +In if you use docker-compose, the configuration would look something like this: + +```YAML +volumes: + vol-emqx-data: + name: foo-emqx-data + vol-emqx-etc: + name: foo-emqx-etc + vol-emqx-log: + name: foo-emqx-log + +services: + emqx: + image: emqx:latest + restart: always + environment: + EMQX_NAME: foo_emqx + EMQX_HOST: 127.0.0.1 + volumes: + - vol-emqx-data:/opt/emqx/data + - vol-emqx-etc:/opt/emqx/etc + - vol-emqx-log:/opt/emqx/log +``` + +### Kernel Tuning + +Under Linux host machine, the easiest way is [Tuning guide](https://www.emqx.io/docs/en/latest/deploy/tune.html). + +If you want tune Linux kernel by docker, you must ensure your docker is latest version (>=1.12). + +```bash +docker run -d --name emqx -p 18083:18083 -p 1883:1883 \ + --sysctl fs.file-max=2097152 \ + --sysctl fs.nr_open=2097152 \ + --sysctl net.core.somaxconn=32768 \ + --sysctl net.ipv4.tcp_max_syn_backlog=16384 \ + --sysctl net.core.netdev_max_backlog=16384 \ + --sysctl net.ipv4.ip_local_port_range=1000 65535 \ + --sysctl net.core.rmem_default=262144 \ + --sysctl net.core.wmem_default=262144 \ + --sysctl net.core.rmem_max=16777216 \ + --sysctl net.core.wmem_max=16777216 \ + --sysctl net.core.optmem_max=16777216 \ + --sysctl net.ipv4.tcp_rmem=1024 4096 16777216 \ + --sysctl net.ipv4.tcp_wmem=1024 4096 16777216 \ + --sysctl net.ipv4.tcp_max_tw_buckets=1048576 \ + --sysctl net.ipv4.tcp_fin_timeout=15 \ + emqx:latest +``` + +> REMEMBER: DO NOT RUN EMQX DOCKER PRIVILEGED OR MOUNT SYSTEM PROC IN CONTAINER TO TUNE LINUX KERNEL, IT IS UNSAFE. + +# License + +View [license information](https://github.com/emqx/emqx/blob/master/LICENSE) for the software contained in this image. + +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). + +Some additional license information which was able to be auto-detected might be found in [the `repo-info` repository's `emqx/` directory](https://github.com/docker-library/repo-info/tree/master/repos/emqx). + +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. diff --git a/emqx/content.md b/emqx/content.md new file mode 100644 index 000000000000..5c1f4b0a9541 --- /dev/null +++ b/emqx/content.md @@ -0,0 +1,307 @@ +# What is EMQX + +[EMQX](https://emqx.io/) is the world's most scalable open-source MQTT broker with a high performance that connects 100M+ IoT devices in 1 cluster, while maintaining 1M message per second throughput and sub-millisecond latency. + +EMQX supports multiple open standard protocols like MQTT, HTTP, QUIC, and WebSocket. It's 100% compliant with MQTT 5.0 and 3.x standard, and secures bi-directional communication with MQTT over TLS/SSL and various authentication mechanisms. + +With the built-in powerful SQL-based rules engine, EMQX can extract, filter, enrich and transform IoT data in real-time. In addition, it ensures high availability and horizontal scalability with a masterless distributed architecture, and provides ops-friendly user experience and great observability. + +EMQX boasts more than 20K+ enterprise users across 50+ countries and regions, connecting 100M+ IoT devices worldwide, and is trusted by over 400 customers in mission-critical scenarios of IoT, IIoT, connected vehicles, and more, including over 70 Fortune 500 companies like HPE, VMware, Verifone, SAIC Volkswagen, and Ericsson. + +%%LOGO%% + +# How to use this image + +### Run EMQX + +Execute some command under this docker image + +```console +$ docker run -d --name emqx %%IMAGE%%:${tag} +``` + +For example + +```console +$ docker run -d --name emqx -p 18083:18083 -p 1883:1883 %%IMAGE%%:latest +``` + +The EMQX broker runs as Linux user `emqx` in the docker container. + +### Configuration + +Use the environment variable to configure the EMQX docker container. + +By default, the environment variables with `EMQX_` prefix are mapped to key-value pairs in configuration files. + +You can change the prefix by overriding `HOCON_ENV_OVERRIDE_PREFIX`. + +Example: + +```bash +EMQX_LISTENERS__SSL__DEFAULT__ACCEPTORS <--> listeners.ssl.default.acceptors +EMQX_ZONES__DEFAULT__MQTT__MAX_PACKET_SIZE <--> zones.default.mqtt.max_packet_size +``` + +- Prefix `EMQX_` is removed +- All upper case letters is replaced with lower case letters +- `__` is replaced with `.` + +If `HOCON_ENV_OVERRIDE_PREFIX=DEV_` is set: + +```bash +DEV_LISTENER__SSL__EXTERNAL__ACCEPTORS <--> listener.ssl.external.acceptors +DEV_MQTT__MAX_PACKET_SIZE <--> mqtt.max_packet_size +``` + +Non mapped environment variables: + +```bash +EMQX_NAME +EMQX_HOST +``` + +These environment variables will ignore for configuration file. + +#### EMQX Configuration + +> NOTE: All EMQX Configuration in [`etc/emqx.conf`](https://github.com/emqx/emqx/blob/master/apps/emqx/etc/emqx.conf) can be configured via environment variables. The following list is just an example, not a complete configuration. + +| Options | Default | Mapped | Description | +|-------------|----------------|--------|----------------------------| +| `EMQX_NAME` | container name | none | EMQX node short name | +| `EMQX_HOST` | container IP | none | EMQX node host, IP or FQDN | + +The list is incomplete and may be changed with [`etc/emqx.conf`](https://github.com/emqx/emqx/blob/master/apps/emqx/etc/emqx.conf) and plugin configuration files. But the mapping rule is similar. + +If set `EMQX_NAME` and `EMQX_HOST`, and unset `EMQX_NODE_NAME`, `EMQX_NODE_NAME=$EMQX_NAME@$EMQX_HOST`. + +For example, set MQTT TCP port to 1883 + +```console +$ docker run -d --name emqx -e EMQX__LISTENERS__TCP__DEFAULT__BIND=1883 -p 18083:18083 -p 1883:1883 %%IMAGE%%:latest +``` + +#### EMQX Loaded Modules Configuration + +| Options | Default | Description | +|-----------------------|-------------------|-----------------------------| +| `EMQX_LOADED_MODULES` | see content below | default EMQX loaded modules | + +Default environment variable `EMQX_LOADED_MODULES`, including + +- `emqx_mod_presence` + +```bash +# The default EMQX_LOADED_MODULES env +EMQX_LOADED_MODULES="emqx_mod_presence" +``` + +For example, set `EMQX_LOADED_MODULES=emqx_mod_delayed,emqx_mod_rewrite` to load these two modules. + +You can use comma, space or other separator that you want. + +All the modules defined in env `EMQX_LOADED_MODULES` will be loaded. + +```bash +EMQX_LOADED_MODULES="emqx_mod_delayed,emqx_mod_rewrite" +EMQX_LOADED_MODULES="emqx_mod_delayed emqx_mod_rewrite" +EMQX_LOADED_MODULES="emqx_mod_delayed | emqx_mod_rewrite" +``` + +#### EMQX Loaded Plugins Configuration + +| Options | Default | Description | +|-----------------------|-------------------|-----------------------------| +| `EMQX_LOADED_PLUGINS` | see content below | default EMQX loaded plugins | + +Default environment variable `EMQX_LOADED_PLUGINS`, including + +- `emqx_recon` +- `emqx_retainer` +- `emqx_rule_engine` +- `emqx_management` +- `emqx_dashboard` + +```bash +# The default EMQX_LOADED_PLUGINS env +EMQX_LOADED_PLUGINS="emqx_recon,emqx_retainer,emqx_management,emqx_dashboard" +``` + +For example, set `EMQX_LOADED_PLUGINS= emqx_retainer,emqx_rule_engine` to load these two plugins. + +You can use comma, space or other separator that you want. + +All the plugins defined in `EMQX_LOADED_PLUGINS` will be loaded. + +```bash +EMQX_LOADED_PLUGINS="emqx_retainer,emqx_rule_engine" +EMQX_LOADED_PLUGINS="emqx_retainer emqx_rule_engine" +EMQX_LOADED_PLUGINS="emqx_retainer | emqx_rule_engine" +``` + +#### EMQX Plugins Configuration + +The environment variables which with `EMQX_` prefix are mapped to all EMQX plugins' configuration file, `.` get replaced by `__`. + +Example: + +```bash +EMQX_RETAINER__STORAGE_TYPE <--> retainer.storage_type +EMQX_RETAINER__MAX_PAYLOAD_SIZE <--> retainer.max_payload_size +``` + +Don't worry about where to find the configuration file of EMQX plugins, this docker image will find and configure them automatically using some magic. + +All EMQX plugins can be configured this way, following the environment variables mapping rule above. + +Assume you are using Redis auth plugin, for example: + +```bash +#EMQX_RETAINER__STORAGE_TYPE = "ram" +#EMQX_RETAINER.MAX_PAYLOAD_SIZE = 1MB + +docker run -d --name emqx -p 18083:18083 -p 1883:1883 \ + -e EMQX_LISTENERS__TCP__DEFAULT=1883 \ + -e EMQX_LOADED_PLUGINS="emqx_retainer" \ + -e EMQX_RETAINER__STORAGE_TYPE = "ram" \ + -e EMQX_RETAINER__MAX_PAYLOAD_SIZE = 1MB \ + %%IMAGE%%:latest +``` + +For numbered configuration options where the number is next to a `.` such as: + +- backend.redis.pool1.server +- backend.redis.hook.message.publish.1 + +You can configure an arbitrary number of them as long as each has a unique number for its own configuration option: + +```bash +docker run -d --name emqx -p 18083:18083 -p 1883:1883 -p 4369:4369 \ + -e EMQX_BACKEND_REDIS_POOL1__SERVER=127.0.0.1:6379 \ + [...] + -e EMQX_BACKEND__REDIS__POOL5__SERVER=127.0.0.5:6379 \ + -e EMQX_BACKEND__REDIS__HOOK_MESSAGE__PUBLISH__1='{"topic": "persistent/topic1", "action": {"function": "on_message_publish"}, "pool": "pool1"}' \ + -e EMQX_BACKEND__REDIS__HOOK_MESSAGE__PUBLISH__2='{"topic": "persistent/topic2", "action": {"function": "on_message_publish"}, "pool": "pool1"}' \ + -e EMQX_BACKEND__REDIS__HOOK_MESSAGE__PUBLISH__3='{"topic": "persistent/topic3", "action": {"function": "on_message_publish"}, "pool": "pool1"}' \ + [...] + -e EMQX_BACKEND__REDIS__HOOK_MESSAGE__PUBLISH__13='{"topic": "persistent/topic13", "action": {"function": "on_message_publish"}, "pool": "pool1"}' \ + %%IMAGE%%:latest +``` + +### Cluster + +EMQX supports a variety of clustering methods, see our [documentation](https://www.emqx.io/docs/en/latest/deploy/cluster/intro.html) for details. + +Let's create a static node list cluster from docker-compose. + +- Create `docker-compose.yaml`: + +```yaml + version: '3' + + services: + emqx1: + image: %%IMAGE%%:latest + environment: + - "EMQX_NAME=emqx" + - "EMQX_HOST=node1.emqx.io" + - "EMQX_CLUSTER__DISCOVERY_STRATEGY=static" + - "EMQX_CLUSTER__STATIC__SEEDS=[emqx@node1.emqx.io, emqx@node2.emqx.io]" + networks: + emqx-bridge: + aliases: + - node1.emqx.io + + emqx2: + image: %%IMAGE%%:latest + environment: + - "EMQX_NAME=emqx" + - "EMQX_HOST=node2.emqx.io" + - "EMQX_CLUSTER__DISCOVERY_STRATEGY=static" + - "EMQX_CLUSTER__STATIC__SEEDS=[emqx@node1.emqx.io, emqx@node2.emqx.io]" + networks: + emqx-bridge: + aliases: + - node2.emqx.io + + networks: + emqx-bridge: + driver: bridge +``` + +- Start the docker-compose cluster + +```bash + docker-compose -p my_emqx up -d +``` + +- View cluster + +```bash + $ docker exec -it my_emqx_emqx1_1 sh -c "emqx_ctl cluster status" + Cluster status: #{running_nodes => ['emqx@node1.emqx.io','emqx@node2.emqx.io'], + stopped_nodes => []} +``` + +### Persistence + +If you want to persist the EMQX docker container, you need to keep the following directories: + +- `/opt/emqx/data` +- `/opt/emqx/etc` +- `/opt/emqx/log` + +Since data in these folders are partially stored under the `/opt/emqx/data/mnesia/${node_name}`, the user also needs to reuse the same node name to see the previous state. In detail, one needs to specify the two environment variables: `EMQX_NAME` and `EMQX_HOST`, `EMQX_HOST` set as `127.0.0.1` or network alias would be useful. + +In if you use docker-compose, the configuration would look something like this: + +```YAML +volumes: + vol-emqx-data: + name: foo-emqx-data + vol-emqx-etc: + name: foo-emqx-etc + vol-emqx-log: + name: foo-emqx-log + +services: + emqx: + image: %%IMAGE%%:latest + restart: always + environment: + EMQX_NAME: foo_emqx + EMQX_HOST: 127.0.0.1 + volumes: + - vol-emqx-data:/opt/emqx/data + - vol-emqx-etc:/opt/emqx/etc + - vol-emqx-log:/opt/emqx/log +``` + +### Kernel Tuning + +Under Linux host machine, the easiest way is [Tuning guide](https://www.emqx.io/docs/en/latest/deploy/tune.html). + +If you want tune Linux kernel by docker, you must ensure your docker is latest version (>=1.12). + +```bash +docker run -d --name emqx -p 18083:18083 -p 1883:1883 \ + --sysctl fs.file-max=2097152 \ + --sysctl fs.nr_open=2097152 \ + --sysctl net.core.somaxconn=32768 \ + --sysctl net.ipv4.tcp_max_syn_backlog=16384 \ + --sysctl net.core.netdev_max_backlog=16384 \ + --sysctl net.ipv4.ip_local_port_range=1000 65535 \ + --sysctl net.core.rmem_default=262144 \ + --sysctl net.core.wmem_default=262144 \ + --sysctl net.core.rmem_max=16777216 \ + --sysctl net.core.wmem_max=16777216 \ + --sysctl net.core.optmem_max=16777216 \ + --sysctl net.ipv4.tcp_rmem=1024 4096 16777216 \ + --sysctl net.ipv4.tcp_wmem=1024 4096 16777216 \ + --sysctl net.ipv4.tcp_max_tw_buckets=1048576 \ + --sysctl net.ipv4.tcp_fin_timeout=15 \ + %%IMAGE%%:latest +``` + +> REMEMBER: DO NOT RUN EMQX DOCKER PRIVILEGED OR MOUNT SYSTEM PROC IN CONTAINER TO TUNE LINUX KERNEL, IT IS UNSAFE. diff --git a/emqx/get-help.md b/emqx/get-help.md new file mode 100644 index 000000000000..292cfb37c380 --- /dev/null +++ b/emqx/get-help.md @@ -0,0 +1 @@ +[Discussions](https://github.com/emqx/emqx/discussions) or [Discord](https://discord.gg/xYGf3fQnES) diff --git a/emqx/github-repo b/emqx/github-repo new file mode 100644 index 000000000000..c225c8ed2658 --- /dev/null +++ b/emqx/github-repo @@ -0,0 +1 @@ +https://github.com/emqx/emqx-docker diff --git a/emqx/license.md b/emqx/license.md new file mode 100644 index 000000000000..e2a94a5f02ba --- /dev/null +++ b/emqx/license.md @@ -0,0 +1 @@ +View [license information](https://github.com/emqx/emqx/blob/master/LICENSE) for the software contained in this image. diff --git a/emqx/logo.svg b/emqx/logo.svg new file mode 100644 index 000000000000..60f452a87765 --- /dev/null +++ b/emqx/logo.svg @@ -0,0 +1,14 @@ + + + 320备份 + + + + + + + + + + + \ No newline at end of file diff --git a/emqx/maintainer.md b/emqx/maintainer.md new file mode 100644 index 000000000000..3faa249415e0 --- /dev/null +++ b/emqx/maintainer.md @@ -0,0 +1 @@ +[EMQ Technologies](https://github.com/emqx) diff --git a/erlang/README.md b/erlang/README.md index 203df3f1c224..049d3f494e3d 100644 --- a/erlang/README.md +++ b/erlang/README.md @@ -20,26 +20,26 @@ WARNING: [the Docker Community](https://github.com/erlang/docker-erlang-otp) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`23.0`, `23`, `latest`](https://github.com/erlang/docker-erlang-otp/blob/5792e5865314ba4bfc9d5e41526f321ce6bea690/23/Dockerfile) -- [`23.0-slim`, `23-slim`, `slim`](https://github.com/erlang/docker-erlang-otp/blob/5792e5865314ba4bfc9d5e41526f321ce6bea690/23/slim/Dockerfile) -- [`23.0-alpine`, `23-alpine`, `alpine`](https://github.com/erlang/docker-erlang-otp/blob/5792e5865314ba4bfc9d5e41526f321ce6bea690/23/alpine/Dockerfile) -- [`22.3.4`, `22.3`, `22`](https://github.com/erlang/docker-erlang-otp/blob/93b423b5fdb067b7fc951cb8da8011a24daf3729/22/Dockerfile) -- [`22.3.4-slim`, `22.3-slim`, `22-slim`](https://github.com/erlang/docker-erlang-otp/blob/93b423b5fdb067b7fc951cb8da8011a24daf3729/22/slim/Dockerfile) -- [`22.3.4-alpine`, `22.3-alpine`, `22-alpine`](https://github.com/erlang/docker-erlang-otp/blob/93b423b5fdb067b7fc951cb8da8011a24daf3729/22/alpine/Dockerfile) -- [`21.3.8.15`, `21.3.8`, `21.3`, `21`](https://github.com/erlang/docker-erlang-otp/blob/75e255874efbf06d2543b9dad2f63e43f98051eb/21/Dockerfile) -- [`21.3.8.15-slim`, `21.3.8-slim`, `21.3-slim`, `21-slim`](https://github.com/erlang/docker-erlang-otp/blob/75e255874efbf06d2543b9dad2f63e43f98051eb/21/slim/Dockerfile) -- [`21.3.8.15-alpine`, `21.3.8-alpine`, `21.3-alpine`, `21-alpine`](https://github.com/erlang/docker-erlang-otp/blob/75e255874efbf06d2543b9dad2f63e43f98051eb/21/alpine/Dockerfile) -- [`20.3.8.26`, `20.3.8`, `20.3`, `20`](https://github.com/erlang/docker-erlang-otp/blob/b06bf8de34e693b3698f3a22e8ff864dc320b380/20/Dockerfile) -- [`20.3.8.26-slim`, `20.3.8-slim`, `20.3-slim`, `20-slim`](https://github.com/erlang/docker-erlang-otp/blob/b06bf8de34e693b3698f3a22e8ff864dc320b380/20/slim/Dockerfile) -- [`20.3.8.26-alpine`, `20.3.8-alpine`, `20.3-alpine`, `20-alpine`](https://github.com/erlang/docker-erlang-otp/blob/b06bf8de34e693b3698f3a22e8ff864dc320b380/20/alpine/Dockerfile) -- [`19.3.6.13`, `19.3.6`, `19.3`, `19`](https://github.com/erlang/docker-erlang-otp/blob/e91894d9d9c3651382834b77978a05fa057338fb/19/Dockerfile) -- [`19.3.6.13-slim`, `19.3.6-slim`, `19.3-slim`, `19-slim`](https://github.com/erlang/docker-erlang-otp/blob/e91894d9d9c3651382834b77978a05fa057338fb/19/slim/Dockerfile) -- [`18.3.4.11`, `18.3.4`, `18.3`, `18`](https://github.com/erlang/docker-erlang-otp/blob/e91894d9d9c3651382834b77978a05fa057338fb/18/Dockerfile) -- [`18.3.4.11-slim`, `18.3.4-slim`, `18.3-slim`, `18-slim`](https://github.com/erlang/docker-erlang-otp/blob/e91894d9d9c3651382834b77978a05fa057338fb/18/slim/Dockerfile) +- [`25.2.0.0`, `25.2.0`, `25.2`, `25`, `latest`](https://github.com/erlang/docker-erlang-otp/blob/e9ce9f226c50a8cf186258d9f571f24dd4096bbf/25/Dockerfile) +- [`25.2.0.0-slim`, `25.2.0-slim`, `25.2-slim`, `25-slim`, `slim`](https://github.com/erlang/docker-erlang-otp/blob/e9ce9f226c50a8cf186258d9f571f24dd4096bbf/25/slim/Dockerfile) +- [`25.2.0.0-alpine`, `25.2.0-alpine`, `25.2-alpine`, `25-alpine`, `alpine`](https://github.com/erlang/docker-erlang-otp/blob/e9ce9f226c50a8cf186258d9f571f24dd4096bbf/25/alpine/Dockerfile) +- [`24.3.4.6`, `24.3.4`, `24.3`, `24`](https://github.com/erlang/docker-erlang-otp/blob/ae880ebdea91a9a7ce87634f8750526d3ee3a851/24/Dockerfile) +- [`24.3.4.6-slim`, `24.3.4-slim`, `24.3-slim`, `24-slim`](https://github.com/erlang/docker-erlang-otp/blob/ae880ebdea91a9a7ce87634f8750526d3ee3a851/24/slim/Dockerfile) +- [`24.3.4.6-alpine`, `24.3.4-alpine`, `24.3-alpine`, `24-alpine`](https://github.com/erlang/docker-erlang-otp/blob/ae880ebdea91a9a7ce87634f8750526d3ee3a851/24/alpine/Dockerfile) +- [`23.3.4.18`, `23.3.4`, `23.3`, `23`](https://github.com/erlang/docker-erlang-otp/blob/ba3db36fd4ce972f32c91d9043dc2acb5a07063f/23/Dockerfile) +- [`23.3.4.18-slim`, `23.3.4-slim`, `23.3-slim`, `23-slim`](https://github.com/erlang/docker-erlang-otp/blob/ba3db36fd4ce972f32c91d9043dc2acb5a07063f/23/slim/Dockerfile) +- [`23.3.4.18-alpine`, `23.3.4-alpine`, `23.3-alpine`, `23-alpine`](https://github.com/erlang/docker-erlang-otp/blob/ba3db36fd4ce972f32c91d9043dc2acb5a07063f/23/alpine/Dockerfile) +- [`22.3.4.26`, `22.3.4`, `22.3`, `22`](https://github.com/erlang/docker-erlang-otp/blob/65d8b721f96b98d2daa032cd7431ff64d5e8154a/22/Dockerfile) +- [`22.3.4.26-slim`, `22.3.4-slim`, `22.3-slim`, `22-slim`](https://github.com/erlang/docker-erlang-otp/blob/65d8b721f96b98d2daa032cd7431ff64d5e8154a/22/slim/Dockerfile) +- [`22.3.4.26-alpine`, `22.3.4-alpine`, `22.3-alpine`, `22-alpine`](https://github.com/erlang/docker-erlang-otp/blob/65d8b721f96b98d2daa032cd7431ff64d5e8154a/22/alpine/Dockerfile) +- [`21.3.8.24`, `21.3.8`, `21.3`, `21`](https://github.com/erlang/docker-erlang-otp/blob/fd21a3bf876b240b413d2cd4543d832dca466c5c/21/Dockerfile) +- [`21.3.8.24-slim`, `21.3.8-slim`, `21.3-slim`, `21-slim`](https://github.com/erlang/docker-erlang-otp/blob/fd21a3bf876b240b413d2cd4543d832dca466c5c/21/slim/Dockerfile) +- [`20.3.8.26`, `20.3.8`, `20.3`, `20`](https://github.com/erlang/docker-erlang-otp/blob/fd21a3bf876b240b413d2cd4543d832dca466c5c/20/Dockerfile) +- [`20.3.8.26-slim`, `20.3.8-slim`, `20.3-slim`, `20-slim`](https://github.com/erlang/docker-erlang-otp/blob/fd21a3bf876b240b413d2cd4543d832dca466c5c/20/slim/Dockerfile) # Quick reference (cont.) @@ -47,14 +47,14 @@ WARNING: [https://github.com/erlang/docker-erlang-otp/issues](https://github.com/erlang/docker-erlang-otp/issues) - **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) - [`amd64`](https://hub.docker.com/r/amd64/erlang/), [`arm32v7`](https://hub.docker.com/r/arm32v7/erlang/), [`arm64v8`](https://hub.docker.com/r/arm64v8/erlang/), [`i386`](https://hub.docker.com/r/i386/erlang/), [`ppc64le`](https://hub.docker.com/r/ppc64le/erlang/), [`s390x`](https://hub.docker.com/r/s390x/erlang/) + [`amd64`](https://hub.docker.com/r/amd64/erlang/), [`arm32v5`](https://hub.docker.com/r/arm32v5/erlang/), [`arm32v7`](https://hub.docker.com/r/arm32v7/erlang/), [`arm64v8`](https://hub.docker.com/r/arm64v8/erlang/), [`i386`](https://hub.docker.com/r/i386/erlang/), [`mips64le`](https://hub.docker.com/r/mips64le/erlang/), [`ppc64le`](https://hub.docker.com/r/ppc64le/erlang/), [`s390x`](https://hub.docker.com/r/s390x/erlang/) - **Published image artifact details**: [repo-info repo's `repos/erlang/` directory](https://github.com/docker-library/repo-info/blob/master/repos/erlang) ([history](https://github.com/docker-library/repo-info/commits/master/repos/erlang)) (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/erlang`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Ferlang) + [official-images repo's `library/erlang` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Ferlang) [official-images repo's `library/erlang` file](https://github.com/docker-library/official-images/blob/master/library/erlang) ([history](https://github.com/docker-library/official-images/commits/master/library/erlang)) - **Source of this description**: @@ -125,9 +125,9 @@ This image does not contain the common packages contained in the default tag and ## `erlang:-alpine` -This image is based on the popular [Alpine Linux project](http://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. +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. -This variant is highly recommended when final image size being as small as possible is desired. The main caveat to note is that it does use [musl libc](http://www.musl-libc.org) instead of [glibc and friends](http://www.etalabs.net/compare_libcs.html), so certain software might run into issues depending on the depth of their libc requirements. However, most software doesn't have an issue with this, so this variant is usually a very safe choice. 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. +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. 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). diff --git a/euleros/README-short.txt b/euleros/README-short.txt deleted file mode 100644 index 45a1862c08e5..000000000000 --- a/euleros/README-short.txt +++ /dev/null @@ -1 +0,0 @@ -The official release of EulerOS. diff --git a/euleros/README.md b/euleros/README.md deleted file mode 100644 index 9ee88660fc1c..000000000000 --- a/euleros/README.md +++ /dev/null @@ -1,79 +0,0 @@ - - -# Quick reference - -- **Maintained by**: - [The EulerOS Project](https://github.com/euleros/euleros-docker-images) - -- **Where to get help**: - [the EulerOS Community Forums](http://developer.huawei.com/ict/forum/forum.php?mod=forumdisplay&fid=400257&page=) or 8x5 Comprehensive Support 400 8828 000 - -# Supported tags and respective `Dockerfile` links - -- [`2.3.1809`, `latest`](https://github.com/euleros/euleros-docker-images/blob/db22e2c392c3922d2c674110c90667576618f348/2.3.1809/x86_64/Dockerfile) -- [`2.3.1806`](https://github.com/euleros/euleros-docker-images/blob/e304245f74141e6e856a017c8d204c27300c1da8/2.3.1806/x86_64/Dockerfile) -- [`2.3.1803`](https://github.com/euleros/euleros-docker-images/blob/5afd15edcd49671adefb6dff87537f2943ae1107/2.3.1803/x86_64/Dockerfile) -- [`2.2`](https://github.com/euleros/euleros-docker-images/blob/959f378638f222bd1eebe8dccf267cccbc118174/2.2/Dockerfile) - -# Quick reference (cont.) - -- **Where to file issues**: - [https://github.com/euleros/euleros-docker-images/issues](https://github.com/euleros/euleros-docker-images/issues) - -- **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) - [`amd64`](https://hub.docker.com/r/amd64/euleros/), [`arm64v8`](https://hub.docker.com/r/arm64v8/euleros/) - -- **Published image artifact details**: - [repo-info repo's `repos/euleros/` directory](https://github.com/docker-library/repo-info/blob/master/repos/euleros) ([history](https://github.com/docker-library/repo-info/commits/master/repos/euleros)) - (image metadata, transfer size, etc) - -- **Image updates**: - [official-images PRs with label `library/euleros`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Feuleros) - [official-images repo's `library/euleros` file](https://github.com/docker-library/official-images/blob/master/library/euleros) ([history](https://github.com/docker-library/official-images/commits/master/library/euleros)) - -- **Source of this description**: - [docs repo's `euleros/` directory](https://github.com/docker-library/docs/tree/master/euleros) ([history](https://github.com/docker-library/docs/commits/master/euleros)) - -![logo](https://raw.githubusercontent.com/docker-library/docs/67335f712632d352c94de4beeff0120d7c68168c/euleros/logo.png) - -# EulerOS - -EulerOS provides enhanced security, compatibility and easy-to-use features along with high reliability. It meets the increasing requirements of Linux OS in enterprise applications and provides a compelling choice of open IT platform for users. EulerOS integrates the advanced Linux technologies, delivers more value to enterprise users in terms of high capability, stability, usability and expansibility. And it helps you reallocate resources from maintaining the status quo to tackling new challenges. - -## Operating System - -Linux/Unix, Other V2.0 - -## High Lights - -- Extreme Security: EulerOS is one of the most secure operating systems available, which provides variety of security technologies to prevent intrusions and protect your system. -- Carrier-class Reliability, Availability and Serviceability: EulerOS customers are able to provide carrier-class ultra-long-term reliability and stability to their users. -- High Performance: EulerOS has done a lot of optimization in the compilation, virtual memory, CPU scheduling, IO drive, network and file system and so on. - -## Resources - -[Administrators Guide](http://developer.huawei.com/ict/en/doc/site-euleros-administrators-guide-en/index.html/en-us) - -# License - -View [license information](https://github.com/euleros/euleros-docker-images/blob/master/LICENSE) for the software contained in this image and [EULA](http://developer.huawei.com/ict/en/site-euleros/article/privacy-policy) for the end user license agreement. - -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). - -Some additional license information which was able to be auto-detected might be found in [the `repo-info` repository's `euleros/` directory](https://github.com/docker-library/repo-info/tree/master/repos/euleros). - -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. diff --git a/euleros/content.md b/euleros/content.md deleted file mode 100644 index b1265f22d796..000000000000 --- a/euleros/content.md +++ /dev/null @@ -1,19 +0,0 @@ -%%LOGO%% - -# EulerOS - -EulerOS provides enhanced security, compatibility and easy-to-use features along with high reliability. It meets the increasing requirements of Linux OS in enterprise applications and provides a compelling choice of open IT platform for users. EulerOS integrates the advanced Linux technologies, delivers more value to enterprise users in terms of high capability, stability, usability and expansibility. And it helps you reallocate resources from maintaining the status quo to tackling new challenges. - -## Operating System - -Linux/Unix, Other V2.0 - -## High Lights - -- Extreme Security: EulerOS is one of the most secure operating systems available, which provides variety of security technologies to prevent intrusions and protect your system. -- Carrier-class Reliability, Availability and Serviceability: EulerOS customers are able to provide carrier-class ultra-long-term reliability and stability to their users. -- High Performance: EulerOS has done a lot of optimization in the compilation, virtual memory, CPU scheduling, IO drive, network and file system and so on. - -## Resources - -[Administrators Guide](http://developer.huawei.com/ict/en/doc/site-euleros-administrators-guide-en/index.html/en-us) diff --git a/euleros/get-help.md b/euleros/get-help.md deleted file mode 100644 index edcbc4dbe488..000000000000 --- a/euleros/get-help.md +++ /dev/null @@ -1 +0,0 @@ -[the EulerOS Community Forums](http://developer.huawei.com/ict/forum/forum.php?mod=forumdisplay&fid=400257&page=) or 8x5 Comprehensive Support 400 8828 000 diff --git a/euleros/github-repo b/euleros/github-repo deleted file mode 100644 index 480f19c59154..000000000000 --- a/euleros/github-repo +++ /dev/null @@ -1 +0,0 @@ -https://github.com/euleros/euleros-docker-images diff --git a/euleros/license.md b/euleros/license.md deleted file mode 100644 index f630c348b6b9..000000000000 --- a/euleros/license.md +++ /dev/null @@ -1 +0,0 @@ -View [license information](https://github.com/euleros/euleros-docker-images/blob/master/LICENSE) for the software contained in this image and [EULA](http://developer.huawei.com/ict/en/site-euleros/article/privacy-policy) for the end user license agreement. diff --git a/euleros/logo.png b/euleros/logo.png deleted file mode 100644 index 18ff6bfa2887047feaea4dda7d0d7c7de3bfe42d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3431 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 +# **DEPRECATION NOTICE** + +This project is no longer maintained. Read [here](https://github.com/ExpressGateway/express-gateway/issues/1011#issuecomment-748354599) for more details or if you're interested in taking over the project. + # Quick reference - **Maintained by**: [the Express Gateway Team](https://github.com/ExpressGateway/express-gateway) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`1.x`, `1.16.x`, `1.16.10`, `latest`](https://github.com/ExpressGateway/docker-express-gateway/blob/704432298a3b9a99de87fcb19b33962e6995b7a3/alpine/Dockerfile) +- [`1.x`, `1.16.x`, `1.16.11`, `latest`](https://github.com/ExpressGateway/docker-express-gateway/blob/fa2707c3b24bbd99710a100d7859566fa28817b8/alpine/Dockerfile) # Quick reference (cont.) @@ -32,14 +36,14 @@ WARNING: [https://github.com/ExpressGateway/express-gateway/issues](https://github.com/ExpressGateway/express-gateway/issues) - **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) - [`amd64`](https://hub.docker.com/r/amd64/express-gateway/), [`arm64v8`](https://hub.docker.com/r/arm64v8/express-gateway/), [`i386`](https://hub.docker.com/r/i386/express-gateway/), [`ppc64le`](https://hub.docker.com/r/ppc64le/express-gateway/), [`s390x`](https://hub.docker.com/r/s390x/express-gateway/) + [`amd64`](https://hub.docker.com/r/amd64/express-gateway/), [`arm64v8`](https://hub.docker.com/r/arm64v8/express-gateway/), [`ppc64le`](https://hub.docker.com/r/ppc64le/express-gateway/), [`s390x`](https://hub.docker.com/r/s390x/express-gateway/) - **Published image artifact details**: [repo-info repo's `repos/express-gateway/` directory](https://github.com/docker-library/repo-info/blob/master/repos/express-gateway) ([history](https://github.com/docker-library/repo-info/commits/master/repos/express-gateway)) (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/express-gateway`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fexpress-gateway) + [official-images repo's `library/express-gateway` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fexpress-gateway) [official-images repo's `library/express-gateway` file](https://github.com/docker-library/official-images/blob/master/library/express-gateway) ([history](https://github.com/docker-library/official-images/commits/master/library/express-gateway)) - **Source of this description**: diff --git a/express-gateway/deprecated.md b/express-gateway/deprecated.md new file mode 100644 index 000000000000..9a16fcc9850c --- /dev/null +++ b/express-gateway/deprecated.md @@ -0,0 +1 @@ +This project is no longer maintained. Read [here](https://github.com/ExpressGateway/express-gateway/issues/1011#issuecomment-748354599) for more details or if you're interested in taking over the project. diff --git a/fedora/README.md b/fedora/README.md index 6b68bd4fdf5e..ccdf4896f1c9 100644 --- a/fedora/README.md +++ b/fedora/README.md @@ -20,33 +20,29 @@ WARNING: [Fedora Release Engineering](https://github.com/fedora-cloud/docker-brew-fedora) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`26`](https://github.com/fedora-cloud/docker-brew-fedora/blob/035aa2a3970e4e10a9a6ae0b79322b882bfe50d3/x86_64/Dockerfile) -- [`27`](https://github.com/fedora-cloud/docker-brew-fedora/blob/e1796b2753d5a5731de5915661e4639c4342b950/x86_64/Dockerfile) -- [`28`](https://github.com/fedora-cloud/docker-brew-fedora/blob/aa106da2be30656a7ccb32b96f6788031ce8656f/x86_64/Dockerfile) -- [`29`](https://github.com/fedora-cloud/docker-brew-fedora/blob/4dbc2ccd3b4d52258981eaf12043025054d53023/x86_64/Dockerfile) -- [`30`](https://github.com/fedora-cloud/docker-brew-fedora/blob/ec092e1e4679f955d142b91f85ecd30a4f14a6ed/x86_64/Dockerfile) -- [`latest`, `31`](https://github.com/fedora-cloud/docker-brew-fedora/blob/dfd9c5c8cb3b98de83f697446ad5885df1476d73/x86_64/Dockerfile) -- [`32`](https://github.com/fedora-cloud/docker-brew-fedora/blob/d44f7abdc99edb550771c154ab81ce8f12e11172/x86_64/Dockerfile) -- [`rawhide`, `33`](https://github.com/fedora-cloud/docker-brew-fedora/blob/54c8f0cfa2dcedcd2165fecb101e9e4ba9c2c499/x86_64/Dockerfile) +- [`35`](https://github.com/fedora-cloud/docker-brew-fedora/blob/493d6eda2434bfdac64d61016aa6b9dc33cf4bc5/x86_64/Dockerfile) +- [`36`](https://github.com/fedora-cloud/docker-brew-fedora/blob/6c310b8b652eb03e5e895b0d47a6d1fde84d5e26/x86_64/Dockerfile) +- [`37`, `latest`](https://github.com/fedora-cloud/docker-brew-fedora/blob/1853328a811b98a580c4d3ca50d10cd788ba9d64/x86_64/Dockerfile) +- [`38`, `rawhide`](https://github.com/fedora-cloud/docker-brew-fedora/blob/e7136a4190768fa604776d6535269a6b52189a4c/x86_64/Dockerfile) # Quick reference (cont.) - **Where to file issues**: - [Fedora's bugzilla page](https://bugzilla.redhat.com/enter_bug.cgi?product=Fedora) (choose `docker` as component and include details about image problems in the description) or [GitHub](https://github.com/fedora-cloud/docker-brew-fedora/issues) + [Fedora's bugzilla page](https://bugzilla.redhat.com/enter_bug.cgi?product=Fedora%20Container%20Images) or [GitHub](https://github.com/fedora-cloud/docker-brew-fedora/issues) - **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) - [`amd64`](https://hub.docker.com/r/amd64/fedora/), [`arm32v7`](https://hub.docker.com/r/arm32v7/fedora/), [`arm64v8`](https://hub.docker.com/r/arm64v8/fedora/), [`ppc64le`](https://hub.docker.com/r/ppc64le/fedora/), [`s390x`](https://hub.docker.com/r/s390x/fedora/) + [`amd64`](https://hub.docker.com/r/amd64/fedora/), [`arm64v8`](https://hub.docker.com/r/arm64v8/fedora/), [`ppc64le`](https://hub.docker.com/r/ppc64le/fedora/), [`s390x`](https://hub.docker.com/r/s390x/fedora/) - **Published image artifact details**: [repo-info repo's `repos/fedora/` directory](https://github.com/docker-library/repo-info/blob/master/repos/fedora) ([history](https://github.com/docker-library/repo-info/commits/master/repos/fedora)) (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/fedora`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Ffedora) + [official-images repo's `library/fedora` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Ffedora) [official-images repo's `library/fedora` file](https://github.com/docker-library/official-images/blob/master/library/fedora) ([history](https://github.com/docker-library/official-images/commits/master/library/fedora)) - **Source of this description**: @@ -56,11 +52,11 @@ WARNING: This image serves as the `official Fedora image` for the [Fedora Distribution](https://getfedora.org/). -![logo](https://raw.githubusercontent.com/docker-library/docs/b449be7df57e9ed9086bb5821bfb5d6cdc5d67a4/fedora/logo.png) +![logo](https://raw.githubusercontent.com/docker-library/docs/7925a7131128930eed07077f9369b7ca52e0fd02/fedora/logo.png) The `fedora:latest` tag will always point to the latest stable release. -This image is a relatively small footprint in comparison to a standard Fedora installation. This image is generated in the [Fedora Build System](http://koji.fedoraproject.org/koji/) and is built from [this kickstart file](https://pagure.io/fedora-kickstarts/blob/master/f/fedora-container-base.ks). +This image is a relatively small footprint in comparison to a standard Fedora installation. This image is generated in the [Fedora Build System](http://koji.fedoraproject.org/koji/) and is built from [this kickstart file](https://pagure.io/fedora-kickstarts/blob/main/f/fedora-container-base.ks). [Fedora Rawhide](https://fedoraproject.org/wiki/Releases/Rawhide) is available via `fedora:rawhide` and any specific version of Fedora as `fedora:$version` (example: `fedora:23`). diff --git a/fedora/content.md b/fedora/content.md index 3bbdd859c365..10eccce893d2 100644 --- a/fedora/content.md +++ b/fedora/content.md @@ -6,6 +6,6 @@ This image serves as the `official Fedora image` for the [Fedora Distribution](h The `%%IMAGE%%:latest` tag will always point to the latest stable release. -This image is a relatively small footprint in comparison to a standard Fedora installation. This image is generated in the [Fedora Build System](http://koji.fedoraproject.org/koji/) and is built from [this kickstart file](https://pagure.io/fedora-kickstarts/blob/master/f/fedora-container-base.ks). +This image is a relatively small footprint in comparison to a standard Fedora installation. This image is generated in the [Fedora Build System](http://koji.fedoraproject.org/koji/) and is built from [this kickstart file](https://pagure.io/fedora-kickstarts/blob/main/f/fedora-container-base.ks). [Fedora Rawhide](https://fedoraproject.org/wiki/Releases/Rawhide) is available via `%%IMAGE%%:rawhide` and any specific version of Fedora as `%%IMAGE%%:$version` (example: `%%IMAGE%%:23`). diff --git a/fedora/issues.md b/fedora/issues.md index c2bfb6883b4e..504e4b7ab05d 100644 --- a/fedora/issues.md +++ b/fedora/issues.md @@ -1 +1 @@ -[Fedora's bugzilla page](https://bugzilla.redhat.com/enter_bug.cgi?product=Fedora) (choose `docker` as component and include details about image problems in the description) or [GitHub](%%GITHUB-REPO%%/issues) +[Fedora's bugzilla page](https://bugzilla.redhat.com/enter_bug.cgi?product=Fedora%20Container%20Images) or [GitHub](%%GITHUB-REPO%%/issues) diff --git a/fedora/logo.png b/fedora/logo.png index 39b6c9127ab366fd2be06b199880ab767fd33c55..d40479ce4ff192755d7775e203646074383dd98a 100644 GIT binary patch literal 4298 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 literal 11879 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 Kwo<(U5cGcsh$j00 diff --git a/flink/README.md b/flink/README.md index 16821f13a56b..87a7432f0b61 100644 --- a/flink/README.md +++ b/flink/README.md @@ -17,32 +17,32 @@ WARNING: # Quick reference - **Maintained by**: - [members of the Apache Flink community](https://github.com/docker-flink/docker-flink) + [Apache Flink](https://flink.apache.org/community.html#people) - **Where to get help**: - [Community & Project Info](https://flink.apache.org/community.html) + [Official Apache Flink Mailing lists](https://flink.apache.org/community.html#mailing-lists) and [StackOverflow (tag `apache-flink`)](https://stackoverflow.com/questions/tagged/apache-flink) # Supported tags and respective `Dockerfile` links -- [`1.9.3-scala_2.11`, `1.9-scala_2.11`](https://github.com/apache/flink-docker/blob/379970e8d2a9e138d1291d83b47e7ea643421b3a/1.9/scala_2.11-debian/Dockerfile) -- [`1.9.3-scala_2.12`, `1.9-scala_2.12`, `1.9.3`, `1.9`](https://github.com/apache/flink-docker/blob/379970e8d2a9e138d1291d83b47e7ea643421b3a/1.9/scala_2.12-debian/Dockerfile) -- [`1.10.1-scala_2.11`, `1.10-scala_2.11`, `scala_2.11`](https://github.com/apache/flink-docker/blob/31794825ad02db8b0eb961372c74a309a4504bcd/1.10/scala_2.11-debian/Dockerfile) -- [`1.10.1-scala_2.12`, `1.10-scala_2.12`, `scala_2.12`, `1.10.1`, `1.10`, `latest`](https://github.com/apache/flink-docker/blob/31794825ad02db8b0eb961372c74a309a4504bcd/1.10/scala_2.12-debian/Dockerfile) +- [`1.16.0-scala_2.12-java8`, `1.16-scala_2.12-java8`, `scala_2.12-java8`, `1.16.0-java8`, `1.16-java8`, `java8`](https://github.com/apache/flink-docker/blob/51ea69cc52e6a759c5b5e463d3920fd7ed8caebc/1.16/scala_2.12-java8-ubuntu/Dockerfile) +- [`1.16.0-scala_2.12-java11`, `1.16-scala_2.12-java11`, `scala_2.12-java11`, `1.16.0-scala_2.12`, `1.16-scala_2.12`, `scala_2.12`, `1.16.0-java11`, `1.16-java11`, `java11`, `1.16.0`, `1.16`, `latest`](https://github.com/apache/flink-docker/blob/51ea69cc52e6a759c5b5e463d3920fd7ed8caebc/1.16/scala_2.12-java11-ubuntu/Dockerfile) +- [`1.15.3-scala_2.12-java8`, `1.15-scala_2.12-java8`, `1.15.3-java8`, `1.15-java8`](https://github.com/apache/flink-docker/blob/a22c0f04972a1d8539d9213b52fc0728eac8c1fa/1.15/scala_2.12-java8-ubuntu/Dockerfile) +- [`1.15.3-scala_2.12-java11`, `1.15-scala_2.12-java11`, `1.15.3-scala_2.12`, `1.15-scala_2.12`, `1.15.3-java11`, `1.15-java11`, `1.15.3`, `1.15`](https://github.com/apache/flink-docker/blob/a22c0f04972a1d8539d9213b52fc0728eac8c1fa/1.15/scala_2.12-java11-ubuntu/Dockerfile) # Quick reference (cont.) - **Where to file issues**: - [https://github.com/docker-flink/docker-flink/issues](https://github.com/docker-flink/docker-flink/issues) + https://issues.apache.org/jira/browse/FLINK - **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) - [`amd64`](https://hub.docker.com/r/amd64/flink/) + [`amd64`](https://hub.docker.com/r/amd64/flink/), [`arm64v8`](https://hub.docker.com/r/arm64v8/flink/) - **Published image artifact details**: [repo-info repo's `repos/flink/` directory](https://github.com/docker-library/repo-info/blob/master/repos/flink) ([history](https://github.com/docker-library/repo-info/commits/master/repos/flink)) (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/flink`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fflink) + [official-images repo's `library/flink` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fflink) [official-images repo's `library/flink` file](https://github.com/docker-library/official-images/blob/master/library/flink) ([history](https://github.com/docker-library/official-images/commits/master/library/flink)) - **Source of this description**: @@ -50,87 +50,13 @@ WARNING: # What is Apache Flink? -Apache Flink is an open source stream processing framework with powerful stream- and batch-processing capabilities. - -Learn more about Flink at [https://flink.apache.org/](https://flink.apache.org/) - -> [wikipedia.org/wiki/Apache_Flink](https://en.wikipedia.org/wiki/Apache_Flink) +[Apache Flink](https://flink.apache.org/) is an open source stream processing framework with powerful stream- and batch-processing capabilities. ![logo](https://raw.githubusercontent.com/docker-library/docs/71398f44551617e3934a86b4b7a3c770ae093b59/flink/logo.png) -# Flink Docker image tags - -Starting with Flink 1.5, images without "hadoop" in the tag are the "Hadoop-free" variant of Flink. If you require Hadoop support (such as its HDFS filesystem implementation), you should reference an image whose tag includes the Hadoop version you need. - -# How to use this Docker image - -## Running a JobManager or a TaskManager - -You can run a JobManager (master). - -```console -$ docker run --name flink_jobmanager -d -t flink jobmanager -``` - -You can also run a TaskManager (worker). Notice that workers need to register with the JobManager directly or via ZooKeeper so the master starts to send them tasks to execute. - -```console -$ docker run --name flink_taskmanager -d -t flink taskmanager -``` - -## Running a cluster using Docker Compose - -With Docker Compose you can create a Flink cluster: - -```yml -version: "2.1" -services: - jobmanager: - image: ${FLINK_DOCKER_IMAGE_NAME:-flink} - expose: - - "6123" - ports: - - "8081:8081" - command: jobmanager - environment: - - JOB_MANAGER_RPC_ADDRESS=jobmanager - - taskmanager: - image: ${FLINK_DOCKER_IMAGE_NAME:-flink} - expose: - - "6121" - - "6122" - depends_on: - - jobmanager - command: taskmanager - links: - - "jobmanager:jobmanager" - environment: - - JOB_MANAGER_RPC_ADDRESS=jobmanager -``` - -and just run `docker-compose up`. - -Scale the cluster up or down to *N* TaskManagers: - -```console -docker-compose scale taskmanager= -``` - -## Configuration - -These are the default ports used by the Flink image: - -- The Web Client is on port `8081` -- JobManager RPC port `6123` -- TaskManagers RPC port `6122` -- TaskManagers Data port `6121` - -# About this repository - -This repository is available on [github.com/docker-flink/docker-flink](https://github.com/docker-flink/docker-flink), and the official build is on the [Docker Hub](https://hub.docker.com/_/flink/). +# How to use Apache Flink with Docker? -This repository is maintained by members of the Apache Flink community. +Please refer to the official [Apache Flink documentation](https://ci.apache.org/projects/flink/flink-docs-master/) about [how to use Apache Flink with Docker](https://ci.apache.org/projects/flink/flink-docs-master/ops/deployment/docker.html). # License @@ -138,7 +64,7 @@ Licensed under the Apache License, Version 2.0 (the "License"); you may not use https://www.apache.org/licenses/LICENSE-2.0 -Apache Flink, Flink®, Apache®, the squirrel logo, and the Apache feather logo are either registered trademarks or trademarks of The Apache Software Foundation. +Apache Flink, Flink®, Apache®, the squirrel logo, and the Apache feather logo are either registered trademarks or trademarks of [The Apache Software Foundation](https://apache.org/). 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). diff --git a/flink/content.md b/flink/content.md index 8959bd47ac58..5c74bfede002 100644 --- a/flink/content.md +++ b/flink/content.md @@ -1,83 +1,9 @@ # What is Apache Flink? -Apache Flink is an open source stream processing framework with powerful stream- and batch-processing capabilities. - -Learn more about Flink at [https://flink.apache.org/](https://flink.apache.org/) - -> [wikipedia.org/wiki/Apache_Flink](https://en.wikipedia.org/wiki/Apache_Flink) +[Apache Flink](https://flink.apache.org/) is an open source stream processing framework with powerful stream- and batch-processing capabilities. %%LOGO%% -# Flink Docker image tags - -Starting with Flink 1.5, images without "hadoop" in the tag are the "Hadoop-free" variant of Flink. If you require Hadoop support (such as its HDFS filesystem implementation), you should reference an image whose tag includes the Hadoop version you need. - -# How to use this Docker image - -## Running a JobManager or a TaskManager - -You can run a JobManager (master). - -```console -$ docker run --name flink_jobmanager -d -t %%IMAGE%% jobmanager -``` - -You can also run a TaskManager (worker). Notice that workers need to register with the JobManager directly or via ZooKeeper so the master starts to send them tasks to execute. - -```console -$ docker run --name flink_taskmanager -d -t %%IMAGE%% taskmanager -``` - -## Running a cluster using Docker Compose - -With Docker Compose you can create a Flink cluster: - -```yml -version: "2.1" -services: - jobmanager: - image: ${FLINK_DOCKER_IMAGE_NAME:-flink} - expose: - - "6123" - ports: - - "8081:8081" - command: jobmanager - environment: - - JOB_MANAGER_RPC_ADDRESS=jobmanager - - taskmanager: - image: ${FLINK_DOCKER_IMAGE_NAME:-flink} - expose: - - "6121" - - "6122" - depends_on: - - jobmanager - command: taskmanager - links: - - "jobmanager:jobmanager" - environment: - - JOB_MANAGER_RPC_ADDRESS=jobmanager -``` - -and just run `docker-compose up`. - -Scale the cluster up or down to *N* TaskManagers: - -```console -docker-compose scale taskmanager= -``` - -## Configuration - -These are the default ports used by the Flink image: - -- The Web Client is on port `8081` -- JobManager RPC port `6123` -- TaskManagers RPC port `6122` -- TaskManagers Data port `6121` - -# About this repository - -This repository is available on [github.com/docker-flink/docker-flink](https://github.com/docker-flink/docker-flink), and the official build is on the [Docker Hub](https://hub.docker.com/_/flink/). +# How to use Apache Flink with Docker? -This repository is maintained by members of the Apache Flink community. +Please refer to the official [Apache Flink documentation](https://ci.apache.org/projects/flink/flink-docs-master/) about [how to use Apache Flink with Docker](https://ci.apache.org/projects/flink/flink-docs-master/ops/deployment/docker.html). diff --git a/flink/get-help.md b/flink/get-help.md index 7a0301b156b0..3d41cd9541e5 100644 --- a/flink/get-help.md +++ b/flink/get-help.md @@ -1 +1 @@ -[Community & Project Info](https://flink.apache.org/community.html) +[Official Apache Flink Mailing lists](https://flink.apache.org/community.html#mailing-lists) and [StackOverflow (tag `apache-flink`)](https://stackoverflow.com/questions/tagged/apache-flink) diff --git a/flink/github-repo b/flink/github-repo index 410f54164315..423374b73a25 100644 --- a/flink/github-repo +++ b/flink/github-repo @@ -1 +1 @@ -https://github.com/docker-flink/docker-flink +https://github.com/apache/flink-docker diff --git a/flink/issues.md b/flink/issues.md new file mode 100644 index 000000000000..628f3dfb14ad --- /dev/null +++ b/flink/issues.md @@ -0,0 +1 @@ +https://issues.apache.org/jira/browse/FLINK diff --git a/flink/license.md b/flink/license.md index d1a78fb78c3c..b639adefc537 100644 --- a/flink/license.md +++ b/flink/license.md @@ -2,4 +2,4 @@ Licensed under the Apache License, Version 2.0 (the "License"); you may not use https://www.apache.org/licenses/LICENSE-2.0 -Apache Flink, Flink®, Apache®, the squirrel logo, and the Apache feather logo are either registered trademarks or trademarks of The Apache Software Foundation. +Apache Flink, Flink®, Apache®, the squirrel logo, and the Apache feather logo are either registered trademarks or trademarks of [The Apache Software Foundation](https://apache.org/). diff --git a/flink/maintainer.md b/flink/maintainer.md index f00911460ab4..89974abbb612 100644 --- a/flink/maintainer.md +++ b/flink/maintainer.md @@ -1 +1 @@ -[members of the Apache Flink community](%%GITHUB-REPO%%) +[Apache Flink](https://flink.apache.org/community.html#people) diff --git a/fluentd/README.md b/fluentd/README.md index 63e706e75b63..3244554f1a26 100644 --- a/fluentd/README.md +++ b/fluentd/README.md @@ -20,12 +20,12 @@ WARNING: [Fluentd](https://github.com/fluent/fluentd-docker-image) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`v1.9.1-1.0`, `v1.9-1`, `latest`](https://github.com/fluent/fluentd-docker-image/blob/b9cb2826b85900f960e256b2426a033e7cacfd6c/v1.9/alpine/Dockerfile) -- [`v1.9.1-debian-1.0`, `v1.9-debian-1`](https://github.com/fluent/fluentd-docker-image/blob/b9cb2826b85900f960e256b2426a033e7cacfd6c/v1.9/debian/Dockerfile) +- [`v1.14.0-1.0`, `v1.14-1`, `latest`](https://github.com/fluent/fluentd-docker-image/blob/a9e4cee765c7aaf7876d6fe3282aa565dbcdc2a4/v1.14/alpine/Dockerfile) +- [`v1.14.0-debian-1.0`, `v1.14-debian-1`](https://github.com/fluent/fluentd-docker-image/blob/a9e4cee765c7aaf7876d6fe3282aa565dbcdc2a4/v1.14/debian/Dockerfile) # Quick reference (cont.) @@ -40,7 +40,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/fluentd`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Ffluentd) + [official-images repo's `library/fluentd` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Ffluentd) [official-images repo's `library/fluentd` file](https://github.com/docker-library/official-images/blob/master/library/fluentd) ([history](https://github.com/docker-library/official-images/commits/master/library/fluentd)) - **Source of this description**: diff --git a/friendica/README.md b/friendica/README.md index 917a64955d04..5fd47a833f4d 100644 --- a/friendica/README.md +++ b/friendica/README.md @@ -20,16 +20,16 @@ WARNING: [nupplaPhil](https://github.com/friendica/docker) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`2020.03-apache`, `apache`, `stable-apache`, `2020.03`, `latest`, `stable`](https://github.com/friendica/docker/blob/ad99a985409c5ef4eefb5903b1ec81096dc8f613/2020.03/apache/Dockerfile) -- [`2020.03-fpm`, `fpm`, `stable-fpm`](https://github.com/friendica/docker/blob/ad99a985409c5ef4eefb5903b1ec81096dc8f613/2020.03/fpm/Dockerfile) -- [`2020.03-fpm-alpine`, `fpm-alpine`, `stable-fpm-alpine`](https://github.com/friendica/docker/blob/ad99a985409c5ef4eefb5903b1ec81096dc8f613/2020.03/fpm-alpine/Dockerfile) -- [`2020.06-dev-apache`, `dev-apache`, `2020.06-dev`, `dev`](https://github.com/friendica/docker/blob/ad99a985409c5ef4eefb5903b1ec81096dc8f613/2020.06-dev/apache/Dockerfile) -- [`2020.06-dev-fpm`, `dev-fpm`](https://github.com/friendica/docker/blob/ad99a985409c5ef4eefb5903b1ec81096dc8f613/2020.06-dev/fpm/Dockerfile) -- [`2020.06-dev-fpm-alpine`, `dev-fpm-alpine`](https://github.com/friendica/docker/blob/ad99a985409c5ef4eefb5903b1ec81096dc8f613/2020.06-dev/fpm-alpine/Dockerfile) +- [`2022.12-apache`, `apache`, `stable-apache`, `2022.12`, `latest`, `stable`](https://github.com/friendica/docker/blob/d4c80286df956393b364a37c2471dc501c0373a1/2022.12/apache/Dockerfile) +- [`2022.12-fpm`, `fpm`, `stable-fpm`](https://github.com/friendica/docker/blob/d4c80286df956393b364a37c2471dc501c0373a1/2022.12/fpm/Dockerfile) +- [`2022.12-fpm-alpine`, `fpm-alpine`, `stable-fpm-alpine`](https://github.com/friendica/docker/blob/d4c80286df956393b364a37c2471dc501c0373a1/2022.12/fpm-alpine/Dockerfile) +- [`2023.03-dev-apache`, `dev-apache`, `2023.03-dev`, `dev`](https://github.com/friendica/docker/blob/d4c80286df956393b364a37c2471dc501c0373a1/2023.03-dev/apache/Dockerfile) +- [`2023.03-dev-fpm`, `dev-fpm`](https://github.com/friendica/docker/blob/d4c80286df956393b364a37c2471dc501c0373a1/2023.03-dev/fpm/Dockerfile) +- [`2023.03-dev-fpm-alpine`, `dev-fpm-alpine`](https://github.com/friendica/docker/blob/d4c80286df956393b364a37c2471dc501c0373a1/2023.03-dev/fpm-alpine/Dockerfile) # Quick reference (cont.) @@ -37,14 +37,14 @@ WARNING: [https://github.com/friendica/docker/issues](https://github.com/friendica/docker/issues) - **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) - [`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/), [`ppc64le`](https://hub.docker.com/r/ppc64le/friendica/) + [`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/), [`s390x`](https://hub.docker.com/r/s390x/friendica/) - **Published image artifact details**: [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)) (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/friendica`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Ffriendica) + [official-images repo's `library/friendica` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Ffriendica) [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)) - **Source of this description**: @@ -88,31 +88,34 @@ $ docker run -d friendica:fpm 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. -## Using the cron job +## Background tasks -There are three options to enable the cron-job for Friendica: +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: -- Using the default Image and activate the cron-job (see [Installation](https://friendi.ca/resources/installation/), sector `Activating scheduled tasks`) -- Using the default image (apache, fpm, fpm-alpine) and creating **two** container (one for cron and one for the main app) -- Using one of the additional, prepared [`cron dockerfiles`](https://github.com/friendica/docker/tree/master/.examples/dockerfiles/cron) +- 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)) +- 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)) ## Possible Environment Variables **Friendica Settings** -- `FRIENDICA_URL` The Friendica URL. +- `FRIENDICA_URL` The Friendica complete URL including protocol, domain and subpath (example: https://friendica.local/sub/ ). - `FRIENDICA_TZ` The default localization of the Friendica server. - `FRIENDICA_LANG` The default language of the Friendica server. - `FRIENDICA_SITENAME` The Sitename of the Friendica server. - `FRIENDICA_NO_VALIDATION` If set to `true`, the URL and E-Mail validation will be disabled. -- `FRIENDICA_DATA` If set to `true`, the fileystem will be used instead of the DB backend. +- `FRIENDICA_DATA` Set the name of the storage provider (e.g `Filesystem` to use filesystem), default ist the DB backend. - `FRIENDICA_DATA_DIR` The data directory of the Friendica server (Default: /var/www/data). +- `FRIENDICA_UPGRADE` Force starting the Friendica update even it's the same version (Default: `false`). **Friendica Logging** - `FRIENDICA_DEBUGGING` If set to `true`, the logging of Friendica is enabled. - `FRIENDICA_LOGFILE` (optional) The path to the logfile (Default: /var/www/friendica.log). - `FRIENDICA_LOGLEVEL` (optional) The loglevel to log (Default: notice). +- `FRIENDICA_LOGGER` (optional) Set the type - stream, syslog, monolog (Default: stream). +- `FRIENDICA_SYSLOG_FLAGS` (optional) In case syslog is used, set the corresponding flags (Default: `LOG_PID | LOG_ODELAY | LOG_CONS | LOG_PERROR`). +- `FRIENDICA_SYSLOG_FACTORY` (optional) In case syslog is used, set the corresponding factory (Default: `LOG_USER`). **Database** (**required at installation**) @@ -129,6 +132,11 @@ There are three options to enable the cron-job for Friendica: - `REDIS_PW` (optional) The password for the redis instance (in case of locking). - `REDIS_DB` (optional) The database instance of the redis instance (in case of locking). +**PHP limits** + +- `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. +- `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. + ## Administrator account Because Friendica links the administrator account to a specific mail address, you **have** to set a valid address for `MAILNAME`. @@ -144,13 +152,14 @@ You have to set a valid SMTP-MTA for the `SMTP` environment variable to enable m The following environment variables are possible for the SMTP examples. - `SMTP` Address of the SMTP Mail-Gateway. (**required**) +- `SMTP_PORT` Port of the SMTP Mail-Gateway. (Default: 587) - `SMTP_DOMAIN` The sender domain. (**required** - e.g. `friendica.local`) - `SMTP_FROM` Sender user-part of the address. (Default: `no-reply` - e.g. no-reply@friendica.local) - `SMTP_TLS` Use TLS for connecting the SMTP Mail-Gateway. (Default: empty) - `SMTP_STARTTLS` Use STARTTLS for connecting the SMTP Mail-Gateway. (Default: empty) +- `SMTP_AUTH` Auth mode for the SMTP Mail-Gateway. (Default: `On`) - `SMTP_AUTH_USER` Username for the SMTP Mail-Gateway. (Default: empty) - `SMTP_AUTH_PASS` Password for the SMTP Mail-Gateway. (Default: empty) -- `SMTP_AUTH_METHOD` Authentication method for the SMTP Mail-Gateway. (Default: empty/plain text) ## Database settings @@ -186,12 +195,73 @@ $ docker run -d \ 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: +- `FRIENDICA_URL` The Friendica complete URL including protocol, domain and subpath (example: https://friendica.local/sub/ ). - `FRIENDICA_ADMIN_MAIL` E-Mail address of the administrator. - `MYSQL_USER` Username for the database user using mysql / mariadb. - `MYSQL_PASSWORD` Password for the database user using mysql / mariadb. - `MYSQL_DATABASE` Name of the database using mysql / mariadb. - `MYSQL_HOST` Hostname of the database server using mysql / mariadb. +# Docker Secrets + +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/ files. For example: + +```yaml +version: '3.2' + +services: + db: + image: mariadb + restart: always + volumes: + - db:/var/lib/mysql + environment: + - MYSQL_DATABASE_FILE=/run/secrets/mysql_database + - MYSQL_USER_FILE=/run/secrets/mysql_user + - MYSQL_PASSWORD_FILE=/run/secrets/mysql_password + secrets: + - mysql_database + - mysql_password + - mysql_user + + app: + image: friendica + restart: always + volumes: + - friendica:/var/www/html + ports: + - "8080:80" + environment: + - MYSQL_HOST=db + - MYSQL_DATABASE_FILE=/run/secrets/mysql_database + - MYSQL_USER_FILE=/run/secrets/mysql_user + - MYSQL_PASSWORD_FILE=/run/secrets/mysql_password + - FRIENDICA_ADMIN_MAIL_FILE=/run/secrets/friendica_admin_mail + depends_on: + - db + secrets: + - friendica_admin_mail + - mysql_database + - mysql_password + - mysql_user + +volumes: + db: + friendica: + +secrets: + friendica_admin_mail: + file: ./friendica_admin_mail.txt # put admin email to this file + mysql_database: + file: ./mysql_database.txt # put mysql database name to this file + mysql_password: + file: ./mysql_password.txt # put mysql password to this file + mysql_user: + file: ./mysql_user.txt # put mysql username to this file +``` + +Currently, this is only supported for `FRIENDICA_ADMIN_MAIL`, `MYSQL_DATABASE`, `MYSQL_PASSWORD`, `MYSQL_USER`. + # Maintenance of the image ## Updating to a newer version @@ -315,25 +385,7 @@ Then run `docker-compose up -d`, now you can access Friendica at http://localhos # Special settings for DEV/RC images -The `*-dev` and `*-rc` branches are having additional possibilities to get the latest sources of Friendica. - -## Possible Environment Variables - -The following environment variables are possible for these kind of images too: - -**Develop/Release Candidate Settings** - -- `FRIENDICA_UPGRADE` If set to `true`, a develop or release candidat node will get updated at startup. -- `FRIENDICA_REPOSITORY` If set, a custom repository will be chosen (Default: `friendica`) -- `FRIENDICA_ADDONS_REPO` If set, a custom repository for the addons will be chosen (Default: `friendica`) -- `FRIENDICA_VERSION` If set, a custom branch will be chosen (Default is based on the chosen image version) -- `FRIENDICA_ADDONS` If set, a custom branch for the addons will be chosen (Default is based on the chosen image version) - -## Updating to a newer version - -You don't need to pull the image for each commit in [friendica](https://github.com/friendica/friendica/). Instead, the release candidate or develop branch will get updated if no installation was found or the environment variable `FRIENDICA_UPGRADE` is set to `true`. - -It will clone the latest Friendica version and copy it to your working directory. +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. # Questions / Issues @@ -349,9 +401,9 @@ This is the defacto image. If you are unsure about what your needs are, you prob ## `friendica:-alpine` -This image is based on the popular [Alpine Linux project](http://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. +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. -This variant is highly recommended when final image size being as small as possible is desired. The main caveat to note is that it does use [musl libc](http://www.musl-libc.org) instead of [glibc and friends](http://www.etalabs.net/compare_libcs.html), so certain software might run into issues depending on the depth of their libc requirements. However, most software doesn't have an issue with this, so this variant is usually a very safe choice. 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. +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. 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). diff --git a/friendica/content.md b/friendica/content.md index 88bc4e9388ce..df72f372e31a 100644 --- a/friendica/content.md +++ b/friendica/content.md @@ -36,31 +36,34 @@ $ docker run -d %%IMAGE%%:fpm 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. -## Using the cron job +## Background tasks -There are three options to enable the cron-job for Friendica: +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: -- Using the default Image and activate the cron-job (see [Installation](https://friendi.ca/resources/installation/), sector `Activating scheduled tasks`) -- Using the default image (apache, fpm, fpm-alpine) and creating **two** container (one for cron and one for the main app) -- Using one of the additional, prepared [`cron dockerfiles`](https://github.com/friendica/docker/tree/master/.examples/dockerfiles/cron) +- 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)) +- 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)) ## Possible Environment Variables **Friendica Settings** -- `FRIENDICA_URL` The Friendica URL. +- `FRIENDICA_URL` The Friendica complete URL including protocol, domain and subpath (example: https://friendica.local/sub/ ). - `FRIENDICA_TZ` The default localization of the Friendica server. - `FRIENDICA_LANG` The default language of the Friendica server. - `FRIENDICA_SITENAME` The Sitename of the Friendica server. - `FRIENDICA_NO_VALIDATION` If set to `true`, the URL and E-Mail validation will be disabled. -- `FRIENDICA_DATA` If set to `true`, the fileystem will be used instead of the DB backend. +- `FRIENDICA_DATA` Set the name of the storage provider (e.g `Filesystem` to use filesystem), default ist the DB backend. - `FRIENDICA_DATA_DIR` The data directory of the Friendica server (Default: /var/www/data). +- `FRIENDICA_UPGRADE` Force starting the Friendica update even it's the same version (Default: `false`). **Friendica Logging** - `FRIENDICA_DEBUGGING` If set to `true`, the logging of Friendica is enabled. - `FRIENDICA_LOGFILE` (optional) The path to the logfile (Default: /var/www/friendica.log). - `FRIENDICA_LOGLEVEL` (optional) The loglevel to log (Default: notice). +- `FRIENDICA_LOGGER` (optional) Set the type - stream, syslog, monolog (Default: stream). +- `FRIENDICA_SYSLOG_FLAGS` (optional) In case syslog is used, set the corresponding flags (Default: `LOG_PID | LOG_ODELAY | LOG_CONS | LOG_PERROR`). +- `FRIENDICA_SYSLOG_FACTORY` (optional) In case syslog is used, set the corresponding factory (Default: `LOG_USER`). **Database** (**required at installation**) @@ -77,6 +80,11 @@ There are three options to enable the cron-job for Friendica: - `REDIS_PW` (optional) The password for the redis instance (in case of locking). - `REDIS_DB` (optional) The database instance of the redis instance (in case of locking). +**PHP limits** + +- `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. +- `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. + ## Administrator account Because Friendica links the administrator account to a specific mail address, you **have** to set a valid address for `MAILNAME`. @@ -92,13 +100,14 @@ You have to set a valid SMTP-MTA for the `SMTP` environment variable to enable m The following environment variables are possible for the SMTP examples. - `SMTP` Address of the SMTP Mail-Gateway. (**required**) +- `SMTP_PORT` Port of the SMTP Mail-Gateway. (Default: 587) - `SMTP_DOMAIN` The sender domain. (**required** - e.g. `friendica.local`) - `SMTP_FROM` Sender user-part of the address. (Default: `no-reply` - e.g. no-reply@friendica.local) - `SMTP_TLS` Use TLS for connecting the SMTP Mail-Gateway. (Default: empty) - `SMTP_STARTTLS` Use STARTTLS for connecting the SMTP Mail-Gateway. (Default: empty) +- `SMTP_AUTH` Auth mode for the SMTP Mail-Gateway. (Default: `On`) - `SMTP_AUTH_USER` Username for the SMTP Mail-Gateway. (Default: empty) - `SMTP_AUTH_PASS` Password for the SMTP Mail-Gateway. (Default: empty) -- `SMTP_AUTH_METHOD` Authentication method for the SMTP Mail-Gateway. (Default: empty/plain text) ## Database settings @@ -134,12 +143,73 @@ $ docker run -d \ 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: +- `FRIENDICA_URL` The Friendica complete URL including protocol, domain and subpath (example: https://friendica.local/sub/ ). - `FRIENDICA_ADMIN_MAIL` E-Mail address of the administrator. - `MYSQL_USER` Username for the database user using mysql / mariadb. - `MYSQL_PASSWORD` Password for the database user using mysql / mariadb. - `MYSQL_DATABASE` Name of the database using mysql / mariadb. - `MYSQL_HOST` Hostname of the database server using mysql / mariadb. +# Docker Secrets + +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/ files. For example: + +```yaml +version: '3.2' + +services: + db: + image: mariadb + restart: always + volumes: + - db:/var/lib/mysql + environment: + - MYSQL_DATABASE_FILE=/run/secrets/mysql_database + - MYSQL_USER_FILE=/run/secrets/mysql_user + - MYSQL_PASSWORD_FILE=/run/secrets/mysql_password + secrets: + - mysql_database + - mysql_password + - mysql_user + + app: + image: friendica + restart: always + volumes: + - friendica:/var/www/html + ports: + - "8080:80" + environment: + - MYSQL_HOST=db + - MYSQL_DATABASE_FILE=/run/secrets/mysql_database + - MYSQL_USER_FILE=/run/secrets/mysql_user + - MYSQL_PASSWORD_FILE=/run/secrets/mysql_password + - FRIENDICA_ADMIN_MAIL_FILE=/run/secrets/friendica_admin_mail + depends_on: + - db + secrets: + - friendica_admin_mail + - mysql_database + - mysql_password + - mysql_user + +volumes: + db: + friendica: + +secrets: + friendica_admin_mail: + file: ./friendica_admin_mail.txt # put admin email to this file + mysql_database: + file: ./mysql_database.txt # put mysql database name to this file + mysql_password: + file: ./mysql_password.txt # put mysql password to this file + mysql_user: + file: ./mysql_user.txt # put mysql username to this file +``` + +Currently, this is only supported for `FRIENDICA_ADMIN_MAIL`, `MYSQL_DATABASE`, `MYSQL_PASSWORD`, `MYSQL_USER`. + # Maintenance of the image ## Updating to a newer version @@ -263,25 +333,7 @@ Then run `docker-compose up -d`, now you can access Friendica at http://localhos # Special settings for DEV/RC images -The `*-dev` and `*-rc` branches are having additional possibilities to get the latest sources of Friendica. - -## Possible Environment Variables - -The following environment variables are possible for these kind of images too: - -**Develop/Release Candidate Settings** - -- `FRIENDICA_UPGRADE` If set to `true`, a develop or release candidat node will get updated at startup. -- `FRIENDICA_REPOSITORY` If set, a custom repository will be chosen (Default: `friendica`) -- `FRIENDICA_ADDONS_REPO` If set, a custom repository for the addons will be chosen (Default: `friendica`) -- `FRIENDICA_VERSION` If set, a custom branch will be chosen (Default is based on the chosen image version) -- `FRIENDICA_ADDONS` If set, a custom branch for the addons will be chosen (Default is based on the chosen image version) - -## Updating to a newer version - -You don't need to pull the image for each commit in [friendica](https://github.com/friendica/friendica/). Instead, the release candidate or develop branch will get updated if no installation was found or the environment variable `FRIENDICA_UPGRADE` is set to `true`. - -It will clone the latest Friendica version and copy it to your working directory. +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. # Questions / Issues diff --git a/fsharp/README-short.txt b/fsharp/README-short.txt deleted file mode 100644 index 3189df8aa6aa..000000000000 --- a/fsharp/README-short.txt +++ /dev/null @@ -1 +0,0 @@ -F# is a multi-paradigm language encompassing functional, imperative, and object-oriented styles diff --git a/fsharp/README.md b/fsharp/README.md deleted file mode 100644 index ac080d301ffb..000000000000 --- a/fsharp/README.md +++ /dev/null @@ -1,80 +0,0 @@ - - -# Quick reference - -- **Maintained by**: - [the F# Community](https://github.com/fsprojects/docker-fsharp) - -- **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) - -# Supported tags and respective `Dockerfile` links - -- [`latest`, `10`, `10.7`, `10.7.0`](https://github.com/fsprojects/docker-fsharp/blob/6ced4c004bac9d5a024eefbc1d90219c78ce784b/10.7.0/mono/Dockerfile) -- [`4`, `4.1`, `4.1.34`](https://github.com/fsprojects/docker-fsharp/blob/6ced4c004bac9d5a024eefbc1d90219c78ce784b/4.1.34/mono/Dockerfile) -- [`netcore`, `10-netcore`, `10.7-netcore`, `10.7.0-netcore`](https://github.com/fsprojects/docker-fsharp/blob/6ced4c004bac9d5a024eefbc1d90219c78ce784b/10.7.0/netcore/Dockerfile) - -# Quick reference (cont.) - -- **Where to file issues**: - [https://github.com/fsprojects/docker-fsharp/issues](https://github.com/fsprojects/docker-fsharp/issues) - -- **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) - [`amd64`](https://hub.docker.com/r/amd64/fsharp/), [`arm64v8`](https://hub.docker.com/r/arm64v8/fsharp/) - -- **Published image artifact details**: - [repo-info repo's `repos/fsharp/` directory](https://github.com/docker-library/repo-info/blob/master/repos/fsharp) ([history](https://github.com/docker-library/repo-info/commits/master/repos/fsharp)) - (image metadata, transfer size, etc) - -- **Image updates**: - [official-images PRs with label `library/fsharp`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Ffsharp) - [official-images repo's `library/fsharp` file](https://github.com/docker-library/official-images/blob/master/library/fsharp) ([history](https://github.com/docker-library/official-images/commits/master/library/fsharp)) - -- **Source of this description**: - [docs repo's `fsharp/` directory](https://github.com/docker-library/docs/tree/master/fsharp) ([history](https://github.com/docker-library/docs/commits/master/fsharp)) - -# What is F#? - -F# (pronounced F sharp) is a strongly typed, multi-paradigm programming language that encompasses functional, imperative, and object-oriented programming techniques. F# is most often used as a cross-platform CLI language, but can also be used to generate JavaScript and GPU code. - -> [wikipedia.org/wiki/F Sharp (programming language)](https://en.wikipedia.org/wiki/F_Sharp_%28programming_language%29) - -![logo](https://raw.githubusercontent.com/docker-library/docs/7d8c02340482b7f0c08c9fa7dc534d72314d3a22/fsharp/logo.png) - -# How to use this image - -## Start your application inside this image - -The most straightforward way to use this image is to use it both as the build and runtime environment. In your `Dockerfile`, you can write something similar to the following: - -```dockerfile -FROM fsharp -COPY . /app -RUN xbuild /app/myproject.sln -``` - -This will copy your application source code into the image and use `xbuild` to build it. - -# License - -View [the Apache 2.0 license](https://github.com/fsharp/fsharp/blob/d518f91418ef43a61875a5d932147b97fd0f47f3/LICENSE) for the software contained in this image. - -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). - -Some additional license information which was able to be auto-detected might be found in [the `repo-info` repository's `fsharp/` directory](https://github.com/docker-library/repo-info/tree/master/repos/fsharp). - -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. diff --git a/fsharp/content.md b/fsharp/content.md deleted file mode 100644 index 75ec7ab217f3..000000000000 --- a/fsharp/content.md +++ /dev/null @@ -1,21 +0,0 @@ -# What is F#? - -F# (pronounced F sharp) is a strongly typed, multi-paradigm programming language that encompasses functional, imperative, and object-oriented programming techniques. F# is most often used as a cross-platform CLI language, but can also be used to generate JavaScript and GPU code. - -> [wikipedia.org/wiki/F Sharp (programming language)](https://en.wikipedia.org/wiki/F_Sharp_%28programming_language%29) - -%%LOGO%% - -# How to use this image - -## Start your application inside this image - -The most straightforward way to use this image is to use it both as the build and runtime environment. In your `Dockerfile`, you can write something similar to the following: - -```dockerfile -FROM %%IMAGE%% -COPY . /app -RUN xbuild /app/myproject.sln -``` - -This will copy your application source code into the image and use `xbuild` to build it. diff --git a/fsharp/github-repo b/fsharp/github-repo deleted file mode 100644 index ac3d02410c15..000000000000 --- a/fsharp/github-repo +++ /dev/null @@ -1 +0,0 @@ -https://github.com/fsprojects/docker-fsharp diff --git a/fsharp/license.md b/fsharp/license.md deleted file mode 100644 index ce9909b47eb8..000000000000 --- a/fsharp/license.md +++ /dev/null @@ -1 +0,0 @@ -View [the Apache 2.0 license](https://github.com/fsharp/fsharp/blob/d518f91418ef43a61875a5d932147b97fd0f47f3/LICENSE) for the software contained in this image. diff --git a/fsharp/logo.png b/fsharp/logo.png deleted file mode 100644 index 2dcecfbdc61bf2107755d978cfd3cd16a6b1d24a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8550 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 diff --git a/fsharp/maintainer.md b/fsharp/maintainer.md deleted file mode 100644 index bfb50db0394e..000000000000 --- a/fsharp/maintainer.md +++ /dev/null @@ -1 +0,0 @@ -[the F# Community](%%GITHUB-REPO%%) diff --git a/gazebo/README.md b/gazebo/README.md index e2ba0cf8fb3c..8be1ff5a804a 100644 --- a/gazebo/README.md +++ b/gazebo/README.md @@ -20,22 +20,18 @@ WARNING: [the Open Source Robotics Foundation](https://github.com/osrf/docker_images) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`gzserver7`, `gzserver7-xenial`](https://github.com/osrf/docker_images/blob/e296cc1a131ef3b2ac62a91d6bf31ab6fb27884d/gazebo/7/ubuntu/xenial/gzserver7/Dockerfile) -- [`libgazebo7`, `libgazebo7-xenial`](https://github.com/osrf/docker_images/blob/e296cc1a131ef3b2ac62a91d6bf31ab6fb27884d/gazebo/7/ubuntu/xenial/libgazebo7/Dockerfile) -- [`gzserver9-xenial`](https://github.com/osrf/docker_images/blob/844fe41c654dd84ba291d01620fc11f7ec99c9ad/gazebo/9/ubuntu/xenial/gzserver9/Dockerfile) -- [`libgazebo9-xenial`](https://github.com/osrf/docker_images/blob/844fe41c654dd84ba291d01620fc11f7ec99c9ad/gazebo/9/ubuntu/xenial/libgazebo9/Dockerfile) -- [`gzserver9`, `gzserver9-bionic`](https://github.com/osrf/docker_images/blob/2f090a032f756498681f948e60711908cfb524d6/gazebo/9/ubuntu/bionic/gzserver9/Dockerfile) -- [`libgazebo9`, `libgazebo9-bionic`](https://github.com/osrf/docker_images/blob/2f090a032f756498681f948e60711908cfb524d6/gazebo/9/ubuntu/bionic/libgazebo9/Dockerfile) -- [`gzserver9-stretch`](https://github.com/osrf/docker_images/blob/e02819ea8bb6838c133d476a7f41f5079836eb4a/gazebo/9/debian/stretch/gzserver9/Dockerfile) -- [`libgazebo9-stretch`](https://github.com/osrf/docker_images/blob/e02819ea8bb6838c133d476a7f41f5079836eb4a/gazebo/9/debian/stretch/libgazebo9/Dockerfile) -- [`gzserver10`, `gzserver10-bionic`](https://github.com/osrf/docker_images/blob/f1b7ad09fa3bc6b88621c5f4ff2da9669c9ccb3e/gazebo/10/ubuntu/bionic/gzserver10/Dockerfile) -- [`libgazebo10`, `libgazebo10-bionic`](https://github.com/osrf/docker_images/blob/f1b7ad09fa3bc6b88621c5f4ff2da9669c9ccb3e/gazebo/10/ubuntu/bionic/libgazebo10/Dockerfile) -- [`gzserver11`, `gzserver11-bionic`](https://github.com/osrf/docker_images/blob/bd0ef992496452d93ea929ea5921b123acdab58c/gazebo/11/ubuntu/bionic/gzserver11/Dockerfile) -- [`libgazebo11`, `libgazebo11-bionic`, `latest`](https://github.com/osrf/docker_images/blob/bd0ef992496452d93ea929ea5921b123acdab58c/gazebo/11/ubuntu/bionic/libgazebo11/Dockerfile) +- [`gzserver9-xenial`](https://github.com/osrf/docker_images/blob/96c8fa210caaeebd50e067ade05d5fc9a4a60c84/gazebo/9/ubuntu/xenial/gzserver9/Dockerfile) +- [`libgazebo9-xenial`](https://github.com/osrf/docker_images/blob/96c8fa210caaeebd50e067ade05d5fc9a4a60c84/gazebo/9/ubuntu/xenial/libgazebo9/Dockerfile) +- [`gzserver9`, `gzserver9-bionic`](https://github.com/osrf/docker_images/blob/212f7553882e8f3e96af773ede6ef1848277c09e/gazebo/9/ubuntu/bionic/gzserver9/Dockerfile) +- [`libgazebo9`, `libgazebo9-bionic`](https://github.com/osrf/docker_images/blob/212f7553882e8f3e96af773ede6ef1848277c09e/gazebo/9/ubuntu/bionic/libgazebo9/Dockerfile) +- [`gzserver11-bionic`](https://github.com/osrf/docker_images/blob/6900fe08e79c7b70471cb10f83324ec24a906bea/gazebo/11/ubuntu/bionic/gzserver11/Dockerfile) +- [`libgazebo11-bionic`](https://github.com/osrf/docker_images/blob/6900fe08e79c7b70471cb10f83324ec24a906bea/gazebo/11/ubuntu/bionic/libgazebo11/Dockerfile) +- [`gzserver11`, `gzserver11-focal`](https://github.com/osrf/docker_images/blob/6900fe08e79c7b70471cb10f83324ec24a906bea/gazebo/11/ubuntu/focal/gzserver11/Dockerfile) +- [`libgazebo11`, `libgazebo11-focal`, `latest`](https://github.com/osrf/docker_images/blob/6900fe08e79c7b70471cb10f83324ec24a906bea/gazebo/11/ubuntu/focal/libgazebo11/Dockerfile) # Quick reference (cont.) @@ -50,7 +46,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/gazebo`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fgazebo) + [official-images repo's `library/gazebo` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fgazebo) [official-images repo's `library/gazebo` file](https://github.com/docker-library/official-images/blob/master/library/gazebo) ([history](https://github.com/docker-library/official-images/commits/master/library/gazebo)) - **Source of this description**: diff --git a/gcc/README.md b/gcc/README.md index a46b0f880762..b8f42b3dc8ce 100644 --- a/gcc/README.md +++ b/gcc/README.md @@ -20,13 +20,14 @@ WARNING: [the Docker Community](https://github.com/docker-library/gcc) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`10.1.0`, `10.1`, `10`, `latest`](https://github.com/docker-library/gcc/blob/97b046b578bd86cae5414d80b3ad0027c590aebd/10/Dockerfile) -- [`9.3.0`, `9.3`, `9`](https://github.com/docker-library/gcc/blob/05aef2fc627328e12bbf77aca44fd399a22c7fc4/9/Dockerfile) -- [`8.4.0`, `8.4`, `8`](https://github.com/docker-library/gcc/blob/05aef2fc627328e12bbf77aca44fd399a22c7fc4/8/Dockerfile) +- [`12.2.0`, `12.2`, `12`, `latest`, `12.2.0-bullseye`, `12.2-bullseye`, `12-bullseye`, `bullseye`](https://github.com/docker-library/gcc/blob/523e01b2ccf43f1fd702aa9fdc2f71c827b76525/12/Dockerfile) +- [`11.3.0`, `11.3`, `11`, `11.3.0-bullseye`, `11.3-bullseye`, `11-bullseye`](https://github.com/docker-library/gcc/blob/a5a94a2d5c812fe57f6f28713b0f899b879145d3/11/Dockerfile) +- [`10.4.0`, `10.4`, `10`, `10.4.0-buster`, `10.4-buster`, `10-buster`](https://github.com/docker-library/gcc/blob/1e3174f36d64a3ce1373a7004a7f0d4f98de307b/10/Dockerfile) +- [`9.5.0`, `9.5`, `9`, `9.5.0-buster`, `9.5-buster`, `9-buster`](https://github.com/docker-library/gcc/blob/6c40a41a202b2996b26b52e94762fe9aa8830766/9/Dockerfile) # Quick reference (cont.) @@ -41,7 +42,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/gcc`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fgcc) + [official-images repo's `library/gcc` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fgcc) [official-images repo's `library/gcc` file](https://github.com/docker-library/official-images/blob/master/library/gcc) ([history](https://github.com/docker-library/official-images/commits/master/library/gcc)) - **Source of this description**: @@ -92,7 +93,7 @@ $ docker run --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp gcc:4.9 make # License -View [license information](https://gcc.gnu.org/viewcvs/gcc/trunk/gcc/COPYING3?view=markup) for the software contained in this image. +View [license information](https://gcc.gnu.org/onlinedocs/gcc-11.2.0/gcc/Copying.html) for the software contained in this image. 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). diff --git a/gcc/license.md b/gcc/license.md index 9a0a820c2ea3..091413a158bc 100644 --- a/gcc/license.md +++ b/gcc/license.md @@ -1 +1 @@ -View [license information](https://gcc.gnu.org/viewcvs/gcc/trunk/gcc/COPYING3?view=markup) for the software contained in this image. +View [license information](https://gcc.gnu.org/onlinedocs/gcc-11.2.0/gcc/Copying.html) for the software contained in this image. diff --git a/generate-repo-stub-readme.sh b/generate-repo-stub-readme.sh index e327106c9061..1c8504cf186c 100755 --- a/generate-repo-stub-readme.sh +++ b/generate-repo-stub-readme.sh @@ -40,12 +40,17 @@ if [ -f "$repo/deprecated.md" ]; then echo fi +case "$repo" in + hello-world | buildpack-deps) disclaimer='' ;; + *) disclaimer=" (not to be confused with any official \`$repo\` image provided by \`$repo\` upstream)" ;; +esac + cat </dev/null \ - | grep -qvE 'unknown|invalid|access denied|not found' +_wget_spider() { + wget -q -o /dev/null -O /dev/null --spider "$@" } set -- "${toTest[@]}" while [ "$#" -gt 0 ]; do image="$1"; shift url="$1"; shift - if _check_shields_io_image "$image"; then + testUrl="$1"; shift + if _wget_spider "$testUrl"; then badges+=( "-${t}[![build status badge]($image)]($url)" ) fi done @@ -89,22 +101,16 @@ if [ -n "$arches" ]; then i=0 for arch in $arches put-shared; do if [ "$arch" = 'put-shared' ]; then - jenkinsLink= - for jenkinsJob in "job/put-shared/job/light/job/$repo" 'job/put-shared/job/heavy'; do - jenkinsImage="https://img.shields.io/jenkins/s/https/doi-janky.infosiftr.net/$jenkinsJob.svg?label=$arch" - if _check_shields_io_image "$jenkinsImage"; then - jenkinsLink="https://doi-janky.infosiftr.net/$jenkinsJob/" - break - fi - done - if [ -z "$jenkinsLink" ]; then - continue + jenkinsJob="job/put-shared/job/light/job/$repo" + if ! _wget_spider "https://doi-janky.infosiftr.net/$jenkinsJob/"; then + jenkinsJob='job/put-shared/job/heavy' fi else - jenkinsLink="https://doi-janky.infosiftr.net/job/multiarch/job/$arch/job/$repo/" - jenkinsImage="https://img.shields.io/jenkins/s/https/doi-janky.infosiftr.net/job/multiarch/job/$arch/job/$repo.svg?label=$arch" + jenkinsJob="job/multiarch/job/$arch/job/$repo" fi - if _check_shields_io_image "$jenkinsImage"; then + jenkinsLink="https://doi-janky.infosiftr.net/$jenkinsJob/" + jenkinsImage="https://img.shields.io/jenkins/s/https/doi-janky.infosiftr.net/$jenkinsJob.svg?label=$arch" + if _wget_spider "$jenkinsLink"; then archTable="${archTable:-|} [![$arch build status badge]($jenkinsImage)]($jenkinsLink) |" (( i = (i + 1) % 4 )) || : # modulo here needs to match the number of colums used below if [ "$i" = 0 ]; then diff --git a/geonetwork/README.md b/geonetwork/README.md index 0e2e2919c876..4102a3f09d78 100644 --- a/geonetwork/README.md +++ b/geonetwork/README.md @@ -20,14 +20,14 @@ WARNING: [GeoNetwork opensource](https://github.com/geonetwork/docker-geonetwork) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`3.10.2`, `3.10`, `latest`](https://github.com/geonetwork/docker-geonetwork/blob/f81b111fbe3d765ee56f61c5474099764ee07004/3.10.2/Dockerfile) -- [`3.10.2-postgres`, `3.10-postgres`, `postgres`](https://github.com/geonetwork/docker-geonetwork/blob/f81b111fbe3d765ee56f61c5474099764ee07004/3.10.2/postgres/Dockerfile) -- [`3.8.3`, `3.8`](https://github.com/geonetwork/docker-geonetwork/blob/af81a4ff8f592d27b4911ad20d569379864ee85f/3.8.3/Dockerfile) -- [`3.8.3-postgres`, `3.8-postgres`](https://github.com/geonetwork/docker-geonetwork/blob/af81a4ff8f592d27b4911ad20d569379864ee85f/3.8.3/postgres/Dockerfile) +- [`3.12.8`, `3.12`, `3`](https://github.com/geonetwork/docker-geonetwork/blob/57f727acc7ac1fd74f6dc95afa58f4136c7e35b4/3.12.8/Dockerfile) +- [`3.12.8-postgres`, `3.12-postgres`, `3-postgres`](https://github.com/geonetwork/docker-geonetwork/blob/57f727acc7ac1fd74f6dc95afa58f4136c7e35b4/3.12.8/postgres/Dockerfile) +- [`4.0.6`, `4.0`](https://github.com/geonetwork/docker-geonetwork/blob/00936dcf7dbb2399405c53aa05c670fa4bb79736/4.0.6/Dockerfile) +- [`4.2.2`, `4.2`, `4`, `latest`](https://github.com/geonetwork/docker-geonetwork/blob/bf7033838f82f2d4529d70442c727808f5bfa432/4.2.2/Dockerfile) # Quick reference (cont.) @@ -35,14 +35,14 @@ WARNING: [https://github.com/geonetwork/docker-geonetwork/issues](https://github.com/geonetwork/docker-geonetwork/issues) - **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) - [`amd64`](https://hub.docker.com/r/amd64/geonetwork/) + [`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/) - **Published image artifact details**: [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)) (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/geonetwork`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fgeonetwork) + [official-images repo's `library/geonetwork` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fgeonetwork) [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)) - **Source of this description**: @@ -82,24 +82,24 @@ $ docker run --name some-geonetwork -d -p 8080:8080 geonetwork Then, if you are running docker on Linux, you may access geonetwork at http://localhost:8080/geonetwork. Otherwise, replace `localhost` by the address of your docker machine. -## Set the data directory +## Set the data directory and H2 db file -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.: Lucene index, spatial index, thumbnails). +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.: Lucene index, spatial index, thumbnails). The default variant also uses a local H2 database to store the metadata catalog itself. -By default, geonetwork sets the data directory on `/usr/local/tomcat/webapps/geonetwork/WEB-INF/data`, but you may override this value by injecting an environment variable into the container: - `-e DATA_DIR=...` (defaults to `/usr/local/tomcat/webapps/geonetwork/WEB-INF/data`) +By default, geonetwork sets the data directory on `/usr/local/tomcat/webapps/geonetwork/WEB-INF/data` and H2 database file to the tomcat bin dir `/usr/local/tomcat/gn.h2.db`, but you may override these values by injecting environment variables into the container: - `-e DATA_DIR=...` (defaults to `/usr/local/tomcat/webapps/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. -For instance, to set the data directory to `/var/lib/geonetwork_data`: +## Persisting data + +To set the data directory to `/var/lib/geonetwork/data` and H2 database file to `/var/lib/geonetwork/db/gn.h2.db` so they both persist through restarts: ```console -$ docker run --name some-geonetwork -d -p 8080:8080 -e DATA_DIR=/var/lib/geonetwork_data geonetwork +$ docker run --name some-geonetwork -d -p 8080:8080 -e DATA_DIR=/var/lib/geonetwork/data -e GEONETWORK_DB_NAME=/var/lib/geonetwork/db/gn geonetwork ``` -## Persist data - -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 `/var/lib/geonetwork_data` on the container: +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 `/var/lib/geonetwork` on the container: ```console -$ docker run --name some-geonetwork -d -p 8080:8080 -e DATA_DIR=/var/lib/geonetwork_data -v /host/geonetwork-docker:/var/lib/geonetwork_data geonetwork +$ docker run --name some-geonetwork -d -p 8080:8080 -e DATA_DIR=/var/lib/geonetwork/data -e GEONETWORK_DB_NAME=/var/lib/geonetwork/db/gn -v /host/geonetwork-docker:/var/lib/geonetwork geonetwork ``` ## ... via [`docker stack deploy`](https://docs.docker.com/engine/reference/commandline/stack_deploy/) or [`docker-compose`](https://github.com/docker/compose) diff --git a/geonetwork/content.md b/geonetwork/content.md index 679083fdbe10..2da1202a0ea8 100644 --- a/geonetwork/content.md +++ b/geonetwork/content.md @@ -32,24 +32,24 @@ $ docker run --name some-%%REPO%% -d -p 8080:8080 %%IMAGE%% Then, if you are running docker on Linux, you may access geonetwork at http://localhost:8080/geonetwork. Otherwise, replace `localhost` by the address of your docker machine. -## Set the data directory +## Set the data directory and H2 db file -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.: Lucene index, spatial index, thumbnails). +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.: Lucene index, spatial index, thumbnails). The default variant also uses a local H2 database to store the metadata catalog itself. -By default, geonetwork sets the data directory on `/usr/local/tomcat/webapps/geonetwork/WEB-INF/data`, but you may override this value by injecting an environment variable into the container: - `-e DATA_DIR=...` (defaults to `/usr/local/tomcat/webapps/geonetwork/WEB-INF/data`) +By default, geonetwork sets the data directory on `/usr/local/tomcat/webapps/geonetwork/WEB-INF/data` and H2 database file to the tomcat bin dir `/usr/local/tomcat/gn.h2.db`, but you may override these values by injecting environment variables into the container: - `-e DATA_DIR=...` (defaults to `/usr/local/tomcat/webapps/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. -For instance, to set the data directory to `/var/lib/geonetwork_data`: +## Persisting data + +To set the data directory to `/var/lib/geonetwork/data` and H2 database file to `/var/lib/geonetwork/db/gn.h2.db` so they both persist through restarts: ```console -$ docker run --name some-%%REPO%% -d -p 8080:8080 -e DATA_DIR=/var/lib/geonetwork_data %%IMAGE%% +$ docker run --name some-%%REPO%% -d -p 8080:8080 -e DATA_DIR=/var/lib/geonetwork/data -e GEONETWORK_DB_NAME=/var/lib/geonetwork/db/gn %%IMAGE%% ``` -## Persist data - -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 `/var/lib/geonetwork_data` on the container: +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 `/var/lib/geonetwork` on the container: ```console -$ docker run --name some-%%REPO%% -d -p 8080:8080 -e DATA_DIR=/var/lib/geonetwork_data -v /host/geonetwork-docker:/var/lib/geonetwork_data %%IMAGE%% +$ docker run --name some-%%REPO%% -d -p 8080:8080 -e DATA_DIR=/var/lib/geonetwork/data -e GEONETWORK_DB_NAME=/var/lib/geonetwork/db/gn -v /host/geonetwork-docker:/var/lib/geonetwork %%IMAGE%% ``` ## %%STACK%% diff --git a/ghost/README.md b/ghost/README.md index f729c345b983..6f6462ba5504 100644 --- a/ghost/README.md +++ b/ghost/README.md @@ -20,14 +20,14 @@ WARNING: [the Docker Community](https://github.com/docker-library/ghost) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`3.15.3`, `3.15`, `3`, `latest`](https://github.com/docker-library/ghost/blob/b565e6288d0c41bbdba4fcc763169e471a448cb5/3/debian/Dockerfile) -- [`3.15.3-alpine`, `3.15-alpine`, `3-alpine`, `alpine`](https://github.com/docker-library/ghost/blob/b565e6288d0c41bbdba4fcc763169e471a448cb5/3/alpine/Dockerfile) -- [`2.38.1`, `2.38`, `2`](https://github.com/docker-library/ghost/blob/292aeadfdf5d428867c2b160268540aa4d4a04c5/2/debian/Dockerfile) -- [`2.38.1-alpine`, `2.38-alpine`, `2-alpine`](https://github.com/docker-library/ghost/blob/7555f792b28dbe01d521e7edbfc4af2c6824a3ff/2/alpine/Dockerfile) +- [`5.30.0`, `5.30`, `5`, `latest`](https://github.com/docker-library/ghost/blob/6b51b1413dc7303993dec2200532cf1ff9d14cf0/5/debian/Dockerfile) +- [`5.30.0-alpine`, `5.30-alpine`, `5-alpine`, `alpine`](https://github.com/docker-library/ghost/blob/6b51b1413dc7303993dec2200532cf1ff9d14cf0/5/alpine/Dockerfile) +- [`4.48.9`, `4.48`, `4`](https://github.com/docker-library/ghost/blob/1f74dbadd9f1959422a4e42c3f9c0f5d281c4461/4/debian/Dockerfile) +- [`4.48.9-alpine`, `4.48-alpine`, `4-alpine`](https://github.com/docker-library/ghost/blob/1f74dbadd9f1959422a4e42c3f9c0f5d281c4461/4/alpine/Dockerfile) # Quick reference (cont.) @@ -35,14 +35,14 @@ WARNING: [https://github.com/docker-library/ghost/issues](https://github.com/docker-library/ghost/issues) - **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) - [`amd64`](https://hub.docker.com/r/amd64/ghost/), [`arm32v6`](https://hub.docker.com/r/arm32v6/ghost/), [`arm32v7`](https://hub.docker.com/r/arm32v7/ghost/), [`arm64v8`](https://hub.docker.com/r/arm64v8/ghost/), [`i386`](https://hub.docker.com/r/i386/ghost/), [`ppc64le`](https://hub.docker.com/r/ppc64le/ghost/), [`s390x`](https://hub.docker.com/r/s390x/ghost/) + [`amd64`](https://hub.docker.com/r/amd64/ghost/), [`arm32v6`](https://hub.docker.com/r/arm32v6/ghost/), [`arm32v7`](https://hub.docker.com/r/arm32v7/ghost/), [`arm64v8`](https://hub.docker.com/r/arm64v8/ghost/), [`ppc64le`](https://hub.docker.com/r/ppc64le/ghost/), [`s390x`](https://hub.docker.com/r/s390x/ghost/) - **Published image artifact details**: [repo-info repo's `repos/ghost/` directory](https://github.com/docker-library/repo-info/blob/master/repos/ghost) ([history](https://github.com/docker-library/repo-info/commits/master/repos/ghost)) (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/ghost`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fghost) + [official-images repo's `library/ghost` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fghost) [official-images repo's `library/ghost` file](https://github.com/docker-library/official-images/blob/master/library/ghost) ([history](https://github.com/docker-library/official-images/commits/master/library/ghost)) - **Source of this description**: @@ -58,10 +58,10 @@ Ghost is a free and open source blogging platform written in JavaScript and dist # How to use this image -This will start a Ghost instance listening on the default Ghost port of 2368. +This will start a Ghost development instance listening on the default Ghost port of 2368. ```console -$ docker run -d --name some-ghost ghost +$ docker run -d --name some-ghost -e NODE_ENV=development ghost ``` ## Custom port @@ -69,14 +69,14 @@ $ docker run -d --name some-ghost ghost If you'd like to be able to access the instance from the host without the container's IP, standard port mappings can be used: ```console -$ docker run -d --name some-ghost -e url=http://localhost:3001 -p 3001:2368 ghost +$ docker run -d --name some-ghost -e NODE_ENV=development -e url=http://localhost:3001 -p 3001:2368 ghost ``` If all goes well, you'll be able to access your new site on `http://localhost:3001` and `http://localhost:3001/ghost` to access Ghost Admin (or `http://host-ip:3001` and `http://host-ip:3001/ghost`, respectively). ### Upgrading Ghost -You will want to ensure you are running the latest minor version (1.25.5 or 0.11.9) of Ghost before upgrading major versions. Otherwise, you may run into database errors. +You will want to ensure you are running the latest minor version of Ghost before upgrading major versions. Otherwise, you may run into database errors. For upgrading your Ghost container you will want to mount your data to the appropriate path in the predecessor container (see below): import your content from the admin panel, stop the container, and then re-mount your content to the successor container you are upgrading into; you can then export your content from the admin panel. @@ -84,36 +84,24 @@ For upgrading your Ghost container you will want to mount your data to the appro Mount your existing content. In this example we also use the Alpine base image. -### Ghost 1.x.x - -```console -$ docker run -d --name some-ghost -p 3001:2368 -v /path/to/ghost/blog:/var/lib/ghost/content ghost:1-alpine -``` - -### Ghost 0.11.xx - ```console -$ docker run -d --name some-ghost -p 3001:2368 -v /path/to/ghost/blog:/var/lib/ghost ghost:0.11-alpine +$ docker run -d --name some-ghost -e NODE_ENV=development -p 3001:2368 -v /path/to/ghost/blog:/var/lib/ghost/content ghost:alpine ``` ### Docker Volume -Alternatively you can use a [data container](http://docs.docker.com/engine/tutorials/dockervolumes/) that has a volume that points to `/var/lib/ghost/content` (or /var/lib/ghost for 0.11.x) and then reference it: +Alternatively you can use a named [docker volume](https://docs.docker.com/storage/volumes/) instead of a direct host path for `/var/lib/ghost/content`: ```console -$ docker run -d --name some-ghost --volumes-from some-ghost-data ghost +$ docker run -d --name some-ghost -e NODE_ENV=development -v some-ghost-data:/var/lib/ghost/content ghost ``` -### SQLite Database - -This Docker image for Ghost uses SQLite. There is nothing special to configure. - ## Configuration -All Ghost configuration parameters (such as `url`) can be specified via environment variables. See [the Ghost documentation](https://docs.ghost.org/docs/config#section-running-ghost-with-config-env-variables) for details about what configuration is allowed and how to convert a nested configuration key into the appropriate environment variable name: +All Ghost configuration parameters (such as `url`) can be specified via environment variables. See [the Ghost documentation](https://ghost.org/docs/concepts/config/#running-ghost-with-config-env-variables) for details about what configuration is allowed and how to convert a nested configuration key into the appropriate environment variable name: ```console -$ docker run -d --name some-ghost -e url=http://some-ghost.example.com ghost +$ docker run -d --name some-ghost -e NODE_ENV=development -e url=http://some-ghost.example.com ghost ``` (There are further configuration examples in the `stack.yml` listed below.) @@ -124,46 +112,53 @@ When opening a ticket at https://github.com/TryGhost/Ghost/issues it becomes nec ```console $ docker exec node --version -v6.11.2 +[node version output] ``` ## Note about Ghost-CLI While the Docker images do have Ghost-CLI available and do use some of its commands to set up the base Ghost image, many of the other Ghost-CLI commands won't work correctly, and really aren't designed/intended to. For more info see [docker-library/ghost#156 (comment)](https://github.com/docker-library/ghost/issues/156#issuecomment-428159861) +## Production mode + +To run Ghost for production you'll also need to be running with MySQL 8, https, and a reverse proxy configured with appropriate `X-Forwarded-For`, `X-Forwared-Host`, and `X-Forwarded-Proto` (`https`) headers. + +The following example demonstrates some of the necessary configuration for running with MySQL. For more detail, see [Ghost's "Configuration options" documentation](https://ghost.org/docs/config/#configuration-options). + ## ... via [`docker stack deploy`](https://docs.docker.com/engine/reference/commandline/stack_deploy/) or [`docker-compose`](https://github.com/docker/compose) Example `stack.yml` for `ghost`: ```yaml -# by default, the Ghost image will use SQLite (and thus requires no separate database container) -# we have used MySQL here merely for demonstration purposes (especially environment-variable-based configuration) - version: '3.1' services: ghost: - image: ghost:1-alpine + image: ghost:4-alpine restart: always ports: - 8080:2368 environment: - # see https://docs.ghost.org/docs/config#section-running-ghost-with-config-env-variables + # see https://ghost.org/docs/config/#configuration-options database__client: mysql database__connection__host: db database__connection__user: root database__connection__password: example database__connection__database: ghost + # this url value is just an example, and is likely wrong for your environment! + url: http://localhost:8080 + # contrary to the default mentioned in the linked documentation, this image defaults to NODE_ENV=production (so development mode needs to be explicitly specified if desired) + #NODE_ENV: development db: - image: mysql:5.7 + image: mysql:8.0 restart: always environment: MYSQL_ROOT_PASSWORD: example ``` -[![Try in PWD](https://github.com/play-with-docker/stacks/raw/cff22438cb4195ace27f9b15784bbb497047afa7/assets/images/button.png)](http://play-with-docker.com?stack=https://raw.githubusercontent.com/docker-library/docs/e24f39cddf21560cf0a24f149059ff23640b0f16/ghost/stack.yml) +[![Try in PWD](https://github.com/play-with-docker/stacks/raw/cff22438cb4195ace27f9b15784bbb497047afa7/assets/images/button.png)](http://play-with-docker.com?stack=https://raw.githubusercontent.com/docker-library/docs/57f9907ee5bbeaede8c97f439b9c11bc1081dd75/ghost/stack.yml) Run `docker stack deploy -c stack.yml ghost` (or `docker-compose -f stack.yml up`), wait for it to initialize completely, and visit `http://swarm-ip:8080`, `http://localhost:8080`, or `http://host-ip:8080` (as appropriate). @@ -177,9 +172,9 @@ This is the defacto image. If you are unsure about what your needs are, you prob ## `ghost:-alpine` -This image is based on the popular [Alpine Linux project](http://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. +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. -This variant is highly recommended when final image size being as small as possible is desired. The main caveat to note is that it does use [musl libc](http://www.musl-libc.org) instead of [glibc and friends](http://www.etalabs.net/compare_libcs.html), so certain software might run into issues depending on the depth of their libc requirements. However, most software doesn't have an issue with this, so this variant is usually a very safe choice. 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. +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. 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). diff --git a/ghost/content.md b/ghost/content.md index 0057a20809c9..d475b3ea12e2 100644 --- a/ghost/content.md +++ b/ghost/content.md @@ -8,10 +8,10 @@ Ghost is a free and open source blogging platform written in JavaScript and dist # How to use this image -This will start a Ghost instance listening on the default Ghost port of 2368. +This will start a Ghost development instance listening on the default Ghost port of 2368. ```console -$ docker run -d --name some-ghost %%IMAGE%% +$ docker run -d --name some-ghost -e NODE_ENV=development %%IMAGE%% ``` ## Custom port @@ -19,14 +19,14 @@ $ docker run -d --name some-ghost %%IMAGE%% If you'd like to be able to access the instance from the host without the container's IP, standard port mappings can be used: ```console -$ docker run -d --name some-ghost -e url=http://localhost:3001 -p 3001:2368 %%IMAGE%% +$ docker run -d --name some-ghost -e NODE_ENV=development -e url=http://localhost:3001 -p 3001:2368 %%IMAGE%% ``` If all goes well, you'll be able to access your new site on `http://localhost:3001` and `http://localhost:3001/ghost` to access Ghost Admin (or `http://host-ip:3001` and `http://host-ip:3001/ghost`, respectively). ### Upgrading Ghost -You will want to ensure you are running the latest minor version (1.25.5 or 0.11.9) of Ghost before upgrading major versions. Otherwise, you may run into database errors. +You will want to ensure you are running the latest minor version of Ghost before upgrading major versions. Otherwise, you may run into database errors. For upgrading your Ghost container you will want to mount your data to the appropriate path in the predecessor container (see below): import your content from the admin panel, stop the container, and then re-mount your content to the successor container you are upgrading into; you can then export your content from the admin panel. @@ -34,36 +34,24 @@ For upgrading your Ghost container you will want to mount your data to the appro Mount your existing content. In this example we also use the Alpine base image. -### Ghost 1.x.x - -```console -$ docker run -d --name some-ghost -p 3001:2368 -v /path/to/ghost/blog:/var/lib/ghost/content %%IMAGE%%:1-alpine -``` - -### Ghost 0.11.xx - ```console -$ docker run -d --name some-ghost -p 3001:2368 -v /path/to/ghost/blog:/var/lib/ghost %%IMAGE%%:0.11-alpine +$ docker run -d --name some-ghost -e NODE_ENV=development -p 3001:2368 -v /path/to/ghost/blog:/var/lib/ghost/content %%IMAGE%%:alpine ``` ### Docker Volume -Alternatively you can use a [data container](http://docs.docker.com/engine/tutorials/dockervolumes/) that has a volume that points to `/var/lib/ghost/content` (or /var/lib/ghost for 0.11.x) and then reference it: +Alternatively you can use a named [docker volume](https://docs.docker.com/storage/volumes/) instead of a direct host path for `/var/lib/ghost/content`: ```console -$ docker run -d --name some-ghost --volumes-from some-ghost-data %%IMAGE%% +$ docker run -d --name some-ghost -e NODE_ENV=development -v some-ghost-data:/var/lib/ghost/content %%IMAGE%% ``` -### SQLite Database - -This Docker image for Ghost uses SQLite. There is nothing special to configure. - ## Configuration -All Ghost configuration parameters (such as `url`) can be specified via environment variables. See [the Ghost documentation](https://docs.ghost.org/docs/config#section-running-ghost-with-config-env-variables) for details about what configuration is allowed and how to convert a nested configuration key into the appropriate environment variable name: +All Ghost configuration parameters (such as `url`) can be specified via environment variables. See [the Ghost documentation](https://ghost.org/docs/concepts/config/#running-ghost-with-config-env-variables) for details about what configuration is allowed and how to convert a nested configuration key into the appropriate environment variable name: ```console -$ docker run -d --name some-ghost -e url=http://some-ghost.example.com %%IMAGE%% +$ docker run -d --name some-ghost -e NODE_ENV=development -e url=http://some-ghost.example.com %%IMAGE%% ``` (There are further configuration examples in the `stack.yml` listed below.) @@ -74,13 +62,19 @@ When opening a ticket at https://github.com/TryGhost/Ghost/issues it becomes nec ```console $ docker exec node --version -v6.11.2 +[node version output] ``` ## Note about Ghost-CLI While the Docker images do have Ghost-CLI available and do use some of its commands to set up the base Ghost image, many of the other Ghost-CLI commands won't work correctly, and really aren't designed/intended to. For more info see [docker-library/ghost#156 (comment)](https://github.com/docker-library/ghost/issues/156#issuecomment-428159861) +## Production mode + +To run Ghost for production you'll also need to be running with MySQL 8, https, and a reverse proxy configured with appropriate `X-Forwarded-For`, `X-Forwared-Host`, and `X-Forwarded-Proto` (`https`) headers. + +The following example demonstrates some of the necessary configuration for running with MySQL. For more detail, see [Ghost's "Configuration options" documentation](https://ghost.org/docs/config/#configuration-options). + ## %%STACK%% Run `docker stack deploy -c stack.yml %%REPO%%` (or `docker-compose -f stack.yml up`), wait for it to initialize completely, and visit `http://swarm-ip:8080`, `http://localhost:8080`, or `http://host-ip:8080` (as appropriate). diff --git a/ghost/stack.yml b/ghost/stack.yml index 2d17bb48ce34..eefc6e8a709b 100644 --- a/ghost/stack.yml +++ b/ghost/stack.yml @@ -1,25 +1,26 @@ -# by default, the Ghost image will use SQLite (and thus requires no separate database container) -# we have used MySQL here merely for demonstration purposes (especially environment-variable-based configuration) - version: '3.1' services: ghost: - image: ghost:1-alpine + image: ghost:4-alpine restart: always ports: - 8080:2368 environment: - # see https://docs.ghost.org/docs/config#section-running-ghost-with-config-env-variables + # see https://ghost.org/docs/config/#configuration-options database__client: mysql database__connection__host: db database__connection__user: root database__connection__password: example database__connection__database: ghost + # this url value is just an example, and is likely wrong for your environment! + url: http://localhost:8080 + # contrary to the default mentioned in the linked documentation, this image defaults to NODE_ENV=production (so development mode needs to be explicitly specified if desired) + #NODE_ENV: development db: - image: mysql:5.7 + image: mysql:8.0 restart: always environment: MYSQL_ROOT_PASSWORD: example diff --git a/golang/README.md b/golang/README.md index 884b5c5d3dc3..642ff5b72fd6 100644 --- a/golang/README.md +++ b/golang/README.md @@ -20,7 +20,7 @@ WARNING: [the Docker Community](https://github.com/docker-library/golang) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links @@ -28,40 +28,63 @@ WARNING: ## Simple Tags -- [`1.14.3-buster`, `1.14-buster`, `1-buster`, `buster`](https://github.com/docker-library/golang/blob/d57a23e1c68ef0a393ef9c9267bddf0086959e3e/1.14/buster/Dockerfile) -- [`1.14.3-stretch`, `1.14-stretch`, `1-stretch`, `stretch`](https://github.com/docker-library/golang/blob/d57a23e1c68ef0a393ef9c9267bddf0086959e3e/1.14/stretch/Dockerfile) -- [`1.14.3-alpine3.11`, `1.14-alpine3.11`, `1-alpine3.11`, `alpine3.11`, `1.14.3-alpine`, `1.14-alpine`, `1-alpine`, `alpine`](https://github.com/docker-library/golang/blob/d57a23e1c68ef0a393ef9c9267bddf0086959e3e/1.14/alpine3.11/Dockerfile) -- [`1.14.3-windowsservercore-ltsc2016`, `1.14-windowsservercore-ltsc2016`, `1-windowsservercore-ltsc2016`, `windowsservercore-ltsc2016`](https://github.com/docker-library/golang/blob/d57a23e1c68ef0a393ef9c9267bddf0086959e3e/1.14/windows/windowsservercore-ltsc2016/Dockerfile) -- [`1.14.3-windowsservercore-1809`, `1.14-windowsservercore-1809`, `1-windowsservercore-1809`, `windowsservercore-1809`](https://github.com/docker-library/golang/blob/d57a23e1c68ef0a393ef9c9267bddf0086959e3e/1.14/windows/windowsservercore-1809/Dockerfile) -- [`1.14.3-nanoserver-1809`, `1.14-nanoserver-1809`, `1-nanoserver-1809`, `nanoserver-1809`](https://github.com/docker-library/golang/blob/d57a23e1c68ef0a393ef9c9267bddf0086959e3e/1.14/windows/nanoserver-1809/Dockerfile) -- [`1.13.11-buster`, `1.13-buster`](https://github.com/docker-library/golang/blob/fa9e58f43dbaa227cf05f1b0dc5504f73a50bf41/1.13/buster/Dockerfile) -- [`1.13.11-stretch`, `1.13-stretch`](https://github.com/docker-library/golang/blob/fa9e58f43dbaa227cf05f1b0dc5504f73a50bf41/1.13/stretch/Dockerfile) -- [`1.13.11-alpine3.11`, `1.13-alpine3.11`, `1.13.11-alpine`, `1.13-alpine`](https://github.com/docker-library/golang/blob/fa9e58f43dbaa227cf05f1b0dc5504f73a50bf41/1.13/alpine3.11/Dockerfile) -- [`1.13.11-alpine3.10`, `1.13-alpine3.10`](https://github.com/docker-library/golang/blob/fa9e58f43dbaa227cf05f1b0dc5504f73a50bf41/1.13/alpine3.10/Dockerfile) -- [`1.13.11-windowsservercore-ltsc2016`, `1.13-windowsservercore-ltsc2016`](https://github.com/docker-library/golang/blob/fa9e58f43dbaa227cf05f1b0dc5504f73a50bf41/1.13/windows/windowsservercore-ltsc2016/Dockerfile) -- [`1.13.11-windowsservercore-1809`, `1.13-windowsservercore-1809`](https://github.com/docker-library/golang/blob/fa9e58f43dbaa227cf05f1b0dc5504f73a50bf41/1.13/windows/windowsservercore-1809/Dockerfile) -- [`1.13.11-nanoserver-1809`, `1.13-nanoserver-1809`](https://github.com/docker-library/golang/blob/fa9e58f43dbaa227cf05f1b0dc5504f73a50bf41/1.13/windows/nanoserver-1809/Dockerfile) +- [`1.20rc3-bullseye`, `1.20-rc-bullseye`](https://github.com/docker-library/golang/blob/9a135136dcd3d56a39e1f40c5b264938eac0c7ee/1.20-rc/bullseye/Dockerfile) +- [`1.20rc3-buster`, `1.20-rc-buster`](https://github.com/docker-library/golang/blob/9a135136dcd3d56a39e1f40c5b264938eac0c7ee/1.20-rc/buster/Dockerfile) +- [`1.20rc3-alpine3.17`, `1.20-rc-alpine3.17`, `1.20rc3-alpine`, `1.20-rc-alpine`](https://github.com/docker-library/golang/blob/9a135136dcd3d56a39e1f40c5b264938eac0c7ee/1.20-rc/alpine3.17/Dockerfile) +- [`1.20rc3-alpine3.16`, `1.20-rc-alpine3.16`](https://github.com/docker-library/golang/blob/9a135136dcd3d56a39e1f40c5b264938eac0c7ee/1.20-rc/alpine3.16/Dockerfile) +- [`1.20rc3-windowsservercore-ltsc2022`, `1.20-rc-windowsservercore-ltsc2022`](https://github.com/docker-library/golang/blob/9a135136dcd3d56a39e1f40c5b264938eac0c7ee/1.20-rc/windows/windowsservercore-ltsc2022/Dockerfile) +- [`1.20rc3-windowsservercore-1809`, `1.20-rc-windowsservercore-1809`](https://github.com/docker-library/golang/blob/9a135136dcd3d56a39e1f40c5b264938eac0c7ee/1.20-rc/windows/windowsservercore-1809/Dockerfile) +- [`1.20rc3-nanoserver-ltsc2022`, `1.20-rc-nanoserver-ltsc2022`](https://github.com/docker-library/golang/blob/9a135136dcd3d56a39e1f40c5b264938eac0c7ee/1.20-rc/windows/nanoserver-ltsc2022/Dockerfile) +- [`1.20rc3-nanoserver-1809`, `1.20-rc-nanoserver-1809`](https://github.com/docker-library/golang/blob/9a135136dcd3d56a39e1f40c5b264938eac0c7ee/1.20-rc/windows/nanoserver-1809/Dockerfile) +- [`1.19.5-bullseye`, `1.19-bullseye`, `1-bullseye`, `bullseye`](https://github.com/docker-library/golang/blob/8e04c39d2ce4466162418245c8b1178951021321/1.19/bullseye/Dockerfile) +- [`1.19.5-buster`, `1.19-buster`, `1-buster`, `buster`](https://github.com/docker-library/golang/blob/8e04c39d2ce4466162418245c8b1178951021321/1.19/buster/Dockerfile) +- [`1.19.5-alpine3.17`, `1.19-alpine3.17`, `1-alpine3.17`, `alpine3.17`, `1.19.5-alpine`, `1.19-alpine`, `1-alpine`, `alpine`](https://github.com/docker-library/golang/blob/8e04c39d2ce4466162418245c8b1178951021321/1.19/alpine3.17/Dockerfile) +- [`1.19.5-alpine3.16`, `1.19-alpine3.16`, `1-alpine3.16`, `alpine3.16`](https://github.com/docker-library/golang/blob/8e04c39d2ce4466162418245c8b1178951021321/1.19/alpine3.16/Dockerfile) +- [`1.19.5-windowsservercore-ltsc2022`, `1.19-windowsservercore-ltsc2022`, `1-windowsservercore-ltsc2022`, `windowsservercore-ltsc2022`](https://github.com/docker-library/golang/blob/8e04c39d2ce4466162418245c8b1178951021321/1.19/windows/windowsservercore-ltsc2022/Dockerfile) +- [`1.19.5-windowsservercore-1809`, `1.19-windowsservercore-1809`, `1-windowsservercore-1809`, `windowsservercore-1809`](https://github.com/docker-library/golang/blob/8e04c39d2ce4466162418245c8b1178951021321/1.19/windows/windowsservercore-1809/Dockerfile) +- [`1.19.5-nanoserver-ltsc2022`, `1.19-nanoserver-ltsc2022`, `1-nanoserver-ltsc2022`, `nanoserver-ltsc2022`](https://github.com/docker-library/golang/blob/8e04c39d2ce4466162418245c8b1178951021321/1.19/windows/nanoserver-ltsc2022/Dockerfile) +- [`1.19.5-nanoserver-1809`, `1.19-nanoserver-1809`, `1-nanoserver-1809`, `nanoserver-1809`](https://github.com/docker-library/golang/blob/8e04c39d2ce4466162418245c8b1178951021321/1.19/windows/nanoserver-1809/Dockerfile) +- [`1.18.10-bullseye`, `1.18-bullseye`](https://github.com/docker-library/golang/blob/f28358ce7460e4b8fe0c5ef7c1c4cc54f0f6ea15/1.18/bullseye/Dockerfile) +- [`1.18.10-buster`, `1.18-buster`](https://github.com/docker-library/golang/blob/f28358ce7460e4b8fe0c5ef7c1c4cc54f0f6ea15/1.18/buster/Dockerfile) +- [`1.18.10-alpine3.17`, `1.18-alpine3.17`, `1.18.10-alpine`, `1.18-alpine`](https://github.com/docker-library/golang/blob/f28358ce7460e4b8fe0c5ef7c1c4cc54f0f6ea15/1.18/alpine3.17/Dockerfile) +- [`1.18.10-alpine3.16`, `1.18-alpine3.16`](https://github.com/docker-library/golang/blob/f28358ce7460e4b8fe0c5ef7c1c4cc54f0f6ea15/1.18/alpine3.16/Dockerfile) +- [`1.18.10-windowsservercore-ltsc2022`, `1.18-windowsservercore-ltsc2022`](https://github.com/docker-library/golang/blob/f28358ce7460e4b8fe0c5ef7c1c4cc54f0f6ea15/1.18/windows/windowsservercore-ltsc2022/Dockerfile) +- [`1.18.10-windowsservercore-1809`, `1.18-windowsservercore-1809`](https://github.com/docker-library/golang/blob/f28358ce7460e4b8fe0c5ef7c1c4cc54f0f6ea15/1.18/windows/windowsservercore-1809/Dockerfile) +- [`1.18.10-nanoserver-ltsc2022`, `1.18-nanoserver-ltsc2022`](https://github.com/docker-library/golang/blob/f28358ce7460e4b8fe0c5ef7c1c4cc54f0f6ea15/1.18/windows/nanoserver-ltsc2022/Dockerfile) +- [`1.18.10-nanoserver-1809`, `1.18-nanoserver-1809`](https://github.com/docker-library/golang/blob/f28358ce7460e4b8fe0c5ef7c1c4cc54f0f6ea15/1.18/windows/nanoserver-1809/Dockerfile) ## Shared Tags -- `1.14.3`, `1.14`, `1`, `latest`: - - [`1.14.3-buster`](https://github.com/docker-library/golang/blob/d57a23e1c68ef0a393ef9c9267bddf0086959e3e/1.14/buster/Dockerfile) - - [`1.14.3-windowsservercore-ltsc2016`](https://github.com/docker-library/golang/blob/d57a23e1c68ef0a393ef9c9267bddf0086959e3e/1.14/windows/windowsservercore-ltsc2016/Dockerfile) - - [`1.14.3-windowsservercore-1809`](https://github.com/docker-library/golang/blob/d57a23e1c68ef0a393ef9c9267bddf0086959e3e/1.14/windows/windowsservercore-1809/Dockerfile) -- `1.14.3-windowsservercore`, `1.14-windowsservercore`, `1-windowsservercore`, `windowsservercore`: - - [`1.14.3-windowsservercore-ltsc2016`](https://github.com/docker-library/golang/blob/d57a23e1c68ef0a393ef9c9267bddf0086959e3e/1.14/windows/windowsservercore-ltsc2016/Dockerfile) - - [`1.14.3-windowsservercore-1809`](https://github.com/docker-library/golang/blob/d57a23e1c68ef0a393ef9c9267bddf0086959e3e/1.14/windows/windowsservercore-1809/Dockerfile) -- `1.14.3-nanoserver`, `1.14-nanoserver`, `1-nanoserver`, `nanoserver`: - - [`1.14.3-nanoserver-1809`](https://github.com/docker-library/golang/blob/d57a23e1c68ef0a393ef9c9267bddf0086959e3e/1.14/windows/nanoserver-1809/Dockerfile) -- `1.13.11`, `1.13`: - - [`1.13.11-buster`](https://github.com/docker-library/golang/blob/fa9e58f43dbaa227cf05f1b0dc5504f73a50bf41/1.13/buster/Dockerfile) - - [`1.13.11-windowsservercore-ltsc2016`](https://github.com/docker-library/golang/blob/fa9e58f43dbaa227cf05f1b0dc5504f73a50bf41/1.13/windows/windowsservercore-ltsc2016/Dockerfile) - - [`1.13.11-windowsservercore-1809`](https://github.com/docker-library/golang/blob/fa9e58f43dbaa227cf05f1b0dc5504f73a50bf41/1.13/windows/windowsservercore-1809/Dockerfile) -- `1.13.11-windowsservercore`, `1.13-windowsservercore`: - - [`1.13.11-windowsservercore-ltsc2016`](https://github.com/docker-library/golang/blob/fa9e58f43dbaa227cf05f1b0dc5504f73a50bf41/1.13/windows/windowsservercore-ltsc2016/Dockerfile) - - [`1.13.11-windowsservercore-1809`](https://github.com/docker-library/golang/blob/fa9e58f43dbaa227cf05f1b0dc5504f73a50bf41/1.13/windows/windowsservercore-1809/Dockerfile) -- `1.13.11-nanoserver`, `1.13-nanoserver`: - - [`1.13.11-nanoserver-1809`](https://github.com/docker-library/golang/blob/fa9e58f43dbaa227cf05f1b0dc5504f73a50bf41/1.13/windows/nanoserver-1809/Dockerfile) +- `1.20rc3`, `1.20-rc`: + - [`1.20rc3-bullseye`](https://github.com/docker-library/golang/blob/9a135136dcd3d56a39e1f40c5b264938eac0c7ee/1.20-rc/bullseye/Dockerfile) + - [`1.20rc3-windowsservercore-ltsc2022`](https://github.com/docker-library/golang/blob/9a135136dcd3d56a39e1f40c5b264938eac0c7ee/1.20-rc/windows/windowsservercore-ltsc2022/Dockerfile) + - [`1.20rc3-windowsservercore-1809`](https://github.com/docker-library/golang/blob/9a135136dcd3d56a39e1f40c5b264938eac0c7ee/1.20-rc/windows/windowsservercore-1809/Dockerfile) +- `1.20rc3-windowsservercore`, `1.20-rc-windowsservercore`: + - [`1.20rc3-windowsservercore-ltsc2022`](https://github.com/docker-library/golang/blob/9a135136dcd3d56a39e1f40c5b264938eac0c7ee/1.20-rc/windows/windowsservercore-ltsc2022/Dockerfile) + - [`1.20rc3-windowsservercore-1809`](https://github.com/docker-library/golang/blob/9a135136dcd3d56a39e1f40c5b264938eac0c7ee/1.20-rc/windows/windowsservercore-1809/Dockerfile) +- `1.20rc3-nanoserver`, `1.20-rc-nanoserver`: + - [`1.20rc3-nanoserver-ltsc2022`](https://github.com/docker-library/golang/blob/9a135136dcd3d56a39e1f40c5b264938eac0c7ee/1.20-rc/windows/nanoserver-ltsc2022/Dockerfile) + - [`1.20rc3-nanoserver-1809`](https://github.com/docker-library/golang/blob/9a135136dcd3d56a39e1f40c5b264938eac0c7ee/1.20-rc/windows/nanoserver-1809/Dockerfile) +- `1.19.5`, `1.19`, `1`, `latest`: + - [`1.19.5-bullseye`](https://github.com/docker-library/golang/blob/8e04c39d2ce4466162418245c8b1178951021321/1.19/bullseye/Dockerfile) + - [`1.19.5-windowsservercore-ltsc2022`](https://github.com/docker-library/golang/blob/8e04c39d2ce4466162418245c8b1178951021321/1.19/windows/windowsservercore-ltsc2022/Dockerfile) + - [`1.19.5-windowsservercore-1809`](https://github.com/docker-library/golang/blob/8e04c39d2ce4466162418245c8b1178951021321/1.19/windows/windowsservercore-1809/Dockerfile) +- `1.19.5-windowsservercore`, `1.19-windowsservercore`, `1-windowsservercore`, `windowsservercore`: + - [`1.19.5-windowsservercore-ltsc2022`](https://github.com/docker-library/golang/blob/8e04c39d2ce4466162418245c8b1178951021321/1.19/windows/windowsservercore-ltsc2022/Dockerfile) + - [`1.19.5-windowsservercore-1809`](https://github.com/docker-library/golang/blob/8e04c39d2ce4466162418245c8b1178951021321/1.19/windows/windowsservercore-1809/Dockerfile) +- `1.19.5-nanoserver`, `1.19-nanoserver`, `1-nanoserver`, `nanoserver`: + - [`1.19.5-nanoserver-ltsc2022`](https://github.com/docker-library/golang/blob/8e04c39d2ce4466162418245c8b1178951021321/1.19/windows/nanoserver-ltsc2022/Dockerfile) + - [`1.19.5-nanoserver-1809`](https://github.com/docker-library/golang/blob/8e04c39d2ce4466162418245c8b1178951021321/1.19/windows/nanoserver-1809/Dockerfile) +- `1.18.10`, `1.18`: + - [`1.18.10-bullseye`](https://github.com/docker-library/golang/blob/f28358ce7460e4b8fe0c5ef7c1c4cc54f0f6ea15/1.18/bullseye/Dockerfile) + - [`1.18.10-windowsservercore-ltsc2022`](https://github.com/docker-library/golang/blob/f28358ce7460e4b8fe0c5ef7c1c4cc54f0f6ea15/1.18/windows/windowsservercore-ltsc2022/Dockerfile) + - [`1.18.10-windowsservercore-1809`](https://github.com/docker-library/golang/blob/f28358ce7460e4b8fe0c5ef7c1c4cc54f0f6ea15/1.18/windows/windowsservercore-1809/Dockerfile) +- `1.18.10-windowsservercore`, `1.18-windowsservercore`: + - [`1.18.10-windowsservercore-ltsc2022`](https://github.com/docker-library/golang/blob/f28358ce7460e4b8fe0c5ef7c1c4cc54f0f6ea15/1.18/windows/windowsservercore-ltsc2022/Dockerfile) + - [`1.18.10-windowsservercore-1809`](https://github.com/docker-library/golang/blob/f28358ce7460e4b8fe0c5ef7c1c4cc54f0f6ea15/1.18/windows/windowsservercore-1809/Dockerfile) +- `1.18.10-nanoserver`, `1.18-nanoserver`: + - [`1.18.10-nanoserver-ltsc2022`](https://github.com/docker-library/golang/blob/f28358ce7460e4b8fe0c5ef7c1c4cc54f0f6ea15/1.18/windows/nanoserver-ltsc2022/Dockerfile) + - [`1.18.10-nanoserver-1809`](https://github.com/docker-library/golang/blob/f28358ce7460e4b8fe0c5ef7c1c4cc54f0f6ea15/1.18/windows/nanoserver-1809/Dockerfile) # Quick reference (cont.) @@ -69,14 +92,14 @@ WARNING: [https://github.com/docker-library/golang/issues](https://github.com/docker-library/golang/issues) - **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) - [`amd64`](https://hub.docker.com/r/amd64/golang/), [`arm32v6`](https://hub.docker.com/r/arm32v6/golang/), [`arm32v7`](https://hub.docker.com/r/arm32v7/golang/), [`arm64v8`](https://hub.docker.com/r/arm64v8/golang/), [`i386`](https://hub.docker.com/r/i386/golang/), [`ppc64le`](https://hub.docker.com/r/ppc64le/golang/), [`s390x`](https://hub.docker.com/r/s390x/golang/), [`windows-amd64`](https://hub.docker.com/r/winamd64/golang/) + [`amd64`](https://hub.docker.com/r/amd64/golang/), [`arm32v5`](https://hub.docker.com/r/arm32v5/golang/), [`arm32v6`](https://hub.docker.com/r/arm32v6/golang/), [`arm32v7`](https://hub.docker.com/r/arm32v7/golang/), [`arm64v8`](https://hub.docker.com/r/arm64v8/golang/), [`i386`](https://hub.docker.com/r/i386/golang/), [`mips64le`](https://hub.docker.com/r/mips64le/golang/), [`ppc64le`](https://hub.docker.com/r/ppc64le/golang/), [`s390x`](https://hub.docker.com/r/s390x/golang/), [`windows-amd64`](https://hub.docker.com/r/winamd64/golang/) - **Published image artifact details**: [repo-info repo's `repos/golang/` directory](https://github.com/docker-library/repo-info/blob/master/repos/golang) ([history](https://github.com/docker-library/repo-info/commits/master/repos/golang)) (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/golang`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fgolang) + [official-images repo's `library/golang` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fgolang) [official-images repo's `library/golang` file](https://github.com/docker-library/official-images/blob/master/library/golang) ([history](https://github.com/docker-library/official-images/commits/master/library/golang)) - **Source of this description**: @@ -92,18 +115,23 @@ Go (a.k.a., Golang) is a programming language first developed at Google. It is a # How to use this image +**Note:** `/go` is world-writable to allow flexibility in the user which runs the container (for example, in a container started with `--user 1000:1000`, running `go get github.com/example/...` into the default `$GOPATH` will succeed). While the `777` directory would be insecure on a regular host setup, there are not typically other processes or users inside the container, so this is equivalent to `700` for Docker usage, but allowing for `--user` flexibility. + ## Start a Go instance in your app -The most straightforward way to use this image is to use a Go container as both the build and runtime environment. In your `Dockerfile`, writing something along the lines of the following will compile and run your project: +The most straightforward way to use this image is to use a Go container as both the build and runtime environment. In your `Dockerfile`, writing something along the lines of the following will compile and run your project (assuming it uses `go.mod` for dependency management): ```dockerfile -FROM golang:1.13 +FROM golang:1.19 -WORKDIR /go/src/app -COPY . . +WORKDIR /usr/src/app -RUN go get -d -v ./... -RUN go install -v ./... +# pre-copy/cache go.mod for pre-downloading dependencies and only redownloading them in subsequent builds if they change +COPY go.mod go.sum ./ +RUN go mod download && go mod verify + +COPY . . +RUN go build -v -o /usr/local/bin/app ./... CMD ["app"] ``` @@ -120,13 +148,13 @@ $ docker run -it --rm --name my-running-app my-golang-app There may be occasions where it is not appropriate to run your app inside a container. To compile, but not run your app inside the Docker instance, you can write something like: ```console -$ docker run --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp golang:1.13 go build -v +$ docker run --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp golang:1.19 go build -v ``` This will add your current directory as a volume to the container, set the working directory to the volume, and run the command `go build` which will tell go to compile the project in the working directory and output the executable to `myapp`. Alternatively, if you have a `Makefile`, you can run the `make` command inside your container. ```console -$ docker run --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp golang:1.13 make +$ docker run --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp golang:1.19 make ``` ## Cross-compile your app inside the Docker container @@ -134,13 +162,13 @@ $ docker run --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp golang:1.13 make If you need to compile your application for a platform other than `linux/amd64` (such as `windows/386`): ```console -$ docker run --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp -e GOOS=windows -e GOARCH=386 golang:1.13 go build -v +$ docker run --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp -e GOOS=windows -e GOARCH=386 golang:1.19 go build -v ``` Alternatively, you can build for multiple platforms at once: ```console -$ docker run --rm -it -v "$PWD":/usr/src/myapp -w /usr/src/myapp golang:1.13 bash +$ docker run --rm -it -v "$PWD":/usr/src/myapp -w /usr/src/myapp golang:1.19 bash $ for GOOS in darwin linux; do > for GOARCH in 386 amd64; do > export GOOS GOARCH @@ -157,15 +185,17 @@ The `golang` images come in many flavors, each designed for a specific use case. 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. -Some of these tags may have names like buster or stretch 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. +Some of these tags may have names like bullseye or buster 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. ## `golang:-alpine` -This image is based on the popular [Alpine Linux project](http://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. +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. + +This variant is highly experimental, and *not* officially supported by the Go project (see [golang/go#19938](https://github.com/golang/go/issues/19938) for details). -This variant is highly recommended when final image size being as small as possible is desired. The main caveat to note is that it does use [musl libc](http://www.musl-libc.org) instead of [glibc and friends](http://www.etalabs.net/compare_libcs.html), so certain software might run into issues depending on the depth of their libc requirements. However, most software doesn't have an issue with this, so this variant is usually a very safe choice. 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. +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), which can lead to unexpected behavior. 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. -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). +To minimize image size, additional related tools (such as `git`, `gcc`, or `bash`) are not 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). See also [docker-library/golang#250 (comment)](https://github.com/docker-library/golang/issues/250#issuecomment-451201761) for a longer explanation. ## `golang:-windowsservercore` diff --git a/golang/content.md b/golang/content.md index 684a3b06ff79..e104a68f5850 100644 --- a/golang/content.md +++ b/golang/content.md @@ -8,18 +8,23 @@ Go (a.k.a., Golang) is a programming language first developed at Google. It is a # How to use this image +**Note:** `/go` is world-writable to allow flexibility in the user which runs the container (for example, in a container started with `--user 1000:1000`, running `go get github.com/example/...` into the default `$GOPATH` will succeed). While the `777` directory would be insecure on a regular host setup, there are not typically other processes or users inside the container, so this is equivalent to `700` for Docker usage, but allowing for `--user` flexibility. + ## Start a Go instance in your app -The most straightforward way to use this image is to use a Go container as both the build and runtime environment. In your `Dockerfile`, writing something along the lines of the following will compile and run your project: +The most straightforward way to use this image is to use a Go container as both the build and runtime environment. In your `Dockerfile`, writing something along the lines of the following will compile and run your project (assuming it uses `go.mod` for dependency management): ```dockerfile -FROM %%IMAGE%%:1.13 +FROM %%IMAGE%%:1.19 -WORKDIR /go/src/app -COPY . . +WORKDIR /usr/src/app -RUN go get -d -v ./... -RUN go install -v ./... +# pre-copy/cache go.mod for pre-downloading dependencies and only redownloading them in subsequent builds if they change +COPY go.mod go.sum ./ +RUN go mod download && go mod verify + +COPY . . +RUN go build -v -o /usr/local/bin/app ./... CMD ["app"] ``` @@ -36,13 +41,13 @@ $ docker run -it --rm --name my-running-app my-golang-app There may be occasions where it is not appropriate to run your app inside a container. To compile, but not run your app inside the Docker instance, you can write something like: ```console -$ docker run --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp %%IMAGE%%:1.13 go build -v +$ docker run --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp %%IMAGE%%:1.19 go build -v ``` This will add your current directory as a volume to the container, set the working directory to the volume, and run the command `go build` which will tell go to compile the project in the working directory and output the executable to `myapp`. Alternatively, if you have a `Makefile`, you can run the `make` command inside your container. ```console -$ docker run --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp %%IMAGE%%:1.13 make +$ docker run --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp %%IMAGE%%:1.19 make ``` ## Cross-compile your app inside the Docker container @@ -50,13 +55,13 @@ $ docker run --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp %%IMAGE%%:1.13 make If you need to compile your application for a platform other than `linux/amd64` (such as `windows/386`): ```console -$ docker run --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp -e GOOS=windows -e GOARCH=386 %%IMAGE%%:1.13 go build -v +$ docker run --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp -e GOOS=windows -e GOARCH=386 %%IMAGE%%:1.19 go build -v ``` Alternatively, you can build for multiple platforms at once: ```console -$ docker run --rm -it -v "$PWD":/usr/src/myapp -w /usr/src/myapp %%IMAGE%%:1.13 bash +$ docker run --rm -it -v "$PWD":/usr/src/myapp -w /usr/src/myapp %%IMAGE%%:1.19 bash $ for GOOS in darwin linux; do > for GOARCH in 386 amd64; do > export GOOS GOARCH diff --git a/golang/variant-alpine.md b/golang/variant-alpine.md new file mode 100644 index 000000000000..f14e58f4f45b --- /dev/null +++ b/golang/variant-alpine.md @@ -0,0 +1,9 @@ +## `%%IMAGE%%:-alpine` + +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. + +This variant is highly experimental, and *not* officially supported by the Go project (see [golang/go#19938](https://github.com/golang/go/issues/19938) for details). + +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), which can lead to unexpected behavior. 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. + +To minimize image size, additional related tools (such as `git`, `gcc`, or `bash`) are not 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). See also [docker-library/golang#250 (comment)](https://github.com/docker-library/golang/issues/250#issuecomment-451201761) for a longer explanation. diff --git a/gradle/README.md b/gradle/README.md index 0662bdebe319..7704bd2261c2 100644 --- a/gradle/README.md +++ b/gradle/README.md @@ -20,16 +20,29 @@ WARNING: [Keegan Witt (of the Groovy Project)](https://github.com/keeganwitt/docker-gradle), [with the Gradle Project's approval](https://discuss.gradle.org/t/official-docker-images/21159/8) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`6.4.0-jdk8`, `6.4-jdk8`, `jdk8`, `6.4.0-jdk`, `6.4-jdk`, `jdk`, `6.4.0`, `6.4`, `latest`](https://github.com/keeganwitt/docker-gradle/blob/cef7b34da71a291cd4c2f6c1020d57c8457343db/jdk8/Dockerfile) -- [`6.4.0-jre8`, `6.4-jre8`, `jre8`, `6.4.0-jre`, `6.4-jre`, `jre`](https://github.com/keeganwitt/docker-gradle/blob/cef7b34da71a291cd4c2f6c1020d57c8457343db/jre8/Dockerfile) -- [`6.4.0-jdk11`, `6.4-jdk11`, `jdk11`](https://github.com/keeganwitt/docker-gradle/blob/cef7b34da71a291cd4c2f6c1020d57c8457343db/jdk11/Dockerfile) -- [`6.4.0-jre11`, `6.4-jre11`, `jre11`](https://github.com/keeganwitt/docker-gradle/blob/cef7b34da71a291cd4c2f6c1020d57c8457343db/jre11/Dockerfile) -- [`6.4.0-jdk14`, `6.4-jdk14`, `jdk14`](https://github.com/keeganwitt/docker-gradle/blob/cef7b34da71a291cd4c2f6c1020d57c8457343db/jdk14/Dockerfile) -- [`6.4.0-jre14`, `6.4-jre14`, `jre14`](https://github.com/keeganwitt/docker-gradle/blob/cef7b34da71a291cd4c2f6c1020d57c8457343db/jre14/Dockerfile) +- [`7.6.0-jdk8`, `7.6-jdk8`, `7-jdk8`, `jdk8`, `7.6.0-jdk8-jammy`, `7.6-jdk8-jammy`, `7-jdk8-jammy`, `jdk8-jammy`](https://github.com/keeganwitt/docker-gradle/blob/24b8697d05b77df7eaacdbb20b8f9cc023d659fc/jdk8/Dockerfile) +- [`7.6.0-jdk8-focal`, `7.6-jdk8-focal`, `7-jdk8-focal`, `jdk8-focal`](https://github.com/keeganwitt/docker-gradle/blob/24b8697d05b77df7eaacdbb20b8f9cc023d659fc/jdk8-focal/Dockerfile) +- [`7.6.0-jdk11`, `7.6-jdk11`, `7-jdk11`, `jdk11`, `7.6.0-jdk11-jammy`, `7.6-jdk11-jammy`, `7-jdk11-jammy`, `jdk11-jammy`](https://github.com/keeganwitt/docker-gradle/blob/24b8697d05b77df7eaacdbb20b8f9cc023d659fc/jdk11/Dockerfile) +- [`7.6.0-jdk11-focal`, `7.6-jdk11-focal`, `7-jdk11-focal`, `jdk11-focal`](https://github.com/keeganwitt/docker-gradle/blob/24b8697d05b77df7eaacdbb20b8f9cc023d659fc/jdk11-focal/Dockerfile) +- [`7.6.0-jdk11-alpine`, `7.6-jdk11-alpine`, `7-jdk11-alpine`, `jdk11-alpine`](https://github.com/keeganwitt/docker-gradle/blob/24b8697d05b77df7eaacdbb20b8f9cc023d659fc/jdk11-alpine/Dockerfile) +- [`7.6.0-jdk17`, `7.6-jdk17`, `7-jdk17`, `jdk17`, `7.6.0-jdk`, `7.6-jdk`, `7-jdk`, `jdk`, `7.6.0`, `7.6`, `7`, `latest`, `7.6.0-jdk17-jammy`, `7.6-jdk17-jammy`, `7-jdk17-jammy`, `jdk17-jammy`, `7.6.0-jdk-jammy`, `7.6-jdk-jammy`, `7-jdk-jammy`, `jdk-jammy`, `7.6.0-jammy`, `7.6-jammy`, `7-jammy`, `jammy`](https://github.com/keeganwitt/docker-gradle/blob/24b8697d05b77df7eaacdbb20b8f9cc023d659fc/jdk17/Dockerfile) +- [`7.6.0-jdk17-focal`, `7.6-jdk17-focal`, `7-jdk17-focal`, `jdk17-focal`, `7.6.0-jdk-focal`, `7.6-jdk-focal`, `7-jdk-focal`, `jdk-focal`, `7.6.0-focal`, `7.6-focal`, `7-focal`, `focal`](https://github.com/keeganwitt/docker-gradle/blob/24b8697d05b77df7eaacdbb20b8f9cc023d659fc/jdk17-focal/Dockerfile) +- [`7.6.0-jdk17-alpine`, `7.6-jdk17-alpine`, `7-jdk17-alpine`, `jdk17-alpine`, `7.6.0-jdk-alpine`, `7.6-jdk-alpine`, `7-jdk-alpine`, `jdk-alpine`, `7.6.0-alpine`, `7.6-alpine`, `7-alpine`, `alpine`](https://github.com/keeganwitt/docker-gradle/blob/24b8697d05b77df7eaacdbb20b8f9cc023d659fc/jdk17-alpine/Dockerfile) +- [`7.6.0-jdk19`, `7.6-jdk19`, `7-jdk19`, `jdk19`, `7.6.0-jdk19-jammy`, `7.6-jdk19-jammy`, `7-jdk19-jammy`, `jdk19-jammy`](https://github.com/keeganwitt/docker-gradle/blob/24b8697d05b77df7eaacdbb20b8f9cc023d659fc/jdk19/Dockerfile) +- [`7.6.0-jdk19-focal`, `7.6-jdk19-focal`, `7-jdk19-focal`, `jdk19-focal`](https://github.com/keeganwitt/docker-gradle/blob/24b8697d05b77df7eaacdbb20b8f9cc023d659fc/jdk19-focal/Dockerfile) +- [`7.6.0-jdk19-alpine`, `7.6-jdk19-alpine`, `7-jdk19-alpine`, `jdk19-alpine`](https://github.com/keeganwitt/docker-gradle/blob/24b8697d05b77df7eaacdbb20b8f9cc023d659fc/jdk19-alpine/Dockerfile) +- [`6.9.3-jdk8`, `6.9-jdk8`, `6-jdk8`, `6.9.3-jdk8-jammy`, `6.9-jdk8-jammy`, `6-jdk8-jammy`](https://github.com/keeganwitt/docker-gradle/blob/3cf51c6d6c509c0df464a34856be4d1bc49fddf8/jdk8/Dockerfile) +- [`6.9.3-jdk8-focal`, `6.9-jdk8-focal`, `6-jdk8-focal`](https://github.com/keeganwitt/docker-gradle/blob/3cf51c6d6c509c0df464a34856be4d1bc49fddf8/jdk8-focal/Dockerfile) +- [`6.9.3-jdk11`, `6.9-jdk11`, `6-jdk11`, `6.9.3-jdk11-jammy`, `6.9-jdk11-jammy`, `6-jdk11-jammy`](https://github.com/keeganwitt/docker-gradle/blob/3cf51c6d6c509c0df464a34856be4d1bc49fddf8/jdk11/Dockerfile) +- [`6.9.3-jdk11-focal`, `6.9-jdk11-focal`, `6-jdk11-focal`](https://github.com/keeganwitt/docker-gradle/blob/3cf51c6d6c509c0df464a34856be4d1bc49fddf8/jdk11-focal/Dockerfile) +- [`6.9.3-jdk11-alpine`, `6.9-jdk11-alpine`, `6-jdk11-alpine`](https://github.com/keeganwitt/docker-gradle/blob/3cf51c6d6c509c0df464a34856be4d1bc49fddf8/jdk11-alpine/Dockerfile) +- [`6.9.3-jdk17`, `6.9-jdk17`, `6-jdk17`, `6.9.3-jdk`, `6.9-jdk`, `6-jdk`, `6.9.3`, `6.9`, `6`, `6.9.3-jdk17-jammy`, `6.9-jdk17-jammy`, `6-jdk17-jammy`, `6.9.3-jdk-jammy`, `6.9-jdk-jammy`, `6-jdk-jammy`, `6.9.3-jammy`, `6.9-jammy`, `6-jammy`](https://github.com/keeganwitt/docker-gradle/blob/3cf51c6d6c509c0df464a34856be4d1bc49fddf8/jdk17/Dockerfile) +- [`6.9.3-jdk17-focal`, `6.9-jdk17-focal`, `6-jdk17-focal`, `6.9.3-jdk-focal`, `6.9-jdk-focal`, `6-jdk-focal`, `6.9.3-focal`, `6.9-focal`, `6-focal`](https://github.com/keeganwitt/docker-gradle/blob/3cf51c6d6c509c0df464a34856be4d1bc49fddf8/jdk17-focal/Dockerfile) +- [`6.9.3-jdk17-alpine`, `6.9-jdk17-alpine`, `6-jdk17-alpine`, `6.9.3-jdk-alpine`, `6.9-jdk-alpine`, `6-jdk-alpine`, `6.9.3-alpine`, `6.9-alpine`, `6-alpine`](https://github.com/keeganwitt/docker-gradle/blob/3cf51c6d6c509c0df464a34856be4d1bc49fddf8/jdk17-alpine/Dockerfile) # Quick reference (cont.) @@ -44,7 +57,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/gradle`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fgradle) + [official-images repo's `library/gradle` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fgradle) [official-images repo's `library/gradle` file](https://github.com/docker-library/official-images/blob/master/library/gradle) ([history](https://github.com/docker-library/official-images/commits/master/library/gradle)) - **Source of this description**: @@ -68,6 +81,24 @@ Note the above command runs using uid/gid 1000 (user *gradle*) to avoid running If you are mounting a volume and the uid/gid running Docker is not *1000*, you should run as user *root* (`-u root`). *root* is also the default, so you can also simply not specify a user. +# Image Variants + +The `gradle` images come in many flavors, each designed for a specific use case. + +## `gradle:` + +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. + +Some of these tags may have names like focal or jammy in them. These are the suite code names for releases of [Ubuntu](https://wiki.ubuntu.com/Releases) 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 Ubuntu. + +## `gradle:-alpine` + +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. + +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. + +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). + # License View [license information](https://gradle.org/license/) for the software contained in this image. diff --git a/groovy/README.md b/groovy/README.md index 494a80612ce1..d77c96b418e6 100644 --- a/groovy/README.md +++ b/groovy/README.md @@ -20,16 +20,20 @@ WARNING: [the Apache Groovy project](https://github.com/groovy/docker-groovy) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`3.0.2-jdk8`, `3.0-jdk8`, `3.0.2-jdk`, `3.0-jdk`, `jdk8`, `jdk`](https://github.com/groovy/docker-groovy/blob/a4f34b40e606ef013c6e05ef9db18844befa6a47/jdk8/Dockerfile) -- [`3.0.2-jre8`, `3.0-jre8`, `3.0.2-jre`, `3.0-jre`, `3.0.2`, `3.0`, `jre8`, `jre`, `latest`](https://github.com/groovy/docker-groovy/blob/a4f34b40e606ef013c6e05ef9db18844befa6a47/jre8/Dockerfile) -- [`3.0.2-jdk11`, `3.0-jdk11`, `jdk11`](https://github.com/groovy/docker-groovy/blob/a4f34b40e606ef013c6e05ef9db18844befa6a47/jdk11/Dockerfile) -- [`3.0.2-jre11`, `3.0-jre11`, `jre11`](https://github.com/groovy/docker-groovy/blob/a4f34b40e606ef013c6e05ef9db18844befa6a47/jre11/Dockerfile) -- [`3.0.2-jdk14`, `3.0-jdk14`, `jdk14`](https://github.com/groovy/docker-groovy/blob/a4f34b40e606ef013c6e05ef9db18844befa6a47/jdk14/Dockerfile) -- [`3.0.2-jre14`, `3.0-jre14`, `jre14`](https://github.com/groovy/docker-groovy/blob/a4f34b40e606ef013c6e05ef9db18844befa6a47/jre14/Dockerfile) +- [`3.0.14-jdk8`, `3.0-jdk8`, `jdk8`, `3.0.14-jdk8-jammy`, `3.0-jdk8-jammy`, `jdk8-jammy`](https://github.com/groovy/docker-groovy/blob/bc4c3ee2a4e26f14458b121f238bb862c9de6b27/jdk8/Dockerfile) +- [`3.0.14-jdk11`, `3.0-jdk11`, `jdk11`, `3.0.14-jdk11-jammy`, `3.0-jdk11-jammy`, `jdk11-jammy`](https://github.com/groovy/docker-groovy/blob/bc4c3ee2a4e26f14458b121f238bb862c9de6b27/jdk11/Dockerfile) +- [`3.0.14-jdk11-alpine`, `3.0-jdk11-alpine`, `jdk11-alpine`](https://github.com/groovy/docker-groovy/blob/bc4c3ee2a4e26f14458b121f238bb862c9de6b27/jdk11-alpine/Dockerfile) +- [`3.0.14-jdk17`, `3.0-jdk17`, `jdk17`, `3.0.14-jdk`, `3.0-jdk`, `3.0.14`, `3.0`, `3`, `jdk`, `latest`, `3.0.14-jdk17-jammy`, `3.0-jdk17-jammy`, `jdk17-jammy`, `3.0.14-jdk-jammy`, `3.0-jdk-jammy`, `3.0.14-jammy`, `3.0-jammy`, `3-jammy`, `jdk-jammy`, `jammy`](https://github.com/groovy/docker-groovy/blob/bc4c3ee2a4e26f14458b121f238bb862c9de6b27/jdk17/Dockerfile) +- [`3.0.14-jdk17-alpine`, `3.0-jdk17-alpine`, `jdk17-alpine`, `3.0.14-jdk-alpine`, `3.0-jdk-alpine`, `3.0.14-alpine`, `3.0-alpine`, `3-alpine`, `jdk-alpine`, `alpine`](https://github.com/groovy/docker-groovy/blob/bc4c3ee2a4e26f14458b121f238bb862c9de6b27/jdk17-alpine/Dockerfile) +- [`4.0.7-jdk8`, `4.0-jdk8`, `4.0.7-jdk8-jammy`, `4.0-jdk8-jammy`](https://github.com/groovy/docker-groovy/blob/085e0eb9a0611dd84c16efdcad26f352157d6f79/jdk8/Dockerfile) +- [`4.0.7-jdk11`, `4.0-jdk11`, `4.0.7-jdk11-jammy`, `4.0-jdk11-jammy`](https://github.com/groovy/docker-groovy/blob/085e0eb9a0611dd84c16efdcad26f352157d6f79/jdk11/Dockerfile) +- [`4.0.7-jdk11-alpine`, `4.0-jdk11-alpine`](https://github.com/groovy/docker-groovy/blob/085e0eb9a0611dd84c16efdcad26f352157d6f79/jdk11-alpine/Dockerfile) +- [`4.0.7-jdk17`, `4.0-jdk17`, `4.0.7-jdk`, `4.0.7`, `4.0`, `4`, `4.0.7-jdk17-jammy`, `4.0-jdk17-jammy`, `4.0.7-jdk-jammy`, `4.0.7-jammy`, `4.0-jammy`, `4-jammy`](https://github.com/groovy/docker-groovy/blob/085e0eb9a0611dd84c16efdcad26f352157d6f79/jdk17/Dockerfile) +- [`4.0.7-jdk17-alpine`, `4.0-jdk17-alpine`, `4.0.7-jdk-alpine`, `4.0.7-alpine`, `4.0-alpine`, `4-alpine`](https://github.com/groovy/docker-groovy/blob/085e0eb9a0611dd84c16efdcad26f352157d6f79/jdk17-alpine/Dockerfile) # Quick reference (cont.) @@ -44,7 +48,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/groovy`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fgroovy) + [official-images repo's `library/groovy` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fgroovy) [official-images repo's `library/groovy` file](https://github.com/docker-library/official-images/blob/master/library/groovy) ([history](https://github.com/docker-library/official-images/commits/master/library/groovy)) - **Source of this description**: @@ -77,6 +81,24 @@ docker volume create --name grapes-cache docker run --rm -it -v grapes-cache:/home/groovy/.groovy/grapes groovy ``` +# Image Variants + +The `groovy` images come in many flavors, each designed for a specific use case. + +## `groovy:` + +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. + +Some of these tags may have names like jammy in them. These are the suite code names for releases of [Ubuntu](https://wiki.ubuntu.com/Releases) 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 Ubuntu. + +## `groovy:-alpine` + +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. + +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. + +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). + # License View [license information](http://www.apache.org/licenses/LICENSE-2.0.html) for the software contained in this image. diff --git a/haproxy/README.md b/haproxy/README.md index 28dbc83a44c1..bbbc263407da 100644 --- a/haproxy/README.md +++ b/haproxy/README.md @@ -20,24 +20,24 @@ WARNING: [the Docker Community](https://github.com/docker-library/haproxy) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`2.2-dev7`, `2.2-rc`](https://github.com/docker-library/haproxy/blob/e5884936dca8ee8968522abff21713042983a898/2.2-rc/Dockerfile) -- [`2.2-dev7-alpine`, `2.2-rc-alpine`](https://github.com/docker-library/haproxy/blob/e5884936dca8ee8968522abff21713042983a898/2.2-rc/alpine/Dockerfile) -- [`2.1.4`, `2.1`, `latest`](https://github.com/docker-library/haproxy/blob/eeaaa570ccaeec6fa7e545b9314d6f246b6b283c/2.1/Dockerfile) -- [`2.1.4-alpine`, `2.1-alpine`, `alpine`](https://github.com/docker-library/haproxy/blob/bfa23c19cffdb4247474b2138feeeb14f48b7fe4/2.1/alpine/Dockerfile) -- [`2.0.14`, `2.0`](https://github.com/docker-library/haproxy/blob/eeaaa570ccaeec6fa7e545b9314d6f246b6b283c/2.0/Dockerfile) -- [`2.0.14-alpine`, `2.0-alpine`](https://github.com/docker-library/haproxy/blob/bfa23c19cffdb4247474b2138feeeb14f48b7fe4/2.0/alpine/Dockerfile) -- [`1.9.15`, `1.9`, `1`](https://github.com/docker-library/haproxy/blob/eeaaa570ccaeec6fa7e545b9314d6f246b6b283c/1.9/Dockerfile) -- [`1.9.15-alpine`, `1.9-alpine`, `1-alpine`](https://github.com/docker-library/haproxy/blob/bfa23c19cffdb4247474b2138feeeb14f48b7fe4/1.9/alpine/Dockerfile) -- [`1.8.25`, `1.8`](https://github.com/docker-library/haproxy/blob/eeaaa570ccaeec6fa7e545b9314d6f246b6b283c/1.8/Dockerfile) -- [`1.8.25-alpine`, `1.8-alpine`](https://github.com/docker-library/haproxy/blob/bfa23c19cffdb4247474b2138feeeb14f48b7fe4/1.8/alpine/Dockerfile) -- [`1.7.12`, `1.7`](https://github.com/docker-library/haproxy/blob/14431e31ab981456585021f7dca35626c5e060c1/1.7/Dockerfile) -- [`1.7.12-alpine`, `1.7-alpine`](https://github.com/docker-library/haproxy/blob/bfa23c19cffdb4247474b2138feeeb14f48b7fe4/1.7/alpine/Dockerfile) -- [`1.6.15`, `1.6`](https://github.com/docker-library/haproxy/blob/4e917ff7cbc629b29af59d02057ceece8102e4e0/1.6/Dockerfile) -- [`1.6.15-alpine`, `1.6-alpine`](https://github.com/docker-library/haproxy/blob/bfa23c19cffdb4247474b2138feeeb14f48b7fe4/1.6/alpine/Dockerfile) +- [`2.8-dev1`, `2.8-dev`, `2.8-dev1-bullseye`, `2.8-dev-bullseye`](https://github.com/docker-library/haproxy/blob/817555017600e0dac39d93a75ef920adac450958/2.8/Dockerfile) +- [`2.8-dev1-alpine`, `2.8-dev-alpine`, `2.8-dev1-alpine3.17`, `2.8-dev-alpine3.17`](https://github.com/docker-library/haproxy/blob/817555017600e0dac39d93a75ef920adac450958/2.8/alpine/Dockerfile) +- [`2.7.1`, `2.7`, `latest`, `2.7.1-bullseye`, `2.7-bullseye`, `bullseye`](https://github.com/docker-library/haproxy/blob/eccea371bf2c3d5744a8ad1b2f5861825161052f/2.7/Dockerfile) +- [`2.7.1-alpine`, `2.7-alpine`, `alpine`, `2.7.1-alpine3.17`, `2.7-alpine3.17`, `alpine3.17`](https://github.com/docker-library/haproxy/blob/eccea371bf2c3d5744a8ad1b2f5861825161052f/2.7/alpine/Dockerfile) +- [`2.6.7`, `2.6`, `lts`, `2.6.7-bullseye`, `2.6-bullseye`, `lts-bullseye`](https://github.com/docker-library/haproxy/blob/9ae13c91cf82c4042360a0363b4d3fa190a51341/2.6/Dockerfile) +- [`2.6.7-alpine`, `2.6-alpine`, `lts-alpine`, `2.6.7-alpine3.17`, `2.6-alpine3.17`, `lts-alpine3.17`](https://github.com/docker-library/haproxy/blob/9ae13c91cf82c4042360a0363b4d3fa190a51341/2.6/alpine/Dockerfile) +- [`2.5.10`, `2.5`, `2.5.10-bullseye`, `2.5-bullseye`](https://github.com/docker-library/haproxy/blob/541751988360a0ee55b6bee53c2d41acafaee35d/2.5/Dockerfile) +- [`2.5.10-alpine`, `2.5-alpine`, `2.5.10-alpine3.17`, `2.5-alpine3.17`](https://github.com/docker-library/haproxy/blob/541751988360a0ee55b6bee53c2d41acafaee35d/2.5/alpine/Dockerfile) +- [`2.4.20`, `2.4`, `2.4.20-bullseye`, `2.4-bullseye`](https://github.com/docker-library/haproxy/blob/6a15b45320ff96bb7548248596ac0ee3d38d8fab/2.4/Dockerfile) +- [`2.4.20-alpine`, `2.4-alpine`, `2.4.20-alpine3.17`, `2.4-alpine3.17`](https://github.com/docker-library/haproxy/blob/6a15b45320ff96bb7548248596ac0ee3d38d8fab/2.4/alpine/Dockerfile) +- [`2.2.26`, `2.2`, `2.2.26-bullseye`, `2.2-bullseye`](https://github.com/docker-library/haproxy/blob/509852454b03fd3aeaad66d46b5f6655275646bb/2.2/Dockerfile) +- [`2.2.26-alpine`, `2.2-alpine`, `2.2.26-alpine3.17`, `2.2-alpine3.17`](https://github.com/docker-library/haproxy/blob/509852454b03fd3aeaad66d46b5f6655275646bb/2.2/alpine/Dockerfile) +- [`2.0.30`, `2.0`, `2.0.30-buster`, `2.0-buster`](https://github.com/docker-library/haproxy/blob/c845b04087b9d388d60f3158670c37c31e7e6fbb/2.0/Dockerfile) +- [`2.0.30-alpine`, `2.0-alpine`, `2.0.30-alpine3.16`, `2.0-alpine3.16`](https://github.com/docker-library/haproxy/blob/c845b04087b9d388d60f3158670c37c31e7e6fbb/2.0/alpine/Dockerfile) # Quick reference (cont.) @@ -52,7 +52,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/haproxy`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fhaproxy) + [official-images repo's `library/haproxy` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fhaproxy) [official-images repo's `library/haproxy` file](https://github.com/docker-library/official-images/blob/master/library/haproxy) ([history](https://github.com/docker-library/official-images/commits/master/library/haproxy)) - **Source of this description**: @@ -64,20 +64,20 @@ HAProxy is a free, open source high availability solution, providing load balanc > [wikipedia.org/wiki/HAProxy](https://en.wikipedia.org/wiki/HAProxy) -![logo](https://raw.githubusercontent.com/docker-library/docs/566c944ca5eb9d1947c8a2e8821f8de2b0fc144c/haproxy/logo.png) +![logo](https://raw.githubusercontent.com/docker-library/docs/4da3e2446a4c257c3a32faac6256bee81f770316/haproxy/logo.png) # How to use this image Since no two users of HAProxy are likely to configure it exactly alike, this image does not come with any default configuration. -Please refer to [upstream's excellent (and comprehensive) documentation](https://cbonte.github.io/haproxy-dconv/) on the subject of configuring HAProxy for your needs. +Please refer to [upstream's excellent (and comprehensive) documentation](https://docs.haproxy.org/) on the subject of configuring HAProxy for your needs. -It is also worth checking out the [`examples/` directory from upstream](http://git.haproxy.org/?p=haproxy-1.8.git;a=tree;f=examples). +It is also worth checking out the [`examples/` directory from upstream](http://git.haproxy.org/?p=haproxy-2.3.git;a=tree;f=examples). ## Create a `Dockerfile` ```dockerfile -FROM haproxy:1.7 +FROM haproxy:2.3 COPY haproxy.cfg /usr/local/etc/haproxy/haproxy.cfg ``` @@ -96,15 +96,17 @@ $ docker run -it --rm --name haproxy-syntax-check my-haproxy haproxy -c -f /usr/ ## Run the container ```console -$ docker run -d --name my-running-haproxy my-haproxy +$ docker run -d --name my-running-haproxy --sysctl net.ipv4.ip_unprivileged_port_start=0 my-haproxy ``` -You may need to publish the ports your HAProxy is listening on to the host by specifying the -p option, for example -p 8080:80 to publish port 8080 from the container host to port 80 in the container. Make sure the port you're using is free. +You will need a kernel at [version 4.11 or newer](https://github.com/moby/moby/issues/8460#issuecomment-312459310) to use `--sysctl net.ipv4.ip_unprivileged_port_start=0` , you may need to publish the ports your HAProxy is listening on to the host by specifying the -p option, for example -p 8080:80 to publish port 8080 from the container host to port 80 in the container. Make sure the port you're using is free. + +**Note:** the 2.4+ versions of the container will run as `USER haproxy` by default (hence the `--sysctl net.ipv4.ip_unprivileged_port_start=0` above), but older versions still default to `root` for compatibility reasons; use `--user haproxy` (or any other UID) if you want to run as non-root in older versions. ## Directly via bind mount ```console -$ docker run -d --name my-running-haproxy -v /path/to/etc/haproxy:/usr/local/etc/haproxy:ro haproxy:1.7 +$ docker run -d --name my-running-haproxy -v /path/to/etc/haproxy:/usr/local/etc/haproxy:ro --sysctl net.ipv4.ip_unprivileged_port_start=0 haproxy:2.3 ``` Note that your host's `/path/to/etc/haproxy` folder should be populated with a file named `haproxy.cfg`. If this configuration file refers to any other files within that folder then you should ensure that they also exist (e.g. template files such as `400.http`, `404.http`, and so forth). However, many minimal configurations do not require any supporting files. @@ -117,7 +119,7 @@ If you used a bind mount for the config and have edited your `haproxy.cfg` file, $ docker kill -s HUP my-running-haproxy ``` -The entrypoint script in the image checks for running the command `haproxy` and replaces it with `haproxy-systemd-wrapper` from HAProxy upstream which takes care of signal handling to do the graceful reload. Under the hood this uses the `-sf` option of `haproxy` so "there are two small windows of a few milliseconds each where it is possible that a few connection failures will be noticed during high loads" (see [Stopping and restarting HAProxy](http://www.haproxy.org/download/1.7/doc/management.txt)). +The entrypoint script in the image checks for running the command `haproxy` and replaces it with `haproxy-systemd-wrapper` from HAProxy upstream which takes care of signal handling to do the graceful reload. Under the hood this uses the `-sf` option of `haproxy` so "there are two small windows of a few milliseconds each where it is possible that a few connection failures will be noticed during high loads" (see [Stopping and restarting HAProxy](http://www.haproxy.org/download/2.3/doc/management.txt)). # Image Variants @@ -127,11 +129,13 @@ The `haproxy` images come in many flavors, each designed for a specific use case 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. +Some of these tags may have names like bullseye or buster 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. + ## `haproxy:-alpine` -This image is based on the popular [Alpine Linux project](http://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. +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. -This variant is highly recommended when final image size being as small as possible is desired. The main caveat to note is that it does use [musl libc](http://www.musl-libc.org) instead of [glibc and friends](http://www.etalabs.net/compare_libcs.html), so certain software might run into issues depending on the depth of their libc requirements. However, most software doesn't have an issue with this, so this variant is usually a very safe choice. 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. +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. 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). diff --git a/haproxy/content.md b/haproxy/content.md index e05cf3fb753f..1373341dd163 100644 --- a/haproxy/content.md +++ b/haproxy/content.md @@ -10,14 +10,14 @@ HAProxy is a free, open source high availability solution, providing load balanc Since no two users of HAProxy are likely to configure it exactly alike, this image does not come with any default configuration. -Please refer to [upstream's excellent (and comprehensive) documentation](https://cbonte.github.io/haproxy-dconv/) on the subject of configuring HAProxy for your needs. +Please refer to [upstream's excellent (and comprehensive) documentation](https://docs.haproxy.org/) on the subject of configuring HAProxy for your needs. -It is also worth checking out the [`examples/` directory from upstream](http://git.haproxy.org/?p=haproxy-1.8.git;a=tree;f=examples). +It is also worth checking out the [`examples/` directory from upstream](http://git.haproxy.org/?p=haproxy-2.3.git;a=tree;f=examples). ## Create a `Dockerfile` ```dockerfile -FROM %%IMAGE%%:1.7 +FROM %%IMAGE%%:2.3 COPY haproxy.cfg /usr/local/etc/haproxy/haproxy.cfg ``` @@ -36,15 +36,17 @@ $ docker run -it --rm --name haproxy-syntax-check my-haproxy haproxy -c -f /usr/ ## Run the container ```console -$ docker run -d --name my-running-haproxy my-haproxy +$ docker run -d --name my-running-haproxy --sysctl net.ipv4.ip_unprivileged_port_start=0 my-haproxy ``` -You may need to publish the ports your HAProxy is listening on to the host by specifying the -p option, for example -p 8080:80 to publish port 8080 from the container host to port 80 in the container. Make sure the port you're using is free. +You will need a kernel at [version 4.11 or newer](https://github.com/moby/moby/issues/8460#issuecomment-312459310) to use `--sysctl net.ipv4.ip_unprivileged_port_start=0` , you may need to publish the ports your HAProxy is listening on to the host by specifying the -p option, for example -p 8080:80 to publish port 8080 from the container host to port 80 in the container. Make sure the port you're using is free. + +**Note:** the 2.4+ versions of the container will run as `USER haproxy` by default (hence the `--sysctl net.ipv4.ip_unprivileged_port_start=0` above), but older versions still default to `root` for compatibility reasons; use `--user haproxy` (or any other UID) if you want to run as non-root in older versions. ## Directly via bind mount ```console -$ docker run -d --name my-running-haproxy -v /path/to/etc/haproxy:/usr/local/etc/haproxy:ro %%IMAGE%%:1.7 +$ docker run -d --name my-running-haproxy -v /path/to/etc/haproxy:/usr/local/etc/haproxy:ro --sysctl net.ipv4.ip_unprivileged_port_start=0 %%IMAGE%%:2.3 ``` Note that your host's `/path/to/etc/haproxy` folder should be populated with a file named `haproxy.cfg`. If this configuration file refers to any other files within that folder then you should ensure that they also exist (e.g. template files such as `400.http`, `404.http`, and so forth). However, many minimal configurations do not require any supporting files. @@ -57,4 +59,4 @@ If you used a bind mount for the config and have edited your `haproxy.cfg` file, $ docker kill -s HUP my-running-haproxy ``` -The entrypoint script in the image checks for running the command `haproxy` and replaces it with `haproxy-systemd-wrapper` from HAProxy upstream which takes care of signal handling to do the graceful reload. Under the hood this uses the `-sf` option of `haproxy` so "there are two small windows of a few milliseconds each where it is possible that a few connection failures will be noticed during high loads" (see [Stopping and restarting HAProxy](http://www.haproxy.org/download/1.7/doc/management.txt)). +The entrypoint script in the image checks for running the command `haproxy` and replaces it with `haproxy-systemd-wrapper` from HAProxy upstream which takes care of signal handling to do the graceful reload. Under the hood this uses the `-sf` option of `haproxy` so "there are two small windows of a few milliseconds each where it is possible that a few connection failures will be noticed during high loads" (see [Stopping and restarting HAProxy](http://www.haproxy.org/download/2.3/doc/management.txt)). diff --git a/haproxy/logo.png b/haproxy/logo.png index 1be03b25ac43e1550586d17b3bbd3db4e3085e6d..06262b08374882c65b80605eed463f1b37e1e450 100644 GIT binary patch literal 12526 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 Axc~qF literal 3522 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 diff --git a/haskell/README.md b/haskell/README.md index cdb37bdbcd36..fc1ccc553df3 100644 --- a/haskell/README.md +++ b/haskell/README.md @@ -20,14 +20,16 @@ WARNING: [the Docker Community](https://github.com/haskell/docker-haskell) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`8.10.1-buster`, `8.10-buster`, `8-buster`, `buster`, `8.10.1`, `8.10`, `8`, `latest`](https://github.com/haskell/docker-haskell/blob/82f44382a183fcc1d0026d8abe58259195a8930c/8.10/buster/Dockerfile) -- [`8.10.1-stretch`, `8.10-stretch`, `8-stretch`, `stretch`](https://github.com/haskell/docker-haskell/blob/82f44382a183fcc1d0026d8abe58259195a8930c/8.10/stretch/Dockerfile) -- [`8.8.3-buster`, `8.8-buster`, `8.8.3`, `8.8`](https://github.com/haskell/docker-haskell/blob/82f44382a183fcc1d0026d8abe58259195a8930c/8.8/buster/Dockerfile) -- [`8.8.3-stretch`, `8.8-stretch`](https://github.com/haskell/docker-haskell/blob/82f44382a183fcc1d0026d8abe58259195a8930c/8.8/stretch/Dockerfile) +- [`9.4.4-buster`, `9.4-buster`, `9-buster`, `buster`, `9.4.4`, `9.4`, `9`, `latest`](https://github.com/haskell/docker-haskell/blob/12cd297d7ccc2e97fe5e94548ae502b0cbb6735f/9.4/buster/Dockerfile) +- [`9.4.4-slim-buster`, `9.4-slim-buster`, `9-slim-buster`, `slim-buster`, `9.4.4-slim`, `9.4-slim`, `9-slim`, `slim`](https://github.com/haskell/docker-haskell/blob/12cd297d7ccc2e97fe5e94548ae502b0cbb6735f/9.4/slim-buster/Dockerfile) +- [`9.2.5-buster`, `9.2-buster`, `9.2.5`, `9.2`](https://github.com/haskell/docker-haskell/blob/12cd297d7ccc2e97fe5e94548ae502b0cbb6735f/9.2/buster/Dockerfile) +- [`9.2.5-slim-buster`, `9.2-slim-buster`, `9.2.5-slim`, `9.2-slim`](https://github.com/haskell/docker-haskell/blob/12cd297d7ccc2e97fe5e94548ae502b0cbb6735f/9.2/slim-buster/Dockerfile) +- [`9.0.2-buster`, `9.0-buster`, `9.0.2`, `9.0`](https://github.com/haskell/docker-haskell/blob/12cd297d7ccc2e97fe5e94548ae502b0cbb6735f/9.0/buster/Dockerfile) +- [`9.0.2-slim-buster`, `9.0-slim-buster`, `9.0.2-slim`, `9.0-slim`](https://github.com/haskell/docker-haskell/blob/12cd297d7ccc2e97fe5e94548ae502b0cbb6735f/9.0/slim-buster/Dockerfile) # Quick reference (cont.) @@ -35,14 +37,14 @@ WARNING: [https://github.com/haskell/docker-haskell/issues](https://github.com/haskell/docker-haskell/issues) - **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) - [`amd64`](https://hub.docker.com/r/amd64/haskell/) + [`amd64`](https://hub.docker.com/r/amd64/haskell/), [`arm64v8`](https://hub.docker.com/r/arm64v8/haskell/) - **Published image artifact details**: [repo-info repo's `repos/haskell/` directory](https://github.com/docker-library/repo-info/blob/master/repos/haskell) ([history](https://github.com/docker-library/repo-info/commits/master/repos/haskell)) (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/haskell`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fhaskell) + [official-images repo's `library/haskell` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fhaskell) [official-images repo's `library/haskell` file](https://github.com/docker-library/official-images/blob/master/library/haskell) ([history](https://github.com/docker-library/official-images/commits/master/library/haskell)) - **Source of this description**: @@ -60,37 +62,39 @@ A large number of production-quality Haskell libraries are available from [Hacka ## About this image -This image ships a minimal Haskell toolchain (`ghc` and `cabal-install`) from the upstream [downloads.haskell.org](https://launchpad.net/~hvr/+archive/ubuntu/ghc) Debian repository as well as the `stack` tool ([https://www.haskellstack.org/](https://www.haskellstack.org/)). +This image ships a minimal Haskell toolchain (`ghc` and `cabal-install`) as well as the `stack` tool ([https://www.haskellstack.org/](https://www.haskellstack.org/)) where possible. [`stack` does not currently support `ARM64`](https://github.com/commercialhaskell/stack/issues/2103) so is not included for that processor architecture. -Note: The GHC developers do not support legacy release branches (i.e. `7.8.x`). While older GHC release tags are available in this DockerHub repository, only the two most recent minor releases will receive updates or be shown in the "Supported tags ..." section at the top of this page. +ARM64 support is new and should be considered experimental at this stage. Support has been added as of `8.10.7`, `9.0.2` and `9.2.1`. -Additionally, we support the two most versions of Debian (`stable` and `oldstable`) as variants, with the most recent being the default if not specified. +Note: The GHC developers do not support legacy release branches (i.e. `7.8.x`). Only the two most recent minor releases will receive updates or be shown in the "Supported tags ..." section at the top of this page. -> Note: `haskell:8.8.3` was updated from Debian Stretch to Buster, so you will need to specify `haskell:8.8.3-stretch` to stick with Stretch in this particular case. +Additionally, we aim to support the two most recent versions of Debian (`stable` and `oldstable`) as variants, with the most recent being the default if not specified. + +> Note: Currently `stable` Debian is version 11 bullseye, however it is not yet supported by Haskell tooling. Until that time the default will remain Debian 10 buster. We have dropped support for Debian 9 stretch. ## How to use this image Start an interactive interpreter session with `ghci`: ```console -$ docker run -it --rm haskell:8 -GHCi, version 8.4.3: http://www.haskell.org/ghc/ :? for help +$ docker run -it --rm haskell:9 +GHCi, version 9.0.1: http://www.haskell.org/ghc/ :? for help Prelude> ``` Dockerize an application using `stack`: ```dockerfile -FROM haskell:8 -RUN stack install pandoc pandoc-citeproc +FROM haskell:8.10 +RUN stack install --resolver lts-17.14 pandoc citeproc ENTRYPOINT ["pandoc"] ``` Dockerize an application using `cabal`: ```dockerfile -FROM haskell:8 -RUN cabal update && cabal install pandoc pandoc-citeproc +FROM haskell:8.10 +RUN cabal update && cabal install pandoc citeproc ENTRYPOINT ["pandoc"] ``` @@ -109,7 +113,7 @@ COPY ./example.cabal /opt/example/example.cabal # Docker will cache this command as a layer, freeing us up to # modify source code without re-installing dependencies # (unless the .cabal file changes!) -RUN cabal install --only-dependencies -j4 +RUN cabal build --only-dependencies -j4 # Add and Install Application Code COPY . /opt/example @@ -154,6 +158,24 @@ Selected mirror https://s3.amazonaws.com/hackage.fpcomplete.com/ The alternative to use `--install-ghc` doesn't make sense in a Docker image context, and hence the global `install-ghc` flag has been set to `false` (as of `haskell:8.2.2` & `haskell:8.4.3`) to avoid the default behavior of bootstrapping a new GHC in the container. +# Image Variants + +The `haskell` images come in many flavors, each designed for a specific use case. + +## `haskell:` + +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. + +Some of these tags may have names like buster 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. + +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. + +## `haskell:-slim` + +This image does not contain the common packages contained in the default tag and only contains the minimal packages needed to run `ghc`, `cabal-install` and `stack`. In addition, [profiling support](https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/profiling.html) is not included which saves ~ 700MB of space. + +If image size is of concern, we recommend using the slim images. + # License This image is licensed under the MIT License ([LICENSE](https://github.com/haskell/docker-haskell/blob/master/LICENSE)) and includes software licensed under BSD licenses: [Glasgow Haskell Compiler License](https://www.haskell.org/ghc/license), [Stack License](https://github.com/commercialhaskell/stack/blob/master/LICENSE). diff --git a/haskell/content.md b/haskell/content.md index 8bb6c14cfe1c..e0cf83eee3b7 100644 --- a/haskell/content.md +++ b/haskell/content.md @@ -10,37 +10,39 @@ A large number of production-quality Haskell libraries are available from [Hacka ## About this image -This image ships a minimal Haskell toolchain (`ghc` and `cabal-install`) from the upstream [downloads.haskell.org](https://launchpad.net/~hvr/+archive/ubuntu/ghc) Debian repository as well as the `stack` tool ([https://www.haskellstack.org/](https://www.haskellstack.org/)). +This image ships a minimal Haskell toolchain (`ghc` and `cabal-install`) as well as the `stack` tool ([https://www.haskellstack.org/](https://www.haskellstack.org/)) where possible. [`stack` does not currently support `ARM64`](https://github.com/commercialhaskell/stack/issues/2103) so is not included for that processor architecture. -Note: The GHC developers do not support legacy release branches (i.e. `7.8.x`). While older GHC release tags are available in this DockerHub repository, only the two most recent minor releases will receive updates or be shown in the "Supported tags ..." section at the top of this page. +ARM64 support is new and should be considered experimental at this stage. Support has been added as of `8.10.7`, `9.0.2` and `9.2.1`. -Additionally, we support the two most versions of Debian (`stable` and `oldstable`) as variants, with the most recent being the default if not specified. +Note: The GHC developers do not support legacy release branches (i.e. `7.8.x`). Only the two most recent minor releases will receive updates or be shown in the "Supported tags ..." section at the top of this page. -> Note: `%%IMAGE%%:8.8.3` was updated from Debian Stretch to Buster, so you will need to specify `%%IMAGE%%:8.8.3-stretch` to stick with Stretch in this particular case. +Additionally, we aim to support the two most recent versions of Debian (`stable` and `oldstable`) as variants, with the most recent being the default if not specified. + +> Note: Currently `stable` Debian is version 11 bullseye, however it is not yet supported by Haskell tooling. Until that time the default will remain Debian 10 buster. We have dropped support for Debian 9 stretch. ## How to use this image Start an interactive interpreter session with `ghci`: ```console -$ docker run -it --rm %%IMAGE%%:8 -GHCi, version 8.4.3: http://www.haskell.org/ghc/ :? for help +$ docker run -it --rm %%IMAGE%%:9 +GHCi, version 9.0.1: http://www.haskell.org/ghc/ :? for help Prelude> ``` Dockerize an application using `stack`: ```dockerfile -FROM %%IMAGE%%:8 -RUN stack install pandoc pandoc-citeproc +FROM %%IMAGE%%:8.10 +RUN stack install --resolver lts-17.14 pandoc citeproc ENTRYPOINT ["pandoc"] ``` Dockerize an application using `cabal`: ```dockerfile -FROM %%IMAGE%%:8 -RUN cabal update && cabal install pandoc pandoc-citeproc +FROM %%IMAGE%%:8.10 +RUN cabal update && cabal install pandoc citeproc ENTRYPOINT ["pandoc"] ``` @@ -59,7 +61,7 @@ COPY ./example.cabal /opt/example/example.cabal # Docker will cache this command as a layer, freeing us up to # modify source code without re-installing dependencies # (unless the .cabal file changes!) -RUN cabal install --only-dependencies -j4 +RUN cabal build --only-dependencies -j4 # Add and Install Application Code COPY . /opt/example diff --git a/haskell/variant-slim.md b/haskell/variant-slim.md new file mode 100644 index 000000000000..cb3bc2292356 --- /dev/null +++ b/haskell/variant-slim.md @@ -0,0 +1,5 @@ +## `%%IMAGE%%:-slim` + +This image does not contain the common packages contained in the default tag and only contains the minimal packages needed to run `ghc`, `cabal-install` and `stack`. In addition, [profiling support](https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/profiling.html) is not included which saves ~ 700MB of space. + +If image size is of concern, we recommend using the slim images. diff --git a/haxe/README.md b/haxe/README.md index 2ced370c3fb9..05fe28e5106d 100644 --- a/haxe/README.md +++ b/haxe/README.md @@ -20,7 +20,7 @@ WARNING: [the Haxe Foundation](https://github.com/HaxeFoundation/docker-library-haxe) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links @@ -28,80 +28,89 @@ WARNING: ## Simple Tags -- [`4.0.5-buster`, `4.0-buster`](https://github.com/HaxeFoundation/docker-library-haxe/blob/38b1ceb14a5692ae2c655c056baaff79d963da33/4.0/buster/Dockerfile) -- [`4.0.5-stretch`, `4.0-stretch`](https://github.com/HaxeFoundation/docker-library-haxe/blob/38b1ceb14a5692ae2c655c056baaff79d963da33/4.0/stretch/Dockerfile) -- [`4.0.5-jessie`, `4.0-jessie`](https://github.com/HaxeFoundation/docker-library-haxe/blob/38b1ceb14a5692ae2c655c056baaff79d963da33/4.0/jessie/Dockerfile) -- [`4.0.5-windowsservercore-1809`, `4.0-windowsservercore-1809`](https://github.com/HaxeFoundation/docker-library-haxe/blob/38b1ceb14a5692ae2c655c056baaff79d963da33/4.0/windowsservercore-1809/Dockerfile) -- [`4.0.5-windowsservercore-ltsc2016`, `4.0-windowsservercore-ltsc2016`](https://github.com/HaxeFoundation/docker-library-haxe/blob/38b1ceb14a5692ae2c655c056baaff79d963da33/4.0/windowsservercore-ltsc2016/Dockerfile) -- [`4.0.5-alpine3.11`, `4.0-alpine3.11`, `4.0.5-alpine`, `4.0-alpine`](https://github.com/HaxeFoundation/docker-library-haxe/blob/c06030895887da79e312f97bb434ca0f0e0f7f22/4.0/alpine3.11/Dockerfile) -- [`4.0.5-alpine3.10`, `4.0-alpine3.10`](https://github.com/HaxeFoundation/docker-library-haxe/blob/38b1ceb14a5692ae2c655c056baaff79d963da33/4.0/alpine3.10/Dockerfile) -- [`4.0.5-alpine3.9`, `4.0-alpine3.9`](https://github.com/HaxeFoundation/docker-library-haxe/blob/38b1ceb14a5692ae2c655c056baaff79d963da33/4.0/alpine3.9/Dockerfile) -- [`4.0.5-alpine3.8`, `4.0-alpine3.8`](https://github.com/HaxeFoundation/docker-library-haxe/blob/38b1ceb14a5692ae2c655c056baaff79d963da33/4.0/alpine3.8/Dockerfile) -- [`3.4.7-buster`, `3.4-buster`](https://github.com/HaxeFoundation/docker-library-haxe/blob/b62c53f203ae20f2b3dcc1af2881ccab602a4fe1/3.4/buster/Dockerfile) -- [`3.4.7-stretch`, `3.4-stretch`](https://github.com/HaxeFoundation/docker-library-haxe/blob/b62c53f203ae20f2b3dcc1af2881ccab602a4fe1/3.4/stretch/Dockerfile) -- [`3.4.7-jessie`, `3.4-jessie`](https://github.com/HaxeFoundation/docker-library-haxe/blob/b62c53f203ae20f2b3dcc1af2881ccab602a4fe1/3.4/jessie/Dockerfile) -- [`3.4.7-windowsservercore-1809`, `3.4-windowsservercore-1809`](https://github.com/HaxeFoundation/docker-library-haxe/blob/7df74d220cce33998dde7623f8c9176d7fa938f7/3.4/windowsservercore-1809/Dockerfile) -- [`3.4.7-windowsservercore-ltsc2016`, `3.4-windowsservercore-ltsc2016`](https://github.com/HaxeFoundation/docker-library-haxe/blob/7df74d220cce33998dde7623f8c9176d7fa938f7/3.4/windowsservercore-ltsc2016/Dockerfile) -- [`3.4.7-alpine3.11`, `3.4-alpine3.11`, `3.4.7-alpine`, `3.4-alpine`](https://github.com/HaxeFoundation/docker-library-haxe/blob/c06030895887da79e312f97bb434ca0f0e0f7f22/3.4/alpine3.11/Dockerfile) -- [`3.4.7-alpine3.10`, `3.4-alpine3.10`](https://github.com/HaxeFoundation/docker-library-haxe/blob/b62c53f203ae20f2b3dcc1af2881ccab602a4fe1/3.4/alpine3.10/Dockerfile) -- [`3.4.7-alpine3.9`, `3.4-alpine3.9`](https://github.com/HaxeFoundation/docker-library-haxe/blob/b62c53f203ae20f2b3dcc1af2881ccab602a4fe1/3.4/alpine3.9/Dockerfile) -- [`3.4.7-alpine3.8`, `3.4-alpine3.8`](https://github.com/HaxeFoundation/docker-library-haxe/blob/b62c53f203ae20f2b3dcc1af2881ccab602a4fe1/3.4/alpine3.8/Dockerfile) -- [`3.3.0-rc.1-buster`, `3.3.0-buster`, `3.3-buster`](https://github.com/HaxeFoundation/docker-library-haxe/blob/b62c53f203ae20f2b3dcc1af2881ccab602a4fe1/3.3/buster/Dockerfile) -- [`3.3.0-rc.1-stretch`, `3.3.0-stretch`, `3.3-stretch`](https://github.com/HaxeFoundation/docker-library-haxe/blob/b62c53f203ae20f2b3dcc1af2881ccab602a4fe1/3.3/stretch/Dockerfile) -- [`3.3.0-rc.1-jessie`, `3.3.0-jessie`, `3.3-jessie`](https://github.com/HaxeFoundation/docker-library-haxe/blob/b62c53f203ae20f2b3dcc1af2881ccab602a4fe1/3.3/jessie/Dockerfile) -- [`3.3.0-rc.1-windowsservercore-1809`, `3.3.0-windowsservercore-1809`, `3.3-windowsservercore-1809`](https://github.com/HaxeFoundation/docker-library-haxe/blob/7df74d220cce33998dde7623f8c9176d7fa938f7/3.3/windowsservercore-1809/Dockerfile) -- [`3.3.0-rc.1-windowsservercore-ltsc2016`, `3.3.0-windowsservercore-ltsc2016`, `3.3-windowsservercore-ltsc2016`](https://github.com/HaxeFoundation/docker-library-haxe/blob/7df74d220cce33998dde7623f8c9176d7fa938f7/3.3/windowsservercore-ltsc2016/Dockerfile) -- [`3.3.0-rc.1-alpine3.11`, `3.3.0-rc.1-alpine`, `3.3.0-alpine3.11`, `3.3-alpine3.11`, `3.3.0-alpine`, `3.3-alpine`](https://github.com/HaxeFoundation/docker-library-haxe/blob/c06030895887da79e312f97bb434ca0f0e0f7f22/3.3/alpine3.11/Dockerfile) -- [`3.3.0-rc.1-alpine3.10`, `3.3.0-alpine3.10`, `3.3-alpine3.10`](https://github.com/HaxeFoundation/docker-library-haxe/blob/b62c53f203ae20f2b3dcc1af2881ccab602a4fe1/3.3/alpine3.10/Dockerfile) -- [`3.3.0-rc.1-alpine3.9`, `3.3.0-alpine3.9`, `3.3-alpine3.9`](https://github.com/HaxeFoundation/docker-library-haxe/blob/b62c53f203ae20f2b3dcc1af2881ccab602a4fe1/3.3/alpine3.9/Dockerfile) -- [`3.3.0-rc.1-alpine3.8`, `3.3.0-alpine3.8`, `3.3-alpine3.8`](https://github.com/HaxeFoundation/docker-library-haxe/blob/b62c53f203ae20f2b3dcc1af2881ccab602a4fe1/3.3/alpine3.8/Dockerfile) -- [`3.2.1-buster`, `3.2-buster`](https://github.com/HaxeFoundation/docker-library-haxe/blob/b62c53f203ae20f2b3dcc1af2881ccab602a4fe1/3.2/buster/Dockerfile) -- [`3.2.1-stretch`, `3.2-stretch`](https://github.com/HaxeFoundation/docker-library-haxe/blob/b62c53f203ae20f2b3dcc1af2881ccab602a4fe1/3.2/stretch/Dockerfile) -- [`3.2.1-jessie`, `3.2-jessie`](https://github.com/HaxeFoundation/docker-library-haxe/blob/b62c53f203ae20f2b3dcc1af2881ccab602a4fe1/3.2/jessie/Dockerfile) -- [`3.2.1-windowsservercore-1809`, `3.2-windowsservercore-1809`](https://github.com/HaxeFoundation/docker-library-haxe/blob/7df74d220cce33998dde7623f8c9176d7fa938f7/3.2/windowsservercore-1809/Dockerfile) -- [`3.2.1-windowsservercore-ltsc2016`, `3.2-windowsservercore-ltsc2016`](https://github.com/HaxeFoundation/docker-library-haxe/blob/7df74d220cce33998dde7623f8c9176d7fa938f7/3.2/windowsservercore-ltsc2016/Dockerfile) -- [`3.2.1-alpine3.11`, `3.2-alpine3.11`, `3.2.1-alpine`, `3.2-alpine`](https://github.com/HaxeFoundation/docker-library-haxe/blob/c06030895887da79e312f97bb434ca0f0e0f7f22/3.2/alpine3.11/Dockerfile) -- [`3.2.1-alpine3.10`, `3.2-alpine3.10`](https://github.com/HaxeFoundation/docker-library-haxe/blob/b62c53f203ae20f2b3dcc1af2881ccab602a4fe1/3.2/alpine3.10/Dockerfile) -- [`3.2.1-alpine3.9`, `3.2-alpine3.9`](https://github.com/HaxeFoundation/docker-library-haxe/blob/b62c53f203ae20f2b3dcc1af2881ccab602a4fe1/3.2/alpine3.9/Dockerfile) -- [`3.2.1-alpine3.8`, `3.2-alpine3.8`](https://github.com/HaxeFoundation/docker-library-haxe/blob/b62c53f203ae20f2b3dcc1af2881ccab602a4fe1/3.2/alpine3.8/Dockerfile) -- [`3.1.3-stretch`, `3.1-stretch`](https://github.com/HaxeFoundation/docker-library-haxe/blob/b62c53f203ae20f2b3dcc1af2881ccab602a4fe1/3.1/stretch/Dockerfile) -- [`3.1.3-jessie`, `3.1-jessie`](https://github.com/HaxeFoundation/docker-library-haxe/blob/b62c53f203ae20f2b3dcc1af2881ccab602a4fe1/3.1/jessie/Dockerfile) -- [`3.1.3-windowsservercore-1809`, `3.1-windowsservercore-1809`](https://github.com/HaxeFoundation/docker-library-haxe/blob/7df74d220cce33998dde7623f8c9176d7fa938f7/3.1/windowsservercore-1809/Dockerfile) -- [`3.1.3-windowsservercore-ltsc2016`, `3.1-windowsservercore-ltsc2016`](https://github.com/HaxeFoundation/docker-library-haxe/blob/7df74d220cce33998dde7623f8c9176d7fa938f7/3.1/windowsservercore-ltsc2016/Dockerfile) +- [`4.2.5-bullseye`, `4.2-bullseye`](https://github.com/HaxeFoundation/docker-library-haxe/blob/83789c10dc601064a234fd559206d1ec252228d7/4.2/bullseye/Dockerfile) +- [`4.2.5-buster`, `4.2-buster`](https://github.com/HaxeFoundation/docker-library-haxe/blob/83789c10dc601064a234fd559206d1ec252228d7/4.2/buster/Dockerfile) +- [`4.2.5-windowsservercore-ltsc2022`, `4.2-windowsservercore-ltsc2022`](https://github.com/HaxeFoundation/docker-library-haxe/blob/c0367972017a7b87845bf33477e29b1fe64ccc4a/4.2/windowsservercore-ltsc2022/Dockerfile) +- [`4.2.5-windowsservercore-1809`, `4.2-windowsservercore-1809`](https://github.com/HaxeFoundation/docker-library-haxe/blob/c0367972017a7b87845bf33477e29b1fe64ccc4a/4.2/windowsservercore-1809/Dockerfile) +- [`4.2.5-alpine3.17`, `4.2-alpine3.17`, `4.2.5-alpine`, `4.2-alpine`](https://github.com/HaxeFoundation/docker-library-haxe/blob/40bf9156af6f198cd7a57dbfd452e24dc1ceb94e/4.2/alpine3.17/Dockerfile) +- [`4.2.5-alpine3.16`, `4.2-alpine3.16`](https://github.com/HaxeFoundation/docker-library-haxe/blob/5f520ca3ba5942ab581369bab2cbda2b8c4ab992/4.2/alpine3.16/Dockerfile) +- [`4.2.5-alpine3.15`, `4.2-alpine3.15`](https://github.com/HaxeFoundation/docker-library-haxe/blob/83789c10dc601064a234fd559206d1ec252228d7/4.2/alpine3.15/Dockerfile) +- [`4.2.5-alpine3.14`, `4.2-alpine3.14`](https://github.com/HaxeFoundation/docker-library-haxe/blob/83789c10dc601064a234fd559206d1ec252228d7/4.2/alpine3.14/Dockerfile) +- [`4.1.5-bullseye`, `4.1-bullseye`](https://github.com/HaxeFoundation/docker-library-haxe/blob/0292fae1a29c23dee119205b3b75ad9e27f6cf32/4.1/bullseye/Dockerfile) +- [`4.1.5-buster`, `4.1-buster`](https://github.com/HaxeFoundation/docker-library-haxe/blob/adf0e23e460a657c77c44f2502e5fa8cf820d020/4.1/buster/Dockerfile) +- [`4.1.5-windowsservercore-ltsc2022`, `4.1-windowsservercore-ltsc2022`](https://github.com/HaxeFoundation/docker-library-haxe/blob/c0367972017a7b87845bf33477e29b1fe64ccc4a/4.1/windowsservercore-ltsc2022/Dockerfile) +- [`4.1.5-windowsservercore-1809`, `4.1-windowsservercore-1809`](https://github.com/HaxeFoundation/docker-library-haxe/blob/c0367972017a7b87845bf33477e29b1fe64ccc4a/4.1/windowsservercore-1809/Dockerfile) +- [`4.1.5-alpine3.17`, `4.1-alpine3.17`, `4.1.5-alpine`, `4.1-alpine`](https://github.com/HaxeFoundation/docker-library-haxe/blob/40bf9156af6f198cd7a57dbfd452e24dc1ceb94e/4.1/alpine3.17/Dockerfile) +- [`4.1.5-alpine3.16`, `4.1-alpine3.16`](https://github.com/HaxeFoundation/docker-library-haxe/blob/5f520ca3ba5942ab581369bab2cbda2b8c4ab992/4.1/alpine3.16/Dockerfile) +- [`4.1.5-alpine3.15`, `4.1-alpine3.15`](https://github.com/HaxeFoundation/docker-library-haxe/blob/b0098b4b730d0d9ff21dbf3d543464228d6b7e99/4.1/alpine3.15/Dockerfile) +- [`4.1.5-alpine3.14`, `4.1-alpine3.14`](https://github.com/HaxeFoundation/docker-library-haxe/blob/71afcb74d885cfbcf9bff439d7aba47a79b541b1/4.1/alpine3.14/Dockerfile) +- [`4.0.5-bullseye`, `4.0-bullseye`](https://github.com/HaxeFoundation/docker-library-haxe/blob/0292fae1a29c23dee119205b3b75ad9e27f6cf32/4.0/bullseye/Dockerfile) +- [`4.0.5-buster`, `4.0-buster`](https://github.com/HaxeFoundation/docker-library-haxe/blob/adf0e23e460a657c77c44f2502e5fa8cf820d020/4.0/buster/Dockerfile) +- [`4.0.5-windowsservercore-ltsc2022`, `4.0-windowsservercore-ltsc2022`](https://github.com/HaxeFoundation/docker-library-haxe/blob/c0367972017a7b87845bf33477e29b1fe64ccc4a/4.0/windowsservercore-ltsc2022/Dockerfile) +- [`4.0.5-windowsservercore-1809`, `4.0-windowsservercore-1809`](https://github.com/HaxeFoundation/docker-library-haxe/blob/c0367972017a7b87845bf33477e29b1fe64ccc4a/4.0/windowsservercore-1809/Dockerfile) +- [`4.0.5-alpine3.17`, `4.0-alpine3.17`, `4.0.5-alpine`, `4.0-alpine`](https://github.com/HaxeFoundation/docker-library-haxe/blob/40bf9156af6f198cd7a57dbfd452e24dc1ceb94e/4.0/alpine3.17/Dockerfile) +- [`4.0.5-alpine3.16`, `4.0-alpine3.16`](https://github.com/HaxeFoundation/docker-library-haxe/blob/5f520ca3ba5942ab581369bab2cbda2b8c4ab992/4.0/alpine3.16/Dockerfile) +- [`4.0.5-alpine3.15`, `4.0-alpine3.15`](https://github.com/HaxeFoundation/docker-library-haxe/blob/b0098b4b730d0d9ff21dbf3d543464228d6b7e99/4.0/alpine3.15/Dockerfile) +- [`4.0.5-alpine3.14`, `4.0-alpine3.14`](https://github.com/HaxeFoundation/docker-library-haxe/blob/71afcb74d885cfbcf9bff439d7aba47a79b541b1/4.0/alpine3.14/Dockerfile) +- [`3.4.7-buster`, `3.4-buster`](https://github.com/HaxeFoundation/docker-library-haxe/blob/1f586bf85c12ce5c9300f24079912b94c73bc3f7/3.4/buster/Dockerfile) +- [`3.4.7-windowsservercore-ltsc2022`, `3.4-windowsservercore-ltsc2022`](https://github.com/HaxeFoundation/docker-library-haxe/blob/c0367972017a7b87845bf33477e29b1fe64ccc4a/3.4/windowsservercore-ltsc2022/Dockerfile) +- [`3.4.7-windowsservercore-1809`, `3.4-windowsservercore-1809`](https://github.com/HaxeFoundation/docker-library-haxe/blob/c0367972017a7b87845bf33477e29b1fe64ccc4a/3.4/windowsservercore-1809/Dockerfile) +- [`3.3.0-rc.1-buster`, `3.3.0-buster`, `3.3-buster`](https://github.com/HaxeFoundation/docker-library-haxe/blob/1f586bf85c12ce5c9300f24079912b94c73bc3f7/3.3/buster/Dockerfile) +- [`3.3.0-rc.1-windowsservercore-ltsc2022`, `3.3.0-windowsservercore-ltsc2022`, `3.3-windowsservercore-ltsc2022`](https://github.com/HaxeFoundation/docker-library-haxe/blob/c0367972017a7b87845bf33477e29b1fe64ccc4a/3.3/windowsservercore-ltsc2022/Dockerfile) +- [`3.3.0-rc.1-windowsservercore-1809`, `3.3.0-windowsservercore-1809`, `3.3-windowsservercore-1809`](https://github.com/HaxeFoundation/docker-library-haxe/blob/c0367972017a7b87845bf33477e29b1fe64ccc4a/3.3/windowsservercore-1809/Dockerfile) +- [`3.2.1-buster`, `3.2-buster`](https://github.com/HaxeFoundation/docker-library-haxe/blob/1f586bf85c12ce5c9300f24079912b94c73bc3f7/3.2/buster/Dockerfile) +- [`3.2.1-windowsservercore-ltsc2022`, `3.2-windowsservercore-ltsc2022`](https://github.com/HaxeFoundation/docker-library-haxe/blob/c0367972017a7b87845bf33477e29b1fe64ccc4a/3.2/windowsservercore-ltsc2022/Dockerfile) +- [`3.2.1-windowsservercore-1809`, `3.2-windowsservercore-1809`](https://github.com/HaxeFoundation/docker-library-haxe/blob/c0367972017a7b87845bf33477e29b1fe64ccc4a/3.2/windowsservercore-1809/Dockerfile) +- [`3.1.3-windowsservercore-ltsc2022`, `3.1-windowsservercore-ltsc2022`](https://github.com/HaxeFoundation/docker-library-haxe/blob/c0367972017a7b87845bf33477e29b1fe64ccc4a/3.1/windowsservercore-ltsc2022/Dockerfile) +- [`3.1.3-windowsservercore-1809`, `3.1-windowsservercore-1809`](https://github.com/HaxeFoundation/docker-library-haxe/blob/c0367972017a7b87845bf33477e29b1fe64ccc4a/3.1/windowsservercore-1809/Dockerfile) ## Shared Tags -- `4.0.5`, `4.0`, `latest`: - - [`4.0.5-buster`](https://github.com/HaxeFoundation/docker-library-haxe/blob/38b1ceb14a5692ae2c655c056baaff79d963da33/4.0/buster/Dockerfile) - - [`4.0.5-windowsservercore-1809`](https://github.com/HaxeFoundation/docker-library-haxe/blob/38b1ceb14a5692ae2c655c056baaff79d963da33/4.0/windowsservercore-1809/Dockerfile) - - [`4.0.5-windowsservercore-ltsc2016`](https://github.com/HaxeFoundation/docker-library-haxe/blob/38b1ceb14a5692ae2c655c056baaff79d963da33/4.0/windowsservercore-ltsc2016/Dockerfile) +- `4.2.5`, `4.2`, `latest`: + - [`4.2.5-bullseye`](https://github.com/HaxeFoundation/docker-library-haxe/blob/83789c10dc601064a234fd559206d1ec252228d7/4.2/bullseye/Dockerfile) + - [`4.2.5-windowsservercore-ltsc2022`](https://github.com/HaxeFoundation/docker-library-haxe/blob/c0367972017a7b87845bf33477e29b1fe64ccc4a/4.2/windowsservercore-ltsc2022/Dockerfile) + - [`4.2.5-windowsservercore-1809`](https://github.com/HaxeFoundation/docker-library-haxe/blob/c0367972017a7b87845bf33477e29b1fe64ccc4a/4.2/windowsservercore-1809/Dockerfile) +- `4.2.5-windowsservercore`, `4.2-windowsservercore`: + - [`4.2.5-windowsservercore-ltsc2022`](https://github.com/HaxeFoundation/docker-library-haxe/blob/c0367972017a7b87845bf33477e29b1fe64ccc4a/4.2/windowsservercore-ltsc2022/Dockerfile) + - [`4.2.5-windowsservercore-1809`](https://github.com/HaxeFoundation/docker-library-haxe/blob/c0367972017a7b87845bf33477e29b1fe64ccc4a/4.2/windowsservercore-1809/Dockerfile) +- `4.1.5`, `4.1`: + - [`4.1.5-bullseye`](https://github.com/HaxeFoundation/docker-library-haxe/blob/0292fae1a29c23dee119205b3b75ad9e27f6cf32/4.1/bullseye/Dockerfile) + - [`4.1.5-windowsservercore-ltsc2022`](https://github.com/HaxeFoundation/docker-library-haxe/blob/c0367972017a7b87845bf33477e29b1fe64ccc4a/4.1/windowsservercore-ltsc2022/Dockerfile) + - [`4.1.5-windowsservercore-1809`](https://github.com/HaxeFoundation/docker-library-haxe/blob/c0367972017a7b87845bf33477e29b1fe64ccc4a/4.1/windowsservercore-1809/Dockerfile) +- `4.1.5-windowsservercore`, `4.1-windowsservercore`: + - [`4.1.5-windowsservercore-ltsc2022`](https://github.com/HaxeFoundation/docker-library-haxe/blob/c0367972017a7b87845bf33477e29b1fe64ccc4a/4.1/windowsservercore-ltsc2022/Dockerfile) + - [`4.1.5-windowsservercore-1809`](https://github.com/HaxeFoundation/docker-library-haxe/blob/c0367972017a7b87845bf33477e29b1fe64ccc4a/4.1/windowsservercore-1809/Dockerfile) +- `4.0.5`, `4.0`: + - [`4.0.5-bullseye`](https://github.com/HaxeFoundation/docker-library-haxe/blob/0292fae1a29c23dee119205b3b75ad9e27f6cf32/4.0/bullseye/Dockerfile) + - [`4.0.5-windowsservercore-ltsc2022`](https://github.com/HaxeFoundation/docker-library-haxe/blob/c0367972017a7b87845bf33477e29b1fe64ccc4a/4.0/windowsservercore-ltsc2022/Dockerfile) + - [`4.0.5-windowsservercore-1809`](https://github.com/HaxeFoundation/docker-library-haxe/blob/c0367972017a7b87845bf33477e29b1fe64ccc4a/4.0/windowsservercore-1809/Dockerfile) - `4.0.5-windowsservercore`, `4.0-windowsservercore`: - - [`4.0.5-windowsservercore-1809`](https://github.com/HaxeFoundation/docker-library-haxe/blob/38b1ceb14a5692ae2c655c056baaff79d963da33/4.0/windowsservercore-1809/Dockerfile) - - [`4.0.5-windowsservercore-ltsc2016`](https://github.com/HaxeFoundation/docker-library-haxe/blob/38b1ceb14a5692ae2c655c056baaff79d963da33/4.0/windowsservercore-ltsc2016/Dockerfile) + - [`4.0.5-windowsservercore-ltsc2022`](https://github.com/HaxeFoundation/docker-library-haxe/blob/c0367972017a7b87845bf33477e29b1fe64ccc4a/4.0/windowsservercore-ltsc2022/Dockerfile) + - [`4.0.5-windowsservercore-1809`](https://github.com/HaxeFoundation/docker-library-haxe/blob/c0367972017a7b87845bf33477e29b1fe64ccc4a/4.0/windowsservercore-1809/Dockerfile) - `3.4.7`, `3.4`: - - [`3.4.7-buster`](https://github.com/HaxeFoundation/docker-library-haxe/blob/b62c53f203ae20f2b3dcc1af2881ccab602a4fe1/3.4/buster/Dockerfile) - - [`3.4.7-windowsservercore-1809`](https://github.com/HaxeFoundation/docker-library-haxe/blob/7df74d220cce33998dde7623f8c9176d7fa938f7/3.4/windowsservercore-1809/Dockerfile) - - [`3.4.7-windowsservercore-ltsc2016`](https://github.com/HaxeFoundation/docker-library-haxe/blob/7df74d220cce33998dde7623f8c9176d7fa938f7/3.4/windowsservercore-ltsc2016/Dockerfile) + - [`3.4.7-buster`](https://github.com/HaxeFoundation/docker-library-haxe/blob/1f586bf85c12ce5c9300f24079912b94c73bc3f7/3.4/buster/Dockerfile) + - [`3.4.7-windowsservercore-ltsc2022`](https://github.com/HaxeFoundation/docker-library-haxe/blob/c0367972017a7b87845bf33477e29b1fe64ccc4a/3.4/windowsservercore-ltsc2022/Dockerfile) + - [`3.4.7-windowsservercore-1809`](https://github.com/HaxeFoundation/docker-library-haxe/blob/c0367972017a7b87845bf33477e29b1fe64ccc4a/3.4/windowsservercore-1809/Dockerfile) - `3.4.7-windowsservercore`, `3.4-windowsservercore`: - - [`3.4.7-windowsservercore-1809`](https://github.com/HaxeFoundation/docker-library-haxe/blob/7df74d220cce33998dde7623f8c9176d7fa938f7/3.4/windowsservercore-1809/Dockerfile) - - [`3.4.7-windowsservercore-ltsc2016`](https://github.com/HaxeFoundation/docker-library-haxe/blob/7df74d220cce33998dde7623f8c9176d7fa938f7/3.4/windowsservercore-ltsc2016/Dockerfile) + - [`3.4.7-windowsservercore-ltsc2022`](https://github.com/HaxeFoundation/docker-library-haxe/blob/c0367972017a7b87845bf33477e29b1fe64ccc4a/3.4/windowsservercore-ltsc2022/Dockerfile) + - [`3.4.7-windowsservercore-1809`](https://github.com/HaxeFoundation/docker-library-haxe/blob/c0367972017a7b87845bf33477e29b1fe64ccc4a/3.4/windowsservercore-1809/Dockerfile) - `3.3.0-rc.1`, `3.3.0`, `3.3`: - - [`3.3.0-rc.1-buster`](https://github.com/HaxeFoundation/docker-library-haxe/blob/b62c53f203ae20f2b3dcc1af2881ccab602a4fe1/3.3/buster/Dockerfile) - - [`3.3.0-rc.1-windowsservercore-1809`](https://github.com/HaxeFoundation/docker-library-haxe/blob/7df74d220cce33998dde7623f8c9176d7fa938f7/3.3/windowsservercore-1809/Dockerfile) - - [`3.3.0-rc.1-windowsservercore-ltsc2016`](https://github.com/HaxeFoundation/docker-library-haxe/blob/7df74d220cce33998dde7623f8c9176d7fa938f7/3.3/windowsservercore-ltsc2016/Dockerfile) + - [`3.3.0-rc.1-buster`](https://github.com/HaxeFoundation/docker-library-haxe/blob/1f586bf85c12ce5c9300f24079912b94c73bc3f7/3.3/buster/Dockerfile) + - [`3.3.0-rc.1-windowsservercore-ltsc2022`](https://github.com/HaxeFoundation/docker-library-haxe/blob/c0367972017a7b87845bf33477e29b1fe64ccc4a/3.3/windowsservercore-ltsc2022/Dockerfile) + - [`3.3.0-rc.1-windowsservercore-1809`](https://github.com/HaxeFoundation/docker-library-haxe/blob/c0367972017a7b87845bf33477e29b1fe64ccc4a/3.3/windowsservercore-1809/Dockerfile) - `3.3.0-rc.1-windowsservercore`, `3.3.0-windowsservercore`, `3.3-windowsservercore`: - - [`3.3.0-rc.1-windowsservercore-1809`](https://github.com/HaxeFoundation/docker-library-haxe/blob/7df74d220cce33998dde7623f8c9176d7fa938f7/3.3/windowsservercore-1809/Dockerfile) - - [`3.3.0-rc.1-windowsservercore-ltsc2016`](https://github.com/HaxeFoundation/docker-library-haxe/blob/7df74d220cce33998dde7623f8c9176d7fa938f7/3.3/windowsservercore-ltsc2016/Dockerfile) + - [`3.3.0-rc.1-windowsservercore-ltsc2022`](https://github.com/HaxeFoundation/docker-library-haxe/blob/c0367972017a7b87845bf33477e29b1fe64ccc4a/3.3/windowsservercore-ltsc2022/Dockerfile) + - [`3.3.0-rc.1-windowsservercore-1809`](https://github.com/HaxeFoundation/docker-library-haxe/blob/c0367972017a7b87845bf33477e29b1fe64ccc4a/3.3/windowsservercore-1809/Dockerfile) - `3.2.1`, `3.2`: - - [`3.2.1-buster`](https://github.com/HaxeFoundation/docker-library-haxe/blob/b62c53f203ae20f2b3dcc1af2881ccab602a4fe1/3.2/buster/Dockerfile) - - [`3.2.1-windowsservercore-1809`](https://github.com/HaxeFoundation/docker-library-haxe/blob/7df74d220cce33998dde7623f8c9176d7fa938f7/3.2/windowsservercore-1809/Dockerfile) - - [`3.2.1-windowsservercore-ltsc2016`](https://github.com/HaxeFoundation/docker-library-haxe/blob/7df74d220cce33998dde7623f8c9176d7fa938f7/3.2/windowsservercore-ltsc2016/Dockerfile) + - [`3.2.1-buster`](https://github.com/HaxeFoundation/docker-library-haxe/blob/1f586bf85c12ce5c9300f24079912b94c73bc3f7/3.2/buster/Dockerfile) + - [`3.2.1-windowsservercore-ltsc2022`](https://github.com/HaxeFoundation/docker-library-haxe/blob/c0367972017a7b87845bf33477e29b1fe64ccc4a/3.2/windowsservercore-ltsc2022/Dockerfile) + - [`3.2.1-windowsservercore-1809`](https://github.com/HaxeFoundation/docker-library-haxe/blob/c0367972017a7b87845bf33477e29b1fe64ccc4a/3.2/windowsservercore-1809/Dockerfile) - `3.2.1-windowsservercore`, `3.2-windowsservercore`: - - [`3.2.1-windowsservercore-1809`](https://github.com/HaxeFoundation/docker-library-haxe/blob/7df74d220cce33998dde7623f8c9176d7fa938f7/3.2/windowsservercore-1809/Dockerfile) - - [`3.2.1-windowsservercore-ltsc2016`](https://github.com/HaxeFoundation/docker-library-haxe/blob/7df74d220cce33998dde7623f8c9176d7fa938f7/3.2/windowsservercore-ltsc2016/Dockerfile) + - [`3.2.1-windowsservercore-ltsc2022`](https://github.com/HaxeFoundation/docker-library-haxe/blob/c0367972017a7b87845bf33477e29b1fe64ccc4a/3.2/windowsservercore-ltsc2022/Dockerfile) + - [`3.2.1-windowsservercore-1809`](https://github.com/HaxeFoundation/docker-library-haxe/blob/c0367972017a7b87845bf33477e29b1fe64ccc4a/3.2/windowsservercore-1809/Dockerfile) - `3.1.3-windowsservercore`, `3.1-windowsservercore`, `3.1.3`, `3.1`: - - [`3.1.3-windowsservercore-1809`](https://github.com/HaxeFoundation/docker-library-haxe/blob/7df74d220cce33998dde7623f8c9176d7fa938f7/3.1/windowsservercore-1809/Dockerfile) - - [`3.1.3-windowsservercore-ltsc2016`](https://github.com/HaxeFoundation/docker-library-haxe/blob/7df74d220cce33998dde7623f8c9176d7fa938f7/3.1/windowsservercore-ltsc2016/Dockerfile) + - [`3.1.3-windowsservercore-ltsc2022`](https://github.com/HaxeFoundation/docker-library-haxe/blob/c0367972017a7b87845bf33477e29b1fe64ccc4a/3.1/windowsservercore-ltsc2022/Dockerfile) + - [`3.1.3-windowsservercore-1809`](https://github.com/HaxeFoundation/docker-library-haxe/blob/c0367972017a7b87845bf33477e29b1fe64ccc4a/3.1/windowsservercore-1809/Dockerfile) # Quick reference (cont.) @@ -116,7 +125,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/haxe`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fhaxe) + [official-images repo's `library/haxe` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fhaxe) [official-images repo's `library/haxe` file](https://github.com/docker-library/official-images/blob/master/library/haxe) ([history](https://github.com/docker-library/official-images/commits/master/library/haxe)) - **Source of this description**: @@ -194,7 +203,7 @@ The `haxe` images come in many flavors, each designed for a specific use case. 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. -Some of these tags may have names like buster, jessie, or stretch 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. +Some of these tags may have names like bullseye or buster 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. ## `haxe:-windowsservercore` @@ -207,9 +216,9 @@ For information about how to get Docker running on Windows, please see the relev ## `haxe:-alpine` -This image is based on the popular [Alpine Linux project](http://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. +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. -This variant is highly recommended when final image size being as small as possible is desired. The main caveat to note is that it does use [musl libc](http://www.musl-libc.org) instead of [glibc and friends](http://www.etalabs.net/compare_libcs.html), so certain software might run into issues depending on the depth of their libc requirements. However, most software doesn't have an issue with this, so this variant is usually a very safe choice. 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. +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. 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). diff --git a/hello-world/README.md b/hello-world/README.md index f567e6d247be..73b30e657c5d 100644 --- a/hello-world/README.md +++ b/hello-world/README.md @@ -20,7 +20,7 @@ WARNING: [the Docker Community](https://github.com/docker-library/hello-world) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links @@ -28,16 +28,19 @@ WARNING: ## Simple Tags -- [`linux`](https://github.com/docker-library/hello-world/blob/7ecae6978055d2fb6960e2a29d24a2af612e2716/amd64/hello-world/Dockerfile) -- [`nanoserver-1809`](https://github.com/docker-library/hello-world/blob/9c93e37114a7fe99b5fc0d776e0b8dff99cbbb75/amd64/hello-world/nanoserver-1809/Dockerfile) +- [`linux`](https://github.com/docker-library/hello-world/blob/3332fbee4210b41738d83f6cfdc301a42b96e30d/amd64/hello-world/Dockerfile) +- [`nanoserver-ltsc2022`](https://github.com/docker-library/hello-world/blob/c816763efda4774cc0c628dca3c7dbd93c099928/amd64/hello-world/nanoserver-ltsc2022/Dockerfile) +- [`nanoserver-1809`](https://github.com/docker-library/hello-world/blob/c816763efda4774cc0c628dca3c7dbd93c099928/amd64/hello-world/nanoserver-1809/Dockerfile) ## Shared Tags - `latest`: - - [`linux`](https://github.com/docker-library/hello-world/blob/7ecae6978055d2fb6960e2a29d24a2af612e2716/amd64/hello-world/Dockerfile) - - [`nanoserver-1809`](https://github.com/docker-library/hello-world/blob/9c93e37114a7fe99b5fc0d776e0b8dff99cbbb75/amd64/hello-world/nanoserver-1809/Dockerfile) + - [`linux`](https://github.com/docker-library/hello-world/blob/3332fbee4210b41738d83f6cfdc301a42b96e30d/amd64/hello-world/Dockerfile) + - [`nanoserver-ltsc2022`](https://github.com/docker-library/hello-world/blob/c816763efda4774cc0c628dca3c7dbd93c099928/amd64/hello-world/nanoserver-ltsc2022/Dockerfile) + - [`nanoserver-1809`](https://github.com/docker-library/hello-world/blob/c816763efda4774cc0c628dca3c7dbd93c099928/amd64/hello-world/nanoserver-1809/Dockerfile) - `nanoserver`: - - [`nanoserver-1809`](https://github.com/docker-library/hello-world/blob/9c93e37114a7fe99b5fc0d776e0b8dff99cbbb75/amd64/hello-world/nanoserver-1809/Dockerfile) + - [`nanoserver-ltsc2022`](https://github.com/docker-library/hello-world/blob/c816763efda4774cc0c628dca3c7dbd93c099928/amd64/hello-world/nanoserver-ltsc2022/Dockerfile) + - [`nanoserver-1809`](https://github.com/docker-library/hello-world/blob/c816763efda4774cc0c628dca3c7dbd93c099928/amd64/hello-world/nanoserver-1809/Dockerfile) # Quick reference (cont.) @@ -45,14 +48,14 @@ WARNING: [https://github.com/docker-library/hello-world/issues](https://github.com/docker-library/hello-world/issues) - **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) - [`amd64`](https://hub.docker.com/r/amd64/hello-world/), [`arm32v5`](https://hub.docker.com/r/arm32v5/hello-world/), [`arm32v7`](https://hub.docker.com/r/arm32v7/hello-world/), [`arm64v8`](https://hub.docker.com/r/arm64v8/hello-world/), [`i386`](https://hub.docker.com/r/i386/hello-world/), [`mips64le`](https://hub.docker.com/r/mips64le/hello-world/), [`ppc64le`](https://hub.docker.com/r/ppc64le/hello-world/), [`s390x`](https://hub.docker.com/r/s390x/hello-world/), [`windows-amd64`](https://hub.docker.com/r/winamd64/hello-world/) + [`amd64`](https://hub.docker.com/r/amd64/hello-world/), [`arm32v5`](https://hub.docker.com/r/arm32v5/hello-world/), [`arm32v7`](https://hub.docker.com/r/arm32v7/hello-world/), [`arm64v8`](https://hub.docker.com/r/arm64v8/hello-world/), [`i386`](https://hub.docker.com/r/i386/hello-world/), [`mips64le`](https://hub.docker.com/r/mips64le/hello-world/), [`ppc64le`](https://hub.docker.com/r/ppc64le/hello-world/), [`riscv64`](https://hub.docker.com/r/riscv64/hello-world/), [`s390x`](https://hub.docker.com/r/s390x/hello-world/), [`windows-amd64`](https://hub.docker.com/r/winamd64/hello-world/) - **Published image artifact details**: [repo-info repo's `repos/hello-world/` directory](https://github.com/docker-library/repo-info/blob/master/repos/hello-world) ([history](https://github.com/docker-library/repo-info/commits/master/repos/hello-world)) (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/hello-world`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fhello-world) + [official-images repo's `library/hello-world` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fhello-world) [official-images repo's `library/hello-world` file](https://github.com/docker-library/official-images/blob/master/library/hello-world) ([history](https://github.com/docker-library/official-images/commits/master/library/hello-world)) - **Source of this description**: @@ -86,8 +89,8 @@ For more examples and ideas, visit: $ docker images hello-world -REPOSITORY TAG IMAGE ID SIZE -hello-world latest bf756fb1ae65 13336 +REPOSITORY TAG IMAGE ID SIZE +hello-world latest feb5d9fea6a5 13.26kB ``` ![logo](https://raw.githubusercontent.com/docker-library/docs/01c12653951b2fe592c1f93a13b4e289ada0e3a1/hello-world/logo.png) @@ -96,6 +99,8 @@ hello-world latest bf756fb1ae65 13336 This image is a prime example of using the [`scratch`](https://hub.docker.com/_/scratch/) image effectively. See [`hello.c`](https://github.com/docker-library/hello-world/blob/master/hello.c) in https://github.com/docker-library/hello-world for the source code of the `hello` binary included in this image. +Because this image consists of nothing but a single static binary which prints some text to standard output, it can trivially be run as any arbitrary user (`docker run --user $RANDOM:$RANDOM hello-world`, for example). + # License View [license information](https://github.com/docker-library/hello-world/blob/master/LICENSE) for the software contained in this image. diff --git a/hello-world/content.md b/hello-world/content.md index 0bacc2c27224..fc79d8d7f4c3 100644 --- a/hello-world/content.md +++ b/hello-world/content.md @@ -26,8 +26,8 @@ For more examples and ideas, visit: $ docker images %%IMAGE%% -REPOSITORY TAG IMAGE ID SIZE -hello-world latest bf756fb1ae65 13336 +REPOSITORY TAG IMAGE ID SIZE +hello-world latest feb5d9fea6a5 13.26kB ``` %%LOGO%% @@ -35,3 +35,5 @@ hello-world latest bf756fb1ae65 13336 # How is this image created? This image is a prime example of using the [`scratch`](https://hub.docker.com/_/scratch/) image effectively. See [`hello.c`](%%GITHUB-REPO%%/blob/master/hello.c) in %%GITHUB-REPO%% for the source code of the `hello` binary included in this image. + +Because this image consists of nothing but a single static binary which prints some text to standard output, it can trivially be run as any arbitrary user (`docker run --user $RANDOM:$RANDOM %%IMAGE%%`, for example). diff --git a/hello-world/update.sh b/hello-world/update.sh index 505ed6490b1e..093a50fdd090 100755 --- a/hello-world/update.sh +++ b/hello-world/update.sh @@ -15,20 +15,16 @@ echo '$ docker run %%IMAGE%%' docker run --rm hello-world echo echo '$ docker images %%IMAGE%%' -{ - id="$(docker image inspect --format '{{ .Id }}' "$image:latest" | sed -r 's/^sha256:([a-f0-9]{12})[a-f0-9]+$/\1/')" - size="$(docker image inspect --format '{{ .VirtualSize }}' "$image:latest")" - echo $'REPOSITORY\tTAG\tIMAGE ID\tSIZE' - echo "$image"$'\tlatest\t'"$id"$'\t'"$size" -} | column -t -s$'\t' +docker image ls --format 'table {{ .Repository }}\t{{ .Tag }}\t{{ .ID }}\t{{ .VirtualSize }}' "$image:latest" echo '```' -echo -echo '%%LOGO%%' - -echo cat <<'EOF' + +%%LOGO%% + # How is this image created? This image is a prime example of using the [`scratch`](https://hub.docker.com/_/scratch/) image effectively. See [`hello.c`](%%GITHUB-REPO%%/blob/master/hello.c) in %%GITHUB-REPO%% for the source code of the `hello` binary included in this image. + +Because this image consists of nothing but a single static binary which prints some text to standard output, it can trivially be run as any arbitrary user (`docker run --user $RANDOM:$RANDOM %%IMAGE%%`, for example). EOF diff --git a/hitch/README-short.txt b/hitch/README-short.txt new file mode 100644 index 000000000000..53536e019edc --- /dev/null +++ b/hitch/README-short.txt @@ -0,0 +1 @@ +Hitch is a libev-based high performance SSL/TLS proxy by Varnish Software. diff --git a/hitch/README.md b/hitch/README.md new file mode 100644 index 000000000000..7d609ca4c60b --- /dev/null +++ b/hitch/README.md @@ -0,0 +1,121 @@ + + +# Quick reference + +- **Maintained by**: + [the Hitch Docker Community](https://github.com/varnish/docker-hitch) + +- **Where to get help**: + [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) + +# Supported tags and respective `Dockerfile` links + +- [`1`, `1.7`, `1.7.3`, `1.7.3-1`, `latest`](https://github.com/varnish/docker-hitch/blob/3f7f06a4eeb066e03f81f5e3d170d1e13606e69e/Dockerfile) +- [`1.7.2`, `1.7.2-1`](https://github.com/varnish/docker-hitch/blob/054c998138c8f8ec6be03c7db711b8435de41e2b/Dockerfile) + +# Quick reference (cont.) + +- **Where to file issues**: + [https://github.com/varnish/docker-hitch/issues](https://github.com/varnish/docker-hitch/issues) + +- **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) + [`amd64`](https://hub.docker.com/r/amd64/hitch/), [`arm32v7`](https://hub.docker.com/r/arm32v7/hitch/), [`arm64v8`](https://hub.docker.com/r/arm64v8/hitch/), [`i386`](https://hub.docker.com/r/i386/hitch/), [`ppc64le`](https://hub.docker.com/r/ppc64le/hitch/), [`s390x`](https://hub.docker.com/r/s390x/hitch/) + +- **Published image artifact details**: + [repo-info repo's `repos/hitch/` directory](https://github.com/docker-library/repo-info/blob/master/repos/hitch) ([history](https://github.com/docker-library/repo-info/commits/master/repos/hitch)) + (image metadata, transfer size, etc) + +- **Image updates**: + [official-images repo's `library/hitch` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fhitch) + [official-images repo's `library/hitch` file](https://github.com/docker-library/official-images/blob/master/library/hitch) ([history](https://github.com/docker-library/official-images/commits/master/library/hitch)) + +- **Source of this description**: + [docs repo's `hitch/` directory](https://github.com/docker-library/docs/tree/master/hitch) ([history](https://github.com/docker-library/docs/commits/master/hitch)) + +# What is Hitch? + +[Hitch](https://hitch-tls.org/) is a *libev-based* high performance *SSL/TLS proxy* by [Varnish Software](https://varnish-software.com). It is specifically built to terminate TLS connections at high scale and forwards unencrypted HTTP traffic to Varnish or any other HTTP backend. + +# How to use this image + +Running a Hitch Docker container can be done by using the following command: + +```console +$ docker run --name=hitch -p 443:443 hitch +``` + +This container will expose port `443`, which is required for HTTPS traffic. + +## Configuration file and extra options + +Without any argument, the container will run `hitch --config=/etc/hitch/hitch.conf`. You can mount your own configuration file to replace the default one: + +```console +$ docker run -v /path/to/your/config/file:/etc/hitch/hitch.conf:ro hitch +``` + +You can also change the path of the configuration file by setting the `HITCH_CONFIG_FILE` environment variable. + +Note that extra arguments can be added to the command line. If the first argument starts with a `-`, the arguments are added to the default command line, otherwise they are treated as a command. + +> Our assumption is that your backend, Varnish or other, supports both *HTTP/2* and the *PROXY* protocol. + +## Connecting to the backend + +By default Hitch will connect to the backend using `localhost:8843` using the [PROXY protocol](https://github.com/varnish/hitch/blob/master/docs/proxy-protocol.md). If your backend server *PROXY*, the two will be able to talk together and backend will be able to expose the true client IP. + +But you'll probably run your backend service in a separate container. In that case, you'll want to change the backend settings. You can either do that by replacing the [`backend`](https://github.com/varnish/hitch/blob/master/hitch.conf.man.rst#backend--) configuration setting in your mounted configuration file, or by adding a *command-line option*. + +Here's how you set the backend via a *command-line option*, assuming your backend is available through `backend.example.com` on port `8443`: + +```console +$ docker run hitch "--backend=[backend.example.com]:8443" +``` + +## Setting the certificate + +The Hitch Docker image comes with a self-signed certificate that is stored in `/etc/hitch/certs/default`. + +This certificate is automatically created during *Hitch* package install, and is a self-signed certificate using 2048-bit RSA-encrypted cipher. It is set up for the `localhost` hostname, with an expiration date 30 years in the future. + +This certificate is only suited for testing. Using a bind mount, you can override the value of the certificate and use your own certificate, which is advisable. + +Here's an example: + +```console +$ docker run -v /path/to/your/certificate:/etc/hitch/certs/default:ro hitch +``` + +You can also override the [`pem-file`](https://github.com/varnish/hitch/blob/master/hitch.conf.man.rst#pem-file--string) configuration setting in your mounted configuration file. + +If you prefer setting the certificate location on the command line, you can add the location as part of the `--backend` option. + +Here's how you do this: + +```console +$ docker run hitch "--backend=[backend.example.com]:8443:/path/to/cert.pem" +``` + +# License + +View [license information](https://github.com/varnish/hitch/blob/master/LICENSE) for the software contained in this image. + +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). + +Some additional license information which was able to be auto-detected might be found in [the `repo-info` repository's `hitch/` directory](https://github.com/docker-library/repo-info/tree/master/repos/hitch). + +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. diff --git a/hitch/content.md b/hitch/content.md new file mode 100644 index 000000000000..589de8eda334 --- /dev/null +++ b/hitch/content.md @@ -0,0 +1,63 @@ +# What is Hitch? + +[Hitch](https://hitch-tls.org/) is a *libev-based* high performance *SSL/TLS proxy* by [Varnish Software](https://varnish-software.com). It is specifically built to terminate TLS connections at high scale and forwards unencrypted HTTP traffic to Varnish or any other HTTP backend. + +# How to use this image + +Running a Hitch Docker container can be done by using the following command: + +```console +$ docker run --name=hitch -p 443:443 %%IMAGE%% +``` + +This container will expose port `443`, which is required for HTTPS traffic. + +## Configuration file and extra options + +Without any argument, the container will run `hitch --config=/etc/hitch/hitch.conf`. You can mount your own configuration file to replace the default one: + +```console +$ docker run -v /path/to/your/config/file:/etc/hitch/hitch.conf:ro %%IMAGE%% +``` + +You can also change the path of the configuration file by setting the `HITCH_CONFIG_FILE` environment variable. + +Note that extra arguments can be added to the command line. If the first argument starts with a `-`, the arguments are added to the default command line, otherwise they are treated as a command. + +> Our assumption is that your backend, Varnish or other, supports both *HTTP/2* and the *PROXY* protocol. + +## Connecting to the backend + +By default Hitch will connect to the backend using `localhost:8843` using the [PROXY protocol](https://github.com/varnish/hitch/blob/master/docs/proxy-protocol.md). If your backend server *PROXY*, the two will be able to talk together and backend will be able to expose the true client IP. + +But you'll probably run your backend service in a separate container. In that case, you'll want to change the backend settings. You can either do that by replacing the [`backend`](https://github.com/varnish/hitch/blob/master/hitch.conf.man.rst#backend--) configuration setting in your mounted configuration file, or by adding a *command-line option*. + +Here's how you set the backend via a *command-line option*, assuming your backend is available through `backend.example.com` on port `8443`: + +```console +$ docker run %%IMAGE%% "--backend=[backend.example.com]:8443" +``` + +## Setting the certificate + +The Hitch Docker image comes with a self-signed certificate that is stored in `/etc/hitch/certs/default`. + +This certificate is automatically created during *Hitch* package install, and is a self-signed certificate using 2048-bit RSA-encrypted cipher. It is set up for the `localhost` hostname, with an expiration date 30 years in the future. + +This certificate is only suited for testing. Using a bind mount, you can override the value of the certificate and use your own certificate, which is advisable. + +Here's an example: + +```console +$ docker run -v /path/to/your/certificate:/etc/hitch/certs/default:ro %%IMAGE%% +``` + +You can also override the [`pem-file`](https://github.com/varnish/hitch/blob/master/hitch.conf.man.rst#pem-file--string) configuration setting in your mounted configuration file. + +If you prefer setting the certificate location on the command line, you can add the location as part of the `--backend` option. + +Here's how you do this: + +```console +$ docker run %%IMAGE%% "--backend=[backend.example.com]:8443:/path/to/cert.pem" +``` diff --git a/hitch/github-repo b/hitch/github-repo new file mode 100644 index 000000000000..37d8c30f7b06 --- /dev/null +++ b/hitch/github-repo @@ -0,0 +1 @@ +https://github.com/varnish/docker-hitch diff --git a/hitch/license.md b/hitch/license.md new file mode 100644 index 000000000000..bbcd4ba42390 --- /dev/null +++ b/hitch/license.md @@ -0,0 +1 @@ +View [license information](https://github.com/varnish/hitch/blob/master/LICENSE) for the software contained in this image. diff --git a/hitch/maintainer.md b/hitch/maintainer.md new file mode 100644 index 000000000000..2aeedddc6e0f --- /dev/null +++ b/hitch/maintainer.md @@ -0,0 +1 @@ +[the Hitch Docker Community](%%GITHUB-REPO%%) diff --git a/httpd/README.md b/httpd/README.md index f27e6917637a..2c3e6dea9415 100644 --- a/httpd/README.md +++ b/httpd/README.md @@ -20,12 +20,12 @@ WARNING: [the Docker Community](https://github.com/docker-library/httpd) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`2.4.43`, `2.4`, `2`, `latest`](https://github.com/docker-library/httpd/blob/6c8e82e20ecefc94c616439f15d14c4bb215b200/2.4/Dockerfile) -- [`2.4.43-alpine`, `2.4-alpine`, `2-alpine`, `alpine`](https://github.com/docker-library/httpd/blob/6c8e82e20ecefc94c616439f15d14c4bb215b200/2.4/alpine/Dockerfile) +- [`2.4.54`, `2.4`, `2`, `latest`, `2.4.54-bullseye`, `2.4-bullseye`, `2-bullseye`, `bullseye`](https://github.com/docker-library/httpd/blob/f3b7fd9c8ef59d1ad46c8b2a27df3e02d822834f/2.4/Dockerfile) +- [`2.4.54-alpine`, `2.4-alpine`, `2-alpine`, `alpine`, `2.4.54-alpine3.17`, `2.4-alpine3.17`, `2-alpine3.17`, `alpine3.17`](https://github.com/docker-library/httpd/blob/a8768519be284075c5cafd0ed6645d3bedaad6b1/2.4/alpine/Dockerfile) # Quick reference (cont.) @@ -40,7 +40,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/httpd`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fhttpd) + [official-images repo's `library/httpd` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fhttpd) [official-images repo's `library/httpd` file](https://github.com/docker-library/official-images/blob/master/library/httpd) ([history](https://github.com/docker-library/official-images/commits/master/library/httpd)) - **Source of this description**: @@ -133,11 +133,13 @@ The `httpd` images come in many flavors, each designed for a specific use case. 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. +Some of these tags may have names like 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. + ## `httpd:-alpine` -This image is based on the popular [Alpine Linux project](http://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. +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. -This variant is highly recommended when final image size being as small as possible is desired. The main caveat to note is that it does use [musl libc](http://www.musl-libc.org) instead of [glibc and friends](http://www.etalabs.net/compare_libcs.html), so certain software might run into issues depending on the depth of their libc requirements. However, most software doesn't have an issue with this, so this variant is usually a very safe choice. 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. +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. 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). diff --git a/hylang/README.md b/hylang/README.md index 6d4cc436641b..1293bddbed8a 100644 --- a/hylang/README.md +++ b/hylang/README.md @@ -20,7 +20,7 @@ WARNING: [Paul Tagliamonte, Hy BDFL](https://github.com/hylang/hy) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links @@ -28,43 +28,55 @@ WARNING: ## Simple Tags -- [`0.18.0-python3.8-buster`, `0.18-python3.8-buster`, `0-python3.8-buster`, `python3.8-buster`, `0.18.0-buster`, `0.18-buster`, `0-buster`, `buster`](https://github.com/hylang/docker-hylang/blob/5148df70ef281642faeb6508aa74cb14b1c09541/dockerfiles-generated/Dockerfile.python3.8-buster) -- [`0.18.0-python3.8-alpine3.11`, `0.18-python3.8-alpine3.11`, `0-python3.8-alpine3.11`, `python3.8-alpine3.11`, `0.18.0-alpine3.11`, `0.18-alpine3.11`, `0-alpine3.11`, `alpine3.11`, `0.18.0-python3.8-alpine`, `0.18-python3.8-alpine`, `0-python3.8-alpine`, `python3.8-alpine`, `0.18.0-alpine`, `0.18-alpine`, `0-alpine`, `alpine`](https://github.com/hylang/docker-hylang/blob/5148df70ef281642faeb6508aa74cb14b1c09541/dockerfiles-generated/Dockerfile.python3.8-alpine3.11) -- [`0.18.0-python3.8-alpine3.10`, `0.18-python3.8-alpine3.10`, `0-python3.8-alpine3.10`, `python3.8-alpine3.10`, `0.18.0-alpine3.10`, `0.18-alpine3.10`, `0-alpine3.10`, `alpine3.10`](https://github.com/hylang/docker-hylang/blob/5148df70ef281642faeb6508aa74cb14b1c09541/dockerfiles-generated/Dockerfile.python3.8-alpine3.10) -- [`0.18.0-python3.8-windowsservercore-1809`, `0.18-python3.8-windowsservercore-1809`, `0-python3.8-windowsservercore-1809`, `python3.8-windowsservercore-1809`, `0.18.0-windowsservercore-1809`, `0.18-windowsservercore-1809`, `0-windowsservercore-1809`, `windowsservercore-1809`](https://github.com/hylang/docker-hylang/blob/5148df70ef281642faeb6508aa74cb14b1c09541/dockerfiles-generated/Dockerfile.python3.8-windowsservercore-1809) -- [`0.18.0-python3.8-windowsservercore-ltsc2016`, `0.18-python3.8-windowsservercore-ltsc2016`, `0-python3.8-windowsservercore-ltsc2016`, `python3.8-windowsservercore-ltsc2016`, `0.18.0-windowsservercore-ltsc2016`, `0.18-windowsservercore-ltsc2016`, `0-windowsservercore-ltsc2016`, `windowsservercore-ltsc2016`](https://github.com/hylang/docker-hylang/blob/5148df70ef281642faeb6508aa74cb14b1c09541/dockerfiles-generated/Dockerfile.python3.8-windowsservercore-ltsc2016) -- [`0.18.0-python3.7-buster`, `0.18-python3.7-buster`, `0-python3.7-buster`, `python3.7-buster`](https://github.com/hylang/docker-hylang/blob/5148df70ef281642faeb6508aa74cb14b1c09541/dockerfiles-generated/Dockerfile.python3.7-buster) -- [`0.18.0-python3.7-stretch`, `0.18-python3.7-stretch`, `0-python3.7-stretch`, `python3.7-stretch`](https://github.com/hylang/docker-hylang/blob/5148df70ef281642faeb6508aa74cb14b1c09541/dockerfiles-generated/Dockerfile.python3.7-stretch) -- [`0.18.0-python3.7-alpine3.11`, `0.18-python3.7-alpine3.11`, `0-python3.7-alpine3.11`, `python3.7-alpine3.11`, `0.18.0-python3.7-alpine`, `0.18-python3.7-alpine`, `0-python3.7-alpine`, `python3.7-alpine`](https://github.com/hylang/docker-hylang/blob/5148df70ef281642faeb6508aa74cb14b1c09541/dockerfiles-generated/Dockerfile.python3.7-alpine3.11) -- [`0.18.0-python3.7-alpine3.10`, `0.18-python3.7-alpine3.10`, `0-python3.7-alpine3.10`, `python3.7-alpine3.10`](https://github.com/hylang/docker-hylang/blob/5148df70ef281642faeb6508aa74cb14b1c09541/dockerfiles-generated/Dockerfile.python3.7-alpine3.10) -- [`0.18.0-python3.7-windowsservercore-1809`, `0.18-python3.7-windowsservercore-1809`, `0-python3.7-windowsservercore-1809`, `python3.7-windowsservercore-1809`](https://github.com/hylang/docker-hylang/blob/5148df70ef281642faeb6508aa74cb14b1c09541/dockerfiles-generated/Dockerfile.python3.7-windowsservercore-1809) -- [`0.18.0-python3.7-windowsservercore-ltsc2016`, `0.18-python3.7-windowsservercore-ltsc2016`, `0-python3.7-windowsservercore-ltsc2016`, `python3.7-windowsservercore-ltsc2016`](https://github.com/hylang/docker-hylang/blob/5148df70ef281642faeb6508aa74cb14b1c09541/dockerfiles-generated/Dockerfile.python3.7-windowsservercore-ltsc2016) -- [`0.18.0-python3.6-buster`, `0.18-python3.6-buster`, `0-python3.6-buster`, `python3.6-buster`](https://github.com/hylang/docker-hylang/blob/5148df70ef281642faeb6508aa74cb14b1c09541/dockerfiles-generated/Dockerfile.python3.6-buster) -- [`0.18.0-python3.6-stretch`, `0.18-python3.6-stretch`, `0-python3.6-stretch`, `python3.6-stretch`](https://github.com/hylang/docker-hylang/blob/5148df70ef281642faeb6508aa74cb14b1c09541/dockerfiles-generated/Dockerfile.python3.6-stretch) -- [`0.18.0-python3.6-alpine3.11`, `0.18-python3.6-alpine3.11`, `0-python3.6-alpine3.11`, `python3.6-alpine3.11`, `0.18.0-python3.6-alpine`, `0.18-python3.6-alpine`, `0-python3.6-alpine`, `python3.6-alpine`](https://github.com/hylang/docker-hylang/blob/5148df70ef281642faeb6508aa74cb14b1c09541/dockerfiles-generated/Dockerfile.python3.6-alpine3.11) -- [`0.18.0-python3.6-alpine3.10`, `0.18-python3.6-alpine3.10`, `0-python3.6-alpine3.10`, `python3.6-alpine3.10`](https://github.com/hylang/docker-hylang/blob/5148df70ef281642faeb6508aa74cb14b1c09541/dockerfiles-generated/Dockerfile.python3.6-alpine3.10) -- [`0.18.0-python3.5-buster`, `0.18-python3.5-buster`, `0-python3.5-buster`, `python3.5-buster`](https://github.com/hylang/docker-hylang/blob/5148df70ef281642faeb6508aa74cb14b1c09541/dockerfiles-generated/Dockerfile.python3.5-buster) -- [`0.18.0-python3.5-stretch`, `0.18-python3.5-stretch`, `0-python3.5-stretch`, `python3.5-stretch`](https://github.com/hylang/docker-hylang/blob/5148df70ef281642faeb6508aa74cb14b1c09541/dockerfiles-generated/Dockerfile.python3.5-stretch) -- [`0.18.0-python3.5-alpine3.11`, `0.18-python3.5-alpine3.11`, `0-python3.5-alpine3.11`, `python3.5-alpine3.11`, `0.18.0-python3.5-alpine`, `0.18-python3.5-alpine`, `0-python3.5-alpine`, `python3.5-alpine`](https://github.com/hylang/docker-hylang/blob/5148df70ef281642faeb6508aa74cb14b1c09541/dockerfiles-generated/Dockerfile.python3.5-alpine3.11) -- [`0.18.0-python3.5-alpine3.10`, `0.18-python3.5-alpine3.10`, `0-python3.5-alpine3.10`, `python3.5-alpine3.10`](https://github.com/hylang/docker-hylang/blob/5148df70ef281642faeb6508aa74cb14b1c09541/dockerfiles-generated/Dockerfile.python3.5-alpine3.10) -- [`0.18.0-pypy3.6-buster`, `0.18-pypy3.6-buster`, `0-pypy3.6-buster`, `pypy3.6-buster`, `0.18.0-pypy-buster`, `0.18-pypy-buster`, `0-pypy-buster`, `pypy-buster`](https://github.com/hylang/docker-hylang/blob/5148df70ef281642faeb6508aa74cb14b1c09541/dockerfiles-generated/Dockerfile.pypy3.6-buster) +- [`0.25.0-python3.11-bullseye`, `0.25-python3.11-bullseye`, `0-python3.11-bullseye`, `python3.11-bullseye`, `0.25.0-bullseye`, `0.25-bullseye`, `0-bullseye`, `bullseye`](https://github.com/hylang/docker-hylang/blob/d5431b3cfc54bd22202a34336d5375d716f2d13d/dockerfiles-generated/Dockerfile.python3.11-bullseye) +- [`0.25.0-python3.11-buster`, `0.25-python3.11-buster`, `0-python3.11-buster`, `python3.11-buster`, `0.25.0-buster`, `0.25-buster`, `0-buster`, `buster`](https://github.com/hylang/docker-hylang/blob/d5431b3cfc54bd22202a34336d5375d716f2d13d/dockerfiles-generated/Dockerfile.python3.11-buster) +- [`0.25.0-python3.11-alpine3.17`, `0.25-python3.11-alpine3.17`, `0-python3.11-alpine3.17`, `python3.11-alpine3.17`, `0.25.0-alpine3.17`, `0.25-alpine3.17`, `0-alpine3.17`, `alpine3.17`, `0.25.0-python3.11-alpine`, `0.25-python3.11-alpine`, `0-python3.11-alpine`, `python3.11-alpine`, `0.25.0-alpine`, `0.25-alpine`, `0-alpine`, `alpine`](https://github.com/hylang/docker-hylang/blob/d5431b3cfc54bd22202a34336d5375d716f2d13d/dockerfiles-generated/Dockerfile.python3.11-alpine3.17) +- [`0.25.0-python3.11-alpine3.16`, `0.25-python3.11-alpine3.16`, `0-python3.11-alpine3.16`, `python3.11-alpine3.16`, `0.25.0-alpine3.16`, `0.25-alpine3.16`, `0-alpine3.16`, `alpine3.16`](https://github.com/hylang/docker-hylang/blob/d5431b3cfc54bd22202a34336d5375d716f2d13d/dockerfiles-generated/Dockerfile.python3.11-alpine3.16) +- [`0.25.0-python3.10-bullseye`, `0.25-python3.10-bullseye`, `0-python3.10-bullseye`, `python3.10-bullseye`](https://github.com/hylang/docker-hylang/blob/d5431b3cfc54bd22202a34336d5375d716f2d13d/dockerfiles-generated/Dockerfile.python3.10-bullseye) +- [`0.25.0-python3.10-buster`, `0.25-python3.10-buster`, `0-python3.10-buster`, `python3.10-buster`](https://github.com/hylang/docker-hylang/blob/d5431b3cfc54bd22202a34336d5375d716f2d13d/dockerfiles-generated/Dockerfile.python3.10-buster) +- [`0.25.0-python3.10-alpine3.17`, `0.25-python3.10-alpine3.17`, `0-python3.10-alpine3.17`, `python3.10-alpine3.17`, `0.25.0-python3.10-alpine`, `0.25-python3.10-alpine`, `0-python3.10-alpine`, `python3.10-alpine`](https://github.com/hylang/docker-hylang/blob/d5431b3cfc54bd22202a34336d5375d716f2d13d/dockerfiles-generated/Dockerfile.python3.10-alpine3.17) +- [`0.25.0-python3.10-alpine3.16`, `0.25-python3.10-alpine3.16`, `0-python3.10-alpine3.16`, `python3.10-alpine3.16`](https://github.com/hylang/docker-hylang/blob/d5431b3cfc54bd22202a34336d5375d716f2d13d/dockerfiles-generated/Dockerfile.python3.10-alpine3.16) +- [`0.25.0-python3.9-bullseye`, `0.25-python3.9-bullseye`, `0-python3.9-bullseye`, `python3.9-bullseye`](https://github.com/hylang/docker-hylang/blob/d5431b3cfc54bd22202a34336d5375d716f2d13d/dockerfiles-generated/Dockerfile.python3.9-bullseye) +- [`0.25.0-python3.9-buster`, `0.25-python3.9-buster`, `0-python3.9-buster`, `python3.9-buster`](https://github.com/hylang/docker-hylang/blob/d5431b3cfc54bd22202a34336d5375d716f2d13d/dockerfiles-generated/Dockerfile.python3.9-buster) +- [`0.25.0-python3.9-alpine3.17`, `0.25-python3.9-alpine3.17`, `0-python3.9-alpine3.17`, `python3.9-alpine3.17`, `0.25.0-python3.9-alpine`, `0.25-python3.9-alpine`, `0-python3.9-alpine`, `python3.9-alpine`](https://github.com/hylang/docker-hylang/blob/d5431b3cfc54bd22202a34336d5375d716f2d13d/dockerfiles-generated/Dockerfile.python3.9-alpine3.17) +- [`0.25.0-python3.9-alpine3.16`, `0.25-python3.9-alpine3.16`, `0-python3.9-alpine3.16`, `python3.9-alpine3.16`](https://github.com/hylang/docker-hylang/blob/d5431b3cfc54bd22202a34336d5375d716f2d13d/dockerfiles-generated/Dockerfile.python3.9-alpine3.16) +- [`0.25.0-python3.8-bullseye`, `0.25-python3.8-bullseye`, `0-python3.8-bullseye`, `python3.8-bullseye`](https://github.com/hylang/docker-hylang/blob/d5431b3cfc54bd22202a34336d5375d716f2d13d/dockerfiles-generated/Dockerfile.python3.8-bullseye) +- [`0.25.0-python3.8-buster`, `0.25-python3.8-buster`, `0-python3.8-buster`, `python3.8-buster`](https://github.com/hylang/docker-hylang/blob/d5431b3cfc54bd22202a34336d5375d716f2d13d/dockerfiles-generated/Dockerfile.python3.8-buster) +- [`0.25.0-python3.8-alpine3.17`, `0.25-python3.8-alpine3.17`, `0-python3.8-alpine3.17`, `python3.8-alpine3.17`, `0.25.0-python3.8-alpine`, `0.25-python3.8-alpine`, `0-python3.8-alpine`, `python3.8-alpine`](https://github.com/hylang/docker-hylang/blob/d5431b3cfc54bd22202a34336d5375d716f2d13d/dockerfiles-generated/Dockerfile.python3.8-alpine3.17) +- [`0.25.0-python3.8-alpine3.16`, `0.25-python3.8-alpine3.16`, `0-python3.8-alpine3.16`, `python3.8-alpine3.16`](https://github.com/hylang/docker-hylang/blob/d5431b3cfc54bd22202a34336d5375d716f2d13d/dockerfiles-generated/Dockerfile.python3.8-alpine3.16) +- [`0.25.0-python3.7-bullseye`, `0.25-python3.7-bullseye`, `0-python3.7-bullseye`, `python3.7-bullseye`](https://github.com/hylang/docker-hylang/blob/d5431b3cfc54bd22202a34336d5375d716f2d13d/dockerfiles-generated/Dockerfile.python3.7-bullseye) +- [`0.25.0-python3.7-buster`, `0.25-python3.7-buster`, `0-python3.7-buster`, `python3.7-buster`](https://github.com/hylang/docker-hylang/blob/d5431b3cfc54bd22202a34336d5375d716f2d13d/dockerfiles-generated/Dockerfile.python3.7-buster) +- [`0.25.0-python3.7-alpine3.17`, `0.25-python3.7-alpine3.17`, `0-python3.7-alpine3.17`, `python3.7-alpine3.17`, `0.25.0-python3.7-alpine`, `0.25-python3.7-alpine`, `0-python3.7-alpine`, `python3.7-alpine`](https://github.com/hylang/docker-hylang/blob/d5431b3cfc54bd22202a34336d5375d716f2d13d/dockerfiles-generated/Dockerfile.python3.7-alpine3.17) +- [`0.25.0-python3.7-alpine3.16`, `0.25-python3.7-alpine3.16`, `0-python3.7-alpine3.16`, `python3.7-alpine3.16`](https://github.com/hylang/docker-hylang/blob/d5431b3cfc54bd22202a34336d5375d716f2d13d/dockerfiles-generated/Dockerfile.python3.7-alpine3.16) +- [`0.25.0-pypy3.9-bullseye`, `0.25-pypy3.9-bullseye`, `0-pypy3.9-bullseye`, `pypy3.9-bullseye`, `0.25.0-pypy-bullseye`, `0.25-pypy-bullseye`, `0-pypy-bullseye`, `pypy-bullseye`](https://github.com/hylang/docker-hylang/blob/d5431b3cfc54bd22202a34336d5375d716f2d13d/dockerfiles-generated/Dockerfile.pypy3.9-bullseye) +- [`0.25.0-pypy3.9-buster`, `0.25-pypy3.9-buster`, `0-pypy3.9-buster`, `pypy3.9-buster`, `0.25.0-pypy-buster`, `0.25-pypy-buster`, `0-pypy-buster`, `pypy-buster`](https://github.com/hylang/docker-hylang/blob/d5431b3cfc54bd22202a34336d5375d716f2d13d/dockerfiles-generated/Dockerfile.pypy3.9-buster) +- [`0.25.0-pypy3.9-windowsservercore-ltsc2022`, `0.25-pypy3.9-windowsservercore-ltsc2022`, `0-pypy3.9-windowsservercore-ltsc2022`, `pypy3.9-windowsservercore-ltsc2022`, `0.25.0-pypy-windowsservercore-ltsc2022`, `0.25-pypy-windowsservercore-ltsc2022`, `0-pypy-windowsservercore-ltsc2022`, `pypy-windowsservercore-ltsc2022`](https://github.com/hylang/docker-hylang/blob/d5431b3cfc54bd22202a34336d5375d716f2d13d/dockerfiles-generated/Dockerfile.pypy3.9-windowsservercore-ltsc2022) +- [`0.25.0-pypy3.9-windowsservercore-1809`, `0.25-pypy3.9-windowsservercore-1809`, `0-pypy3.9-windowsservercore-1809`, `pypy3.9-windowsservercore-1809`, `0.25.0-pypy-windowsservercore-1809`, `0.25-pypy-windowsservercore-1809`, `0-pypy-windowsservercore-1809`, `pypy-windowsservercore-1809`](https://github.com/hylang/docker-hylang/blob/d5431b3cfc54bd22202a34336d5375d716f2d13d/dockerfiles-generated/Dockerfile.pypy3.9-windowsservercore-1809) +- [`0.25.0-pypy3.8-bullseye`, `0.25-pypy3.8-bullseye`, `0-pypy3.8-bullseye`, `pypy3.8-bullseye`](https://github.com/hylang/docker-hylang/blob/d5431b3cfc54bd22202a34336d5375d716f2d13d/dockerfiles-generated/Dockerfile.pypy3.8-bullseye) +- [`0.25.0-pypy3.8-buster`, `0.25-pypy3.8-buster`, `0-pypy3.8-buster`, `pypy3.8-buster`](https://github.com/hylang/docker-hylang/blob/d5431b3cfc54bd22202a34336d5375d716f2d13d/dockerfiles-generated/Dockerfile.pypy3.8-buster) +- [`0.25.0-pypy3.8-windowsservercore-ltsc2022`, `0.25-pypy3.8-windowsservercore-ltsc2022`, `0-pypy3.8-windowsservercore-ltsc2022`, `pypy3.8-windowsservercore-ltsc2022`](https://github.com/hylang/docker-hylang/blob/d5431b3cfc54bd22202a34336d5375d716f2d13d/dockerfiles-generated/Dockerfile.pypy3.8-windowsservercore-ltsc2022) +- [`0.25.0-pypy3.8-windowsservercore-1809`, `0.25-pypy3.8-windowsservercore-1809`, `0-pypy3.8-windowsservercore-1809`, `pypy3.8-windowsservercore-1809`](https://github.com/hylang/docker-hylang/blob/d5431b3cfc54bd22202a34336d5375d716f2d13d/dockerfiles-generated/Dockerfile.pypy3.8-windowsservercore-1809) ## Shared Tags -- `0.18.0-python3.8`, `0.18-python3.8`, `0-python3.8`, `python3.8`, `0.18.0`, `0.18`, `0`, `latest`: - - [`0.18.0-python3.8-buster`](https://github.com/hylang/docker-hylang/blob/5148df70ef281642faeb6508aa74cb14b1c09541/dockerfiles-generated/Dockerfile.python3.8-buster) - - [`0.18.0-python3.8-windowsservercore-1809`](https://github.com/hylang/docker-hylang/blob/5148df70ef281642faeb6508aa74cb14b1c09541/dockerfiles-generated/Dockerfile.python3.8-windowsservercore-1809) - - [`0.18.0-python3.8-windowsservercore-ltsc2016`](https://github.com/hylang/docker-hylang/blob/5148df70ef281642faeb6508aa74cb14b1c09541/dockerfiles-generated/Dockerfile.python3.8-windowsservercore-ltsc2016) -- `0.18.0-python3.7`, `0.18-python3.7`, `0-python3.7`, `python3.7`: - - [`0.18.0-python3.7-buster`](https://github.com/hylang/docker-hylang/blob/5148df70ef281642faeb6508aa74cb14b1c09541/dockerfiles-generated/Dockerfile.python3.7-buster) - - [`0.18.0-python3.7-windowsservercore-1809`](https://github.com/hylang/docker-hylang/blob/5148df70ef281642faeb6508aa74cb14b1c09541/dockerfiles-generated/Dockerfile.python3.7-windowsservercore-1809) - - [`0.18.0-python3.7-windowsservercore-ltsc2016`](https://github.com/hylang/docker-hylang/blob/5148df70ef281642faeb6508aa74cb14b1c09541/dockerfiles-generated/Dockerfile.python3.7-windowsservercore-ltsc2016) -- `0.18.0-python3.6`, `0.18-python3.6`, `0-python3.6`, `python3.6`: - - [`0.18.0-python3.6-buster`](https://github.com/hylang/docker-hylang/blob/5148df70ef281642faeb6508aa74cb14b1c09541/dockerfiles-generated/Dockerfile.python3.6-buster) -- `0.18.0-python3.5`, `0.18-python3.5`, `0-python3.5`, `python3.5`: - - [`0.18.0-python3.5-buster`](https://github.com/hylang/docker-hylang/blob/5148df70ef281642faeb6508aa74cb14b1c09541/dockerfiles-generated/Dockerfile.python3.5-buster) -- `0.18.0-pypy3.6`, `0.18-pypy3.6`, `0-pypy3.6`, `pypy3.6`, `0.18.0-pypy`, `0.18-pypy`, `0-pypy`, `pypy`: - - [`0.18.0-pypy3.6-buster`](https://github.com/hylang/docker-hylang/blob/5148df70ef281642faeb6508aa74cb14b1c09541/dockerfiles-generated/Dockerfile.pypy3.6-buster) +- `0.25.0-python3.11`, `0.25-python3.11`, `0-python3.11`, `python3.11`, `0.25.0`, `0.25`, `0`, `latest`: + - [`0.25.0-python3.11-bullseye`](https://github.com/hylang/docker-hylang/blob/d5431b3cfc54bd22202a34336d5375d716f2d13d/dockerfiles-generated/Dockerfile.python3.11-bullseye) +- `0.25.0-python3.10`, `0.25-python3.10`, `0-python3.10`, `python3.10`: + - [`0.25.0-python3.10-bullseye`](https://github.com/hylang/docker-hylang/blob/d5431b3cfc54bd22202a34336d5375d716f2d13d/dockerfiles-generated/Dockerfile.python3.10-bullseye) +- `0.25.0-python3.9`, `0.25-python3.9`, `0-python3.9`, `python3.9`: + - [`0.25.0-python3.9-bullseye`](https://github.com/hylang/docker-hylang/blob/d5431b3cfc54bd22202a34336d5375d716f2d13d/dockerfiles-generated/Dockerfile.python3.9-bullseye) +- `0.25.0-python3.8`, `0.25-python3.8`, `0-python3.8`, `python3.8`: + - [`0.25.0-python3.8-bullseye`](https://github.com/hylang/docker-hylang/blob/d5431b3cfc54bd22202a34336d5375d716f2d13d/dockerfiles-generated/Dockerfile.python3.8-bullseye) +- `0.25.0-python3.7`, `0.25-python3.7`, `0-python3.7`, `python3.7`: + - [`0.25.0-python3.7-bullseye`](https://github.com/hylang/docker-hylang/blob/d5431b3cfc54bd22202a34336d5375d716f2d13d/dockerfiles-generated/Dockerfile.python3.7-bullseye) +- `0.25.0-pypy3.9`, `0.25-pypy3.9`, `0-pypy3.9`, `pypy3.9`, `0.25.0-pypy`, `0.25-pypy`, `0-pypy`, `pypy`: + - [`0.25.0-pypy3.9-bullseye`](https://github.com/hylang/docker-hylang/blob/d5431b3cfc54bd22202a34336d5375d716f2d13d/dockerfiles-generated/Dockerfile.pypy3.9-bullseye) + - [`0.25.0-pypy3.9-windowsservercore-ltsc2022`](https://github.com/hylang/docker-hylang/blob/d5431b3cfc54bd22202a34336d5375d716f2d13d/dockerfiles-generated/Dockerfile.pypy3.9-windowsservercore-ltsc2022) + - [`0.25.0-pypy3.9-windowsservercore-1809`](https://github.com/hylang/docker-hylang/blob/d5431b3cfc54bd22202a34336d5375d716f2d13d/dockerfiles-generated/Dockerfile.pypy3.9-windowsservercore-1809) +- `0.25.0-pypy3.8`, `0.25-pypy3.8`, `0-pypy3.8`, `pypy3.8`: + - [`0.25.0-pypy3.8-bullseye`](https://github.com/hylang/docker-hylang/blob/d5431b3cfc54bd22202a34336d5375d716f2d13d/dockerfiles-generated/Dockerfile.pypy3.8-bullseye) + - [`0.25.0-pypy3.8-windowsservercore-ltsc2022`](https://github.com/hylang/docker-hylang/blob/d5431b3cfc54bd22202a34336d5375d716f2d13d/dockerfiles-generated/Dockerfile.pypy3.8-windowsservercore-ltsc2022) + - [`0.25.0-pypy3.8-windowsservercore-1809`](https://github.com/hylang/docker-hylang/blob/d5431b3cfc54bd22202a34336d5375d716f2d13d/dockerfiles-generated/Dockerfile.pypy3.8-windowsservercore-1809) # Quick reference (cont.) @@ -79,7 +91,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/hylang`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fhylang) + [official-images repo's `library/hylang` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fhylang) [official-images repo's `library/hylang` file](https://github.com/docker-library/official-images/blob/master/library/hylang) ([history](https://github.com/docker-library/official-images/commits/master/library/hylang)) - **Source of this description**: @@ -127,13 +139,13 @@ The `hylang` images come in many flavors, each designed for a specific use case. 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. -Some of these tags may have names like buster or stretch 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. +Some of these tags may have names like bullseye or buster 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. ## `hylang:-alpine` -This image is based on the popular [Alpine Linux project](http://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. +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. -This variant is highly recommended when final image size being as small as possible is desired. The main caveat to note is that it does use [musl libc](http://www.musl-libc.org) instead of [glibc and friends](http://www.etalabs.net/compare_libcs.html), so certain software might run into issues depending on the depth of their libc requirements. However, most software doesn't have an issue with this, so this variant is usually a very safe choice. 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. +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. 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). diff --git a/ibm-semeru-runtimes/README-short.txt b/ibm-semeru-runtimes/README-short.txt new file mode 100644 index 000000000000..67953ff4a7d2 --- /dev/null +++ b/ibm-semeru-runtimes/README-short.txt @@ -0,0 +1 @@ +IBM Semeru Runtimes Official Images for OpenJDK and Eclipse OpenJ9 binaries. diff --git a/ibm-semeru-runtimes/README.md b/ibm-semeru-runtimes/README.md new file mode 100644 index 000000000000..d506b701a688 --- /dev/null +++ b/ibm-semeru-runtimes/README.md @@ -0,0 +1,144 @@ + + +# Quick reference + +- **Maintained by**: + [IBM Semeru Runtimes](https://github.com/ibmruntimes/semeru-containers) + +- **Where to get help**: + [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) + +# Supported tags and respective `Dockerfile` links + +(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).) + +## Simple Tags + +- [`open-8u352-b08-jdk-focal`, `open-8-jdk-focal`](https://github.com/ibmruntimes/semeru-containers/blob/5be6c185f78d72f254a9874c87c72ea4560c9160/8/jdk/ubuntu/focal/Dockerfile.open.releases.full) +- [`open-8u352-b08-jdk-jammy`, `open-8-jdk-jammy`](https://github.com/ibmruntimes/semeru-containers/blob/5be6c185f78d72f254a9874c87c72ea4560c9160/8/jdk/ubuntu/jammy/Dockerfile.open.releases.full) +- [`open-8u352-b08-jdk-centos7`, `open-8-jdk-centos7`](https://github.com/ibmruntimes/semeru-containers/blob/5be6c185f78d72f254a9874c87c72ea4560c9160/8/jdk/centos/Dockerfile.open.releases.full) +- [`open-8u352-b08-jre-focal`, `open-8-jre-focal`](https://github.com/ibmruntimes/semeru-containers/blob/5be6c185f78d72f254a9874c87c72ea4560c9160/8/jre/ubuntu/focal/Dockerfile.open.releases.full) +- [`open-8u352-b08-jre-jammy`, `open-8-jre-jammy`](https://github.com/ibmruntimes/semeru-containers/blob/5be6c185f78d72f254a9874c87c72ea4560c9160/8/jre/ubuntu/jammy/Dockerfile.open.releases.full) +- [`open-8u352-b08-jre-centos7`, `open-8-jre-centos7`](https://github.com/ibmruntimes/semeru-containers/blob/5be6c185f78d72f254a9874c87c72ea4560c9160/8/jre/centos/Dockerfile.open.releases.full) +- [`open-11.0.17_8-jdk-focal`, `open-11-jdk-focal`](https://github.com/ibmruntimes/semeru-containers/blob/5be6c185f78d72f254a9874c87c72ea4560c9160/11/jdk/ubuntu/focal/Dockerfile.open.releases.full) +- [`open-11.0.17_8-jdk-jammy`, `open-11-jdk-jammy`](https://github.com/ibmruntimes/semeru-containers/blob/5be6c185f78d72f254a9874c87c72ea4560c9160/11/jdk/ubuntu/jammy/Dockerfile.open.releases.full) +- [`open-11.0.17_8-jdk-centos7`, `open-11-jdk-centos7`](https://github.com/ibmruntimes/semeru-containers/blob/5be6c185f78d72f254a9874c87c72ea4560c9160/11/jdk/centos/Dockerfile.open.releases.full) +- [`open-11.0.17_8-jre-focal`, `open-11-jre-focal`](https://github.com/ibmruntimes/semeru-containers/blob/5be6c185f78d72f254a9874c87c72ea4560c9160/11/jre/ubuntu/focal/Dockerfile.open.releases.full) +- [`open-11.0.17_8-jre-jammy`, `open-11-jre-jammy`](https://github.com/ibmruntimes/semeru-containers/blob/5be6c185f78d72f254a9874c87c72ea4560c9160/11/jre/ubuntu/jammy/Dockerfile.open.releases.full) +- [`open-11.0.17_8-jre-centos7`, `open-11-jre-centos7`](https://github.com/ibmruntimes/semeru-containers/blob/5be6c185f78d72f254a9874c87c72ea4560c9160/11/jre/centos/Dockerfile.open.releases.full) +- [`open-17.0.5_8-jdk-focal`, `open-17-jdk-focal`](https://github.com/ibmruntimes/semeru-containers/blob/5be6c185f78d72f254a9874c87c72ea4560c9160/17/jdk/ubuntu/focal/Dockerfile.open.releases.full) +- [`open-17.0.5_8-jdk-jammy`, `open-17-jdk-jammy`](https://github.com/ibmruntimes/semeru-containers/blob/5be6c185f78d72f254a9874c87c72ea4560c9160/17/jdk/ubuntu/jammy/Dockerfile.open.releases.full) +- [`open-17.0.5_8-jdk-centos7`, `open-17-jdk-centos7`](https://github.com/ibmruntimes/semeru-containers/blob/5be6c185f78d72f254a9874c87c72ea4560c9160/17/jdk/centos/Dockerfile.open.releases.full) +- [`open-17.0.5_8-jre-focal`, `open-17-jre-focal`](https://github.com/ibmruntimes/semeru-containers/blob/5be6c185f78d72f254a9874c87c72ea4560c9160/17/jre/ubuntu/focal/Dockerfile.open.releases.full) +- [`open-17.0.5_8-jre-jammy`, `open-17-jre-jammy`](https://github.com/ibmruntimes/semeru-containers/blob/5be6c185f78d72f254a9874c87c72ea4560c9160/17/jre/ubuntu/jammy/Dockerfile.open.releases.full) +- [`open-17.0.5_8-jre-centos7`, `open-17-jre-centos7`](https://github.com/ibmruntimes/semeru-containers/blob/5be6c185f78d72f254a9874c87c72ea4560c9160/17/jre/centos/Dockerfile.open.releases.full) +- [`open-18.0.2_9-jdk-focal`, `open-18-jdk-focal`](https://github.com/ibmruntimes/semeru-containers/blob/5be6c185f78d72f254a9874c87c72ea4560c9160/18/jdk/ubuntu/focal/Dockerfile.open.releases.full) +- [`open-18.0.2_9-jdk-jammy`, `open-18-jdk-jammy`](https://github.com/ibmruntimes/semeru-containers/blob/5be6c185f78d72f254a9874c87c72ea4560c9160/18/jdk/ubuntu/jammy/Dockerfile.open.releases.full) +- [`open-18.0.2_9-jdk-centos7`, `open-18-jdk-centos7`](https://github.com/ibmruntimes/semeru-containers/blob/5be6c185f78d72f254a9874c87c72ea4560c9160/18/jdk/centos/Dockerfile.open.releases.full) +- [`open-18.0.2_9-jre-focal`, `open-18-jre-focal`](https://github.com/ibmruntimes/semeru-containers/blob/5be6c185f78d72f254a9874c87c72ea4560c9160/18/jre/ubuntu/focal/Dockerfile.open.releases.full) +- [`open-18.0.2_9-jre-jammy`, `open-18-jre-jammy`](https://github.com/ibmruntimes/semeru-containers/blob/5be6c185f78d72f254a9874c87c72ea4560c9160/18/jre/ubuntu/jammy/Dockerfile.open.releases.full) +- [`open-18.0.2_9-jre-centos7`, `open-18-jre-centos7`](https://github.com/ibmruntimes/semeru-containers/blob/5be6c185f78d72f254a9874c87c72ea4560c9160/18/jre/centos/Dockerfile.open.releases.full) + +## Shared Tags + +- `open-8u352-b08-jdk`, `open-8-jdk`: + - [`open-8u352-b08-jdk-jammy`](https://github.com/ibmruntimes/semeru-containers/blob/5be6c185f78d72f254a9874c87c72ea4560c9160/8/jdk/ubuntu/jammy/Dockerfile.open.releases.full) +- `open-8u352-b08-jre`, `open-8-jre`: + - [`open-8u352-b08-jre-jammy`](https://github.com/ibmruntimes/semeru-containers/blob/5be6c185f78d72f254a9874c87c72ea4560c9160/8/jre/ubuntu/jammy/Dockerfile.open.releases.full) +- `open-11.0.17_8-jdk`, `open-11-jdk`: + - [`open-11.0.17_8-jdk-jammy`](https://github.com/ibmruntimes/semeru-containers/blob/5be6c185f78d72f254a9874c87c72ea4560c9160/11/jdk/ubuntu/jammy/Dockerfile.open.releases.full) +- `open-11.0.17_8-jre`, `open-11-jre`: + - [`open-11.0.17_8-jre-jammy`](https://github.com/ibmruntimes/semeru-containers/blob/5be6c185f78d72f254a9874c87c72ea4560c9160/11/jre/ubuntu/jammy/Dockerfile.open.releases.full) +- `open-17.0.5_8-jdk`, `open-17-jdk`: + - [`open-17.0.5_8-jdk-jammy`](https://github.com/ibmruntimes/semeru-containers/blob/5be6c185f78d72f254a9874c87c72ea4560c9160/17/jdk/ubuntu/jammy/Dockerfile.open.releases.full) +- `open-17.0.5_8-jre`, `open-17-jre`: + - [`open-17.0.5_8-jre-jammy`](https://github.com/ibmruntimes/semeru-containers/blob/5be6c185f78d72f254a9874c87c72ea4560c9160/17/jre/ubuntu/jammy/Dockerfile.open.releases.full) +- `open-18.0.2_9-jdk`, `open-18-jdk`: + - [`open-18.0.2_9-jdk-jammy`](https://github.com/ibmruntimes/semeru-containers/blob/5be6c185f78d72f254a9874c87c72ea4560c9160/18/jdk/ubuntu/jammy/Dockerfile.open.releases.full) +- `open-18.0.2_9-jre`, `open-18-jre`: + - [`open-18.0.2_9-jre-jammy`](https://github.com/ibmruntimes/semeru-containers/blob/5be6c185f78d72f254a9874c87c72ea4560c9160/18/jre/ubuntu/jammy/Dockerfile.open.releases.full) + +# Quick reference (cont.) + +- **Where to file issues**: + [GitHub](https://github.com/ibmruntimes/Semeru-Runtimes/issues); The [IBM Semeru Runtimes support](https://ibm.com/semeru-runtimes) page has more information on quality, roadmap and other details for IBM Semeru Runtime Open Edition builds; + +- **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) + [`amd64`](https://hub.docker.com/r/amd64/ibm-semeru-runtimes/), [`arm64v8`](https://hub.docker.com/r/arm64v8/ibm-semeru-runtimes/), [`ppc64le`](https://hub.docker.com/r/ppc64le/ibm-semeru-runtimes/), [`s390x`](https://hub.docker.com/r/s390x/ibm-semeru-runtimes/) + +- **Published image artifact details**: + [repo-info repo's `repos/ibm-semeru-runtimes/` directory](https://github.com/docker-library/repo-info/blob/master/repos/ibm-semeru-runtimes) ([history](https://github.com/docker-library/repo-info/commits/master/repos/ibm-semeru-runtimes)) + (image metadata, transfer size, etc) + +- **Image updates**: + [official-images repo's `library/ibm-semeru-runtimes` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fibm-semeru-runtimes) + [official-images repo's `library/ibm-semeru-runtimes` file](https://github.com/docker-library/official-images/blob/master/library/ibm-semeru-runtimes) ([history](https://github.com/docker-library/official-images/commits/master/library/ibm-semeru-runtimes)) + +- **Source of this description**: + [docs repo's `ibm-semeru-runtimes/` directory](https://github.com/docker-library/docs/tree/master/ibm-semeru-runtimes) ([history](https://github.com/docker-library/docs/commits/master/ibm-semeru-runtimes)) + +## Overview + +The images in this repository contain OpenJDK binaries that are built by IBM Semeru Runtimes. + +# What is IBM Semeru Runtimes ? + +The IBM Semeru Runtimes are free production-ready open source binaries built with the OpenJDK class libraries and the Eclipse OpenJ9 JVM, which delivers the power and performance to run your Java applications, when you need it most. + +# How to use this Image + +To run a pre-built japp.jar file with the latest OpenJDK 11, use the following Dockerfile: + +```dockerfile +FROM ibm-semeru-runtimes:11 +RUN mkdir /opt/app +COPY japp.jar /opt/app +CMD ["java", "-jar", "/opt/app/japp.jar"] +``` + +You can build and run the Docker Image as shown in the following example: + +```console +docker build -t japp . +docker run -it --rm japp +``` + +### Using a different base Image + +If you are using a distribution that we don't provide an image for you can copy the JDK using a similar Dockerfile to the one below: + +```dockerfile +# Example +FROM +ENV JAVA_HOME=/opt/java/openjdk +COPY --from=ibm-semeru-runtimes:11 $JAVA_HOME $JAVA_HOME +ENV PATH="${JAVA_HOME}/bin:${PATH}" +``` + +# License + +The Dockerfiles and associated scripts are licensed under the [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.html). + +Licenses for the products installed within the images: + +- IBM Semeru Runtime Open Edition: The project license is GNU GPL v2 with Classpath Exception. + +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). + +Some additional license information which was able to be auto-detected might be found in [the `repo-info` repository's `ibm-semeru-runtimes/` directory](https://github.com/docker-library/repo-info/tree/master/repos/ibm-semeru-runtimes). + +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. diff --git a/ibm-semeru-runtimes/content.md b/ibm-semeru-runtimes/content.md new file mode 100644 index 000000000000..20cce094a9a3 --- /dev/null +++ b/ibm-semeru-runtimes/content.md @@ -0,0 +1,37 @@ +## Overview + +The images in this repository contain OpenJDK binaries that are built by IBM Semeru Runtimes. + +# What is IBM Semeru Runtimes ? + +The IBM Semeru Runtimes are free production-ready open source binaries built with the OpenJDK class libraries and the Eclipse OpenJ9 JVM, which delivers the power and performance to run your Java applications, when you need it most. + +# How to use this Image + +To run a pre-built japp.jar file with the latest OpenJDK 11, use the following Dockerfile: + +```dockerfile +FROM %%IMAGE%%:11 +RUN mkdir /opt/app +COPY japp.jar /opt/app +CMD ["java", "-jar", "/opt/app/japp.jar"] +``` + +You can build and run the Docker Image as shown in the following example: + +```console +docker build -t japp . +docker run -it --rm japp +``` + +### Using a different base Image + +If you are using a distribution that we don't provide an image for you can copy the JDK using a similar Dockerfile to the one below: + +```dockerfile +# Example +FROM +ENV JAVA_HOME=/opt/java/openjdk +COPY --from=%%IMAGE%%:11 $JAVA_HOME $JAVA_HOME +ENV PATH="${JAVA_HOME}/bin:${PATH}" +``` diff --git a/ibm-semeru-runtimes/github-repo b/ibm-semeru-runtimes/github-repo new file mode 100644 index 000000000000..18fd7e4d0542 --- /dev/null +++ b/ibm-semeru-runtimes/github-repo @@ -0,0 +1 @@ +https://github.com/ibmruntimes/semeru-containers diff --git a/ibm-semeru-runtimes/issues.md b/ibm-semeru-runtimes/issues.md new file mode 100644 index 000000000000..4cb1bc6a4ab2 --- /dev/null +++ b/ibm-semeru-runtimes/issues.md @@ -0,0 +1 @@ +[GitHub](https://github.com/ibmruntimes/Semeru-Runtimes/issues); The [IBM Semeru Runtimes support](https://ibm.com/semeru-runtimes) page has more information on quality, roadmap and other details for IBM Semeru Runtime Open Edition builds; diff --git a/ibm-semeru-runtimes/license.md b/ibm-semeru-runtimes/license.md new file mode 100644 index 000000000000..41e216753484 --- /dev/null +++ b/ibm-semeru-runtimes/license.md @@ -0,0 +1,5 @@ +The Dockerfiles and associated scripts are licensed under the [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.html). + +Licenses for the products installed within the images: + +- IBM Semeru Runtime Open Edition: The project license is GNU GPL v2 with Classpath Exception. diff --git a/ibm-semeru-runtimes/maintainer.md b/ibm-semeru-runtimes/maintainer.md new file mode 100644 index 000000000000..81ffa6f5c0aa --- /dev/null +++ b/ibm-semeru-runtimes/maintainer.md @@ -0,0 +1 @@ +[IBM Semeru Runtimes](%%GITHUB-REPO%%) diff --git a/ibmjava/README.md b/ibmjava/README.md index 2e9182ba9d78..d7864cbd022f 100644 --- a/ibmjava/README.md +++ b/ibmjava/README.md @@ -24,12 +24,9 @@ WARNING: # Supported tags and respective `Dockerfile` links -- [`8-jre`, `jre`, `8`, `latest`](https://github.com/ibmruntimes/ci.docker/blob/83506ae3219b62dbf96f6ad0111e0f9a6169be0c/ibmjava/8/jre/ubuntu/Dockerfile) -- [`8-jre-alpine`, `jre-alpine`](https://github.com/ibmruntimes/ci.docker/blob/83506ae3219b62dbf96f6ad0111e0f9a6169be0c/ibmjava/8/jre/alpine/Dockerfile) -- [`8-sfj`, `sfj`](https://github.com/ibmruntimes/ci.docker/blob/83506ae3219b62dbf96f6ad0111e0f9a6169be0c/ibmjava/8/sfj/ubuntu/Dockerfile) -- [`8-sfj-alpine`, `sfj-alpine`](https://github.com/ibmruntimes/ci.docker/blob/83506ae3219b62dbf96f6ad0111e0f9a6169be0c/ibmjava/8/sfj/alpine/Dockerfile) -- [`8-sdk`, `sdk`](https://github.com/ibmruntimes/ci.docker/blob/83506ae3219b62dbf96f6ad0111e0f9a6169be0c/ibmjava/8/sdk/ubuntu/Dockerfile) -- [`8-sdk-alpine`, `sdk-alpine`](https://github.com/ibmruntimes/ci.docker/blob/83506ae3219b62dbf96f6ad0111e0f9a6169be0c/ibmjava/8/sdk/alpine/Dockerfile) +- [`8-jre`, `jre`, `8`, `latest`](https://github.com/ibmruntimes/ci.docker/blob/a596914862ee05bb419b7644e57135f8674e9161/ibmjava/8/jre/ubuntu/Dockerfile) +- [`8-sfj`, `sfj`](https://github.com/ibmruntimes/ci.docker/blob/a596914862ee05bb419b7644e57135f8674e9161/ibmjava/8/sfj/ubuntu/Dockerfile) +- [`8-sdk`, `sdk`](https://github.com/ibmruntimes/ci.docker/blob/a596914862ee05bb419b7644e57135f8674e9161/ibmjava/8/sdk/ubuntu/Dockerfile) # Quick reference (cont.) @@ -44,7 +41,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/ibmjava`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fibmjava) + [official-images repo's `library/ibmjava` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fibmjava) [official-images repo's `library/ibmjava` file](https://github.com/docker-library/official-images/blob/master/library/ibmjava) ([history](https://github.com/docker-library/official-images/commits/master/library/ibmjava)) - **Source of this description**: @@ -52,7 +49,7 @@ WARNING: ### Overview -The images in this repository contain IBM® SDK, Java™ Technology Edition. For more information on the latest version and what's new, see [sdk8 on IBM developerWorks](https://developer.ibm.com/javasdk/downloads/sdk8/). See the license section for restrictions that relate to the use of this image. For more information about IBM® SDK, Java™ Technology Edition and API documentation as well as tutorials, recipes, and Java usage in IBM Cloud, see [IBM developerWorks](https://developer.ibm.com/javasdk/). +The images in this repository contain IBM® SDK, Java™ Technology Edition. For more information on the latest version and what's new, see [sdk8 on IBM developerWorks](https://developer.ibm.com/javasdk/downloads/sdk8/) and [jdk11 on IBM developerWorks](https://developer.ibm.com/javasdk/downloads/java-sdk-downloads-version-110/). See the license section for restrictions that relate to the use of this image. For more information about IBM® SDK, Java™ Technology Edition and API documentation as well as tutorials, recipes, and Java usage in IBM Cloud, see [IBM developerWorks](https://developer.ibm.com/javasdk/). Java and all Java-based trademarks and logos are trademarks or registered trademarks of Oracle and/or its affiliates. @@ -157,30 +154,14 @@ docker run -it --volumes-from classcache japp See the [Websphere-Liberty image](https://hub.docker.com/_/websphere-liberty/), which builds on top of this IBM docker image for Java. -# Image Variants - -The `ibmjava` images come in many flavors, each designed for a specific use case. - -## `ibmjava:` - -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. - -## `ibmjava:-alpine` - -This image is based on the popular [Alpine Linux project](http://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. - -This variant is highly recommended when final image size being as small as possible is desired. The main caveat to note is that it does use [musl libc](http://www.musl-libc.org) instead of [glibc and friends](http://www.etalabs.net/compare_libcs.html), so certain software might run into issues depending on the depth of their libc requirements. However, most software doesn't have an issue with this, so this variant is usually a very safe choice. 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. - -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). - # License The Dockerfiles and associated scripts are licensed under the [Apache License 2.0](http://www.apache.org/licenses/LICENSE-2.0.html). Licenses for the products installed within the images: -- IBM® SDK, Java™ Technology Edition Version 8: [International License Agreement for Non-Warranted Programs](http://www14.software.ibm.com/cgi-bin/weblap/lap.pl?la_formnum=&li_formnum=L-PMAA-A3Z8P2&title=IBM® SDK, Java™ Technology Edition Docker Image, Version 8.0&l=en). -- IBM® SDK, Java™ Technology Edition Version 9 Early Access: [International License Agreement for Non-Warranted Programs](http://www14.software.ibm.com/cgi-bin/weblap/lap.pl?la_formnum=&li_formnum=L-JWOD-AFSFP8&title=IBM® SDK, Java™ Technology Edition Version 9.0 Early Access&l=en). +- IBM® SDK, Java™ Technology Edition Version 8: [International License Agreement for Non-Warranted Programs](http://www14.software.ibm.com/cgi-bin/weblap/lap.pl?la_formnum=&li_formnum=L-SMKR-AVSEUH&title=IBM%AE+SDK%2C+Java%99+Technology+Edition%2C+Version+8.0&l=en). +- IBM® SDK, Java™ Technology Edition Version 11: [International License Agreement for Non-Warranted Programs](http://www14.software.ibm.com/cgi-bin/weblap/lap.pl?la_formnum=&li_formnum=L-PARM-BMVULC&title=IBM%AE+SDK%2C+Java%99+Technology+Edition%2C+Version+11.0&l=en). 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). diff --git a/ibmjava/content.md b/ibmjava/content.md index a2db42396e20..314796a729ed 100644 --- a/ibmjava/content.md +++ b/ibmjava/content.md @@ -1,6 +1,6 @@ ### Overview -The images in this repository contain IBM® SDK, Java™ Technology Edition. For more information on the latest version and what's new, see [sdk8 on IBM developerWorks](https://developer.ibm.com/javasdk/downloads/sdk8/). See the license section for restrictions that relate to the use of this image. For more information about IBM® SDK, Java™ Technology Edition and API documentation as well as tutorials, recipes, and Java usage in IBM Cloud, see [IBM developerWorks](https://developer.ibm.com/javasdk/). +The images in this repository contain IBM® SDK, Java™ Technology Edition. For more information on the latest version and what's new, see [sdk8 on IBM developerWorks](https://developer.ibm.com/javasdk/downloads/sdk8/) and [jdk11 on IBM developerWorks](https://developer.ibm.com/javasdk/downloads/java-sdk-downloads-version-110/). See the license section for restrictions that relate to the use of this image. For more information about IBM® SDK, Java™ Technology Edition and API documentation as well as tutorials, recipes, and Java usage in IBM Cloud, see [IBM developerWorks](https://developer.ibm.com/javasdk/). Java and all Java-based trademarks and logos are trademarks or registered trademarks of Oracle and/or its affiliates. diff --git a/ibmjava/license.md b/ibmjava/license.md index ef75061d6f50..1d189e8f9739 100644 --- a/ibmjava/license.md +++ b/ibmjava/license.md @@ -2,5 +2,5 @@ The Dockerfiles and associated scripts are licensed under the [Apache License 2. Licenses for the products installed within the images: -- IBM® SDK, Java™ Technology Edition Version 8: [International License Agreement for Non-Warranted Programs](http://www14.software.ibm.com/cgi-bin/weblap/lap.pl?la_formnum=&li_formnum=L-PMAA-A3Z8P2&title=IBM® SDK, Java™ Technology Edition Docker Image, Version 8.0&l=en). -- IBM® SDK, Java™ Technology Edition Version 9 Early Access: [International License Agreement for Non-Warranted Programs](http://www14.software.ibm.com/cgi-bin/weblap/lap.pl?la_formnum=&li_formnum=L-JWOD-AFSFP8&title=IBM® SDK, Java™ Technology Edition Version 9.0 Early Access&l=en). +- IBM® SDK, Java™ Technology Edition Version 8: [International License Agreement for Non-Warranted Programs](http://www14.software.ibm.com/cgi-bin/weblap/lap.pl?la_formnum=&li_formnum=L-SMKR-AVSEUH&title=IBM%AE+SDK%2C+Java%99+Technology+Edition%2C+Version+8.0&l=en). +- IBM® SDK, Java™ Technology Edition Version 11: [International License Agreement for Non-Warranted Programs](http://www14.software.ibm.com/cgi-bin/weblap/lap.pl?la_formnum=&li_formnum=L-PARM-BMVULC&title=IBM%AE+SDK%2C+Java%99+Technology+Edition%2C+Version+11.0&l=en). diff --git a/influxdb/README.md b/influxdb/README.md index aa9197e1e2d8..f422092c98de 100644 --- a/influxdb/README.md +++ b/influxdb/README.md @@ -20,22 +20,30 @@ WARNING: [InfluxData](https://github.com/influxdata/influxdata-docker) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`1.7`, `1.7.10`](https://github.com/influxdata/influxdata-docker/blob/032b0c1480b865bd44bb22d97c68cf6c076a04b7/influxdb/1.7/Dockerfile) -- [`1.7-alpine`, `1.7.10-alpine`](https://github.com/influxdata/influxdata-docker/blob/032b0c1480b865bd44bb22d97c68cf6c076a04b7/influxdb/1.7/alpine/Dockerfile) -- [`1.7-data`, `1.7.10-data`](https://github.com/influxdata/influxdata-docker/blob/032b0c1480b865bd44bb22d97c68cf6c076a04b7/influxdb/1.7/data/Dockerfile) -- [`1.7-data-alpine`, `1.7.10-data-alpine`](https://github.com/influxdata/influxdata-docker/blob/032b0c1480b865bd44bb22d97c68cf6c076a04b7/influxdb/1.7/data/alpine/Dockerfile) -- [`1.7-meta`, `1.7.10-meta`](https://github.com/influxdata/influxdata-docker/blob/032b0c1480b865bd44bb22d97c68cf6c076a04b7/influxdb/1.7/meta/Dockerfile) -- [`1.7-meta-alpine`, `1.7.10-meta-alpine`](https://github.com/influxdata/influxdata-docker/blob/032b0c1480b865bd44bb22d97c68cf6c076a04b7/influxdb/1.7/meta/alpine/Dockerfile) -- [`1.8`, `1.8.0`, `latest`](https://github.com/influxdata/influxdata-docker/blob/032b0c1480b865bd44bb22d97c68cf6c076a04b7/influxdb/1.8/Dockerfile) -- [`1.8-alpine`, `1.8.0-alpine`, `alpine`](https://github.com/influxdata/influxdata-docker/blob/032b0c1480b865bd44bb22d97c68cf6c076a04b7/influxdb/1.8/alpine/Dockerfile) -- [`1.8-data`, `1.8.0-data`, `data`](https://github.com/influxdata/influxdata-docker/blob/032b0c1480b865bd44bb22d97c68cf6c076a04b7/influxdb/1.8/data/Dockerfile) -- [`1.8-data-alpine`, `1.8.0-data-alpine`, `data-alpine`](https://github.com/influxdata/influxdata-docker/blob/032b0c1480b865bd44bb22d97c68cf6c076a04b7/influxdb/1.8/data/alpine/Dockerfile) -- [`1.8-meta`, `1.8.0-meta`, `meta`](https://github.com/influxdata/influxdata-docker/blob/032b0c1480b865bd44bb22d97c68cf6c076a04b7/influxdb/1.8/meta/Dockerfile) -- [`1.8-meta-alpine`, `1.8.0-meta-alpine`, `meta-alpine`](https://github.com/influxdata/influxdata-docker/blob/032b0c1480b865bd44bb22d97c68cf6c076a04b7/influxdb/1.8/meta/alpine/Dockerfile) +- [`1.8`, `1.8.10`](https://github.com/influxdata/influxdata-docker/blob/64a63b05b198b6a45176462814d3f35677625415/influxdb/1.8/Dockerfile) +- [`1.8-alpine`, `1.8.10-alpine`](https://github.com/influxdata/influxdata-docker/blob/64a63b05b198b6a45176462814d3f35677625415/influxdb/1.8/alpine/Dockerfile) +- [`1.8-data`, `1.8.10-data`, `data`](https://github.com/influxdata/influxdata-docker/blob/64a63b05b198b6a45176462814d3f35677625415/influxdb/1.8/data/Dockerfile) +- [`1.8-data-alpine`, `1.8.10-data-alpine`, `data-alpine`](https://github.com/influxdata/influxdata-docker/blob/64a63b05b198b6a45176462814d3f35677625415/influxdb/1.8/data/alpine/Dockerfile) +- [`1.8-meta`, `1.8.10-meta`, `meta`](https://github.com/influxdata/influxdata-docker/blob/64a63b05b198b6a45176462814d3f35677625415/influxdb/1.8/meta/Dockerfile) +- [`1.8-meta-alpine`, `1.8.10-meta-alpine`, `meta-alpine`](https://github.com/influxdata/influxdata-docker/blob/64a63b05b198b6a45176462814d3f35677625415/influxdb/1.8/meta/alpine/Dockerfile) +- [`1.9-data`, `1.9.8-data`](https://github.com/influxdata/influxdata-docker/blob/64a63b05b198b6a45176462814d3f35677625415/influxdb/1.9/data/Dockerfile) +- [`1.9-data-alpine`, `1.9.8-data-alpine`](https://github.com/influxdata/influxdata-docker/blob/64a63b05b198b6a45176462814d3f35677625415/influxdb/1.9/data/alpine/Dockerfile) +- [`1.9-meta`, `1.9.8-meta`](https://github.com/influxdata/influxdata-docker/blob/64a63b05b198b6a45176462814d3f35677625415/influxdb/1.9/meta/Dockerfile) +- [`1.9-meta-alpine`, `1.9.8-meta-alpine`](https://github.com/influxdata/influxdata-docker/blob/64a63b05b198b6a45176462814d3f35677625415/influxdb/1.9/meta/alpine/Dockerfile) +- [`1.10-data`, `1.10.0-data`](https://github.com/influxdata/influxdata-docker/blob/64a63b05b198b6a45176462814d3f35677625415/influxdb/1.10/data/Dockerfile) +- [`1.10-data-alpine`, `1.10.0-data-alpine`](https://github.com/influxdata/influxdata-docker/blob/64a63b05b198b6a45176462814d3f35677625415/influxdb/1.10/data/alpine/Dockerfile) +- [`1.10-meta`, `1.10.0-meta`](https://github.com/influxdata/influxdata-docker/blob/64a63b05b198b6a45176462814d3f35677625415/influxdb/1.10/meta/Dockerfile) +- [`1.10-meta-alpine`, `1.10.0-meta-alpine`](https://github.com/influxdata/influxdata-docker/blob/64a63b05b198b6a45176462814d3f35677625415/influxdb/1.10/meta/alpine/Dockerfile) +- [`2.4`, `2.4.0`](https://github.com/influxdata/influxdata-docker/blob/64a63b05b198b6a45176462814d3f35677625415/influxdb/2.4/Dockerfile) +- [`2.4-alpine`, `2.4.0-alpine`](https://github.com/influxdata/influxdata-docker/blob/64a63b05b198b6a45176462814d3f35677625415/influxdb/2.4/alpine/Dockerfile) +- [`2.5`, `2.5.1`](https://github.com/influxdata/influxdata-docker/blob/64a63b05b198b6a45176462814d3f35677625415/influxdb/2.5/Dockerfile) +- [`2.5-alpine`, `2.5.1-alpine`](https://github.com/influxdata/influxdata-docker/blob/64a63b05b198b6a45176462814d3f35677625415/influxdb/2.5/alpine/Dockerfile) +- [`2.6`, `2.6.1`, `latest`](https://github.com/influxdata/influxdata-docker/blob/64a63b05b198b6a45176462814d3f35677625415/influxdb/2.6/Dockerfile) +- [`2.6-alpine`, `2.6.1-alpine`, `alpine`](https://github.com/influxdata/influxdata-docker/blob/64a63b05b198b6a45176462814d3f35677625415/influxdb/2.6/alpine/Dockerfile) # Quick reference (cont.) @@ -50,7 +58,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/influxdb`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Finfluxdb) + [official-images repo's `library/influxdb` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Finfluxdb) [official-images repo's `library/influxdb` file](https://github.com/docker-library/official-images/blob/master/library/influxdb) ([history](https://github.com/docker-library/official-images/commits/master/library/influxdb)) - **Source of this description**: @@ -64,11 +72,405 @@ InfluxDB is a time series database built from the ground up to handle high write ![logo](https://raw.githubusercontent.com/docker-library/docs/43d87118415bb75d7bb107683e79cd6d69186f67/influxdb/logo.png) -## Updating latest to 2.0 +## Using this Image - InfluxDB 2.x -In the future, the latest tag for this image will point to the latest released implementation of influxdb 2.0. This will happen when the first general available release for 2.0 exists. If you are using the `latest` tag for any production or development purposes, please update your development environment to reference the `1.8` tag. +### Quick start -## Using this Image +Using this image is pretty easy, but there are a few things you should know. + +- You should forward TCP port 8086 +- You should mount a volume in /var/lib/influxdb2 + +```console +$ docker run \ + -p 8086:8086 \ + -v myInfluxVolume:/var/lib/influxdb2 \ + influxdb:latest +``` + +After starting the container you can use the web interface at http://localhost:8086/ to setup and customize your Influx database. + +Find more about API Endpoints & Ports [here](https://docs.influxdata.com/influxdb/v2.5/reference/api/). + +### Configuration + +InfluxDB can be configured using a mix of a config file, environment variables, and CLI options. To mount a configuration file and use it with the server, you can use this command to generate the default configuration file: + +```console +$ docker run --rm influxdb:2.0 influxd print-config > config.yml +``` + +Modify the default configuration, which will now be available under `$PWD`. Then start the InfluxDB container: + +```console +$ docker run -p 8086:8086 \ + -v $PWD/config.yml:/etc/influxdb2/config.yml \ + influxdb:2.0 +``` + +Modify `$PWD` to be the directory where you want to store the configuration file. + +Individual config settings can be overridden by environment variables. The variables must be named using the format `INFLUXD_${SNAKE_CASE_NAME}`. The `SNAKE_CASE_NAME` for an option will be the option's name with all dashes (`-`) replaced by underscores (`_`), in all caps. + +Examples: + +```console +# Config setting: bolt-path +INFLUXD_BOLT_PATH=/root/influxdb.bolt +# Config setting: no-tasks +INFLUXD_NO_TASKS=true +# Config setting: storage-wal-fsync-delay +INFLUXD_STORAGE_WAL_FSYNC_DELAY=15m +``` + +Finally, all config options can be passed as CLI options: + +```console +$ docker run -p 8086:8086 \ + influxdb:2.0 --storage-wal-fsync-delay=15m +``` + +CLI options take precedence over environment variables. + +Find more about configuring InfluxDB [here](https://docs.influxdata.com/influxdb/v2.0/reference/config-options/). + +### Database Setup + +InfluxDB 2.x requires authentication. A special API exists to bootstrap the first super-user in the database, along with an initial organization and bucket. It's possible to access this API manually, or to run it automatically via environment variables. + +#### Manual Setup + +If your InfluxDB container is running locally (or on a host exposed to the network), you can perform initial setup from outside the container using either the UI or the `influx` CLI. Find more about setting up InfluxDB using these methods [here](https://docs.influxdata.com/influxdb/v2.0/get-started/#set-up-influxdb). + +It's also possible to perform manual setup from within the container using `docker exec`. For example, if you start the container: + +```console +$ docker run -d -p 8086:8086 \ + --name influxdb2 \ + -v $PWD:/var/lib/influxdb2 \ + influxdb:2.0 +``` + +You can then run the `influx` client in the container: + +```console +$ docker exec influxdb2 influx setup \ + --username $USERNAME \ + --password $PASSWORD \ + --org $ORGANIZATION \ + --bucket $BUCKET +``` + +Running setup from within the container will cause CLI configs to be written to `/etc/influxdb2/influx-configs`. You can then use the `influx` CLI from within the container to extract the generated admin token: + +```console +# Using table output + cut +$ docker exec influxdb2 influx auth list \ + --user $USERNAME \ + --hide-headers | cut -f 3 + +# Using JSON output + jq +$ docker exec influxdb2 influx auth list \ + --user $USERNAME \ + --json | jq -r '.[].token' +``` + +Alternatively, you could configure your initial InfluxDB run to mount `/etc/influxdb2` as a volume: + +```console +$ docker run -d -p 8086:8086 \ + --name influxdb2 \ + -v $PWD/data:/var/lib/influxdb2 \ + -v $PWD/config:/etc/influxdb2 \ + influxdb:2.0 +``` + +This will make the generated CLI configs available to the host. + +#### Automated Setup + +The InfluxDB image contains some extra functionality to automatically bootstrap the system. This functionality is enabled by setting the `DOCKER_INFLUXDB_INIT_MODE` environment variable to the value `setup` when running the container. Additional environment variables are used to configure the setup logic: + +- `DOCKER_INFLUXDB_INIT_USERNAME`: The username to set for the system's initial super-user (**Required**). +- `DOCKER_INFLUXDB_INIT_PASSWORD`: The password to set for the system's inital super-user (**Required**). +- `DOCKER_INFLUXDB_INIT_ORG`: The name to set for the system's initial organization (**Required**). +- `DOCKER_INFLUXDB_INIT_BUCKET`: The name to set for the system's initial bucket (**Required**). +- `DOCKER_INFLUXDB_INIT_RETENTION`: The duration the system's initial bucket should retain data. If not set, the initial bucket will retain data forever. +- `DOCKER_INFLUXDB_INIT_ADMIN_TOKEN`: The authentication token to associate with the system's initial super-user. If not set, a token will be auto-generated by the system. + +Automated setup will generate metadata files and CLI configurations. It's recommended to mount volumes at both paths to avoid losing data. + +For example, a minimal invocation of automated setup is: + +```console +$ docker run -d -p 8086:8086 \ + -v $PWD/data:/var/lib/influxdb2 \ + -v $PWD/config:/etc/influxdb2 \ + -e DOCKER_INFLUXDB_INIT_MODE=setup \ + -e DOCKER_INFLUXDB_INIT_USERNAME=my-user \ + -e DOCKER_INFLUXDB_INIT_PASSWORD=my-password \ + -e DOCKER_INFLUXDB_INIT_ORG=my-org \ + -e DOCKER_INFLUXDB_INIT_BUCKET=my-bucket \ + influxdb:2.0 +``` + +And an example using all available options is: + +```console +$ docker run -d -p 8086:8086 \ + -v $PWD/data:/var/lib/influxdb2 \ + -v $PWD/config:/etc/influxdb2 \ + -e DOCKER_INFLUXDB_INIT_MODE=setup \ + -e DOCKER_INFLUXDB_INIT_USERNAME=my-user \ + -e DOCKER_INFLUXDB_INIT_PASSWORD=my-password \ + -e DOCKER_INFLUXDB_INIT_ORG=my-org \ + -e DOCKER_INFLUXDB_INIT_BUCKET=my-bucket \ + -e DOCKER_INFLUXDB_INIT_RETENTION=1w \ + -e DOCKER_INFLUXDB_INIT_ADMIN_TOKEN=my-super-secret-auth-token \ + influxdb:2.0 +``` + +**NOTE:** Automated setup will not run if an existing boltdb file is found at the configured path. This behavior allows for the InfluxDB container to reboot post-setup without encountering "DB is already set up" errors. + +### Interacting with InfluxDB + +Once an InfluxDB instance has completed initial setup, its APIs will unlock. See the main documentation site for reference information and examples on: + +- [Writing data](https://docs.influxdata.com/influxdb/v2.0/write-data/) +- [Reading data](https://docs.influxdata.com/influxdb/v2.0/query-data/) +- [Configuring security](https://docs.influxdata.com/influxdb/v2.0/security/) +- [And more!](https://docs.influxdata.com/influxdb/v2.0/) + +### Custom Initialization Scripts + +The InfluxDB image supports running arbitrary initialization scripts after initial system setup, on both the `setup` and `upgrade` paths. Scripts must have extension `.sh` and be mounted inside of the `/docker-entrypoint-initdb.d` directory. When multiple scripts are present, they will be executed in lexical sort order by name. + +As a convenience for script-writers, the image will export a number of variables into the environment before executing any scripts: + +- `INFLUX_CONFIGS_PATH`: Path to the CLI configs file written by `setup`/`upgrade` +- `INFLUX_HOST`: URL to the `influxd` instance running setup logic +- `DOCKER_INFLUXDB_INIT_USER_ID`: ID of the initial admin user created by `setup`/`upgrade` +- `DOCKER_INFLUXDB_INIT_ORG_ID`: ID of the initial organization created by `setup`/`upgrade` +- `DOCKER_INFLUXDB_INIT_BUCKET_ID`: ID of the initial bucket created by `setup`/`upgrade` + +For example, if you wanted to grant write-access to an InfluxDB 1.x client on your initial bucket, you'd first create the file `$PWD/scripts/setup-v1.sh` with contents: + +```bash +#!/bin/bash +set -e + +influx v1 dbrp create \ + --bucket-id ${DOCKER_INFLUXDB_INIT_BUCKET_ID} \ + --db ${V1_DB_NAME} \ + --rp ${V1_RP_NAME} \ + --default \ + --org ${DOCKER_INFLUXDB_INIT_ORG} + +influx v1 auth create \ + --username ${V1_AUTH_USERNAME} \ + --password ${V1_AUTH_PASSWORD} \ + --write-bucket ${DOCKER_INFLUXDB_INIT_BUCKET_ID} \ + --org ${DOCKER_INFLUXDB_INIT_ORG} +``` + +Then you'd run: + +```console +$ docker run -p 8086:8086 \ + -v $PWD/data:/var/lib/influxdb2 \ + -v $PWD/config:/etc/influxdb2 \ + -v $PWD/scripts:/docker-entrypoint-initdb.d \ + -e DOCKER_INFLUXDB_INIT_MODE=setup \ + -e DOCKER_INFLUXDB_INIT_USERNAME=my-user \ + -e DOCKER_INFLUXDB_INIT_PASSWORD=my-password \ + -e DOCKER_INFLUXDB_INIT_ORG=my-org \ + -e DOCKER_INFLUXDB_INIT_BUCKET=my-bucket \ + -e V1_DB_NAME=v1-db \ + -e V1_RP_NAME=v1-rp \ + -e V1_AUTH_USERNAME=v1-user \ + -e V1_AUTH_PASSWORD=v1-password \ + influxdb:2.0 +``` + +**NOTE:** Custom scripts will not run if an existing boltdb file is found at the configured path (causing `setup` or `upgrade` to be skipped). This behavior allows for the InfluxDB container to reboot post-initialization without encountering errors from non-idempotent script commands. + +### Upgrading from InfluxDB 1.x + +InfluxDB 2.x provides a 1.x-compatible API, but expects a different storage layout on disk. To bridge this mismatch, the InfluxDB image contains extra functionality to migrate 1.x data and config into 2.x layouts automatically before booting the `influxd` server. + +The automated upgrade process bootstraps an initial admin user, organization, and bucket in the system. Additional environment variables are used to configure the setup logic: + +- `DOCKER_INFLUXDB_INIT_USERNAME`: The username to set for the system's initial super-user (**Required**). +- `DOCKER_INFLUXDB_INIT_PASSWORD`: The password to set for the system's inital super-user (**Required**). +- `DOCKER_INFLUXDB_INIT_ORG`: The name to set for the system's initial organization (**Required**). +- `DOCKER_INFLUXDB_INIT_BUCKET`: The name to set for the system's initial bucket (**Required**). +- `DOCKER_INFLUXDB_INIT_RETENTION`: The duration the system's initial bucket should retain data. If not set, the initial bucket will retain data forever. +- `DOCKER_INFLUXDB_INIT_ADMIN_TOKEN`: The authentication token to associate with the system's initial super-user. If not set, a token will be auto-generated by the system. + +It also requires extra volumes to be mounted into the 2.x container: + +- Data from the 1.x instance +- Custom config from the 1.x instance (if any) + +The upgrade process searches for mounted 1.x data / config in this priority order: + +1. A config file referred to by the `DOCKER_INFLUXDB_INIT_UPGRADE_V1_CONFIG` environment variable +2. A data directory referred to by the `DOCKER_INFLUXDB_INIT_UPGRADE_V1_DIR` environment variable +3. A config file mounted at `/etc/influxdb/influxdb.conf` +4. A data directory mounted at `/var/lib/influxdb` + +Finally, the `DOCKER_INFLUXDB_INIT_MODE` environment variable must be set to `upgrade`. + +Automated upgrade will generate both data and config files, by default under `/var/lib/influxdb2` and `/etc/influxdb2`. It's recommended to mount volumes at both paths to avoid losing data. + +**NOTE:** Automated upgrade will not run if an existing boltdb file is found at the configured path. This behavior allows for the InfluxDB container to reboot post-upgrade without overwriting migrated data. + +Find more about the InfluxDB upgrade process [here](https://docs.influxdata.com/influxdb/v2.0/upgrade/v1-to-v2/). See below for examples of common upgrade scenarios. + +#### Upgrade Example - Minimal + +Assume you've been running a minimal InfluxDB 1.x deployment: + +```console +$ docker run -p 8086:8086 \ + -v influxdb:/var/lib/influxdb \ + influxdb:1.8 +``` + +To upgrade this deployment to InfluxDB 2.x, stop the running InfluxDB 1.x container, then run: + +```console +$ docker run -p 8086:8086 \ + -v influxdb:/var/lib/influxdb \ + -v influxdb2:/var/lib/influxdb2 \ + -e DOCKER_INFLUXDB_INIT_MODE=upgrade \ + -e DOCKER_INFLUXDB_INIT_USERNAME=my-user \ + -e DOCKER_INFLUXDB_INIT_PASSWORD=my-password \ + -e DOCKER_INFLUXDB_INIT_ORG=my-org \ + -e DOCKER_INFLUXDB_INIT_BUCKET=my-bucket \ + influxdb:2.0 +``` + +#### Upgrade Example - Custom InfluxDB 1.x Config + +Assume you've been running an InfluxDB 1.x deployment with customized config: + +```console +$ docker run -p 8086:8086 \ + -v influxdb:/var/lib/influxdb \ + -v $PWD/influxdb.conf:/etc/influxdb/influxdb.conf \ + influxdb:1.8 +``` + +To upgrade this deployment to InfluxDB 2.x, stop the running container, then run: + +```console +$ docker run -p 8086:8086 \ + -v influxdb:/var/lib/influxdb \ + -v influxdb2:/var/lib/influxdb2 \ + -v influxdb2-config:/etc/influxdb2 \ + -v $PWD/influxdb.conf:/etc/influxdb/influxdb.conf \ + -e DOCKER_INFLUXDB_INIT_MODE=upgrade \ + -e DOCKER_INFLUXDB_INIT_USERNAME=my-user \ + -e DOCKER_INFLUXDB_INIT_PASSWORD=my-password \ + -e DOCKER_INFLUXDB_INIT_ORG=my-org \ + -e DOCKER_INFLUXDB_INIT_BUCKET=my-bucket \ + influxdb:2.0 +``` + +#### Upgrade Example - Custom Paths + +Assume you've been running an InfluxDB 1.x deployment with data and config mounted at custom paths: + +```console +$ docker run -p 8086:8086 \ + -v influxdb:/root/influxdb/data \ + -v $PWD/influxdb.conf:/root/influxdb/influxdb.conf \ + influxdb:1.8 -config /root/influxdb/influxdb.conf +``` + +To upgrade this deployment to InfluxDB 2.x, first decide if you'd like to keep using custom paths, or use the InfluxDB 2.x defaults. If you decide to use the defaults, you'd stop the running InfluxDB 1.x container, then run: + +```console +$ docker run -p 8086:8086 \ + -v influxdb:/root/influxdb/data \ + -v influxdb2:/var/lib/influxdb2 \ + -v influxdb2-config:/etc/influxdb2 \ + -v $PWD/influxdb.conf:/root/influxdb/influxdb.conf \ + -e DOCKER_INFLUXDB_INIT_MODE=upgrade \ + -e DOCKER_INFLUXDB_INIT_USERNAME=my-user \ + -e DOCKER_INFLUXDB_INIT_PASSWORD=my-password \ + -e DOCKER_INFLUXDB_INIT_ORG=my-org \ + -e DOCKER_INFLUXDB_INIT_BUCKET=my-bucket \ + -e DOCKER_INFLUXDB_INIT_UPGRADE_V1_CONFIG=/root/influxdb/influxdb.conf \ + influxdb:2.0 +``` + +To retain your custom paths, you'd run: + +```console +$ docker run -p 8086:8086 \ + -v influxdb:/root/influxdb/data \ + -v influxdb2:/root/influxdb2/data \ + -v influxdb2-config:/etc/influxdb2 \ + -v $PWD/influxdb.conf:/root/influxdb/influxdb.conf \ + -e DOCKER_INFLUXDB_INIT_MODE=upgrade \ + -e DOCKER_INFLUXDB_INIT_USERNAME=my-user \ + -e DOCKER_INFLUXDB_INIT_PASSWORD=my-password \ + -e DOCKER_INFLUXDB_INIT_ORG=my-org \ + -e DOCKER_INFLUXDB_INIT_BUCKET=my-bucket \ + -e DOCKER_INFLUXDB_INIT_UPGRADE_V1_CONFIG=/root/influxdb/influxdb.conf \ + -e DOCKER_INFLUXDB_CONFIG_PATH=/root/influxdb2/config.toml \ + -e DOCKER_INFLUXDB_BOLT_PATH=/root/influxdb2/influxdb.bolt \ + -e DOCKER_INFLUXDB_ENGINE_PATH=/root/influxdb2/engine \ + influxdb:2.0 +``` + +### Upgrading from quay.io-hosted InfluxDB 2.x image + +Early Docker builds of InfluxDB 2.x were hosted at `quay.io/influxdb/influxdb`. The builds were very bare-bones, containing the `influx` and `influxd` binaries without any default configuration or helper scripts. By default, the `influxd` process stored data under `/root/.influxdbv2`. + +Starting with `v2.0.4`, we've restored our DockerHub build. This build defaults to storing data in `/var/lib/influxdb2`. Upgrading directly from `quay.io/influxdb/influxdb` to `influxdb:2.0.4` without modifying any settings will appear to cause data loss, as the new process won't be able to find your existing data files. + +To avoid this problem when migrating from `quay.io/influxdb/influxdb` to `influxdb:2.0`, you can use one of the following approaches. + +#### Change volume mount point + +If you don't mind using the new default path, you can switch the mount-point for the volume containing your data: + +```console +# Migrate from this: +$ docker run -p 8086:8086 \ + -v $PWD:/root/.influxdbv2 \ + quay.io/influxdb/influxdb:v2.0.3 + +# To this: +docker run -p 8086:8086 \ + -v $PWD:/var/lib/influxdb2 \ + influxdb:2.0 +``` + +#### Override default configs + +If you'd rather keep your data files in the home directory, you can override the container's default config: + +```console +# Migrate from this: +$ docker run -p 8086:8086 \ + -v $PWD:/root/.influxdbv2 \ + quay.io/influxdb/influxdb:v2.0.3 + +# To this: +docker run -p 8086:8086 \ + -e INFLUXD_BOLT_PATH=/root/.influxdbv2/influxd.bolt \ + -e INFLUXD_ENGINE_PATH=/root/.influxdbv2/engine \ + -v $PWD:/root/.influxdbv2 \ + influxdb:2.0 +``` + +See the section about configuration below for more ways to override the data paths. + +## Using this Image - InfluxDB 1.x ### Running the container @@ -77,7 +479,7 @@ The InfluxDB image exposes a shared volume under `/var/lib/influxdb`, so you can ```console $ docker run -p 8086:8086 \ -v $PWD:/var/lib/influxdb \ - influxdb + influxdb:1.8 ``` Modify `$PWD` to the directory where you want to store data associated with the InfluxDB container. @@ -87,7 +489,7 @@ You can also have Docker control the volume mountpoint by using a named volume. ```console $ docker run -p 8086:8086 \ -v influxdb:/var/lib/influxdb \ - influxdb + influxdb:1.8 ``` ### Exposed Ports @@ -99,8 +501,6 @@ The following ports are important and are used by InfluxDB. The HTTP API port will be automatically exposed when using `docker run -P`. -Find more about API Endpoints & Ports [here](https://docs.influxdata.com/influxdb/latest/concepts/api/). - ### Configuration InfluxDB can be either configured from a config file or using environment variables. To mount a configuration file and use it with the server, you can use this command: @@ -108,7 +508,7 @@ InfluxDB can be either configured from a config file or using environment variab Generate the default configuration file: ```console -$ docker run --rm influxdb influxd config > influxdb.conf +$ docker run --rm influxdb:1.8 influxd config > influxdb.conf ``` Modify the default configuration, which will now be available under `$PWD`. Then start the InfluxDB container. @@ -116,7 +516,7 @@ Modify the default configuration, which will now be available under `$PWD`. Then ```console $ docker run -p 8086:8086 \ -v $PWD/influxdb.conf:/etc/influxdb/influxdb.conf:ro \ - influxdb -config /etc/influxdb/influxdb.conf + influxdb:1.8 -config /etc/influxdb/influxdb.conf ``` Modify `$PWD` to the directory where you want to store the configuration file. @@ -131,7 +531,7 @@ INFLUXDB_META_DIR=/path/to/metadir INFLUXDB_DATA_QUERY_LOG_ENABLED=false ``` -Find more about configuring InfluxDB [here](https://docs.influxdata.com/influxdb/latest/introduction/installation/). +Find more about configuring InfluxDB [here](https://docs.influxdata.com/influxdb/v1.8/administration/config/). ### Graphite @@ -140,7 +540,7 @@ InfluxDB supports the Graphite line protocol, but the service and ports are not ```console docker run -p 8086:8086 -p 2003:2003 \ -e INFLUXDB_GRAPHITE_ENABLED=true \ - influxdb + influxdb:1.8 ``` See the [README on GitHub](https://github.com/influxdata/influxdb/blob/master/services/graphite/README.md) for more detailed documentation to set up the Graphite service. In order to take advantage of graphite templates, you should use a configuration file by outputting a default configuration file using the steps above and modifying the `[[graphite]]` section. @@ -166,7 +566,7 @@ Read more about this in the [official documentation](https://docs.influxdata.com Start the container: ```console -$ docker run --name=influxdb -d -p 8086:8086 influxdb +$ docker run --name=influxdb -d -p 8086:8086 influxdb:1.8 ``` Run the influx client in this container: @@ -178,7 +578,7 @@ $ docker exec -it influxdb influx Or run the influx client in a separate container: ```console -$ docker run --rm --link=influxdb -it influxdb influx -host influxdb +$ docker run --rm --link=influxdb -it influxdb:1.8 influx -host influxdb ``` ### Database Initialization @@ -245,7 +645,7 @@ $ docker run --rm \ -e INFLUXDB_ADMIN_USER=admin -e INFLUXDB_ADMIN_PASSWORD=supersecretpassword \ -e INFLUXDB_USER=telegraf -e INFLUXDB_USER_PASSWORD=secretpassword \ -v $PWD:/var/lib/influxdb \ - influxdb /init-influxdb.sh + influxdb:1.8 /init-influxdb.sh ``` The above would create the database `db0`, create an admin user with the password `supersecretpassword`, then create the `telegraf` user with your telegraf's secret password. It would then exit and leave behind any files it created in the volume that you mounted. @@ -260,9 +660,9 @@ This is the defacto image. If you are unsure about what your needs are, you prob ## `influxdb:-alpine` -This image is based on the popular [Alpine Linux project](http://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. +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. -This variant is highly recommended when final image size being as small as possible is desired. The main caveat to note is that it does use [musl libc](http://www.musl-libc.org) instead of [glibc and friends](http://www.etalabs.net/compare_libcs.html), so certain software might run into issues depending on the depth of their libc requirements. However, most software doesn't have an issue with this, so this variant is usually a very safe choice. 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. +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. 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). @@ -270,7 +670,7 @@ To minimize image size, it's uncommon for additional related tools (such as `git *This image requires a valid license key from InfluxData.* Please visit our [products page](https://www.influxdata.com/products/) to learn more. -This image contains the enterprise data node package for clustering. It supports all of the same options as the OSS image, but it needs port 8088 to be exposed to the meta nodes. +This image contains the enterprise data node package for clustering. It supports all of the same options as the InfluxDB 1.x OSS image, but it needs port 8088 to be exposed to the meta nodes. Refer to the `influxdb:meta` variant for directions on how to setup a cluster. diff --git a/influxdb/content.md b/influxdb/content.md index a2a3f6373298..83ebe353d489 100644 --- a/influxdb/content.md +++ b/influxdb/content.md @@ -6,11 +6,405 @@ InfluxDB is a time series database built from the ground up to handle high write %%LOGO%% -## Updating latest to 2.0 +## Using this Image - InfluxDB 2.x -In the future, the latest tag for this image will point to the latest released implementation of influxdb 2.0. This will happen when the first general available release for 2.0 exists. If you are using the `latest` tag for any production or development purposes, please update your development environment to reference the `1.8` tag. +### Quick start -## Using this Image +Using this image is pretty easy, but there are a few things you should know. + +- You should forward TCP port 8086 +- You should mount a volume in /var/lib/influxdb2 + +```console +$ docker run \ + -p 8086:8086 \ + -v myInfluxVolume:/var/lib/influxdb2 \ + %%IMAGE%%:latest +``` + +After starting the container you can use the web interface at http://localhost:8086/ to setup and customize your Influx database. + +Find more about API Endpoints & Ports [here](https://docs.influxdata.com/influxdb/v2.5/reference/api/). + +### Configuration + +InfluxDB can be configured using a mix of a config file, environment variables, and CLI options. To mount a configuration file and use it with the server, you can use this command to generate the default configuration file: + +```console +$ docker run --rm %%IMAGE%%:2.0 influxd print-config > config.yml +``` + +Modify the default configuration, which will now be available under `$PWD`. Then start the InfluxDB container: + +```console +$ docker run -p 8086:8086 \ + -v $PWD/config.yml:/etc/influxdb2/config.yml \ + %%IMAGE%%:2.0 +``` + +Modify `$PWD` to be the directory where you want to store the configuration file. + +Individual config settings can be overridden by environment variables. The variables must be named using the format `INFLUXD_${SNAKE_CASE_NAME}`. The `SNAKE_CASE_NAME` for an option will be the option's name with all dashes (`-`) replaced by underscores (`_`), in all caps. + +Examples: + +```console +# Config setting: bolt-path +INFLUXD_BOLT_PATH=/root/influxdb.bolt +# Config setting: no-tasks +INFLUXD_NO_TASKS=true +# Config setting: storage-wal-fsync-delay +INFLUXD_STORAGE_WAL_FSYNC_DELAY=15m +``` + +Finally, all config options can be passed as CLI options: + +```console +$ docker run -p 8086:8086 \ + %%IMAGE%%:2.0 --storage-wal-fsync-delay=15m +``` + +CLI options take precedence over environment variables. + +Find more about configuring InfluxDB [here](https://docs.influxdata.com/influxdb/v2.0/reference/config-options/). + +### Database Setup + +InfluxDB 2.x requires authentication. A special API exists to bootstrap the first super-user in the database, along with an initial organization and bucket. It's possible to access this API manually, or to run it automatically via environment variables. + +#### Manual Setup + +If your InfluxDB container is running locally (or on a host exposed to the network), you can perform initial setup from outside the container using either the UI or the `influx` CLI. Find more about setting up InfluxDB using these methods [here](https://docs.influxdata.com/influxdb/v2.0/get-started/#set-up-influxdb). + +It's also possible to perform manual setup from within the container using `docker exec`. For example, if you start the container: + +```console +$ docker run -d -p 8086:8086 \ + --name influxdb2 \ + -v $PWD:/var/lib/influxdb2 \ + %%IMAGE%%:2.0 +``` + +You can then run the `influx` client in the container: + +```console +$ docker exec influxdb2 influx setup \ + --username $USERNAME \ + --password $PASSWORD \ + --org $ORGANIZATION \ + --bucket $BUCKET +``` + +Running setup from within the container will cause CLI configs to be written to `/etc/influxdb2/influx-configs`. You can then use the `influx` CLI from within the container to extract the generated admin token: + +```console +# Using table output + cut +$ docker exec influxdb2 influx auth list \ + --user $USERNAME \ + --hide-headers | cut -f 3 + +# Using JSON output + jq +$ docker exec influxdb2 influx auth list \ + --user $USERNAME \ + --json | jq -r '.[].token' +``` + +Alternatively, you could configure your initial InfluxDB run to mount `/etc/influxdb2` as a volume: + +```console +$ docker run -d -p 8086:8086 \ + --name influxdb2 \ + -v $PWD/data:/var/lib/influxdb2 \ + -v $PWD/config:/etc/influxdb2 \ + %%IMAGE%%:2.0 +``` + +This will make the generated CLI configs available to the host. + +#### Automated Setup + +The InfluxDB image contains some extra functionality to automatically bootstrap the system. This functionality is enabled by setting the `DOCKER_INFLUXDB_INIT_MODE` environment variable to the value `setup` when running the container. Additional environment variables are used to configure the setup logic: + +- `DOCKER_INFLUXDB_INIT_USERNAME`: The username to set for the system's initial super-user (**Required**). +- `DOCKER_INFLUXDB_INIT_PASSWORD`: The password to set for the system's inital super-user (**Required**). +- `DOCKER_INFLUXDB_INIT_ORG`: The name to set for the system's initial organization (**Required**). +- `DOCKER_INFLUXDB_INIT_BUCKET`: The name to set for the system's initial bucket (**Required**). +- `DOCKER_INFLUXDB_INIT_RETENTION`: The duration the system's initial bucket should retain data. If not set, the initial bucket will retain data forever. +- `DOCKER_INFLUXDB_INIT_ADMIN_TOKEN`: The authentication token to associate with the system's initial super-user. If not set, a token will be auto-generated by the system. + +Automated setup will generate metadata files and CLI configurations. It's recommended to mount volumes at both paths to avoid losing data. + +For example, a minimal invocation of automated setup is: + +```console +$ docker run -d -p 8086:8086 \ + -v $PWD/data:/var/lib/influxdb2 \ + -v $PWD/config:/etc/influxdb2 \ + -e DOCKER_INFLUXDB_INIT_MODE=setup \ + -e DOCKER_INFLUXDB_INIT_USERNAME=my-user \ + -e DOCKER_INFLUXDB_INIT_PASSWORD=my-password \ + -e DOCKER_INFLUXDB_INIT_ORG=my-org \ + -e DOCKER_INFLUXDB_INIT_BUCKET=my-bucket \ + %%IMAGE%%:2.0 +``` + +And an example using all available options is: + +```console +$ docker run -d -p 8086:8086 \ + -v $PWD/data:/var/lib/influxdb2 \ + -v $PWD/config:/etc/influxdb2 \ + -e DOCKER_INFLUXDB_INIT_MODE=setup \ + -e DOCKER_INFLUXDB_INIT_USERNAME=my-user \ + -e DOCKER_INFLUXDB_INIT_PASSWORD=my-password \ + -e DOCKER_INFLUXDB_INIT_ORG=my-org \ + -e DOCKER_INFLUXDB_INIT_BUCKET=my-bucket \ + -e DOCKER_INFLUXDB_INIT_RETENTION=1w \ + -e DOCKER_INFLUXDB_INIT_ADMIN_TOKEN=my-super-secret-auth-token \ + %%IMAGE%%:2.0 +``` + +**NOTE:** Automated setup will not run if an existing boltdb file is found at the configured path. This behavior allows for the InfluxDB container to reboot post-setup without encountering "DB is already set up" errors. + +### Interacting with InfluxDB + +Once an InfluxDB instance has completed initial setup, its APIs will unlock. See the main documentation site for reference information and examples on: + +- [Writing data](https://docs.influxdata.com/influxdb/v2.0/write-data/) +- [Reading data](https://docs.influxdata.com/influxdb/v2.0/query-data/) +- [Configuring security](https://docs.influxdata.com/influxdb/v2.0/security/) +- [And more!](https://docs.influxdata.com/influxdb/v2.0/) + +### Custom Initialization Scripts + +The InfluxDB image supports running arbitrary initialization scripts after initial system setup, on both the `setup` and `upgrade` paths. Scripts must have extension `.sh` and be mounted inside of the `/docker-entrypoint-initdb.d` directory. When multiple scripts are present, they will be executed in lexical sort order by name. + +As a convenience for script-writers, the image will export a number of variables into the environment before executing any scripts: + +- `INFLUX_CONFIGS_PATH`: Path to the CLI configs file written by `setup`/`upgrade` +- `INFLUX_HOST`: URL to the `influxd` instance running setup logic +- `DOCKER_INFLUXDB_INIT_USER_ID`: ID of the initial admin user created by `setup`/`upgrade` +- `DOCKER_INFLUXDB_INIT_ORG_ID`: ID of the initial organization created by `setup`/`upgrade` +- `DOCKER_INFLUXDB_INIT_BUCKET_ID`: ID of the initial bucket created by `setup`/`upgrade` + +For example, if you wanted to grant write-access to an InfluxDB 1.x client on your initial bucket, you'd first create the file `$PWD/scripts/setup-v1.sh` with contents: + +```bash +#!/bin/bash +set -e + +influx v1 dbrp create \ + --bucket-id ${DOCKER_INFLUXDB_INIT_BUCKET_ID} \ + --db ${V1_DB_NAME} \ + --rp ${V1_RP_NAME} \ + --default \ + --org ${DOCKER_INFLUXDB_INIT_ORG} + +influx v1 auth create \ + --username ${V1_AUTH_USERNAME} \ + --password ${V1_AUTH_PASSWORD} \ + --write-bucket ${DOCKER_INFLUXDB_INIT_BUCKET_ID} \ + --org ${DOCKER_INFLUXDB_INIT_ORG} +``` + +Then you'd run: + +```console +$ docker run -p 8086:8086 \ + -v $PWD/data:/var/lib/influxdb2 \ + -v $PWD/config:/etc/influxdb2 \ + -v $PWD/scripts:/docker-entrypoint-initdb.d \ + -e DOCKER_INFLUXDB_INIT_MODE=setup \ + -e DOCKER_INFLUXDB_INIT_USERNAME=my-user \ + -e DOCKER_INFLUXDB_INIT_PASSWORD=my-password \ + -e DOCKER_INFLUXDB_INIT_ORG=my-org \ + -e DOCKER_INFLUXDB_INIT_BUCKET=my-bucket \ + -e V1_DB_NAME=v1-db \ + -e V1_RP_NAME=v1-rp \ + -e V1_AUTH_USERNAME=v1-user \ + -e V1_AUTH_PASSWORD=v1-password \ + %%IMAGE%%:2.0 +``` + +**NOTE:** Custom scripts will not run if an existing boltdb file is found at the configured path (causing `setup` or `upgrade` to be skipped). This behavior allows for the InfluxDB container to reboot post-initialization without encountering errors from non-idempotent script commands. + +### Upgrading from InfluxDB 1.x + +InfluxDB 2.x provides a 1.x-compatible API, but expects a different storage layout on disk. To bridge this mismatch, the InfluxDB image contains extra functionality to migrate 1.x data and config into 2.x layouts automatically before booting the `influxd` server. + +The automated upgrade process bootstraps an initial admin user, organization, and bucket in the system. Additional environment variables are used to configure the setup logic: + +- `DOCKER_INFLUXDB_INIT_USERNAME`: The username to set for the system's initial super-user (**Required**). +- `DOCKER_INFLUXDB_INIT_PASSWORD`: The password to set for the system's inital super-user (**Required**). +- `DOCKER_INFLUXDB_INIT_ORG`: The name to set for the system's initial organization (**Required**). +- `DOCKER_INFLUXDB_INIT_BUCKET`: The name to set for the system's initial bucket (**Required**). +- `DOCKER_INFLUXDB_INIT_RETENTION`: The duration the system's initial bucket should retain data. If not set, the initial bucket will retain data forever. +- `DOCKER_INFLUXDB_INIT_ADMIN_TOKEN`: The authentication token to associate with the system's initial super-user. If not set, a token will be auto-generated by the system. + +It also requires extra volumes to be mounted into the 2.x container: + +- Data from the 1.x instance +- Custom config from the 1.x instance (if any) + +The upgrade process searches for mounted 1.x data / config in this priority order: + +1. A config file referred to by the `DOCKER_INFLUXDB_INIT_UPGRADE_V1_CONFIG` environment variable +2. A data directory referred to by the `DOCKER_INFLUXDB_INIT_UPGRADE_V1_DIR` environment variable +3. A config file mounted at `/etc/influxdb/influxdb.conf` +4. A data directory mounted at `/var/lib/influxdb` + +Finally, the `DOCKER_INFLUXDB_INIT_MODE` environment variable must be set to `upgrade`. + +Automated upgrade will generate both data and config files, by default under `/var/lib/influxdb2` and `/etc/influxdb2`. It's recommended to mount volumes at both paths to avoid losing data. + +**NOTE:** Automated upgrade will not run if an existing boltdb file is found at the configured path. This behavior allows for the InfluxDB container to reboot post-upgrade without overwriting migrated data. + +Find more about the InfluxDB upgrade process [here](https://docs.influxdata.com/influxdb/v2.0/upgrade/v1-to-v2/). See below for examples of common upgrade scenarios. + +#### Upgrade Example - Minimal + +Assume you've been running a minimal InfluxDB 1.x deployment: + +```console +$ docker run -p 8086:8086 \ + -v influxdb:/var/lib/influxdb \ + %%IMAGE%%:1.8 +``` + +To upgrade this deployment to InfluxDB 2.x, stop the running InfluxDB 1.x container, then run: + +```console +$ docker run -p 8086:8086 \ + -v influxdb:/var/lib/influxdb \ + -v influxdb2:/var/lib/influxdb2 \ + -e DOCKER_INFLUXDB_INIT_MODE=upgrade \ + -e DOCKER_INFLUXDB_INIT_USERNAME=my-user \ + -e DOCKER_INFLUXDB_INIT_PASSWORD=my-password \ + -e DOCKER_INFLUXDB_INIT_ORG=my-org \ + -e DOCKER_INFLUXDB_INIT_BUCKET=my-bucket \ + %%IMAGE%%:2.0 +``` + +#### Upgrade Example - Custom InfluxDB 1.x Config + +Assume you've been running an InfluxDB 1.x deployment with customized config: + +```console +$ docker run -p 8086:8086 \ + -v influxdb:/var/lib/influxdb \ + -v $PWD/influxdb.conf:/etc/influxdb/influxdb.conf \ + %%IMAGE%%:1.8 +``` + +To upgrade this deployment to InfluxDB 2.x, stop the running container, then run: + +```console +$ docker run -p 8086:8086 \ + -v influxdb:/var/lib/influxdb \ + -v influxdb2:/var/lib/influxdb2 \ + -v influxdb2-config:/etc/influxdb2 \ + -v $PWD/influxdb.conf:/etc/influxdb/influxdb.conf \ + -e DOCKER_INFLUXDB_INIT_MODE=upgrade \ + -e DOCKER_INFLUXDB_INIT_USERNAME=my-user \ + -e DOCKER_INFLUXDB_INIT_PASSWORD=my-password \ + -e DOCKER_INFLUXDB_INIT_ORG=my-org \ + -e DOCKER_INFLUXDB_INIT_BUCKET=my-bucket \ + %%IMAGE%%:2.0 +``` + +#### Upgrade Example - Custom Paths + +Assume you've been running an InfluxDB 1.x deployment with data and config mounted at custom paths: + +```console +$ docker run -p 8086:8086 \ + -v influxdb:/root/influxdb/data \ + -v $PWD/influxdb.conf:/root/influxdb/influxdb.conf \ + %%IMAGE%%:1.8 -config /root/influxdb/influxdb.conf +``` + +To upgrade this deployment to InfluxDB 2.x, first decide if you'd like to keep using custom paths, or use the InfluxDB 2.x defaults. If you decide to use the defaults, you'd stop the running InfluxDB 1.x container, then run: + +```console +$ docker run -p 8086:8086 \ + -v influxdb:/root/influxdb/data \ + -v influxdb2:/var/lib/influxdb2 \ + -v influxdb2-config:/etc/influxdb2 \ + -v $PWD/influxdb.conf:/root/influxdb/influxdb.conf \ + -e DOCKER_INFLUXDB_INIT_MODE=upgrade \ + -e DOCKER_INFLUXDB_INIT_USERNAME=my-user \ + -e DOCKER_INFLUXDB_INIT_PASSWORD=my-password \ + -e DOCKER_INFLUXDB_INIT_ORG=my-org \ + -e DOCKER_INFLUXDB_INIT_BUCKET=my-bucket \ + -e DOCKER_INFLUXDB_INIT_UPGRADE_V1_CONFIG=/root/influxdb/influxdb.conf \ + %%IMAGE%%:2.0 +``` + +To retain your custom paths, you'd run: + +```console +$ docker run -p 8086:8086 \ + -v influxdb:/root/influxdb/data \ + -v influxdb2:/root/influxdb2/data \ + -v influxdb2-config:/etc/influxdb2 \ + -v $PWD/influxdb.conf:/root/influxdb/influxdb.conf \ + -e DOCKER_INFLUXDB_INIT_MODE=upgrade \ + -e DOCKER_INFLUXDB_INIT_USERNAME=my-user \ + -e DOCKER_INFLUXDB_INIT_PASSWORD=my-password \ + -e DOCKER_INFLUXDB_INIT_ORG=my-org \ + -e DOCKER_INFLUXDB_INIT_BUCKET=my-bucket \ + -e DOCKER_INFLUXDB_INIT_UPGRADE_V1_CONFIG=/root/influxdb/influxdb.conf \ + -e DOCKER_INFLUXDB_CONFIG_PATH=/root/influxdb2/config.toml \ + -e DOCKER_INFLUXDB_BOLT_PATH=/root/influxdb2/influxdb.bolt \ + -e DOCKER_INFLUXDB_ENGINE_PATH=/root/influxdb2/engine \ + %%IMAGE%%:2.0 +``` + +### Upgrading from quay.io-hosted InfluxDB 2.x image + +Early Docker builds of InfluxDB 2.x were hosted at `quay.io/influxdb/influxdb`. The builds were very bare-bones, containing the `influx` and `influxd` binaries without any default configuration or helper scripts. By default, the `influxd` process stored data under `/root/.influxdbv2`. + +Starting with `v2.0.4`, we've restored our DockerHub build. This build defaults to storing data in `/var/lib/influxdb2`. Upgrading directly from `quay.io/influxdb/influxdb` to `influxdb:2.0.4` without modifying any settings will appear to cause data loss, as the new process won't be able to find your existing data files. + +To avoid this problem when migrating from `quay.io/influxdb/influxdb` to `influxdb:2.0`, you can use one of the following approaches. + +#### Change volume mount point + +If you don't mind using the new default path, you can switch the mount-point for the volume containing your data: + +```console +# Migrate from this: +$ docker run -p 8086:8086 \ + -v $PWD:/root/.influxdbv2 \ + quay.io/influxdb/influxdb:v2.0.3 + +# To this: +docker run -p 8086:8086 \ + -v $PWD:/var/lib/influxdb2 \ + %%IMAGE%%:2.0 +``` + +#### Override default configs + +If you'd rather keep your data files in the home directory, you can override the container's default config: + +```console +# Migrate from this: +$ docker run -p 8086:8086 \ + -v $PWD:/root/.influxdbv2 \ + quay.io/influxdb/influxdb:v2.0.3 + +# To this: +docker run -p 8086:8086 \ + -e INFLUXD_BOLT_PATH=/root/.influxdbv2/influxd.bolt \ + -e INFLUXD_ENGINE_PATH=/root/.influxdbv2/engine \ + -v $PWD:/root/.influxdbv2 \ + %%IMAGE%%:2.0 +``` + +See the section about configuration below for more ways to override the data paths. + +## Using this Image - InfluxDB 1.x ### Running the container @@ -19,7 +413,7 @@ The InfluxDB image exposes a shared volume under `/var/lib/influxdb`, so you can ```console $ docker run -p 8086:8086 \ -v $PWD:/var/lib/influxdb \ - %%IMAGE%% + %%IMAGE%%:1.8 ``` Modify `$PWD` to the directory where you want to store data associated with the InfluxDB container. @@ -29,7 +423,7 @@ You can also have Docker control the volume mountpoint by using a named volume. ```console $ docker run -p 8086:8086 \ -v influxdb:/var/lib/influxdb \ - %%IMAGE%% + %%IMAGE%%:1.8 ``` ### Exposed Ports @@ -41,8 +435,6 @@ The following ports are important and are used by InfluxDB. The HTTP API port will be automatically exposed when using `docker run -P`. -Find more about API Endpoints & Ports [here](https://docs.influxdata.com/influxdb/latest/concepts/api/). - ### Configuration InfluxDB can be either configured from a config file or using environment variables. To mount a configuration file and use it with the server, you can use this command: @@ -50,7 +442,7 @@ InfluxDB can be either configured from a config file or using environment variab Generate the default configuration file: ```console -$ docker run --rm %%IMAGE%% influxd config > influxdb.conf +$ docker run --rm %%IMAGE%%:1.8 influxd config > influxdb.conf ``` Modify the default configuration, which will now be available under `$PWD`. Then start the InfluxDB container. @@ -58,7 +450,7 @@ Modify the default configuration, which will now be available under `$PWD`. Then ```console $ docker run -p 8086:8086 \ -v $PWD/influxdb.conf:/etc/influxdb/influxdb.conf:ro \ - %%IMAGE%% -config /etc/influxdb/influxdb.conf + %%IMAGE%%:1.8 -config /etc/influxdb/influxdb.conf ``` Modify `$PWD` to the directory where you want to store the configuration file. @@ -73,7 +465,7 @@ INFLUXDB_META_DIR=/path/to/metadir INFLUXDB_DATA_QUERY_LOG_ENABLED=false ``` -Find more about configuring InfluxDB [here](https://docs.influxdata.com/influxdb/latest/introduction/installation/). +Find more about configuring InfluxDB [here](https://docs.influxdata.com/influxdb/v1.8/administration/config/). ### Graphite @@ -82,7 +474,7 @@ InfluxDB supports the Graphite line protocol, but the service and ports are not ```console docker run -p 8086:8086 -p 2003:2003 \ -e INFLUXDB_GRAPHITE_ENABLED=true \ - %%IMAGE%% + %%IMAGE%%:1.8 ``` See the [README on GitHub](https://github.com/influxdata/influxdb/blob/master/services/graphite/README.md) for more detailed documentation to set up the Graphite service. In order to take advantage of graphite templates, you should use a configuration file by outputting a default configuration file using the steps above and modifying the `[[graphite]]` section. @@ -108,7 +500,7 @@ Read more about this in the [official documentation](https://docs.influxdata.com Start the container: ```console -$ docker run --name=influxdb -d -p 8086:8086 %%IMAGE%% +$ docker run --name=influxdb -d -p 8086:8086 %%IMAGE%%:1.8 ``` Run the influx client in this container: @@ -120,7 +512,7 @@ $ docker exec -it influxdb influx Or run the influx client in a separate container: ```console -$ docker run --rm --link=influxdb -it %%IMAGE%% influx -host influxdb +$ docker run --rm --link=influxdb -it %%IMAGE%%:1.8 influx -host influxdb ``` ### Database Initialization @@ -187,7 +579,7 @@ $ docker run --rm \ -e INFLUXDB_ADMIN_USER=admin -e INFLUXDB_ADMIN_PASSWORD=supersecretpassword \ -e INFLUXDB_USER=telegraf -e INFLUXDB_USER_PASSWORD=secretpassword \ -v $PWD:/var/lib/influxdb \ - influxdb /init-influxdb.sh + %%IMAGE%%:1.8 /init-influxdb.sh ``` The above would create the database `db0`, create an admin user with the password `supersecretpassword`, then create the `telegraf` user with your telegraf's secret password. It would then exit and leave behind any files it created in the volume that you mounted. diff --git a/influxdb/variant-data.md b/influxdb/variant-data.md index 84ab2410e7bd..f6c6fc19c4f7 100644 --- a/influxdb/variant-data.md +++ b/influxdb/variant-data.md @@ -2,6 +2,6 @@ *This image requires a valid license key from InfluxData.* Please visit our [products page](https://www.influxdata.com/products/) to learn more. -This image contains the enterprise data node package for clustering. It supports all of the same options as the OSS image, but it needs port 8088 to be exposed to the meta nodes. +This image contains the enterprise data node package for clustering. It supports all of the same options as the InfluxDB 1.x OSS image, but it needs port 8088 to be exposed to the meta nodes. Refer to the `influxdb:meta` variant for directions on how to setup a cluster. diff --git a/irssi/README.md b/irssi/README.md index fde00f60ff87..821d046ab93f 100644 --- a/irssi/README.md +++ b/irssi/README.md @@ -20,12 +20,12 @@ WARNING: [Jessie and Tianon (of the Docker Community)](https://github.com/jessfraz/irssi), [with the appreciation of the Irssi Project](https://twitter.com/GeertHauwaerts/status/559131523145035776) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`1.2.2`, `1.2`, `1`, `latest`](https://github.com/jessfraz/irssi/blob/773216139cd3685fd710b77dc7d4ee26ec9fb187/debian/Dockerfile) -- [`1.2.2-alpine`, `1.2-alpine`, `1-alpine`, `alpine`](https://github.com/jessfraz/irssi/blob/4eb15e5f0583e58b326282ce0b1454aa5df1cf31/alpine/Dockerfile) +- [`1.4.3`, `1.4`, `1`, `latest`](https://github.com/jessfraz/irssi/blob/980ac05787b560d131fdb3cf0fc45d097fd8d366/debian/Dockerfile) +- [`1.4.3-alpine`, `1.4-alpine`, `1-alpine`, `alpine`](https://github.com/jessfraz/irssi/blob/980ac05787b560d131fdb3cf0fc45d097fd8d366/alpine/Dockerfile) # Quick reference (cont.) @@ -40,7 +40,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/irssi`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Firssi) + [official-images repo's `library/irssi` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Firssi) [official-images repo's `library/irssi` file](https://github.com/docker-library/official-images/blob/master/library/irssi) ([history](https://github.com/docker-library/official-images/commits/master/library/irssi)) - **Source of this description**: @@ -95,9 +95,9 @@ This is the defacto image. If you are unsure about what your needs are, you prob ## `irssi:-alpine` -This image is based on the popular [Alpine Linux project](http://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. +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. -This variant is highly recommended when final image size being as small as possible is desired. The main caveat to note is that it does use [musl libc](http://www.musl-libc.org) instead of [glibc and friends](http://www.etalabs.net/compare_libcs.html), so certain software might run into issues depending on the depth of their libc requirements. However, most software doesn't have an issue with this, so this variant is usually a very safe choice. 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. +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. 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). diff --git a/jetty/README.md b/jetty/README.md index aab29b8caefe..ae519bebef3a 100644 --- a/jetty/README.md +++ b/jetty/README.md @@ -17,25 +17,59 @@ WARNING: # Quick reference - **Maintained by**: - [the Docker Community](https://github.com/appropriate/docker-jetty) + [the Docker Community](https://github.com/eclipse/jetty.docker) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`9.4.27-jre11-slim`, `9.4-jre11-slim`, `9-jre11-slim`](https://github.com/appropriate/docker-jetty/blob/89dfeafc4a603611cf5135249acbe218b515439c/9.4-jre11-slim/Dockerfile) -- [`9.4.27-jre11`, `9.4-jre11`, `9-jre11`](https://github.com/appropriate/docker-jetty/blob/89dfeafc4a603611cf5135249acbe218b515439c/9.4-jre11/Dockerfile) -- [`9.4.27-jre8`, `9.4-jre8`, `9-jre8`](https://github.com/appropriate/docker-jetty/blob/89dfeafc4a603611cf5135249acbe218b515439c/9.4-jre8/Dockerfile) -- [`9.4.27-jdk13-slim`, `9.4-jdk13-slim`, `9-jdk13-slim`](https://github.com/appropriate/docker-jetty/blob/89dfeafc4a603611cf5135249acbe218b515439c/9.4-jdk13-slim/Dockerfile) -- [`9.4.27`, `9.4`, `9`, `9.4.27-jdk13`, `9.4-jdk13`, `9-jdk13`, `latest`, `jdk13`](https://github.com/appropriate/docker-jetty/blob/89dfeafc4a603611cf5135249acbe218b515439c/9.4-jdk13/Dockerfile) -- [`9.3.28-jre8`, `9.3-jre8`](https://github.com/appropriate/docker-jetty/blob/28562cbee783f1ccb94c375b7e9165c6cfe6d2e2/9.3-jre8/Dockerfile) -- [`9.2.29-jre8`, `9.2-jre8`](https://github.com/appropriate/docker-jetty/blob/28562cbee783f1ccb94c375b7e9165c6cfe6d2e2/9.2-jre8/Dockerfile) +- [`9.4.50-jre8-alpine`, `9.4-jre8-alpine`, `9-jre8-alpine`, `9.4.50-jre8-alpine-eclipse-temurin`, `9.4-jre8-alpine-eclipse-temurin`, `9-jre8-alpine-eclipse-temurin`](https://github.com/eclipse/jetty.docker/blob/748caa5c7b1bd06ad238d9987757123cd4bc918a/eclipse-temurin/9.4/jre8-alpine/Dockerfile) +- [`9.4.50-jre8`, `9.4-jre8`, `9-jre8`, `9.4.50-jre8-eclipse-temurin`, `9.4-jre8-eclipse-temurin`, `9-jre8-eclipse-temurin`](https://github.com/eclipse/jetty.docker/blob/748caa5c7b1bd06ad238d9987757123cd4bc918a/eclipse-temurin/9.4/jre8/Dockerfile) +- [`9.4.50-jre17-alpine`, `9.4-jre17-alpine`, `9-jre17-alpine`, `9.4.50-jre17-alpine-eclipse-temurin`, `9.4-jre17-alpine-eclipse-temurin`, `9-jre17-alpine-eclipse-temurin`](https://github.com/eclipse/jetty.docker/blob/748caa5c7b1bd06ad238d9987757123cd4bc918a/eclipse-temurin/9.4/jre17-alpine/Dockerfile) +- [`9.4.50-jre17`, `9.4-jre17`, `9-jre17`, `9.4.50-jre17-eclipse-temurin`, `9.4-jre17-eclipse-temurin`, `9-jre17-eclipse-temurin`](https://github.com/eclipse/jetty.docker/blob/748caa5c7b1bd06ad238d9987757123cd4bc918a/eclipse-temurin/9.4/jre17/Dockerfile) +- [`9.4.50-jre11-alpine`, `9.4-jre11-alpine`, `9-jre11-alpine`, `9.4.50-jre11-alpine-eclipse-temurin`, `9.4-jre11-alpine-eclipse-temurin`, `9-jre11-alpine-eclipse-temurin`](https://github.com/eclipse/jetty.docker/blob/748caa5c7b1bd06ad238d9987757123cd4bc918a/eclipse-temurin/9.4/jre11-alpine/Dockerfile) +- [`9.4.50-jre11`, `9.4-jre11`, `9-jre11`, `9.4.50-jre11-eclipse-temurin`, `9.4-jre11-eclipse-temurin`, `9-jre11-eclipse-temurin`](https://github.com/eclipse/jetty.docker/blob/748caa5c7b1bd06ad238d9987757123cd4bc918a/eclipse-temurin/9.4/jre11/Dockerfile) +- [`9.4.50-jdk8`, `9.4-jdk8`, `9-jdk8`, `9.4.50-jdk8-eclipse-temurin`, `9.4-jdk8-eclipse-temurin`, `9-jdk8-eclipse-temurin`](https://github.com/eclipse/jetty.docker/blob/748caa5c7b1bd06ad238d9987757123cd4bc918a/eclipse-temurin/9.4/jdk8/Dockerfile) +- [`9.4.50-jdk17-alpine`, `9.4-jdk17-alpine`, `9-jdk17-alpine`, `9.4.50-jdk17-alpine-eclipse-temurin`, `9.4-jdk17-alpine-eclipse-temurin`, `9-jdk17-alpine-eclipse-temurin`](https://github.com/eclipse/jetty.docker/blob/748caa5c7b1bd06ad238d9987757123cd4bc918a/eclipse-temurin/9.4/jdk17-alpine/Dockerfile) +- [`9.4.50`, `9.4`, `9`, `9.4.50-jdk17`, `9.4-jdk17`, `9-jdk17`, `9.4.50-eclipse-temurin`, `9.4-eclipse-temurin`, `9-eclipse-temurin`, `9.4.50-jdk17-eclipse-temurin`, `9.4-jdk17-eclipse-temurin`, `9-jdk17-eclipse-temurin`](https://github.com/eclipse/jetty.docker/blob/748caa5c7b1bd06ad238d9987757123cd4bc918a/eclipse-temurin/9.4/jdk17/Dockerfile) +- [`9.4.50-jdk11-alpine`, `9.4-jdk11-alpine`, `9-jdk11-alpine`, `9.4.50-jdk11-alpine-eclipse-temurin`, `9.4-jdk11-alpine-eclipse-temurin`, `9-jdk11-alpine-eclipse-temurin`](https://github.com/eclipse/jetty.docker/blob/748caa5c7b1bd06ad238d9987757123cd4bc918a/eclipse-temurin/9.4/jdk11-alpine/Dockerfile) +- [`9.4.50-jdk11`, `9.4-jdk11`, `9-jdk11`, `9.4.50-jdk11-eclipse-temurin`, `9.4-jdk11-eclipse-temurin`, `9-jdk11-eclipse-temurin`](https://github.com/eclipse/jetty.docker/blob/748caa5c7b1bd06ad238d9987757123cd4bc918a/eclipse-temurin/9.4/jdk11/Dockerfile) +- [`11.0.13-jre17-alpine`, `11.0-jre17-alpine`, `11-jre17-alpine`, `11.0.13-jre17-alpine-eclipse-temurin`, `11.0-jre17-alpine-eclipse-temurin`, `11-jre17-alpine-eclipse-temurin`](https://github.com/eclipse/jetty.docker/blob/748caa5c7b1bd06ad238d9987757123cd4bc918a/eclipse-temurin/11.0/jre17-alpine/Dockerfile) +- [`11.0.13-jre17`, `11.0-jre17`, `11-jre17`, `11.0.13-jre17-eclipse-temurin`, `11.0-jre17-eclipse-temurin`, `11-jre17-eclipse-temurin`](https://github.com/eclipse/jetty.docker/blob/748caa5c7b1bd06ad238d9987757123cd4bc918a/eclipse-temurin/11.0/jre17/Dockerfile) +- [`11.0.13-jre11-alpine`, `11.0-jre11-alpine`, `11-jre11-alpine`, `11.0.13-jre11-alpine-eclipse-temurin`, `11.0-jre11-alpine-eclipse-temurin`, `11-jre11-alpine-eclipse-temurin`](https://github.com/eclipse/jetty.docker/blob/748caa5c7b1bd06ad238d9987757123cd4bc918a/eclipse-temurin/11.0/jre11-alpine/Dockerfile) +- [`11.0.13-jre11`, `11.0-jre11`, `11-jre11`, `11.0.13-jre11-eclipse-temurin`, `11.0-jre11-eclipse-temurin`, `11-jre11-eclipse-temurin`](https://github.com/eclipse/jetty.docker/blob/748caa5c7b1bd06ad238d9987757123cd4bc918a/eclipse-temurin/11.0/jre11/Dockerfile) +- [`11.0.13-jdk17-alpine`, `11.0-jdk17-alpine`, `11-jdk17-alpine`, `11.0.13-jdk17-alpine-eclipse-temurin`, `11.0-jdk17-alpine-eclipse-temurin`, `11-jdk17-alpine-eclipse-temurin`](https://github.com/eclipse/jetty.docker/blob/748caa5c7b1bd06ad238d9987757123cd4bc918a/eclipse-temurin/11.0/jdk17-alpine/Dockerfile) +- [`11.0.13`, `11.0`, `11`, `11.0.13-jdk17`, `11.0-jdk17`, `11-jdk17`, `11.0.13-eclipse-temurin`, `11.0-eclipse-temurin`, `11-eclipse-temurin`, `11.0.13-jdk17-eclipse-temurin`, `11.0-jdk17-eclipse-temurin`, `11-jdk17-eclipse-temurin`, `latest`, `jdk17`](https://github.com/eclipse/jetty.docker/blob/748caa5c7b1bd06ad238d9987757123cd4bc918a/eclipse-temurin/11.0/jdk17/Dockerfile) +- [`11.0.13-jdk11-alpine`, `11.0-jdk11-alpine`, `11-jdk11-alpine`, `11.0.13-jdk11-alpine-eclipse-temurin`, `11.0-jdk11-alpine-eclipse-temurin`, `11-jdk11-alpine-eclipse-temurin`](https://github.com/eclipse/jetty.docker/blob/748caa5c7b1bd06ad238d9987757123cd4bc918a/eclipse-temurin/11.0/jdk11-alpine/Dockerfile) +- [`11.0.13-jdk11`, `11.0-jdk11`, `11-jdk11`, `11.0.13-jdk11-eclipse-temurin`, `11.0-jdk11-eclipse-temurin`, `11-jdk11-eclipse-temurin`](https://github.com/eclipse/jetty.docker/blob/748caa5c7b1bd06ad238d9987757123cd4bc918a/eclipse-temurin/11.0/jdk11/Dockerfile) +- [`10.0.13-jre17-alpine`, `10.0-jre17-alpine`, `10-jre17-alpine`, `10.0.13-jre17-alpine-eclipse-temurin`, `10.0-jre17-alpine-eclipse-temurin`, `10-jre17-alpine-eclipse-temurin`](https://github.com/eclipse/jetty.docker/blob/748caa5c7b1bd06ad238d9987757123cd4bc918a/eclipse-temurin/10.0/jre17-alpine/Dockerfile) +- [`10.0.13-jre17`, `10.0-jre17`, `10-jre17`, `10.0.13-jre17-eclipse-temurin`, `10.0-jre17-eclipse-temurin`, `10-jre17-eclipse-temurin`](https://github.com/eclipse/jetty.docker/blob/748caa5c7b1bd06ad238d9987757123cd4bc918a/eclipse-temurin/10.0/jre17/Dockerfile) +- [`10.0.13-jre11-alpine`, `10.0-jre11-alpine`, `10-jre11-alpine`, `10.0.13-jre11-alpine-eclipse-temurin`, `10.0-jre11-alpine-eclipse-temurin`, `10-jre11-alpine-eclipse-temurin`](https://github.com/eclipse/jetty.docker/blob/748caa5c7b1bd06ad238d9987757123cd4bc918a/eclipse-temurin/10.0/jre11-alpine/Dockerfile) +- [`10.0.13-jre11`, `10.0-jre11`, `10-jre11`, `10.0.13-jre11-eclipse-temurin`, `10.0-jre11-eclipse-temurin`, `10-jre11-eclipse-temurin`](https://github.com/eclipse/jetty.docker/blob/748caa5c7b1bd06ad238d9987757123cd4bc918a/eclipse-temurin/10.0/jre11/Dockerfile) +- [`10.0.13-jdk17-alpine`, `10.0-jdk17-alpine`, `10-jdk17-alpine`, `10.0.13-jdk17-alpine-eclipse-temurin`, `10.0-jdk17-alpine-eclipse-temurin`, `10-jdk17-alpine-eclipse-temurin`](https://github.com/eclipse/jetty.docker/blob/748caa5c7b1bd06ad238d9987757123cd4bc918a/eclipse-temurin/10.0/jdk17-alpine/Dockerfile) +- [`10.0.13`, `10.0`, `10`, `10.0.13-jdk17`, `10.0-jdk17`, `10-jdk17`, `10.0.13-eclipse-temurin`, `10.0-eclipse-temurin`, `10-eclipse-temurin`, `10.0.13-jdk17-eclipse-temurin`, `10.0-jdk17-eclipse-temurin`, `10-jdk17-eclipse-temurin`](https://github.com/eclipse/jetty.docker/blob/748caa5c7b1bd06ad238d9987757123cd4bc918a/eclipse-temurin/10.0/jdk17/Dockerfile) +- [`10.0.13-jdk11-alpine`, `10.0-jdk11-alpine`, `10-jdk11-alpine`, `10.0.13-jdk11-alpine-eclipse-temurin`, `10.0-jdk11-alpine-eclipse-temurin`, `10-jdk11-alpine-eclipse-temurin`](https://github.com/eclipse/jetty.docker/blob/748caa5c7b1bd06ad238d9987757123cd4bc918a/eclipse-temurin/10.0/jdk11-alpine/Dockerfile) +- [`10.0.13-jdk11`, `10.0-jdk11`, `10-jdk11`, `10.0.13-jdk11-eclipse-temurin`, `10.0-jdk11-eclipse-temurin`, `10-jdk11-eclipse-temurin`](https://github.com/eclipse/jetty.docker/blob/748caa5c7b1bd06ad238d9987757123cd4bc918a/eclipse-temurin/10.0/jdk11/Dockerfile) +- [`9.4.50-jdk8-alpine-amazoncorretto`, `9.4-jdk8-alpine-amazoncorretto`, `9-jdk8-alpine-amazoncorretto`](https://github.com/eclipse/jetty.docker/blob/748caa5c7b1bd06ad238d9987757123cd4bc918a/amazoncorretto/9.4/jdk8-alpine/Dockerfile) +- [`9.4.50-jdk8-amazoncorretto`, `9.4-jdk8-amazoncorretto`, `9-jdk8-amazoncorretto`](https://github.com/eclipse/jetty.docker/blob/748caa5c7b1bd06ad238d9987757123cd4bc918a/amazoncorretto/9.4/jdk8/Dockerfile) +- [`9.4.50-jdk17-alpine-amazoncorretto`, `9.4-jdk17-alpine-amazoncorretto`, `9-jdk17-alpine-amazoncorretto`](https://github.com/eclipse/jetty.docker/blob/748caa5c7b1bd06ad238d9987757123cd4bc918a/amazoncorretto/9.4/jdk17-alpine/Dockerfile) +- [`9.4.50-amazoncorretto`, `9.4-amazoncorretto`, `9-amazoncorretto`, `9.4.50-jdk17-amazoncorretto`, `9.4-jdk17-amazoncorretto`, `9-jdk17-amazoncorretto`](https://github.com/eclipse/jetty.docker/blob/748caa5c7b1bd06ad238d9987757123cd4bc918a/amazoncorretto/9.4/jdk17/Dockerfile) +- [`9.4.50-jdk11-alpine-amazoncorretto`, `9.4-jdk11-alpine-amazoncorretto`, `9-jdk11-alpine-amazoncorretto`](https://github.com/eclipse/jetty.docker/blob/748caa5c7b1bd06ad238d9987757123cd4bc918a/amazoncorretto/9.4/jdk11-alpine/Dockerfile) +- [`9.4.50-jdk11-amazoncorretto`, `9.4-jdk11-amazoncorretto`, `9-jdk11-amazoncorretto`](https://github.com/eclipse/jetty.docker/blob/748caa5c7b1bd06ad238d9987757123cd4bc918a/amazoncorretto/9.4/jdk11/Dockerfile) +- [`11.0.13-jdk17-alpine-amazoncorretto`, `11.0-jdk17-alpine-amazoncorretto`, `11-jdk17-alpine-amazoncorretto`](https://github.com/eclipse/jetty.docker/blob/748caa5c7b1bd06ad238d9987757123cd4bc918a/amazoncorretto/11.0/jdk17-alpine/Dockerfile) +- [`11.0.13-amazoncorretto`, `11.0-amazoncorretto`, `11-amazoncorretto`, `11.0.13-jdk17-amazoncorretto`, `11.0-jdk17-amazoncorretto`, `11-jdk17-amazoncorretto`](https://github.com/eclipse/jetty.docker/blob/748caa5c7b1bd06ad238d9987757123cd4bc918a/amazoncorretto/11.0/jdk17/Dockerfile) +- [`11.0.13-jdk11-alpine-amazoncorretto`, `11.0-jdk11-alpine-amazoncorretto`, `11-jdk11-alpine-amazoncorretto`](https://github.com/eclipse/jetty.docker/blob/748caa5c7b1bd06ad238d9987757123cd4bc918a/amazoncorretto/11.0/jdk11-alpine/Dockerfile) +- [`11.0.13-jdk11-amazoncorretto`, `11.0-jdk11-amazoncorretto`, `11-jdk11-amazoncorretto`](https://github.com/eclipse/jetty.docker/blob/748caa5c7b1bd06ad238d9987757123cd4bc918a/amazoncorretto/11.0/jdk11/Dockerfile) +- [`10.0.13-jdk17-alpine-amazoncorretto`, `10.0-jdk17-alpine-amazoncorretto`, `10-jdk17-alpine-amazoncorretto`](https://github.com/eclipse/jetty.docker/blob/748caa5c7b1bd06ad238d9987757123cd4bc918a/amazoncorretto/10.0/jdk17-alpine/Dockerfile) +- [`10.0.13-amazoncorretto`, `10.0-amazoncorretto`, `10-amazoncorretto`, `10.0.13-jdk17-amazoncorretto`, `10.0-jdk17-amazoncorretto`, `10-jdk17-amazoncorretto`](https://github.com/eclipse/jetty.docker/blob/748caa5c7b1bd06ad238d9987757123cd4bc918a/amazoncorretto/10.0/jdk17/Dockerfile) +- [`10.0.13-jdk11-alpine-amazoncorretto`, `10.0-jdk11-alpine-amazoncorretto`, `10-jdk11-alpine-amazoncorretto`](https://github.com/eclipse/jetty.docker/blob/748caa5c7b1bd06ad238d9987757123cd4bc918a/amazoncorretto/10.0/jdk11-alpine/Dockerfile) +- [`10.0.13-jdk11-amazoncorretto`, `10.0-jdk11-amazoncorretto`, `10-jdk11-amazoncorretto`](https://github.com/eclipse/jetty.docker/blob/748caa5c7b1bd06ad238d9987757123cd4bc918a/amazoncorretto/10.0/jdk11/Dockerfile) # Quick reference (cont.) - **Where to file issues**: - [https://github.com/appropriate/docker-jetty/issues](https://github.com/appropriate/docker-jetty/issues) + [https://github.com/eclipse/jetty.docker/issues](https://github.com/eclipse/jetty.docker/issues) - **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) [`amd64`](https://hub.docker.com/r/amd64/jetty/), [`arm64v8`](https://hub.docker.com/r/arm64v8/jetty/) @@ -45,7 +79,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/jetty`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fjetty) + [official-images repo's `library/jetty` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fjetty) [official-images repo's `library/jetty` file](https://github.com/docker-library/official-images/blob/master/library/jetty) ([history](https://github.com/docker-library/official-images/commits/master/library/jetty)) - **Source of this description**: @@ -143,8 +177,6 @@ RUN java -jar $JETTY_HOME/start.jar --add-to-startd=http2 --approve-all-licenses This will add an `http2.ini` file to the `$JETTY_BASE/start.d` directory and download the required ALPN libraries into `$JETTY_BASE/lib/alpn`, allowing the use of HTTP/2. HTTP/2 connections should be made via the same port as normal HTTPS connections (container port 8443). If you would like to enable the `http2` module via `$JETTY_BASE/start.ini` instead, substitute `--add-to-start` in place of `--add-to-startd` in the `RUN` command above. -Once OpenJDK 9 becomes generally available with built-in support for ALPN, this image will be updated to enable HTTP/2 support by default. - # Security By default, this image starts as user `root` and uses Jetty's `setuid` module to drop privileges to user `jetty` after initialization. The `JETTY_BASE` directory at `/var/lib/jetty` is owned by `jetty:jetty` (uid 999, gid 999). @@ -163,13 +195,17 @@ The `jetty` images come in many flavors, each designed for a specific use case. 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. -## `jetty:-slim` +## `jetty:-alpine` + +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. + +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. -This image does not contain the common packages contained in the default tag and only contains the minimal packages needed to run `jetty`. Unless you are working in an environment where *only* the `jetty` image will be deployed and you have space constraints, we highly recommend using the default image of this repository. +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). # License -View [license information](http://eclipse.org/jetty/licenses.php) for the software contained in this image. +View [license information](http://eclipse.org/jetty/licenses.html) for the software contained in this image. 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). diff --git a/jetty/content.md b/jetty/content.md index d9abb97624e0..ffadcc694576 100644 --- a/jetty/content.md +++ b/jetty/content.md @@ -90,8 +90,6 @@ RUN java -jar $JETTY_HOME/start.jar --add-to-startd=http2 --approve-all-licenses This will add an `http2.ini` file to the `$JETTY_BASE/start.d` directory and download the required ALPN libraries into `$JETTY_BASE/lib/alpn`, allowing the use of HTTP/2. HTTP/2 connections should be made via the same port as normal HTTPS connections (container port 8443). If you would like to enable the `http2` module via `$JETTY_BASE/start.ini` instead, substitute `--add-to-start` in place of `--add-to-startd` in the `RUN` command above. -Once OpenJDK 9 becomes generally available with built-in support for ALPN, this image will be updated to enable HTTP/2 support by default. - # Security By default, this image starts as user `root` and uses Jetty's `setuid` module to drop privileges to user `jetty` after initialization. The `JETTY_BASE` directory at `/var/lib/jetty` is owned by `jetty:jetty` (uid 999, gid 999). diff --git a/jetty/github-repo b/jetty/github-repo index d72a673cabc3..782a4709aa91 100644 --- a/jetty/github-repo +++ b/jetty/github-repo @@ -1 +1 @@ -https://github.com/appropriate/docker-jetty +https://github.com/eclipse/jetty.docker diff --git a/jetty/license.md b/jetty/license.md index c6cea5395848..27b7c27fcdeb 100644 --- a/jetty/license.md +++ b/jetty/license.md @@ -1 +1 @@ -View [license information](http://eclipse.org/jetty/licenses.php) for the software contained in this image. +View [license information](http://eclipse.org/jetty/licenses.html) for the software contained in this image. diff --git a/jobber/README-short.txt b/jobber/README-short.txt index ef64ca0ef05c..e9bb50e633e3 100644 --- a/jobber/README-short.txt +++ b/jobber/README-short.txt @@ -1 +1 @@ -Jobber is an alternative to cron, with sophisticated status-reporting and error-handling. +DEPRECATED; Jobber is an alternative to cron, with sophisticated status-reporting and error-handling diff --git a/jobber/README.md b/jobber/README.md index 53bb52193444..5e954e37e656 100644 --- a/jobber/README.md +++ b/jobber/README.md @@ -14,17 +14,21 @@ WARNING: --> +# **DEPRECATION NOTICE** + +This project is not actively maintained. See [dshearer/jobber#334](https://github.com/dshearer/jobber/pull/334) for more details. + # Quick reference - **Maintained by**: [Jobber](https://github.com/dshearer/jobber-docker) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`1.4.0-alpine3.10`, `1.4-alpine3.10`, `1-alpine3.10`, `latest`](https://github.com/dshearer/jobber-docker/blob/64d2a0778ae73986cb90f1c374d9dfb42c9b8483/alpine3.10/Dockerfile) +- [`1.4.4-alpine3.11`, `1.4-alpine3.11`, `1-alpine3.11`, `latest`](https://github.com/dshearer/jobber-docker/blob/cd07d76987097b5389aa9be5f48df041aa74d699/alpine3.11/Dockerfile) # Quick reference (cont.) @@ -39,7 +43,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/jobber`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fjobber) + [official-images repo's `library/jobber` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fjobber) [official-images repo's `library/jobber` file](https://github.com/docker-library/official-images/blob/master/library/jobber) ([history](https://github.com/docker-library/official-images/commits/master/library/jobber)) - **Source of this description**: diff --git a/jobber/deprecated.md b/jobber/deprecated.md new file mode 100644 index 000000000000..4ebe5963e7d0 --- /dev/null +++ b/jobber/deprecated.md @@ -0,0 +1 @@ +This project is not actively maintained. See [dshearer/jobber#334](https://github.com/dshearer/jobber/pull/334) for more details. diff --git a/joomla/README.md b/joomla/README.md index a71ff02b54ff..717db1267d7c 100644 --- a/joomla/README.md +++ b/joomla/README.md @@ -20,19 +20,19 @@ WARNING: [Joomla!](https://github.com/joomla/docker-joomla) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`3.9.18-php7.2-apache`, `3.9-php7.2-apache`, `3-php7.2-apache`, `php7.2-apache`, `3.9.18-php7.2`, `3.9-php7.2`, `3-php7.2`, `php7.2`](https://github.com/joomla/docker-joomla/blob/f57eb977eb1cdd6872c278be24458f281a9c92c3/php7.2/apache/Dockerfile) -- [`3.9.18-php7.2-fpm`, `3.9-php7.2-fpm`, `3-php7.2-fpm`, `php7.2-fpm`](https://github.com/joomla/docker-joomla/blob/f57eb977eb1cdd6872c278be24458f281a9c92c3/php7.2/fpm/Dockerfile) -- [`3.9.18-php7.2-fpm-alpine`, `3.9-php7.2-fpm-alpine`, `3-php7.2-fpm-alpine`, `php7.2-fpm-alpine`](https://github.com/joomla/docker-joomla/blob/f57eb977eb1cdd6872c278be24458f281a9c92c3/php7.2/fpm-alpine/Dockerfile) -- [`3.9.18-apache`, `3.9-apache`, `3-apache`, `apache`, `3.9.18`, `3.9`, `3`, `latest`, `3.9.18-php7.3-apache`, `3.9-php7.3-apache`, `3-php7.3-apache`, `php7.3-apache`, `3.9.18-php7.3`, `3.9-php7.3`, `3-php7.3`, `php7.3`](https://github.com/joomla/docker-joomla/blob/f57eb977eb1cdd6872c278be24458f281a9c92c3/php7.3/apache/Dockerfile) -- [`3.9.18-fpm`, `3.9-fpm`, `3-fpm`, `fpm`, `3.9.18-php7.3-fpm`, `3.9-php7.3-fpm`, `3-php7.3-fpm`, `php7.3-fpm`](https://github.com/joomla/docker-joomla/blob/f57eb977eb1cdd6872c278be24458f281a9c92c3/php7.3/fpm/Dockerfile) -- [`3.9.18-fpm-alpine`, `3.9-fpm-alpine`, `3-fpm-alpine`, `fpm-alpine`, `3.9.18-php7.3-fpm-alpine`, `3.9-php7.3-fpm-alpine`, `3-php7.3-fpm-alpine`, `php7.3-fpm-alpine`](https://github.com/joomla/docker-joomla/blob/f57eb977eb1cdd6872c278be24458f281a9c92c3/php7.3/fpm-alpine/Dockerfile) -- [`3.9.18-php7.4-apache`, `3.9-php7.4-apache`, `3-php7.4-apache`, `php7.4-apache`, `3.9.18-php7.4`, `3.9-php7.4`, `3-php7.4`, `php7.4`](https://github.com/joomla/docker-joomla/blob/f57eb977eb1cdd6872c278be24458f281a9c92c3/php7.4/apache/Dockerfile) -- [`3.9.18-php7.4-fpm`, `3.9-php7.4-fpm`, `3-php7.4-fpm`, `php7.4-fpm`](https://github.com/joomla/docker-joomla/blob/f57eb977eb1cdd6872c278be24458f281a9c92c3/php7.4/fpm/Dockerfile) -- [`3.9.18-php7.4-fpm-alpine`, `3.9-php7.4-fpm-alpine`, `3-php7.4-fpm-alpine`, `php7.4-fpm-alpine`](https://github.com/joomla/docker-joomla/blob/f57eb977eb1cdd6872c278be24458f281a9c92c3/php7.4/fpm-alpine/Dockerfile) +- [`4.2.6`, `4.2`, `4`, `latest`, `4.2.6-apache`, `4.2-apache`, `4-apache`, `apache`, `4.2.6-php8.0`, `4.2-php8.0`, `4-php8.0`, `php8.0`, `4.2.6-php8.0-apache`, `4.2-php8.0-apache`, `4-php8.0-apache`, `php8.0-apache`](https://github.com/joomla-docker/docker-joomla/blob/935f419c927c2403f587565cda1576a66d52a451/4.2/php8.0/apache/Dockerfile) +- [`4.2.6-php8.0-fpm-alpine`, `4.2-php8.0-fpm-alpine`, `4-php8.0-fpm-alpine`, `php8.0-fpm-alpine`](https://github.com/joomla-docker/docker-joomla/blob/935f419c927c2403f587565cda1576a66d52a451/4.2/php8.0/fpm-alpine/Dockerfile) +- [`4.2.6-php8.0-fpm`, `4.2-php8.0-fpm`, `4-php8.0-fpm`, `php8.0-fpm`](https://github.com/joomla-docker/docker-joomla/blob/935f419c927c2403f587565cda1576a66d52a451/4.2/php8.0/fpm/Dockerfile) +- [`4.2.6-php8.1-apache`, `4.2-php8.1-apache`, `4-php8.1-apache`, `php8.1-apache`](https://github.com/joomla-docker/docker-joomla/blob/935f419c927c2403f587565cda1576a66d52a451/4.2/php8.1/apache/Dockerfile) +- [`4.2.6-php8.1-fpm-alpine`, `4.2-php8.1-fpm-alpine`, `4-php8.1-fpm-alpine`, `php8.1-fpm-alpine`](https://github.com/joomla-docker/docker-joomla/blob/935f419c927c2403f587565cda1576a66d52a451/4.2/php8.1/fpm-alpine/Dockerfile) +- [`4.2.6-php8.1-fpm`, `4.2-php8.1-fpm`, `4-php8.1-fpm`, `php8.1-fpm`](https://github.com/joomla-docker/docker-joomla/blob/935f419c927c2403f587565cda1576a66d52a451/4.2/php8.1/fpm/Dockerfile) +- [`3.10.11`, `3.10`, `3`, `3.10.11-apache`, `3.10-apache`, `3-apache`, `3.10.11-php8.0`, `3.10-php8.0`, `3-php8.0`, `3.10.11-php8.0-apache`, `3.10-php8.0-apache`, `3-php8.0-apache`](https://github.com/joomla-docker/docker-joomla/blob/17df17a732daa119f17bbcc6fb7759d7bf175d0a/3.10/php8.0/apache/Dockerfile) +- [`3.10.11-php8.0-fpm-alpine`, `3.10-php8.0-fpm-alpine`, `3-php8.0-fpm-alpine`](https://github.com/joomla-docker/docker-joomla/blob/17df17a732daa119f17bbcc6fb7759d7bf175d0a/3.10/php8.0/fpm-alpine/Dockerfile) +- [`3.10.11-php8.0-fpm`, `3.10-php8.0-fpm`, `3-php8.0-fpm`](https://github.com/joomla-docker/docker-joomla/blob/17df17a732daa119f17bbcc6fb7759d7bf175d0a/3.10/php8.0/fpm/Dockerfile) # Quick reference (cont.) @@ -47,7 +47,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/joomla`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fjoomla) + [official-images repo's `library/joomla` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fjoomla) [official-images repo's `library/joomla` file](https://github.com/docker-library/official-images/blob/master/library/joomla) ([history](https://github.com/docker-library/official-images/commits/master/library/joomla)) - **Source of this description**: @@ -141,9 +141,9 @@ This is the defacto image. If you are unsure about what your needs are, you prob ## `joomla:-alpine` -This image is based on the popular [Alpine Linux project](http://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. +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. -This variant is highly recommended when final image size being as small as possible is desired. The main caveat to note is that it does use [musl libc](http://www.musl-libc.org) instead of [glibc and friends](http://www.etalabs.net/compare_libcs.html), so certain software might run into issues depending on the depth of their libc requirements. However, most software doesn't have an issue with this, so this variant is usually a very safe choice. 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. +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. 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). diff --git a/jruby/README.md b/jruby/README.md index 933a25724371..6bb743a1b9b4 100644 --- a/jruby/README.md +++ b/jruby/README.md @@ -17,36 +17,38 @@ WARNING: # Quick reference - **Maintained by**: - [the Docker Community](https://github.com/cpuguy83/docker-jruby) + [the Docker Community](https://github.com/jruby/docker-jruby) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`latest`, `9`, `9.2`, `9.2.11`, `9.2-jre`, `9.2-jre8`, `9.2.11-jre`, `9.2.11-jre8`, `9.2.11.1`, `9.2.11.1-jre`, `9.2.11.1-jre8`](https://github.com/cpuguy83/docker-jruby/blob/669ad8f91df152ae83deef766569e0b1f5ec6b2f/9000/jre8/Dockerfile) -- [`9-jdk`, `9-jdk8`, `9.2-jdk`, `9.2-jdk8`, `9.2.11-jdk`, `9.2.11-jdk8`, `9.2.11.1-jdk`, `9.2.11.1-jdk8`](https://github.com/cpuguy83/docker-jruby/blob/669ad8f91df152ae83deef766569e0b1f5ec6b2f/9000/jdk8/Dockerfile) -- [`9.2-jre11`, `9.2.11-jre11`, `9.2.11.1-jre11`](https://github.com/cpuguy83/docker-jruby/blob/669ad8f91df152ae83deef766569e0b1f5ec6b2f/9000/jre11/Dockerfile) -- [`9.2-jdk11`, `9.2.11-jdk11`, `9.2.11.1-jdk11`](https://github.com/cpuguy83/docker-jruby/blob/669ad8f91df152ae83deef766569e0b1f5ec6b2f/9000/jdk11/Dockerfile) -- [`9.2-jdk14`, `9.2.11-jdk14`, `9.2.11.1-jdk14`](https://github.com/cpuguy83/docker-jruby/blob/669ad8f91df152ae83deef766569e0b1f5ec6b2f/9000/jdk14/Dockerfile) -- [`9-onbuild`, `9.2-onbuild`, `9.2.11-onbuild`, `9.2.11.1-onbuild`](https://github.com/cpuguy83/docker-jruby/blob/669ad8f91df152ae83deef766569e0b1f5ec6b2f/9000/onbuild-jdk8/Dockerfile) -- [`9.1`, `9.1.17`, `9.1.17.0`, `9.1-jre`, `9.1.17-jre`, `9.1.17.0-jre`](https://github.com/cpuguy83/docker-jruby/blob/8bc3fe27670a851953345182fe12f14f5e708383/9000/jre/Dockerfile) -- [`9.1-jdk`, `9.1.17-jdk`, `9.1.17.0-jdk`](https://github.com/cpuguy83/docker-jruby/blob/8bc3fe27670a851953345182fe12f14f5e708383/9000/jdk/Dockerfile) +- [`latest`, `9`, `9.4`, `9.4.0`, `9.4-jre`, `9.4-jre8`, `9.4.0-jre`, `9.4.0-jre8`, `9.4.0.0`, `9.4.0.0-jre`, `9.4.0.0-jre8`](https://github.com/jruby/docker-jruby/blob/500a1f58e7ad2be7d2af67f1b480b80ff6517314/9.4/jre8/Dockerfile) +- [`9-jdk`, `9-jdk8`, `9.4-jdk`, `9.4-jdk8`, `9.4.0-jdk`, `9.4.0-jdk8`, `9.4.0.0-jdk`, `9.4.0.0-jdk8`](https://github.com/jruby/docker-jruby/blob/500a1f58e7ad2be7d2af67f1b480b80ff6517314/9.4/jdk8/Dockerfile) +- [`9.4-jre11`, `9.4.0-jre11`, `9.4.0.0-jre11`](https://github.com/jruby/docker-jruby/blob/500a1f58e7ad2be7d2af67f1b480b80ff6517314/9.4/jre11/Dockerfile) +- [`9.4-jdk11`, `9.4.0-jdk11`, `9.4.0.0-jdk11`](https://github.com/jruby/docker-jruby/blob/500a1f58e7ad2be7d2af67f1b480b80ff6517314/9.4/jdk11/Dockerfile) +- [`9.4-jdk17`, `9.4.0-jdk17`, `9.4.0.0-jdk17`](https://github.com/jruby/docker-jruby/blob/500a1f58e7ad2be7d2af67f1b480b80ff6517314/9.4/jdk17/Dockerfile) +- [`9.3`, `9.3.9`, `9.3-jre`, `9.3-jre8`, `9.3.9-jre`, `9.3.9-jre8`, `9.3.9.0`, `9.3.9.0-jre`, `9.3.9.0-jre8`](https://github.com/jruby/docker-jruby/blob/500a1f58e7ad2be7d2af67f1b480b80ff6517314/9.3/jre8/Dockerfile) +- [`9.3-jdk`, `9.3-jdk8`, `9.3.9-jdk`, `9.3.9-jdk8`, `9.3.9.0-jdk`, `9.3.9.0-jdk8`](https://github.com/jruby/docker-jruby/blob/500a1f58e7ad2be7d2af67f1b480b80ff6517314/9.3/jdk8/Dockerfile) +- [`9.3-jre11`, `9.3.9-jre11`, `9.3.9.0-jre11`](https://github.com/jruby/docker-jruby/blob/500a1f58e7ad2be7d2af67f1b480b80ff6517314/9.3/jre11/Dockerfile) +- [`9.3-jdk11`, `9.3.9-jdk11`, `9.3.9.0-jdk11`](https://github.com/jruby/docker-jruby/blob/500a1f58e7ad2be7d2af67f1b480b80ff6517314/9.3/jdk11/Dockerfile) +- [`9.3-jdk17`, `9.3.9-jdk17`, `9.3.9.0-jdk17`](https://github.com/jruby/docker-jruby/blob/500a1f58e7ad2be7d2af67f1b480b80ff6517314/9.3/jdk17/Dockerfile) # Quick reference (cont.) - **Where to file issues**: - [https://github.com/cpuguy83/docker-jruby/issues](https://github.com/cpuguy83/docker-jruby/issues) + [https://github.com/jruby/docker-jruby/issues](https://github.com/jruby/docker-jruby/issues) - **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) - [`amd64`](https://hub.docker.com/r/amd64/jruby/) + [`amd64`](https://hub.docker.com/r/amd64/jruby/), [`arm64v8`](https://hub.docker.com/r/arm64v8/jruby/) - **Published image artifact details**: [repo-info repo's `repos/jruby/` directory](https://github.com/docker-library/repo-info/blob/master/repos/jruby) ([history](https://github.com/docker-library/repo-info/commits/master/repos/jruby)) (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/jruby`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fjruby) + [official-images repo's `library/jruby` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fjruby) [official-images repo's `library/jruby` file](https://github.com/docker-library/official-images/blob/master/library/jruby) ([history](https://github.com/docker-library/official-images/commits/master/library/jruby)) - **Source of this description**: @@ -109,22 +111,6 @@ For many simple, single file projects, you may find it inconvenient to write a c $ docker run -it --rm --name my-running-script -v "$PWD":/usr/src/myapp -w /usr/src/myapp jruby:9 jruby your-daemon-or-script.rb ``` -# Image Variants - -The `jruby` images come in many flavors, each designed for a specific use case. - -## `jruby:` - -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. - -## `jruby:-onbuild` - -The `ONBUILD` image variants are deprecated, and their usage is discouraged. For more details, see [docker-library/official-images#2076](https://github.com/docker-library/official-images/issues/2076). - -While the `onbuild` variant is really useful for "getting off the ground running" (zero to Dockerized in a short period of time), it's not recommended for long-term usage within a project due to the lack of control over *when* the `ONBUILD` triggers fire (see also [`docker/docker#5714`](https://github.com/docker/docker/issues/5714), [`docker/docker#8240`](https://github.com/docker/docker/issues/8240), [`docker/docker#11917`](https://github.com/docker/docker/issues/11917)). - -Once you've got a handle on how your project functions within Docker, you'll probably want to adjust your `Dockerfile` to inherit from a non-`onbuild` variant and copy the commands from the `onbuild` variant `Dockerfile` (moving the `ONBUILD` lines to the end and removing the `ONBUILD` keywords) into your own file so that you have tighter control over them and more transparency for yourself and others looking at your `Dockerfile` as to what it does. This also makes it easier to add additional requirements as time goes on (such as installing more packages before performing the previously-`ONBUILD` steps). - # License View [license information](https://github.com/jruby/jruby/blob/master/COPYING) for the software contained in this image. diff --git a/jruby/github-repo b/jruby/github-repo index 083130bae873..305a7cc12e86 100644 --- a/jruby/github-repo +++ b/jruby/github-repo @@ -1 +1 @@ -https://github.com/cpuguy83/docker-jruby +https://github.com/jruby/docker-jruby diff --git a/julia/README.md b/julia/README.md index 469e1e0a2d35..7a7f350f7139 100644 --- a/julia/README.md +++ b/julia/README.md @@ -20,7 +20,7 @@ WARNING: [the Docker Community](https://github.com/docker-library/julia) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links @@ -28,24 +28,48 @@ WARNING: ## Simple Tags -- [`1.4.1-buster`, `1.4-buster`, `1-buster`, `buster`](https://github.com/docker-library/julia/blob/35ec6b3efb79d22ae7812772d1defdf66bb8990e/1.4/buster/Dockerfile) -- [`1.4.1-windowsservercore-ltsc2016`, `1.4-windowsservercore-ltsc2016`, `1-windowsservercore-ltsc2016`, `windowsservercore-ltsc2016`](https://github.com/docker-library/julia/blob/35ec6b3efb79d22ae7812772d1defdf66bb8990e/1.4/windows/windowsservercore-ltsc2016/Dockerfile) -- [`1.4.1-windowsservercore-1809`, `1.4-windowsservercore-1809`, `1-windowsservercore-1809`, `windowsservercore-1809`](https://github.com/docker-library/julia/blob/35ec6b3efb79d22ae7812772d1defdf66bb8990e/1.4/windows/windowsservercore-1809/Dockerfile) -- [`1.0.5-buster`, `1.0-buster`](https://github.com/docker-library/julia/blob/4c770401df0b946da5cf61150bedb05280b218a6/1.0/buster/Dockerfile) -- [`1.0.5-stretch`, `1.0-stretch`](https://github.com/docker-library/julia/blob/4c770401df0b946da5cf61150bedb05280b218a6/1.0/stretch/Dockerfile) -- [`1.0.5-windowsservercore-ltsc2016`, `1.0-windowsservercore-ltsc2016`](https://github.com/docker-library/julia/blob/fc3c116c6fe19f870091df6843ed63a37f6c291b/1.0/windows/windowsservercore-ltsc2016/Dockerfile) -- [`1.0.5-windowsservercore-1809`, `1.0-windowsservercore-1809`](https://github.com/docker-library/julia/blob/fc3c116c6fe19f870091df6843ed63a37f6c291b/1.0/windows/windowsservercore-1809/Dockerfile) +- [`1.9.0-beta2-bullseye`, `1.9-rc-bullseye`, `rc-bullseye`](https://github.com/docker-library/julia/blob/a60827b1feb946f2701759eb0dceb33c44c24ed3/1.9-rc/bullseye/Dockerfile) +- [`1.9.0-beta2-buster`, `1.9-rc-buster`, `rc-buster`](https://github.com/docker-library/julia/blob/a60827b1feb946f2701759eb0dceb33c44c24ed3/1.9-rc/buster/Dockerfile) +- [`1.9.0-beta2-alpine3.17`, `1.9-rc-alpine3.17`, `rc-alpine3.17`, `1.9.0-beta2-alpine`, `1.9-rc-alpine`, `rc-alpine`](https://github.com/docker-library/julia/blob/a60827b1feb946f2701759eb0dceb33c44c24ed3/1.9-rc/alpine3.17/Dockerfile) +- [`1.9.0-beta2-alpine3.16`, `1.9-rc-alpine3.16`, `rc-alpine3.16`](https://github.com/docker-library/julia/blob/a60827b1feb946f2701759eb0dceb33c44c24ed3/1.9-rc/alpine3.16/Dockerfile) +- [`1.9.0-beta2-windowsservercore-ltsc2022`, `1.9-rc-windowsservercore-ltsc2022`, `rc-windowsservercore-ltsc2022`](https://github.com/docker-library/julia/blob/a60827b1feb946f2701759eb0dceb33c44c24ed3/1.9-rc/windows/windowsservercore-ltsc2022/Dockerfile) +- [`1.9.0-beta2-windowsservercore-1809`, `1.9-rc-windowsservercore-1809`, `rc-windowsservercore-1809`](https://github.com/docker-library/julia/blob/a60827b1feb946f2701759eb0dceb33c44c24ed3/1.9-rc/windows/windowsservercore-1809/Dockerfile) +- [`1.8.5-bullseye`, `1.8-bullseye`, `1-bullseye`, `bullseye`](https://github.com/docker-library/julia/blob/1f6b00c80fa154c1a93ca25bc51e5a70f081530c/1.8/bullseye/Dockerfile) +- [`1.8.5-buster`, `1.8-buster`, `1-buster`, `buster`](https://github.com/docker-library/julia/blob/1f6b00c80fa154c1a93ca25bc51e5a70f081530c/1.8/buster/Dockerfile) +- [`1.8.5-alpine3.17`, `1.8-alpine3.17`, `1-alpine3.17`, `alpine3.17`, `1.8.5-alpine`, `1.8-alpine`, `1-alpine`, `alpine`](https://github.com/docker-library/julia/blob/1f6b00c80fa154c1a93ca25bc51e5a70f081530c/1.8/alpine3.17/Dockerfile) +- [`1.8.5-alpine3.16`, `1.8-alpine3.16`, `1-alpine3.16`, `alpine3.16`](https://github.com/docker-library/julia/blob/1f6b00c80fa154c1a93ca25bc51e5a70f081530c/1.8/alpine3.16/Dockerfile) +- [`1.8.5-windowsservercore-ltsc2022`, `1.8-windowsservercore-ltsc2022`, `1-windowsservercore-ltsc2022`, `windowsservercore-ltsc2022`](https://github.com/docker-library/julia/blob/1f6b00c80fa154c1a93ca25bc51e5a70f081530c/1.8/windows/windowsservercore-ltsc2022/Dockerfile) +- [`1.8.5-windowsservercore-1809`, `1.8-windowsservercore-1809`, `1-windowsservercore-1809`, `windowsservercore-1809`](https://github.com/docker-library/julia/blob/1f6b00c80fa154c1a93ca25bc51e5a70f081530c/1.8/windows/windowsservercore-1809/Dockerfile) +- [`1.6.7-bullseye`, `1.6-bullseye`](https://github.com/docker-library/julia/blob/a7e28ee0b611690e7c81b37edbc04c64e38c9aa8/1.6/bullseye/Dockerfile) +- [`1.6.7-buster`, `1.6-buster`](https://github.com/docker-library/julia/blob/a7e28ee0b611690e7c81b37edbc04c64e38c9aa8/1.6/buster/Dockerfile) +- [`1.6.7-alpine3.17`, `1.6-alpine3.17`, `1.6.7-alpine`, `1.6-alpine`](https://github.com/docker-library/julia/blob/1d8e89b70dd373eceea2879c87e03cc20cafec1a/1.6/alpine3.17/Dockerfile) +- [`1.6.7-alpine3.16`, `1.6-alpine3.16`](https://github.com/docker-library/julia/blob/a7e28ee0b611690e7c81b37edbc04c64e38c9aa8/1.6/alpine3.16/Dockerfile) +- [`1.6.7-windowsservercore-ltsc2022`, `1.6-windowsservercore-ltsc2022`](https://github.com/docker-library/julia/blob/e0d0364c90b544d2d6de097e324ff7cc538613e8/1.6/windows/windowsservercore-ltsc2022/Dockerfile) +- [`1.6.7-windowsservercore-1809`, `1.6-windowsservercore-1809`](https://github.com/docker-library/julia/blob/e0d0364c90b544d2d6de097e324ff7cc538613e8/1.6/windows/windowsservercore-1809/Dockerfile) ## Shared Tags -- `1.4.1`, `1.4`, `1`, `latest`: - - [`1.4.1-buster`](https://github.com/docker-library/julia/blob/35ec6b3efb79d22ae7812772d1defdf66bb8990e/1.4/buster/Dockerfile) - - [`1.4.1-windowsservercore-ltsc2016`](https://github.com/docker-library/julia/blob/35ec6b3efb79d22ae7812772d1defdf66bb8990e/1.4/windows/windowsservercore-ltsc2016/Dockerfile) - - [`1.4.1-windowsservercore-1809`](https://github.com/docker-library/julia/blob/35ec6b3efb79d22ae7812772d1defdf66bb8990e/1.4/windows/windowsservercore-1809/Dockerfile) -- `1.0.5`, `1.0`: - - [`1.0.5-buster`](https://github.com/docker-library/julia/blob/4c770401df0b946da5cf61150bedb05280b218a6/1.0/buster/Dockerfile) - - [`1.0.5-windowsservercore-ltsc2016`](https://github.com/docker-library/julia/blob/fc3c116c6fe19f870091df6843ed63a37f6c291b/1.0/windows/windowsservercore-ltsc2016/Dockerfile) - - [`1.0.5-windowsservercore-1809`](https://github.com/docker-library/julia/blob/fc3c116c6fe19f870091df6843ed63a37f6c291b/1.0/windows/windowsservercore-1809/Dockerfile) +- `1.9.0-beta2`, `1.9-rc`, `rc`: + - [`1.9.0-beta2-bullseye`](https://github.com/docker-library/julia/blob/a60827b1feb946f2701759eb0dceb33c44c24ed3/1.9-rc/bullseye/Dockerfile) + - [`1.9.0-beta2-windowsservercore-ltsc2022`](https://github.com/docker-library/julia/blob/a60827b1feb946f2701759eb0dceb33c44c24ed3/1.9-rc/windows/windowsservercore-ltsc2022/Dockerfile) + - [`1.9.0-beta2-windowsservercore-1809`](https://github.com/docker-library/julia/blob/a60827b1feb946f2701759eb0dceb33c44c24ed3/1.9-rc/windows/windowsservercore-1809/Dockerfile) +- `1.9.0-beta2-windowsservercore`, `1.9-rc-windowsservercore`, `rc-windowsservercore`: + - [`1.9.0-beta2-windowsservercore-ltsc2022`](https://github.com/docker-library/julia/blob/a60827b1feb946f2701759eb0dceb33c44c24ed3/1.9-rc/windows/windowsservercore-ltsc2022/Dockerfile) + - [`1.9.0-beta2-windowsservercore-1809`](https://github.com/docker-library/julia/blob/a60827b1feb946f2701759eb0dceb33c44c24ed3/1.9-rc/windows/windowsservercore-1809/Dockerfile) +- `1.8.5`, `1.8`, `1`, `latest`: + - [`1.8.5-bullseye`](https://github.com/docker-library/julia/blob/1f6b00c80fa154c1a93ca25bc51e5a70f081530c/1.8/bullseye/Dockerfile) + - [`1.8.5-windowsservercore-ltsc2022`](https://github.com/docker-library/julia/blob/1f6b00c80fa154c1a93ca25bc51e5a70f081530c/1.8/windows/windowsservercore-ltsc2022/Dockerfile) + - [`1.8.5-windowsservercore-1809`](https://github.com/docker-library/julia/blob/1f6b00c80fa154c1a93ca25bc51e5a70f081530c/1.8/windows/windowsservercore-1809/Dockerfile) +- `1.8.5-windowsservercore`, `1.8-windowsservercore`, `1-windowsservercore`, `windowsservercore`: + - [`1.8.5-windowsservercore-ltsc2022`](https://github.com/docker-library/julia/blob/1f6b00c80fa154c1a93ca25bc51e5a70f081530c/1.8/windows/windowsservercore-ltsc2022/Dockerfile) + - [`1.8.5-windowsservercore-1809`](https://github.com/docker-library/julia/blob/1f6b00c80fa154c1a93ca25bc51e5a70f081530c/1.8/windows/windowsservercore-1809/Dockerfile) +- `1.6.7`, `1.6`: + - [`1.6.7-bullseye`](https://github.com/docker-library/julia/blob/a7e28ee0b611690e7c81b37edbc04c64e38c9aa8/1.6/bullseye/Dockerfile) + - [`1.6.7-windowsservercore-ltsc2022`](https://github.com/docker-library/julia/blob/e0d0364c90b544d2d6de097e324ff7cc538613e8/1.6/windows/windowsservercore-ltsc2022/Dockerfile) + - [`1.6.7-windowsservercore-1809`](https://github.com/docker-library/julia/blob/e0d0364c90b544d2d6de097e324ff7cc538613e8/1.6/windows/windowsservercore-1809/Dockerfile) +- `1.6.7-windowsservercore`, `1.6-windowsservercore`: + - [`1.6.7-windowsservercore-ltsc2022`](https://github.com/docker-library/julia/blob/e0d0364c90b544d2d6de097e324ff7cc538613e8/1.6/windows/windowsservercore-ltsc2022/Dockerfile) + - [`1.6.7-windowsservercore-1809`](https://github.com/docker-library/julia/blob/e0d0364c90b544d2d6de097e324ff7cc538613e8/1.6/windows/windowsservercore-1809/Dockerfile) # Quick reference (cont.) @@ -60,7 +84,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/julia`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fjulia) + [official-images repo's `library/julia` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fjulia) [official-images repo's `library/julia` file](https://github.com/docker-library/official-images/blob/master/library/julia) ([history](https://github.com/docker-library/official-images/commits/master/library/julia)) - **Source of this description**: @@ -74,6 +98,12 @@ Julia is a high-level, high-performance dynamic programming language for technic ![logo](https://raw.githubusercontent.com/docker-library/docs/520519ad7db3ea9fd5d3590e836c839a0ffd6f19/julia/logo.png) +# Support Tiers + +Platforms supported by Julia are divided into a tier system that ranks them based on level of support. For more dedicated information about support tiers, please see ["Currently supported platforms" on the Julia download page](https://julialang.org/downloads/#currently_supported_platforms). + +It's especially relevant to note that Alpine / musl is "Tier 3" due to several known issues (see [docker-library/julia#47 (comment)](https://github.com/docker-library/julia/pull/47#issuecomment-652661869), [JuliaLang/julia#28805](https://github.com/JuliaLang/julia/issues/28805), [JuliaLang/julia#36458](https://github.com/JuliaLang/julia/issues/36458)). + # How to use this image ## Start Julia REPL @@ -98,7 +128,15 @@ The `julia` images come in many flavors, each designed for a specific use case. 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. -Some of these tags may have names like buster or stretch 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. +Some of these tags may have names like bullseye or buster 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. + +## `julia:-alpine` + +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. + +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. + +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). ## `julia:-windowsservercore` diff --git a/julia/content.md b/julia/content.md index 19907cf1e016..4c49c9049b64 100644 --- a/julia/content.md +++ b/julia/content.md @@ -6,6 +6,12 @@ Julia is a high-level, high-performance dynamic programming language for technic %%LOGO%% +# Support Tiers + +Platforms supported by Julia are divided into a tier system that ranks them based on level of support. For more dedicated information about support tiers, please see ["Currently supported platforms" on the Julia download page](https://julialang.org/downloads/#currently_supported_platforms). + +It's especially relevant to note that Alpine / musl is "Tier 3" due to several known issues (see [docker-library/julia#47 (comment)](https://github.com/docker-library/julia/pull/47#issuecomment-652661869), [JuliaLang/julia#28805](https://github.com/JuliaLang/julia/issues/28805), [JuliaLang/julia#36458](https://github.com/JuliaLang/julia/issues/36458)). + # How to use this image ## Start Julia REPL diff --git a/kaazing-gateway/README-short.txt b/kaazing-gateway/README-short.txt deleted file mode 100644 index d6b829005c34..000000000000 --- a/kaazing-gateway/README-short.txt +++ /dev/null @@ -1 +0,0 @@ -Official build of Kaazing Gateway. diff --git a/kaazing-gateway/README.md b/kaazing-gateway/README.md deleted file mode 100644 index dfaaa5ad2856..000000000000 --- a/kaazing-gateway/README.md +++ /dev/null @@ -1,113 +0,0 @@ - - -# Quick reference - -- **Maintained by**: - [the Kaazing Docker Maintainers](https://github.com/kaazing/gateway.docker) - -- **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) - -# Supported tags and respective `Dockerfile` links - -- [`5.6.0`, `5.6`, `5`, `latest`](https://github.com/kaazing/gateway.docker/blob/a40c8da9d2c2925bdd78b9a6d1b6da3fe89322d1/Dockerfile) - -# Quick reference (cont.) - -- **Where to file issues**: - [https://github.com/kaazing/gateway.docker/issues](https://github.com/kaazing/gateway.docker/issues) - -- **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) - [`amd64`](https://hub.docker.com/r/amd64/kaazing-gateway/), [`arm64v8`](https://hub.docker.com/r/arm64v8/kaazing-gateway/) - -- **Published image artifact details**: - [repo-info repo's `repos/kaazing-gateway/` directory](https://github.com/docker-library/repo-info/blob/master/repos/kaazing-gateway) ([history](https://github.com/docker-library/repo-info/commits/master/repos/kaazing-gateway)) - (image metadata, transfer size, etc) - -- **Image updates**: - [official-images PRs with label `library/kaazing-gateway`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fkaazing-gateway) - [official-images repo's `library/kaazing-gateway` file](https://github.com/docker-library/official-images/blob/master/library/kaazing-gateway) ([history](https://github.com/docker-library/official-images/commits/master/library/kaazing-gateway)) - -- **Source of this description**: - [docs repo's `kaazing-gateway/` directory](https://github.com/docker-library/docs/tree/master/kaazing-gateway) ([history](https://github.com/docker-library/docs/commits/master/kaazing-gateway)) - -# What is the KAAZING Gateway? - -The Kaazing Gateway is a network gateway created to provide a single access point for real-time web based protocols that supports load balancing, clustering, and security management. It is designed to provide scalable and secure bidirectional event-based communication over the web; on every platform, browser, and device. - -![logo](https://raw.githubusercontent.com/docker-library/docs/ba0031dd881f3b95d30ebf1d6094e99985d8eb6d/kaazing-gateway/logo.png) - -# How to use this image - -## Up and Running - -By default the gateway runs a WebSocket echo service similar to [websocket.org](https://www.websocket.org/echo.html). - -You must give your gateway container a hostname. To do this, use the `docker run -h somehostname` option, along with the -e option to define an environment variable, GATEWAY_OPTS, to pass this hostname to the gateway configuration (your hostname may vary): - -```console -$ docker run --name some-kaazing-gateway -h somehostname -e GATEWAY_OPTS="-Dgateway.hostname=somehostname -Xmx512m -Djava.security.egd=file:/dev/urandom" -d -p 8000:8000 kaazing-gateway -``` - -Note: the additional GATEWAY_OPTS options, `-Xmx512m -Djava.security.egd=file:/dev/urandom`, are added in order to preserve these values from the original Dockerfile for the gateway. The `-Xmx512m` value specifies a minimum Java heap size of 512 MB, and `-Djava.security.egd=file:/dev/urandom` is to facilitate faster startup on VMs. See the `Dockerfile` link referenced above for details. - -You should then be able to connect to ws://somehostname:8000 from the [WebSocket echo test](https://www.websocket.org/echo.html). - -Note: all of the above assumes that `somehostname` is resolvable from your browser. You may need to add an etc/hosts entry for `somehostname` on your `dockerhost ip`. - -## Custom Configuration - -To launch a container with a specific configuration you can do the following: - -```console -$ docker run --name some-kaazing-gateway -h somehostname -e GATEWAY_OPTS="-Dgateway.hostname=somehostname -Xmx512m -Djava.security.egd=file:/dev/urandom" -v /some/gateway-config.xml:/kaazing-gateway/conf/gateway-config.xml:ro -d kaazing-gateway -``` - -For information on the syntax of the Kaazing Gateway configuration files, see [the official documentation](https://kaazing.com/doc/5.0/index.html) (specifically the *For Administrators* section). - -If you wish to adapt the default Gateway configuration file, you can use a command such as the following to copy the file from a running Kaazing Gateway container: - -```console -$ docker cp some-kaazing:/kaazing-gateway/conf/gateway-config-minimal.xml /some/gateway-config.xml -``` - -As above, this can also be accomplished more cleanly using a simple `Dockerfile`: - -```dockerfile -FROM kaazing-gateway -COPY gateway-config.xml conf/gateway-config.xml -``` - -Then, build with `docker build -t some-custom-kaazing-gateway .` and run: - -```console -$ docker run --name some-kaazing-gateway -d some-custom-kaazing-gateway -``` - -## GATEWAY_OPTS - -For more information on the GATEWAY_OPTS environment variable, see [Configure Kaazing Gateway Using the GATEWAY_OPTS Environment Variable](https://kaazing.com/doc/5.0/admin-reference/p_configure_gateway_opts/). - -# License - -View [license information](https://github.com/kaazing/gateway/blob/master/LICENSE.txt) for the software contained in this image. - -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). - -Some additional license information which was able to be auto-detected might be found in [the `repo-info` repository's `kaazing-gateway/` directory](https://github.com/docker-library/repo-info/tree/master/repos/kaazing-gateway). - -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. diff --git a/kaazing-gateway/content.md b/kaazing-gateway/content.md deleted file mode 100644 index e6db23f155dc..000000000000 --- a/kaazing-gateway/content.md +++ /dev/null @@ -1,56 +0,0 @@ -# What is the KAAZING Gateway? - -The Kaazing Gateway is a network gateway created to provide a single access point for real-time web based protocols that supports load balancing, clustering, and security management. It is designed to provide scalable and secure bidirectional event-based communication over the web; on every platform, browser, and device. - -%%LOGO%% - -# How to use this image - -## Up and Running - -By default the gateway runs a WebSocket echo service similar to [websocket.org](https://www.websocket.org/echo.html). - -You must give your gateway container a hostname. To do this, use the `docker run -h somehostname` option, along with the -e option to define an environment variable, GATEWAY_OPTS, to pass this hostname to the gateway configuration (your hostname may vary): - -```console -$ docker run --name some-kaazing-gateway -h somehostname -e GATEWAY_OPTS="-Dgateway.hostname=somehostname -Xmx512m -Djava.security.egd=file:/dev/urandom" -d -p 8000:8000 %%IMAGE%% -``` - -Note: the additional GATEWAY_OPTS options, `-Xmx512m -Djava.security.egd=file:/dev/urandom`, are added in order to preserve these values from the original Dockerfile for the gateway. The `-Xmx512m` value specifies a minimum Java heap size of 512 MB, and `-Djava.security.egd=file:/dev/urandom` is to facilitate faster startup on VMs. See the `Dockerfile` link referenced above for details. - -You should then be able to connect to ws://somehostname:8000 from the [WebSocket echo test](https://www.websocket.org/echo.html). - -Note: all of the above assumes that `somehostname` is resolvable from your browser. You may need to add an etc/hosts entry for `somehostname` on your `dockerhost ip`. - -## Custom Configuration - -To launch a container with a specific configuration you can do the following: - -```console -$ docker run --name some-kaazing-gateway -h somehostname -e GATEWAY_OPTS="-Dgateway.hostname=somehostname -Xmx512m -Djava.security.egd=file:/dev/urandom" -v /some/gateway-config.xml:/kaazing-gateway/conf/gateway-config.xml:ro -d %%IMAGE%% -``` - -For information on the syntax of the Kaazing Gateway configuration files, see [the official documentation](https://kaazing.com/doc/5.0/index.html) (specifically the *For Administrators* section). - -If you wish to adapt the default Gateway configuration file, you can use a command such as the following to copy the file from a running Kaazing Gateway container: - -```console -$ docker cp some-kaazing:/kaazing-gateway/conf/gateway-config-minimal.xml /some/gateway-config.xml -``` - -As above, this can also be accomplished more cleanly using a simple `Dockerfile`: - -```dockerfile -FROM %%IMAGE%% -COPY gateway-config.xml conf/gateway-config.xml -``` - -Then, build with `docker build -t some-custom-kaazing-gateway .` and run: - -```console -$ docker run --name some-kaazing-gateway -d some-custom-kaazing-gateway -``` - -## GATEWAY_OPTS - -For more information on the GATEWAY_OPTS environment variable, see [Configure Kaazing Gateway Using the GATEWAY_OPTS Environment Variable](https://kaazing.com/doc/5.0/admin-reference/p_configure_gateway_opts/). diff --git a/kaazing-gateway/github-repo b/kaazing-gateway/github-repo deleted file mode 100644 index 862aa87450fe..000000000000 --- a/kaazing-gateway/github-repo +++ /dev/null @@ -1 +0,0 @@ -https://github.com/kaazing/gateway.docker diff --git a/kaazing-gateway/license.md b/kaazing-gateway/license.md deleted file mode 100644 index bfef639e7557..000000000000 --- a/kaazing-gateway/license.md +++ /dev/null @@ -1 +0,0 @@ -View [license information](https://github.com/kaazing/gateway/blob/master/LICENSE.txt) for the software contained in this image. diff --git a/kaazing-gateway/logo.png b/kaazing-gateway/logo.png deleted file mode 100644 index b23ea17ec6f958f24b8d038f57b8433b904105bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19324 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 diff --git a/kaazing-gateway/maintainer.md b/kaazing-gateway/maintainer.md deleted file mode 100644 index 39f75e47e2db..000000000000 --- a/kaazing-gateway/maintainer.md +++ /dev/null @@ -1 +0,0 @@ -[the Kaazing Docker Maintainers](%%GITHUB-REPO%%) diff --git a/kapacitor/README.md b/kapacitor/README.md index 64fec85bb261..4ca05ec6a851 100644 --- a/kapacitor/README.md +++ b/kapacitor/README.md @@ -20,14 +20,14 @@ WARNING: [InfluxData](https://github.com/influxdata/influxdata-docker) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`1.4`, `1.4.1`](https://github.com/influxdata/influxdata-docker/blob/65e446ee51fa4324559198886e2dd2ce0c24d21e/kapacitor/1.4/Dockerfile) -- [`1.4-alpine`, `1.4.1-alpine`](https://github.com/influxdata/influxdata-docker/blob/65e446ee51fa4324559198886e2dd2ce0c24d21e/kapacitor/1.4/alpine/Dockerfile) -- [`1.5`, `1.5.4`, `latest`](https://github.com/influxdata/influxdata-docker/blob/65e446ee51fa4324559198886e2dd2ce0c24d21e/kapacitor/1.5/Dockerfile) -- [`1.5-alpine`, `1.5.4-alpine`, `alpine`](https://github.com/influxdata/influxdata-docker/blob/65e446ee51fa4324559198886e2dd2ce0c24d21e/kapacitor/1.5/alpine/Dockerfile) +- [`1.5`, `1.5.9`](https://github.com/influxdata/influxdata-docker/blob/410d53519af0edd30a985eacc3bb060258a2705d/kapacitor/1.5/Dockerfile) +- [`1.5-alpine`, `1.5.9-alpine`](https://github.com/influxdata/influxdata-docker/blob/410d53519af0edd30a985eacc3bb060258a2705d/kapacitor/1.5/alpine/Dockerfile) +- [`1.6`, `1.6.5`, `latest`](https://github.com/influxdata/influxdata-docker/blob/410d53519af0edd30a985eacc3bb060258a2705d/kapacitor/1.6/Dockerfile) +- [`1.6-alpine`, `1.6.5-alpine`, `alpine`](https://github.com/influxdata/influxdata-docker/blob/410d53519af0edd30a985eacc3bb060258a2705d/kapacitor/1.6/alpine/Dockerfile) # Quick reference (cont.) @@ -42,7 +42,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/kapacitor`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fkapacitor) + [official-images repo's `library/kapacitor` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fkapacitor) [official-images repo's `library/kapacitor` file](https://github.com/docker-library/official-images/blob/master/library/kapacitor) ([history](https://github.com/docker-library/official-images/commits/master/library/kapacitor)) - **Source of this description**: @@ -191,9 +191,9 @@ This is the defacto image. If you are unsure about what your needs are, you prob ## `kapacitor:-alpine` -This image is based on the popular [Alpine Linux project](http://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. +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. -This variant is highly recommended when final image size being as small as possible is desired. The main caveat to note is that it does use [musl libc](http://www.musl-libc.org) instead of [glibc and friends](http://www.etalabs.net/compare_libcs.html), so certain software might run into issues depending on the depth of their libc requirements. However, most software doesn't have an issue with this, so this variant is usually a very safe choice. 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. +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. 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). diff --git a/kibana/README.md b/kibana/README.md index ad86f30d6066..8bc1951938a9 100644 --- a/kibana/README.md +++ b/kibana/README.md @@ -24,8 +24,8 @@ WARNING: # Supported tags and respective `Dockerfile` links -- [`7.7.0`](https://github.com/docker-library/kibana/blob/e3426d2c1ba645d6e19eb0ac66d7a400fa5f3fdf/7/Dockerfile) -- [`6.8.9`](https://github.com/docker-library/kibana/blob/5e0efc4e8d90e20f0f7faefa145b9b2aebcb2c5a/6/Dockerfile) +- [`8.6.0`](https://github.com/docker-library/kibana/blob/34ba6504a0b63a5f0f9d39564c0bfd47114d94f8/8/Dockerfile) +- [`7.17.8`](https://github.com/docker-library/kibana/blob/c98bb27941c6b2dafd6d963aab2b0cc9f0876315/7/Dockerfile) # Quick reference (cont.) @@ -33,14 +33,14 @@ WARNING: For issues with the Kibana Docker image or Kibana: https://github.com/elastic/kibana/issues - **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) - [`amd64`](https://hub.docker.com/r/amd64/kibana/) + [`amd64`](https://hub.docker.com/r/amd64/kibana/), [`arm64v8`](https://hub.docker.com/r/arm64v8/kibana/) - **Published image artifact details**: [repo-info repo's `repos/kibana/` directory](https://github.com/docker-library/repo-info/blob/master/repos/kibana) ([history](https://github.com/docker-library/repo-info/commits/master/repos/kibana)) (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/kibana`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fkibana) + [official-images repo's `library/kibana` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fkibana) [official-images repo's `library/kibana` file](https://github.com/docker-library/official-images/blob/master/library/kibana) ([history](https://github.com/docker-library/official-images/commits/master/library/kibana)) - **Source of this description**: @@ -94,7 +94,7 @@ For additional information on running and configuring Kibana on Docker, see [Run # License -View [license information](https://github.com/elastic/kibana/blob/master/licenses/ELASTIC-LICENSE.txt) for the software contained in this image. +View [license information](https://github.com/elastic/kibana/blob/master/licenses/ELASTIC-LICENSE-2.0.txt) for the software contained in this image. 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). diff --git a/kibana/license.md b/kibana/license.md index 235b4ac7c23a..9bf621b35289 100644 --- a/kibana/license.md +++ b/kibana/license.md @@ -1 +1 @@ -View [license information](https://github.com/elastic/kibana/blob/master/licenses/ELASTIC-LICENSE.txt) for the software contained in this image. +View [license information](https://github.com/elastic/kibana/blob/master/licenses/ELASTIC-LICENSE-2.0.txt) for the software contained in this image. diff --git a/known/README-short.txt b/known/README-short.txt deleted file mode 100644 index ef69737a0f46..000000000000 --- a/known/README-short.txt +++ /dev/null @@ -1 +0,0 @@ -Blogging, meet social. Known is a social publishing platform. diff --git a/known/README.md b/known/README.md deleted file mode 100644 index 0eff64a1c385..000000000000 --- a/known/README.md +++ /dev/null @@ -1,107 +0,0 @@ - - -# Quick reference - -- **Maintained by**: - [Known](https://github.com/idno/Known-Docker) - -- **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) - -# Supported tags and respective `Dockerfile` links - -- [`0.9.9`, `0.9`, `0`, `latest`](https://github.com/idno/Known-Docker/blob/3454a52b4ad48e22b95e706dba9ff953cf84c2b1/Dockerfile) - -# Quick reference (cont.) - -- **Where to file issues**: - [https://github.com/idno/Known-Docker/issues](https://github.com/idno/Known-Docker/issues) - -- **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) - [`amd64`](https://hub.docker.com/r/amd64/known/), [`arm64v8`](https://hub.docker.com/r/arm64v8/known/) - -- **Published image artifact details**: - [repo-info repo's `repos/known/` directory](https://github.com/docker-library/repo-info/blob/master/repos/known) ([history](https://github.com/docker-library/repo-info/commits/master/repos/known)) - (image metadata, transfer size, etc) - -- **Image updates**: - [official-images PRs with label `library/known`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fknown) - [official-images repo's `library/known` file](https://github.com/docker-library/official-images/blob/master/library/known) ([history](https://github.com/docker-library/official-images/commits/master/library/known)) - -- **Source of this description**: - [docs repo's `known/` directory](https://github.com/docker-library/docs/tree/master/known) ([history](https://github.com/docker-library/docs/commits/master/known)) - -# Known: social publishing for groups and individuals - -Blogging, meet social. - -Known is a social publishing platform. Publish on your own site, reach your audience across social media. - -![logo](https://raw.githubusercontent.com/docker-library/docs/817ab3c02e0a6c38fe8986c4ba96e23a9db26fab/known/logo.png) - -# How to use this image - -```bash -docker run --link some-mysql:db -d known -``` - -Now you can get access to fpm running on port 9000 inside the container. If you want to access it from the Internets, we recommend using a reverse proxy in front. You can find more information on that on the [docker-compose](#docker-compose) section. - -The following environment variables are also honored for configuring your Known instance: - -- `-e KNOWN_DB_HOST=...` (defaults to the IP and port of the linked `mysql` container) -- `-e KNOWN_DB_USER=...` (defaults to "root") -- `-e KNOWN_DB_PASSWORD=...` (defaults to the value of the `MYSQL_ROOT_PASSWORD` environment variable from the linked `mysql` container) -- `-e KNOWN_DB_NAME=...` (defaults to "known") -- `-e MAIL_HOST=...` -- `-e MAIL_PORT=...` -- `-e MAIL_SECURE=...` ("starttls" for instance) -- `-e MAIL_USER=...` -- `-e MAIL_PASS=...` - -If the `KNOWN_DB_NAME` specified does not already exist on the given MySQL server, it will be created automatically upon startup of the `known` container, provided that the `KNOWN_DB_USER` specified has the necessary permissions to create it. - -If you'd like to use an external database instead of a linked `mysql` container, specify the hostname and port with `KNOWN_DB_HOST` along with the password in `KNOWN_DB_PASSWORD` and the username in `KNOWN_DB_USER` (if it is something other than `root`): - -```console -$ docker run --name some-known -e KNOWN_DB_HOST=10.1.2.3:3306 \ - -e KNOWN_DB_USER=... -e KNOWN_DB_PASSWORD=... -d known -``` - -## Via docker-compose - -You can use a setup that is used in production at [IndieHosters/known](https://github.com/indiehosters/known). - -## Installation - -Once started, you'll arrive at the configuration wizard. Follow the steps as indicated. - -## Contribute - -Pull requests are very welcome! - -We'd love to hear your feedback and suggestions in the issue tracker: [github.com/idno/Known-docker/issues](https://github.com/idno/Known-docker/issues). - -# License - -View [license information](https://raw.githubusercontent.com/idno/Known/master/LICENSE) for the software contained in this image. - -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). - -Some additional license information which was able to be auto-detected might be found in [the `repo-info` repository's `known/` directory](https://github.com/docker-library/repo-info/tree/master/repos/known). - -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. diff --git a/known/content.md b/known/content.md deleted file mode 100644 index da2213ea0ede..000000000000 --- a/known/content.md +++ /dev/null @@ -1,50 +0,0 @@ -# Known: social publishing for groups and individuals - -Blogging, meet social. - -Known is a social publishing platform. Publish on your own site, reach your audience across social media. - -%%LOGO%% - -# How to use this image - -```bash -docker run --link some-mysql:db -d %%IMAGE%% -``` - -Now you can get access to fpm running on port 9000 inside the container. If you want to access it from the Internets, we recommend using a reverse proxy in front. You can find more information on that on the [docker-compose](#docker-compose) section. - -The following environment variables are also honored for configuring your Known instance: - -- `-e KNOWN_DB_HOST=...` (defaults to the IP and port of the linked `mysql` container) -- `-e KNOWN_DB_USER=...` (defaults to "root") -- `-e KNOWN_DB_PASSWORD=...` (defaults to the value of the `MYSQL_ROOT_PASSWORD` environment variable from the linked `mysql` container) -- `-e KNOWN_DB_NAME=...` (defaults to "known") -- `-e MAIL_HOST=...` -- `-e MAIL_PORT=...` -- `-e MAIL_SECURE=...` ("starttls" for instance) -- `-e MAIL_USER=...` -- `-e MAIL_PASS=...` - -If the `KNOWN_DB_NAME` specified does not already exist on the given MySQL server, it will be created automatically upon startup of the `%%REPO%%` container, provided that the `KNOWN_DB_USER` specified has the necessary permissions to create it. - -If you'd like to use an external database instead of a linked `mysql` container, specify the hostname and port with `KNOWN_DB_HOST` along with the password in `KNOWN_DB_PASSWORD` and the username in `KNOWN_DB_USER` (if it is something other than `root`): - -```console -$ docker run --name some-%%REPO%% -e KNOWN_DB_HOST=10.1.2.3:3306 \ - -e KNOWN_DB_USER=... -e KNOWN_DB_PASSWORD=... -d %%REPO%% -``` - -## Via docker-compose - -You can use a setup that is used in production at [IndieHosters/known](https://github.com/indiehosters/known). - -## Installation - -Once started, you'll arrive at the configuration wizard. Follow the steps as indicated. - -## Contribute - -Pull requests are very welcome! - -We'd love to hear your feedback and suggestions in the issue tracker: [github.com/idno/Known-docker/issues](https://github.com/idno/Known-docker/issues). diff --git a/known/github-repo b/known/github-repo deleted file mode 100644 index 20300efb8fd2..000000000000 --- a/known/github-repo +++ /dev/null @@ -1 +0,0 @@ -https://github.com/idno/Known-Docker diff --git a/known/license.md b/known/license.md deleted file mode 100644 index ca7a8f8a80a0..000000000000 --- a/known/license.md +++ /dev/null @@ -1 +0,0 @@ -View [license information](https://raw.githubusercontent.com/idno/Known/master/LICENSE) for the software contained in this image. diff --git a/known/logo.png b/known/logo.png deleted file mode 100644 index 1cfdaa970062eb59903f7c527b2dee6c0a919a6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11116 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 ae1L;9Yu4qDg7Ci|ET}4KD3r^Yhx|XMe~9b= diff --git a/known/maintainer.md b/known/maintainer.md deleted file mode 100644 index 909ddaf6d6a8..000000000000 --- a/known/maintainer.md +++ /dev/null @@ -1 +0,0 @@ -[Known](%%GITHUB-REPO%%) diff --git a/kong/README-short.txt b/kong/README-short.txt index 031330bcf561..3bcf8a2a5e40 100644 --- a/kong/README-short.txt +++ b/kong/README-short.txt @@ -1 +1 @@ -The Cloud-Native API Gateway & Service Mesh for APIs and Microservices \ No newline at end of file +The Cloud-Native API Gateway for APIs and Microservices diff --git a/kong/README.md b/kong/README.md index 56b52d1149d3..c14a73b72278 100644 --- a/kong/README.md +++ b/kong/README.md @@ -20,28 +20,22 @@ WARNING: [the Kong Docker Maintainers](https://github.com/kong/kong) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`2.0.4-alpine`, `2.0.4`, `2.0`, `latest`, `alpine`](https://github.com/Kong/docker-kong/blob/74c5796ec1789d13b794c7cda0a5bca692aa6d53/alpine/Dockerfile) -- [`2.0.4-ubuntu`, `2.0-ubuntu`, `ubuntu`](https://github.com/Kong/docker-kong/blob/74c5796ec1789d13b794c7cda0a5bca692aa6d53/ubuntu/Dockerfile) -- [`2.0.4-centos`, `2.0-centos`, `centos`](https://github.com/Kong/docker-kong/blob/74c5796ec1789d13b794c7cda0a5bca692aa6d53/centos/Dockerfile) -- [`1.5.1-alpine`, `1.5.1`, `1.5`](https://github.com/Kong/docker-kong/blob/8ba4389169d5873be65a09001d06293ccdfc7caf/alpine/Dockerfile) -- [`1.5.1-ubuntu`, `1.5-ubuntu`](https://github.com/Kong/docker-kong/blob/8ba4389169d5873be65a09001d06293ccdfc7caf/ubuntu/Dockerfile) -- [`1.5.1-centos`, `1.5-centos`](https://github.com/Kong/docker-kong/blob/8ba4389169d5873be65a09001d06293ccdfc7caf/centos/Dockerfile) -- [`1.4.3-alpine`, `1.4.3`, `1.4`](https://github.com/Kong/docker-kong/blob/d2884ee222e72c3edb9abd48d4062991e41ea7bc/alpine/Dockerfile) -- [`1.4.3-ubuntu`, `1.4-ubuntu`](https://github.com/Kong/docker-kong/blob/d2884ee222e72c3edb9abd48d4062991e41ea7bc/ubuntu/Dockerfile) -- [`1.4.3-centos`, `1.4-centos`](https://github.com/Kong/docker-kong/blob/d2884ee222e72c3edb9abd48d4062991e41ea7bc/centos/Dockerfile) -- [`1.3.1-alpine`, `1.3.1`, `1.3`](https://github.com/Kong/docker-kong/blob/48b240c47a4d902ddcc20de408e2c08855a5feca/alpine/Dockerfile) -- [`1.3.1-ubuntu`, `1.3-ubuntu`](https://github.com/Kong/docker-kong/blob/48b240c47a4d902ddcc20de408e2c08855a5feca/ubuntu/Dockerfile) -- [`1.3.1-centos`, `1.3-centos`](https://github.com/Kong/docker-kong/blob/48b240c47a4d902ddcc20de408e2c08855a5feca/centos/Dockerfile) -- [`1.2.3-alpine`, `1.2.3`, `1.2`](https://github.com/Kong/docker-kong/blob/f5512d2898dad8ad6c95d42b1762ea004713d519/alpine/Dockerfile) -- [`1.2.3-centos`, `1.2-centos`](https://github.com/Kong/docker-kong/blob/f5512d2898dad8ad6c95d42b1762ea004713d519/centos/Dockerfile) -- [`1.1.3-alpine`, `1.1.3`, `1.1`](https://github.com/Kong/docker-kong/blob/196331b1e6b4798032af4d6c218a441e2c8db74d/alpine/Dockerfile) -- [`1.1.3-centos`, `1.1-centos`](https://github.com/Kong/docker-kong/blob/196331b1e6b4798032af4d6c218a441e2c8db74d/centos/Dockerfile) -- [`1.0.4-alpine`, `1.0.4`, `1.0`](https://github.com/Kong/docker-kong/blob/5a47f391b479e6660edab76813891326630bed0e/alpine/Dockerfile) -- [`1.0.4-centos`, `1.0-centos`](https://github.com/Kong/docker-kong/blob/5a47f391b479e6660edab76813891326630bed0e/centos/Dockerfile) +- [`3.1.1-alpine`, `3.1.1`, `3.1`, `3`, `alpine`, `latest`](https://github.com/Kong/docker-kong/blob/5f914be945ec1732837cc4f6463219bed566c7ef/Dockerfile.apk) +- [`3.1.1-ubuntu`, `3.1-ubuntu`, `ubuntu`](https://github.com/Kong/docker-kong/blob/5f914be945ec1732837cc4f6463219bed566c7ef/ubuntu/Dockerfile) +- [`3.0.2-alpine`, `3.0-alpine`, `3.0.2`, `3.0`](https://github.com/Kong/docker-kong/blob/5a3ee8daf50371db2e3a788abe8f306255eead22/Dockerfile.apk) +- [`3.0.2-ubuntu`, `3.0-ubuntu`](https://github.com/Kong/docker-kong/blob/5a3ee8daf50371db2e3a788abe8f306255eead22/ubuntu/Dockerfile) +- [`2.8.3-alpine`, `2.8.3`, `2.8`](https://github.com/Kong/docker-kong/blob/9538eec15456ce93d69a4a1ae9e379a28fd9040b/alpine/Dockerfile) +- [`2.8.3-ubuntu`, `2.8-ubuntu`](https://github.com/Kong/docker-kong/blob/9538eec15456ce93d69a4a1ae9e379a28fd9040b/ubuntu/Dockerfile) +- [`2.7.2-alpine`, `2.7.2`, `2.7`](https://github.com/Kong/docker-kong/blob/456bfc908ed1f4fdbb348bafcf7385aeffdd421c/alpine/Dockerfile) +- [`2.7.2-ubuntu`, `2.7-ubuntu`](https://github.com/Kong/docker-kong/blob/456bfc908ed1f4fdbb348bafcf7385aeffdd421c/ubuntu/Dockerfile) +- [`2.6.1-alpine`, `2.6.1`, `2.6`](https://github.com/Kong/docker-kong/blob/aa4cf106f8933033f433cacc8f073fa4dbbeac21/alpine/Dockerfile) +- [`2.6.1-ubuntu`, `2.6-ubuntu`](https://github.com/Kong/docker-kong/blob/aa4cf106f8933033f433cacc8f073fa4dbbeac21/ubuntu/Dockerfile) +- [`2.5.2-alpine`, `2.5.2`, `2.5`](https://github.com/Kong/docker-kong/blob/e6fbd10247d55eba63db13216666f9db4c6d3363/alpine/Dockerfile) +- [`2.5.2-ubuntu`, `2.5-ubuntu`](https://github.com/Kong/docker-kong/blob/e6fbd10247d55eba63db13216666f9db4c6d3363/ubuntu/Dockerfile) # Quick reference (cont.) @@ -56,7 +50,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/kong`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fkong) + [official-images repo's `library/kong` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fkong) [official-images repo's `library/kong` file](https://github.com/docker-library/official-images/blob/master/library/kong) ([history](https://github.com/docker-library/official-images/commits/master/library/kong)) - **Source of this description**: @@ -64,15 +58,49 @@ WARNING: # What is Kong? -Kong is a scalable, open source API Platform (also known as an API Gateway, or API Middleware, or Service Mesh for Microservices). Kong was originally built by [Kong Inc.](https://konghq.com) (formerly known as Mashape) to secure, manage and extend over 15,000 Microservices for its API Marketplace, which generates billions of requests per month. +Kong is a scalable, open source API Platform (also known as an API Gateway or API Middleware). Kong was originally built by [Kong Inc.](https://konghq.com) (formerly known as Mashape) to secure, manage, and extend over 15,000 Microservices for its API Marketplace, which generates billions of requests per month. Under active development, Kong is now used in production at hundreds of organizations from startups, to large enterprises and governments including: The New York Times, Expedia, Healthcare.gov, The Guardian, Condè Nast, The University of Auckland, Ferrari, Rakuten, Cisco, SkyScanner, Yahoo! Japan, Giphy and so on. Kong's official documentation can be found at [docs.konghq.com](https://docs.konghq.com/). -# How to use this image +# How to use this image without a Database -First, Kong requires a running Cassandra cluster (3.x+) or PostgreSQL instance (9.6+) before it starts. You can either use the official Cassandra/PostgreSQL containers, or use your own. +Kong 1.1 added the capability to run Kong without a database, using only in-memory storage for entities: we call this DB-less mode. When running Kong DB-less, the configuration of entities is done in a second configuration file, in YAML or JSON, using declarative configuration. + +```shell +$ docker run -d --name kong \ + -e "KONG_DATABASE=off" \ + -e "KONG_PROXY_ACCESS_LOG=/dev/stdout" \ + -e "KONG_ADMIN_ACCESS_LOG=/dev/stdout" \ + -e "KONG_PROXY_ERROR_LOG=/dev/stderr" \ + -e "KONG_ADMIN_ERROR_LOG=/dev/stderr" \ + -e "KONG_ADMIN_LISTEN=0.0.0.0:8001, 0.0.0.0:8444 ssl" \ + -p 8000:8000 \ + -p 8443:8443 \ + -p 8001:8001 \ + -p 8444:8444 \ + kong +``` + +Generate a skeleton configuration file to get you started + +```shell +$ docker exec -it kong kong config init /home/kong/kong.yml +$ docker exec -it kong cat /home/kong/kong.yml >> kong.yml +``` + +Load a declarative configuration into a running Kong node via its Admin API using HTTPie + +```shell +$ http :8001/config config=@kong.yml +``` + +**Note**: Not all Kong plugins are compatible with DB-less mode, since some of them by design require a central database coordination and/or dynamic creation of entities, see the doc for details at [DB-less and Declarative Configuration](https://docs.konghq.com/latest/db-less-and-declarative-config/) + +# How to use this image with a Database + +You can either use the official Cassandra/PostgreSQL containers, or use your own. ## 1. Link Kong to either a Cassandra or PostgreSQL container @@ -97,6 +125,7 @@ $ docker run -d --name kong-database \ -p 5432:5432 \ -e "POSTGRES_USER=kong" \ -e "POSTGRES_DB=kong" \ + -e "POSTGRES_PASSWORD=kong" \ postgres:9.6 ``` @@ -109,6 +138,8 @@ $ docker run --rm \ --link kong-database:kong-database \ -e "KONG_DATABASE=postgres" \ -e "KONG_PG_HOST=kong-database" \ + -e "KONG_PG_USER=kong" \ + -e "KONG_PG_PASSWORD=kong" \ -e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \ kong kong migrations bootstrap ``` @@ -126,6 +157,7 @@ $ docker run -d --name kong \ --link kong-database:kong-database \ -e "KONG_DATABASE=postgres" \ -e "KONG_PG_HOST=kong-database" \ + -e "KONG_PG_PASSWORD=kong" \ -e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \ -e "KONG_PROXY_ACCESS_LOG=/dev/stdout" \ -e "KONG_ADMIN_ACCESS_LOG=/dev/stdout" \ @@ -141,7 +173,7 @@ $ docker run -d --name kong \ If everything went well, and if you created your container with the default ports, Kong should be listening on your host's `8000` ([Proxy](https://docs.konghq.com/latest/configuration/#proxy_port)), `8443` ([Proxy SSL](https://docs.konghq.com/latest/configuration/#proxy_listen_ssl)), `8001` ([Admin API](https://docs.konghq.com/latest/configuration/#admin_listen)) and `8444` ([Admin API SSL](https://docs.konghq.com/latest/configuration/#admin_listen_ssl)) ports. -You can now read the docs at [docs.konghq.com](https://docs.konghq.com/) to learn more about Kong. +You can read the docs at [docs.konghq.com](https://docs.konghq.com/) to learn more about Kong. ## 3. Use Kong with a custom configuration (and a custom Cassandra/PostgreSQL cluster) @@ -149,7 +181,7 @@ You can override any property of the [Kong configuration file](https://docs.kong ```shell $ docker run -d --name kong \ - -e "KONG_DATABASE=postgres" + -e "KONG_DATABASE=postgres" \ -e "KONG_PG_HOST=kong-database" \ -e "KONG_LOG_LEVEL=info" \ -e "KONG_CUSTOM_PLUGINS=helloworld" \ @@ -164,7 +196,7 @@ $ docker run -d --name kong \ ## Reload Kong in a running container -If you change your custom configuration, you can reload Kong (without downtime) by issuing: +If you change your custom configuration, reload Kong (without downtime) by running: ```shell $ docker exec -it kong kong reload @@ -174,14 +206,7 @@ This will run the [`kong reload`](https://docs.konghq.com/latest/cli/#reload) co # Kubernetes Ingress -Among the many deployment options [available](https://konghq.com/install), Kong also offers a [Kubernetes Ingress Controller](https://github.com/Kong/kubernetes-ingress-controller) ready to use in your K8S environment. - -# Service Mesh - -Since version 1.x you can run Kong in a Service Mesh deployment as a platform-agnostic sidecar proxy (including Kubernetes, but also on any other platform supported by Kong). To get started and learn more you can read the docs at: - -- [Streams and Service Mesh](https://docs.konghq.com/latest/streams-and-service-mesh/) -- [Kubernetes and Service Mesh](https://github.com/Kong/kong-mesh-dist-kubernetes) +Among the many deployment options [available](https://konghq.com/install), Kong also offers a [Kubernetes Ingress Controller](https://github.com/Kong/kubernetes-ingress-controller) ready to use in your K8s environment. # Image Variants @@ -193,9 +218,9 @@ This is the defacto image. If you are unsure about what your needs are, you prob ## `kong:-alpine` -This image is based on the popular [Alpine Linux project](http://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. +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. -This variant is highly recommended when final image size being as small as possible is desired. The main caveat to note is that it does use [musl libc](http://www.musl-libc.org) instead of [glibc and friends](http://www.etalabs.net/compare_libcs.html), so certain software might run into issues depending on the depth of their libc requirements. However, most software doesn't have an issue with this, so this variant is usually a very safe choice. 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. +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. 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). diff --git a/kong/content.md b/kong/content.md index 0e065b79ae65..20d92fb3759a 100644 --- a/kong/content.md +++ b/kong/content.md @@ -1,14 +1,48 @@ # What is Kong? -Kong is a scalable, open source API Platform (also known as an API Gateway, or API Middleware, or Service Mesh for Microservices). Kong was originally built by [Kong Inc.](https://konghq.com) (formerly known as Mashape) to secure, manage and extend over 15,000 Microservices for its API Marketplace, which generates billions of requests per month. +Kong is a scalable, open source API Platform (also known as an API Gateway or API Middleware). Kong was originally built by [Kong Inc.](https://konghq.com) (formerly known as Mashape) to secure, manage, and extend over 15,000 Microservices for its API Marketplace, which generates billions of requests per month. Under active development, Kong is now used in production at hundreds of organizations from startups, to large enterprises and governments including: The New York Times, Expedia, Healthcare.gov, The Guardian, Condè Nast, The University of Auckland, Ferrari, Rakuten, Cisco, SkyScanner, Yahoo! Japan, Giphy and so on. Kong's official documentation can be found at [docs.konghq.com](https://docs.konghq.com/). -# How to use this image +# How to use this image without a Database -First, Kong requires a running Cassandra cluster (3.x+) or PostgreSQL instance (9.6+) before it starts. You can either use the official Cassandra/PostgreSQL containers, or use your own. +Kong 1.1 added the capability to run Kong without a database, using only in-memory storage for entities: we call this DB-less mode. When running Kong DB-less, the configuration of entities is done in a second configuration file, in YAML or JSON, using declarative configuration. + +```shell +$ docker run -d --name kong \ + -e "KONG_DATABASE=off" \ + -e "KONG_PROXY_ACCESS_LOG=/dev/stdout" \ + -e "KONG_ADMIN_ACCESS_LOG=/dev/stdout" \ + -e "KONG_PROXY_ERROR_LOG=/dev/stderr" \ + -e "KONG_ADMIN_ERROR_LOG=/dev/stderr" \ + -e "KONG_ADMIN_LISTEN=0.0.0.0:8001, 0.0.0.0:8444 ssl" \ + -p 8000:8000 \ + -p 8443:8443 \ + -p 8001:8001 \ + -p 8444:8444 \ + %%IMAGE%% +``` + +Generate a skeleton configuration file to get you started + +```shell +$ docker exec -it kong kong config init /home/kong/kong.yml +$ docker exec -it kong cat /home/kong/kong.yml >> kong.yml +``` + +Load a declarative configuration into a running Kong node via its Admin API using HTTPie + +```shell +$ http :8001/config config=@kong.yml +``` + +**Note**: Not all Kong plugins are compatible with DB-less mode, since some of them by design require a central database coordination and/or dynamic creation of entities, see the doc for details at [DB-less and Declarative Configuration](https://docs.konghq.com/latest/db-less-and-declarative-config/) + +# How to use this image with a Database + +You can either use the official Cassandra/PostgreSQL containers, or use your own. ## 1. Link Kong to either a Cassandra or PostgreSQL container @@ -33,6 +67,7 @@ $ docker run -d --name kong-database \ -p 5432:5432 \ -e "POSTGRES_USER=kong" \ -e "POSTGRES_DB=kong" \ + -e "POSTGRES_PASSWORD=kong" \ postgres:9.6 ``` @@ -45,6 +80,8 @@ $ docker run --rm \ --link kong-database:kong-database \ -e "KONG_DATABASE=postgres" \ -e "KONG_PG_HOST=kong-database" \ + -e "KONG_PG_USER=kong" \ + -e "KONG_PG_PASSWORD=kong" \ -e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \ %%IMAGE%% kong migrations bootstrap ``` @@ -62,6 +99,7 @@ $ docker run -d --name kong \ --link kong-database:kong-database \ -e "KONG_DATABASE=postgres" \ -e "KONG_PG_HOST=kong-database" \ + -e "KONG_PG_PASSWORD=kong" \ -e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \ -e "KONG_PROXY_ACCESS_LOG=/dev/stdout" \ -e "KONG_ADMIN_ACCESS_LOG=/dev/stdout" \ @@ -77,7 +115,7 @@ $ docker run -d --name kong \ If everything went well, and if you created your container with the default ports, Kong should be listening on your host's `8000` ([Proxy](https://docs.konghq.com/latest/configuration/#proxy_port)), `8443` ([Proxy SSL](https://docs.konghq.com/latest/configuration/#proxy_listen_ssl)), `8001` ([Admin API](https://docs.konghq.com/latest/configuration/#admin_listen)) and `8444` ([Admin API SSL](https://docs.konghq.com/latest/configuration/#admin_listen_ssl)) ports. -You can now read the docs at [docs.konghq.com](https://docs.konghq.com/) to learn more about Kong. +You can read the docs at [docs.konghq.com](https://docs.konghq.com/) to learn more about Kong. ## 3. Use Kong with a custom configuration (and a custom Cassandra/PostgreSQL cluster) @@ -85,7 +123,7 @@ You can override any property of the [Kong configuration file](https://docs.kong ```shell $ docker run -d --name kong \ - -e "KONG_DATABASE=postgres" + -e "KONG_DATABASE=postgres" \ -e "KONG_PG_HOST=kong-database" \ -e "KONG_LOG_LEVEL=info" \ -e "KONG_CUSTOM_PLUGINS=helloworld" \ @@ -100,7 +138,7 @@ $ docker run -d --name kong \ ## Reload Kong in a running container -If you change your custom configuration, you can reload Kong (without downtime) by issuing: +If you change your custom configuration, reload Kong (without downtime) by running: ```shell $ docker exec -it kong kong reload @@ -110,11 +148,4 @@ This will run the [`kong reload`](https://docs.konghq.com/latest/cli/#reload) co # Kubernetes Ingress -Among the many deployment options [available](https://konghq.com/install), Kong also offers a [Kubernetes Ingress Controller](https://github.com/Kong/kubernetes-ingress-controller) ready to use in your K8S environment. - -# Service Mesh - -Since version 1.x you can run Kong in a Service Mesh deployment as a platform-agnostic sidecar proxy (including Kubernetes, but also on any other platform supported by Kong). To get started and learn more you can read the docs at: - -- [Streams and Service Mesh](https://docs.konghq.com/latest/streams-and-service-mesh/) -- [Kubernetes and Service Mesh](https://github.com/Kong/kong-mesh-dist-kubernetes) +Among the many deployment options [available](https://konghq.com/install), Kong also offers a [Kubernetes Ingress Controller](https://github.com/Kong/kubernetes-ingress-controller) ready to use in your K8s environment. diff --git a/lightstreamer/README.md b/lightstreamer/README.md index 5b95033e8427..2888a228efea 100644 --- a/lightstreamer/README.md +++ b/lightstreamer/README.md @@ -20,16 +20,20 @@ WARNING: [the Lightstreamer Server Development Team](https://github.com/Lightstreamer/Docker) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`6.0.3`, `6.0`](https://github.com/Lightstreamer/Docker/blob/eeab1ae534273b1b05c973e577a1f3eec8d58427/6.0/Dockerfile) -- [`6.1.0`, `6.1`, `6`](https://github.com/Lightstreamer/Docker/blob/eeab1ae534273b1b05c973e577a1f3eec8d58427/6.1/Dockerfile) -- [`7.0.3-jdk8-openjdk`, `7.0-jdk8-openjdk`, `7.0.3-jdk8`, `7.0-jdk8`](https://github.com/Lightstreamer/Docker/blob/4ffe8753677fe6d6fea3c0e8cdc44383b278a0b7/7.0/jdk8/Dockerfile) -- [`7.0.3-jdk11-openjdk`, `7.0-jdk11-openjdk`, `7.0.3-jdk11`, `7.0-jdk11`, `7.0.3`, `7.0`](https://github.com/Lightstreamer/Docker/blob/3efee7177cc5213bf17ad12ff1ba518f5b58c1f0/7.0/jdk11/Dockerfile) -- [`7.1.0-jdk8-openjdk`, `7.1-jdk8-openjdk`, `7-jdk8-openjdk`, `7.1.0-jdk8`, `7.1-jdk8`, `7-jdk8`](https://github.com/Lightstreamer/Docker/blob/45001c033ed1837a9374a9285b7d2e8acfee6dca/7.1/jdk8/Dockerfile) -- [`7.1.0-jdk11-openjdk`, `7.1-jdk11-openjdk`, `7-jdk11-openjdk`, `7.1.0-jdk11`, `7.1-jdk11`, `7-jdk11`, `7.1.0`, `7.1`, `7`, `latest`](https://github.com/Lightstreamer/Docker/blob/45001c033ed1837a9374a9285b7d2e8acfee6dca/7.1/jdk11/Dockerfile) +- [`6.0.3`, `6.0`](https://github.com/Lightstreamer/Docker/blob/84e3f6588620183b48b7eb62a18070b793eff019/6.0/Dockerfile) +- [`6.1.0`, `6.1`, `6`](https://github.com/Lightstreamer/Docker/blob/84e3f6588620183b48b7eb62a18070b793eff019/6.1/Dockerfile) +- [`7.0.3-jdk8-temurin`, `7.0-jdk8-temurin`, `7.0.3-jdk8`, `7.0-jdk8`](https://github.com/Lightstreamer/Docker/blob/84e3f6588620183b48b7eb62a18070b793eff019/7.0/jdk8/Dockerfile) +- [`7.0.3-jdk11-temurin`, `7.0-jdk11-temurin`, `7.0.3-jdk11`, `7.0-jdk11`, `7.0.3`, `7.0`](https://github.com/Lightstreamer/Docker/blob/84e3f6588620183b48b7eb62a18070b793eff019/7.0/jdk11/Dockerfile) +- [`7.1.3-jdk8-temurin`, `7.1-jdk8-temurin`, `7.1.3-jdk8`, `7.1-jdk8`](https://github.com/Lightstreamer/Docker/blob/84e3f6588620183b48b7eb62a18070b793eff019/7.1/jdk8/Dockerfile) +- [`7.1.3-jdk11-temurin`, `7.1-jdk11-temurin`, `7.1.3-jdk11`, `7.1-jdk11`, `7.1.3`, `7.1`](https://github.com/Lightstreamer/Docker/blob/84e3f6588620183b48b7eb62a18070b793eff019/7.1/jdk11/Dockerfile) +- [`7.2.2-jdk8-temurin`, `7.2-jdk8-temurin`, `7.2.2-jdk8`, `7.2-jdk8`](https://github.com/Lightstreamer/Docker/blob/84e3f6588620183b48b7eb62a18070b793eff019/7.2/jdk8/Dockerfile) +- [`7.2.2-jdk11-temurin`, `7.2-jdk11-temurin`, `7.2.2-jdk11`, `7.2-jdk11`, `7.2.2`, `7.2`](https://github.com/Lightstreamer/Docker/blob/84e3f6588620183b48b7eb62a18070b793eff019/7.2/jdk11/Dockerfile) +- [`7.3.3-jdk8-temurin`, `7.3-jdk8-temurin`, `7-jdk8-temurin`, `7.3.3-jdk8`, `7.3-jdk8`, `7-jdk8`](https://github.com/Lightstreamer/Docker/blob/586d5c630b887344f19e93d5c9a5d63d82365309/7.3/jdk8/Dockerfile) +- [`7.3.3-jdk11-temurin`, `7.3-jdk11-temurin`, `7-jdk11-temurin`, `7.3.3-jdk11`, `7.3-jdk11`, `7-jdk11`, `7.3.3`, `7.3`, `7`, `latest`](https://github.com/Lightstreamer/Docker/blob/586d5c630b887344f19e93d5c9a5d63d82365309/7.3/jdk11/Dockerfile) # Quick reference (cont.) @@ -44,7 +48,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/lightstreamer`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Flightstreamer) + [official-images repo's `library/lightstreamer` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Flightstreamer) [official-images repo's `library/lightstreamer` file](https://github.com/docker-library/official-images/blob/master/library/lightstreamer) ([history](https://github.com/docker-library/official-images/commits/master/library/lightstreamer)) - **Source of this description**: @@ -56,7 +60,7 @@ Lightstreamer is a real-time messaging server optimized for the Internet. Blendi For more information and related downloads for Lightstreamer Server and other Lightstreamer products, please visit [www.lightstreamer.com](https://www.lightstreamer.com). -![logo](https://raw.githubusercontent.com/docker-library/docs/3a58248e2d43ced58c294b7980b55846a0ddc9e5/lightstreamer/logo.png) +![logo](https://raw.githubusercontent.com/docker-library/docs/e7ce6514d9289b897fcb5a4b73e9fafb5f761709/lightstreamer/logo.png) # How to use this image @@ -144,7 +148,6 @@ In this case, the `/path/to/my-adapters` folder has to be structured with the re +my_adapter_set_2 ... +my_adapter_set_N - ``` ### Building a new image diff --git a/lightstreamer/content.md b/lightstreamer/content.md index 2b322d6b99f6..93b07ec16e34 100644 --- a/lightstreamer/content.md +++ b/lightstreamer/content.md @@ -92,7 +92,6 @@ In this case, the `/path/to/my-adapters` folder has to be structured with the re +my_adapter_set_2 ... +my_adapter_set_N - ``` ### Building a new image diff --git a/lightstreamer/logo.png b/lightstreamer/logo.png index 09de2860bfa7275c5a1381cf4a36357c38dbdb1b..90a247a7c1f7cfad43fc379199c334e6f8d82ad4 100644 GIT binary patch literal 74477 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νsOzH~e$ZO1^B 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 P00000NkvXXu0mjfDn}@^ diff --git a/logstash/README.md b/logstash/README.md index e16344b38748..e75935250777 100644 --- a/logstash/README.md +++ b/logstash/README.md @@ -24,8 +24,8 @@ WARNING: # Supported tags and respective `Dockerfile` links -- [`7.7.0`](https://github.com/docker-library/logstash/blob/2b7e24559f1ec8105ce1f6d906eaa7b0d33775ff/7/Dockerfile) -- [`6.8.9`](https://github.com/docker-library/logstash/blob/a205d9b2634606f8fe9a45ed30655acf5d3ac929/6/Dockerfile) +- [`8.6.0`](https://github.com/docker-library/logstash/blob/4fabc6ecfad4f4d760c3f1a53cbcf9abca905543/8/Dockerfile) +- [`7.17.8`](https://github.com/docker-library/logstash/blob/e0450c99e0d55edb3a548a10466153bb42f6eb91/7/Dockerfile) # Quick reference (cont.) @@ -33,14 +33,14 @@ WARNING: For issues with Logstash Docker Image or Logstash: https://github.com/elastic/logstash/issues - **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) - [`amd64`](https://hub.docker.com/r/amd64/logstash/) + [`amd64`](https://hub.docker.com/r/amd64/logstash/), [`arm64v8`](https://hub.docker.com/r/arm64v8/logstash/) - **Published image artifact details**: [repo-info repo's `repos/logstash/` directory](https://github.com/docker-library/repo-info/blob/master/repos/logstash) ([history](https://github.com/docker-library/repo-info/commits/master/repos/logstash)) (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/logstash`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Flogstash) + [official-images repo's `library/logstash` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Flogstash) [official-images repo's `library/logstash` file](https://github.com/docker-library/official-images/blob/master/library/logstash) ([history](https://github.com/docker-library/official-images/commits/master/library/logstash)) - **Source of this description**: diff --git a/mageia/README.md b/mageia/README.md index bfa8c7fb26fc..86fee0e84983 100644 --- a/mageia/README.md +++ b/mageia/README.md @@ -20,11 +20,13 @@ WARNING: [Mageia Developers](https://github.com/juanluisbaptiste/docker-brew-mageia) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`7`, `latest`](https://github.com/juanluisbaptiste/docker-brew-mageia/blob/718477bf0e9298cf8ed9f08c5229713356e4728d/dist/7/x86_64/Dockerfile) +- [`8`, `latest`](https://github.com/juanluisbaptiste/docker-brew-mageia/blob/067e6df19c568e101a42dc71b77f6a2de5992c70/dist/8/x86_64/Dockerfile) +- [`7`](https://github.com/juanluisbaptiste/docker-brew-mageia/blob/067e6df19c568e101a42dc71b77f6a2de5992c70/dist/7/x86_64/Dockerfile) +- [`cauldron`](https://github.com/juanluisbaptiste/docker-brew-mageia/blob/067e6df19c568e101a42dc71b77f6a2de5992c70/dist/cauldron/x86_64/Dockerfile) # Quick reference (cont.) @@ -39,7 +41,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/mageia`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fmageia) + [official-images repo's `library/mageia` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fmageia) [official-images repo's `library/mageia` file](https://github.com/docker-library/official-images/blob/master/library/mageia) ([history](https://github.com/docker-library/official-images/commits/master/library/mageia)) - **Source of this description**: diff --git a/mariadb/README-short.txt b/mariadb/README-short.txt index 4d5ba71da8c0..fba6b84a2a13 100644 --- a/mariadb/README-short.txt +++ b/mariadb/README-short.txt @@ -1 +1 @@ -MariaDB is a community-developed fork of MySQL intended to remain free under the GNU GPL. +MariaDB Server is a high performing open source relational database, forked from MySQL. diff --git a/mariadb/README.md b/mariadb/README.md index b63af677bb27..d4bf2b45f2bc 100644 --- a/mariadb/README.md +++ b/mariadb/README.md @@ -17,33 +17,39 @@ WARNING: # Quick reference - **Maintained by**: - [the Docker Community](https://github.com/docker-library/mariadb) + [MariaDB developer community](https://github.com/MariaDB/mariadb-docker) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [Database Adminstrators (Stack Exchange)](https://dba.stackexchange.com/questions/tagged/docker+mariadb), [MariaDB Knowledge Base](https://mariadb.com/kb/en/docker-and-mariadb/) ([Ask a Question here](https://mariadb.com/kb/en/docker-and-mariadb/ask) available). + +Also see the ["Getting Help with MariaDB" article on the MariaDB Knowledge Base](https://mariadb.com/kb/en/getting-help-with-mariadb/). # Supported tags and respective `Dockerfile` links -- [`10.5.3-bionic`, `10.5-bionic`, `rc-bionic`, `10.5.3`, `10.5`, `rc`](https://github.com/docker-library/mariadb/blob/f2ba44905eb3aed53fca34536f05f109055d9bc2/10.5/Dockerfile) -- [`10.4.13-bionic`, `10.4-bionic`, `10-bionic`, `bionic`, `10.4.13`, `10.4`, `10`, `latest`](https://github.com/docker-library/mariadb/blob/f2ba44905eb3aed53fca34536f05f109055d9bc2/10.4/Dockerfile) -- [`10.3.23-bionic`, `10.3-bionic`, `10.3.23`, `10.3`](https://github.com/docker-library/mariadb/blob/f2ba44905eb3aed53fca34536f05f109055d9bc2/10.3/Dockerfile) -- [`10.2.32-bionic`, `10.2-bionic`, `10.2.32`, `10.2`](https://github.com/docker-library/mariadb/blob/f2ba44905eb3aed53fca34536f05f109055d9bc2/10.2/Dockerfile) -- [`10.1.45-bionic`, `10.1-bionic`, `10.1.45`, `10.1`](https://github.com/docker-library/mariadb/blob/f2ba44905eb3aed53fca34536f05f109055d9bc2/10.1/Dockerfile) +- [`10.11.1-rc-jammy`, `10.11-rc-jammy`, `10.11.1-rc`, `10.11-rc`](https://github.com/MariaDB/mariadb-docker/blob/56ef6d9f842e1ddf50e4359625a6e5cef1748c38/10.11/Dockerfile) +- [`10.10.2-jammy`, `10.10-jammy`, `10-jammy`, `jammy`, `10.10.2`, `10.10`, `10`, `latest`](https://github.com/MariaDB/mariadb-docker/blob/56ef6d9f842e1ddf50e4359625a6e5cef1748c38/10.10/Dockerfile) +- [`10.9.4-jammy`, `10.9-jammy`, `10.9.4`, `10.9`](https://github.com/MariaDB/mariadb-docker/blob/56ef6d9f842e1ddf50e4359625a6e5cef1748c38/10.9/Dockerfile) +- [`10.8.6-jammy`, `10.8-jammy`, `10.8.6`, `10.8`](https://github.com/MariaDB/mariadb-docker/blob/56ef6d9f842e1ddf50e4359625a6e5cef1748c38/10.8/Dockerfile) +- [`10.7.7-focal`, `10.7-focal`, `10.7.7`, `10.7`](https://github.com/MariaDB/mariadb-docker/blob/56ef6d9f842e1ddf50e4359625a6e5cef1748c38/10.7/Dockerfile) +- [`10.6.11-focal`, `10.6-focal`, `10.6.11`, `10.6`](https://github.com/MariaDB/mariadb-docker/blob/56ef6d9f842e1ddf50e4359625a6e5cef1748c38/10.6/Dockerfile) +- [`10.5.18-focal`, `10.5-focal`, `10.5.18`, `10.5`](https://github.com/MariaDB/mariadb-docker/blob/56ef6d9f842e1ddf50e4359625a6e5cef1748c38/10.5/Dockerfile) +- [`10.4.27-focal`, `10.4-focal`, `10.4.27`, `10.4`](https://github.com/MariaDB/mariadb-docker/blob/56ef6d9f842e1ddf50e4359625a6e5cef1748c38/10.4/Dockerfile) +- [`10.3.37-focal`, `10.3-focal`, `10.3.37`, `10.3`](https://github.com/MariaDB/mariadb-docker/blob/56ef6d9f842e1ddf50e4359625a6e5cef1748c38/10.3/Dockerfile) # Quick reference (cont.) - **Where to file issues**: - [https://github.com/docker-library/mariadb/issues](https://github.com/docker-library/mariadb/issues) + Issues can be filed on [https://jira.mariadb.org/](https://jira.mariadb.org/) under the "MDEV" Project and "Docker" Component, or on [GitHub](https://github.com/MariaDB/mariadb-docker/issues) - **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) - [`amd64`](https://hub.docker.com/r/amd64/mariadb/), [`arm64v8`](https://hub.docker.com/r/arm64v8/mariadb/), [`ppc64le`](https://hub.docker.com/r/ppc64le/mariadb/) + [`amd64`](https://hub.docker.com/r/amd64/mariadb/), [`arm64v8`](https://hub.docker.com/r/arm64v8/mariadb/), [`ppc64le`](https://hub.docker.com/r/ppc64le/mariadb/), [`s390x`](https://hub.docker.com/r/s390x/mariadb/) - **Published image artifact details**: [repo-info repo's `repos/mariadb/` directory](https://github.com/docker-library/repo-info/blob/master/repos/mariadb) ([history](https://github.com/docker-library/repo-info/commits/master/repos/mariadb)) (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/mariadb`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fmariadb) + [official-images repo's `library/mariadb` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fmariadb) [official-images repo's `library/mariadb` file](https://github.com/docker-library/official-images/blob/master/library/mariadb) ([history](https://github.com/docker-library/official-images/commits/master/library/mariadb)) - **Source of this description**: @@ -51,32 +57,37 @@ WARNING: # What is MariaDB? -MariaDB is a community-developed fork of the MySQL relational database management system intended to remain free under the GNU GPL. Being a fork of a leading open source software system, it is notable for being led by the original developers of MySQL, who forked it due to concerns over its acquisition by Oracle. Contributors are required to share their copyright with the MariaDB Foundation. - -The intent is also to maintain high compatibility with MySQL, ensuring a "drop-in" replacement capability with library binary equivalency and exact matching with MySQL APIs and commands. It includes the XtraDB storage engine for replacing InnoDB, as well as a new storage engine, Aria, that intends to be both a transactional and non-transactional engine perhaps even included in future versions of MySQL. +MariaDB Server is one of the most popular database servers in the world. It’s made by the original developers of MySQL and guaranteed to stay open source. Notable users include Wikipedia, DBS Bank, and ServiceNow. -> [wikipedia.org/wiki/MariaDB](https://en.wikipedia.org/wiki/MariaDB) +The intent is also to maintain high compatibility with MySQL, ensuring a library binary equivalency and exact matching with MySQL APIs and commands. MariaDB developers continue to develop new features and improve performance to better serve its users. -![logo](https://raw.githubusercontent.com/docker-library/docs/74e3b3d4d60389208732dbd2c95145868111d959/mariadb/logo.png) +![logo](https://raw.githubusercontent.com/docker-library/docs/fe985dcb24154456254e252d1fa4a2b6b656ee80/mariadb/logo.png) # How to use this image ## Start a `mariadb` server instance -Starting a MariaDB instance is simple: +Starting a MariaDB instance with the latest version is simple: ```console -$ docker run --name some-mariadb -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mariadb:tag +$ docker run --detach --name some-mariadb --env MARIADB_USER=example-user --env MARIADB_PASSWORD=my_cool_secret --env MARIADB_ROOT_PASSWORD=my-secret-pw mariadb:latest ``` -... where `some-mariadb` is the name you want to assign to your container, `my-secret-pw` is the password to be set for the MySQL root user and `tag` is the tag specifying the MySQL version you want. See the list above for relevant tags. +or: -## Connect to MariaDB from the MySQL command line client +```console +$ docker network create some-network +$ docker run --detach --network some-network --name some-mariadb --env MARIADB_USER=example-user --env MARIADB_PASSWORD=my_cool_secret --env MARIADB_ROOT_PASSWORD=my-secret-pw mariadb:latest +``` -The following command starts another `mariadb` container instance and runs the `mysql` command line client against your original `mariadb` container, allowing you to execute SQL statements against your database instance: +... where `some-network` is a newly created network (other than `bridge` as the default network), `some-mariadb` is the name you want to assign to your container, `my-secret-pw` is the password to be set for the MariaDB root user. See the list above for relevant tags to match your needs and environment. + +## Connect to MariaDB from the MySQL/MariaDB command line client + +The following command starts another `mariadb` container instance and runs the `mariadb` command line client against your original `mariadb` container, allowing you to execute SQL statements against your database instance: ```console -$ docker run -it --network some-network --rm mariadb mysql -hsome-mariadb -uexample-user -p +$ docker run -it --network some-network --rm mariadb mariadb -hsome-mariadb -uexample-user -p ``` ... where `some-mariadb` is the name of your original `mariadb` container (connected to the `some-network` Docker network). @@ -84,10 +95,18 @@ $ docker run -it --network some-network --rm mariadb mysql -hsome-mariadb -uexam This image can also be used as a client for non-Docker or remote instances: ```console -$ docker run -it --rm mariadb mysql -hsome.mysql.host -usome-mysql-user -p +$ docker run -it --rm mariadb mariadb -h -u example-user -p +``` + +That will give you a standard MariaDB prompt. You can test it with: + +```console +MariaDB [(none)]> SELECT VERSION(); ``` -More information about the MySQL command line client can be found in the [MySQL documentation](http://dev.mysql.com/doc/en/mysql.html) +... which should give you the version. You can then use `exit` to leave the MariaDB command line client and the client container. + +More information about the MariaDB command-line client can be found in the [MariaDB Knowledge Base](https://mariadb.com/kb/en/mysql-command-line-client/) ## ... via [`docker stack deploy`](https://docs.docker.com/engine/reference/commandline/stack_deploy/) or [`docker-compose`](https://github.com/docker/compose) @@ -103,7 +122,7 @@ services: image: mariadb restart: always environment: - MYSQL_ROOT_PASSWORD: example + MARIADB_ROOT_PASSWORD: example adminer: image: adminer @@ -112,11 +131,11 @@ services: - 8080:8080 ``` -[![Try in PWD](https://github.com/play-with-docker/stacks/raw/cff22438cb4195ace27f9b15784bbb497047afa7/assets/images/button.png)](http://play-with-docker.com?stack=https://raw.githubusercontent.com/docker-library/docs/9efeec18b6b2ed232cf0fbd3914b6211e16e242c/mariadb/stack.yml) +[![Try in PWD](https://github.com/play-with-docker/stacks/raw/cff22438cb4195ace27f9b15784bbb497047afa7/assets/images/button.png)](http://play-with-docker.com?stack=https://raw.githubusercontent.com/docker-library/docs/cf3a7fba4dfd134e3f7f5921b580c71e0fd8bc24/mariadb/stack.yml) Run `docker stack deploy -c stack.yml mariadb` (or `docker-compose -f stack.yml up`), wait for it to initialize completely, and visit `http://swarm-ip:8080`, `http://localhost:8080`, or `http://host-ip:8080` (as appropriate). -## Container shell access and viewing MySQL logs +## Container shell access and viewing MariaDB logs The `docker exec` command allows you to run commands inside a Docker container. The following command line will give you a bash shell inside your `mariadb` container: @@ -130,71 +149,104 @@ The log is available through Docker's container log: $ docker logs some-mariadb ``` -## Using a custom MySQL configuration file +## Using a custom MariaDB configuration file + +Custom configuration files should end in `.cnf` and be mounted at the directory `/etc/mysql/conf.d`. These files should contain the minimal changes from the MariaDB workload required for your application/environment. A MariaDB configuration file will have a `[mariadb]` group followed by `variable` = `value` settings per [Setting Server System Variables](https://mariadb.com/kb/en/server-system-variables/#setting-server-system-variables) or [option-prefix-variable](https://mariadb.com/kb/en/configuring-mariadb-with-option-files/#option-prefixes). + +The `mariadb` image configuration contains the Ubuntu MariaDB variables with two custom changes for the container: + + [host-cache-size=0](https://mariadb.com/kb/en/server-system-variables/#host_cache_size) + [skip-name-resolve](https://mariadb.com/kb/en/server-system-variables/#skip_name_resolve) -The startup configuration is specified in the file `/etc/mysql/my.cnf`, and that file in turn includes any files found in the `/etc/mysql/conf.d` directory that end with `.cnf`. Settings in files in this directory will augment and/or override settings in `/etc/mysql/my.cnf`. If you want to use a customized MySQL configuration, you can create your alternative configuration file in a directory on the host machine and then mount that directory location as `/etc/mysql/conf.d` inside the `mariadb` container. +These disable the authentication of `user@hostname` users. To re-enable the `skip-name-resolve` use `disable-skip-name-resolve` as variable or arguement. When enabled, the `host-cache-size` should be sufficient for the number of containers connecting to the `mariadb`. -If `/my/custom/config-file.cnf` is the path and name of your custom configuration file, you can start your `mariadb` container like this (note that only the directory path of the custom config file is used in this command): +To view the resulting configuration of your `mariadb` container: ```console -$ docker run --name some-mariadb -v /my/custom:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mariadb:tag +$ docker run --name some-mariadb -v /my/custom:/etc/mysql/conf.d --rm mariadb:latest my_print_defaults --mysqld ``` -This will start a new container `some-mariadb` where the MariaDB instance uses the combined startup settings from `/etc/mysql/my.cnf` and `/etc/mysql/conf.d/config-file.cnf`, with settings from the latter taking precedence. - ### Configuration without a `cnf` file -Many configuration options can be passed as flags to `mysqld`. This will give you the flexibility to customize the container without needing a `cnf` file. For example, if you want to change the default encoding and collation for all tables to use UTF-8 (`utf8mb4`) just run the following: +Many configuration options can be passed as flags to `mariadbd`. This will give you the flexibility to customize the container without needing a `cnf` file. For example, if you want to run on port 3808 just run the following: ```console -$ docker run --name some-mariadb -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mariadb:tag --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci +$ docker run --name some-mariadb -e MARIADB_ROOT_PASSWORD=my-secret-pw -d mariadb:latest --port 3808 ``` If you would like to see a complete list of available options, just run: ```console -$ docker run -it --rm mariadb:tag --verbose --help +$ docker run -it --rm mariadb:latest --verbose --help ``` ## Environment Variables -When you start the `mariadb` image, you can adjust the configuration of the MariaDB instance by passing one or more environment variables on the `docker run` command line. Do note that none of the variables below will have any effect if you start the container with a data directory that already contains a database: any pre-existing database will always be left untouched on container startup. +When you start the `mariadb` image, you can adjust the initialization of the MariaDB instance by passing one or more environment variables on the `docker run` command line. Do note that none of the variables below will have any effect if you start the container with a data directory that already contains a database: any pre-existing database will always be left untouched on container startup. + +From tag 10.2.38, 10.3.29, 10.4.19, 10.5.10 onwards, and all 10.6 and later tags, the `MARIADB_*` equivalent variables are provided. `MARIADB_*` variants will always be used in preference to `MYSQL_*` variants. + +One of `MARIADB_RANDOM_ROOT_PASSWORD`, `MARIADB_ROOT_PASSWORD_HASH`, `MARIADB_ROOT_PASSWORD` or `MARIADB_ALLOW_EMPTY_ROOT_PASSWORD` (or equivalents, including `*_FILE`), is required. The other environment variables are optional. + +### `MARIADB_ROOT_PASSWORD` / `MYSQL_ROOT_PASSWORD`, `MARIADB_ROOT_PASSWORD_HASH` + +This specifies the password that will be set for the MariaDB `root` superuser account. In the above example, it was set to `my-secret-pw`. + +In order to have no plaintext secret in the deployment, `MARIADB_ROOT_PASSWORD_HASH` can be used as it is just the hash of the password. The hash can be generated with `SELECT PASSWORD('thepassword')` as a SQL query. + +### `MARIADB_ALLOW_EMPTY_ROOT_PASSWORD` / `MYSQL_ALLOW_EMPTY_PASSWORD` + +Set to a non-empty value, like `yes`, to allow the container to be started with a blank password for the root user. *NOTE*: Setting this variable to `yes` is not recommended unless you really know what you are doing, since this will leave your MariaDB instance completely unprotected, allowing anyone to gain complete superuser access. + +### `MARIADB_RANDOM_ROOT_PASSWORD` / `MYSQL_RANDOM_ROOT_PASSWORD` + +Set to a non-empty value, like `yes`, to generate a random initial password for the root user. The generated root password will be printed to stdout (`GENERATED ROOT PASSWORD: .....`). + +### `MARIADB_ROOT_HOST` / `MYSQL_ROOT_HOST` + +This is the hostname part of the root user created. By default this is `%`, however it can be set to any default [MariaDB allowed hostname component](https://mariadb.com/kb/en/create-user/#host-name-component). Setting this to `localhost` will prevent any root user being accessible except via the unix socket. + +### `MARIADB_MYSQL_LOCALHOST_USER` / `MARIADB_MYSQL_LOCALHOST_GRANTS` + +Set `MARIADB_MYSQL_LOCALHOST_USER` to a non-empty value to create the `mysql@locahost` database user. This user is especially useful for a variety of health checks and backup scripts. -### `MYSQL_ROOT_PASSWORD` +The `mysql@localhost` user gets [USAGE](https://mariadb.com/kb/en/grant/#the-usage-privilege) privileges by default. If more access is required, additional [global privileges](https://mariadb.com/kb/en/grant/#global-privileges) in the form of a comma separated list can be provided. If you are sharing a volume containing MariaDB's unix socket (`/var/run/mysqld` by default), privileges beyond `USAGE` can result in confidentiality, integrity and availability risks, so use a minimal set. See the example below on using Mariabackup. The `healthcheck.sh` script also documents the required privileges for each health check test. -This variable is mandatory and specifies the password that will be set for the MariaDB `root` superuser account. In the above example, it was set to `my-secret-pw`. +### `MARIADB_DATABASE` / `MYSQL_DATABASE` -### `MYSQL_DATABASE` +This variable allows you to specify the name of a database to be created on image startup. -This variable is optional and allows you to specify the name of a database to be created on image startup. If a user/password was supplied (see below) then that user will be granted superuser access ([corresponding to `GRANT ALL`](http://dev.mysql.com/doc/en/adding-users.html)) to this database. +### `MARIADB_USER` / `MYSQL_USER`, `MARIADB_PASSWORD` / `MYSQL_PASSWORD`, `MARIADB_PASSWORD_HASH` -### `MYSQL_USER`, `MYSQL_PASSWORD` +These are used in conjunction to create a new user and to set that user's password. Both user and password variables are required for a user to be created. This user will be granted all access ([corresponding to `GRANT ALL`](https://mariadb.com/kb/en/grant/#the-all-privileges-privilege)) to the `MARIADB_DATABASE` database. -These variables are optional, used in conjunction to create a new user and to set that user's password. This user will be granted superuser permissions (see above) for the database specified by the `MYSQL_DATABASE` variable. Both variables are required for a user to be created. +See `MARIADB_ROOT_PASSWORD_HASH` above for how to get a password hash for `MARIADB_PASSWORD_HASH`. -Do note that there is no need to use this mechanism to create the root superuser, that user gets created by default with the password specified by the `MYSQL_ROOT_PASSWORD` variable. +Do note that there is no need to use this mechanism to create the root superuser, that user gets created by default with the password specified by the `MARIADB_ROOT_PASSWORD*` variable. -### `MYSQL_ALLOW_EMPTY_PASSWORD` +### `MARIADB_INITDB_SKIP_TZINFO` / `MYSQL_INITDB_SKIP_TZINFO` -This is an optional variable. Set to `yes` to allow the container to be started with a blank password for the root user. *NOTE*: Setting this variable to `yes` is not recommended unless you really know what you are doing, since this will leave your MariaDB instance completely unprotected, allowing anyone to gain complete superuser access. +By default, the entrypoint script automatically loads the timezone data needed for the `CONVERT_TZ()` function. If it is not needed, any non-empty value disables timezone loading. -### `MYSQL_RANDOM_ROOT_PASSWORD` +### `MARIADB_AUTO_UPGRADE` / `MARIADB_DISABLE_UPGRADE_BACKUP` -This is an optional variable. Set to `yes` to generate a random initial password for the root user (using `pwgen`). The generated root password will be printed to stdout (`GENERATED ROOT PASSWORD: .....`). +Set `MARIADB_AUTO_UPGRADE` to a non-empty value to have the entrypoint check whether `mysql_upgrade`/`mariadb-upgrade` needs to run, and if so, run the upgrade before starting the MariaDB server. + +Before the upgrade, a backup of the system database is created in the top of the datadir with the name `system_mysql_backup_*.sql.zst`. This backup process can be disabled with by setting `MARIADB_DISABLE_UPGRADE_BACKUP` to a non-empty value. ## Docker Secrets 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/` files. For example: ```console -$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD_FILE=/run/secrets/mysql-root -d mariadb:tag +$ docker run --name some-mysql -e MARIADB_ROOT_PASSWORD_FILE=/run/secrets/mysql-root -d mariadb:latest ``` -Currently, this is only supported for `MYSQL_ROOT_PASSWORD`, `MYSQL_ROOT_HOST`, `MYSQL_DATABASE`, `MYSQL_USER`, and `MYSQL_PASSWORD`. +Currently, this is only supported for `MARIADB_ROOT_PASSWORD`, `MARIADB_ROOT_PASSWORD_HASH`, `MARIADB_ROOT_HOST`, `MARIADB_DATABASE`, `MARIADB_USER`, `MARIADB_PASSWORD` and `MARIADB_PASSWORD_HASH` (and `MYSQL_*` equivalents of these). # Initializing a fresh instance -When a container is started for the first time, a new database with the specified name will be created and initialized with the provided configuration variables. Furthermore, it will execute files with extensions `.sh`, `.sql` and `.sql.gz` that are found in `/docker-entrypoint-initdb.d`. Files will be executed in alphabetical order. You can easily populate your `mariadb` services by [mounting a SQL dump into that directory](https://docs.docker.com/engine/tutorials/dockervolumes/#mount-a-host-file-as-a-data-volume) and provide [custom images](https://docs.docker.com/reference/builder/) with contributed data. SQL files will be imported by default to the database specified by the `MYSQL_DATABASE` variable. +When a container is started for the first time, a new database with the specified name will be created and initialized with the provided configuration variables. Furthermore, it will execute files with extensions `.sh`, `.sql`, `.sql.gz`, `.sql.xz` and `.sql.zst` that are found in `/docker-entrypoint-initdb.d`. Files will be executed in alphabetical order. `.sh` files without file execute permission are sourced rather than executed. You can easily populate your `mariadb` services by [mounting a SQL dump into that directory](https://docs.docker.com/engine/tutorials/dockervolumes/#mount-a-host-file-as-a-data-volume) and provide [custom images](https://docs.docker.com/reference/builder/) with contributed data. SQL files will be imported by default to the database specified by the `MARIADB_DATABASE` / `MYSQL_DATABASE` variable. # Caveats @@ -211,35 +263,186 @@ The Docker documentation is a good starting point for understanding the differen 2. Start your `mariadb` container like this: ```console - $ docker run --name some-mariadb -v /my/own/datadir:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mariadb:tag + $ docker run --name some-mariadb -v /my/own/datadir:/var/lib/mysql -e MARIADB_ROOT_PASSWORD=my-secret-pw -d mariadb:latest ``` -The `-v /my/own/datadir:/var/lib/mysql` part of the command mounts the `/my/own/datadir` directory from the underlying host system as `/var/lib/mysql` inside the container, where MySQL by default will write its data files. +The `-v /my/own/datadir:/var/lib/mysql` part of the command mounts the `/my/own/datadir` directory from the underlying host system as `/var/lib/mysql` inside the container, where MariaDB by default will write its data files. -## No connections until MySQL init completes +## No connections until MariaDB init completes If there is no database initialized when the container starts, then a default database will be created. While this is the expected behavior, this means that it will not accept incoming connections until such initialization completes. This may cause issues when using automation tools, such as `docker-compose`, which start several containers simultaneously. +## Health/Liveness/Readiness Checking + +See [the "Official Images" FAQ](https://github.com/docker-library/faq#healthcheck) for why there is no default `HEALTHCHECK` directive. However, you can use the `/usr/local/bin/healthcheck.sh` script to choose from a (non-exhaustive) list of tests to check for whatever you consider health/liveness/readiness. Refer to the script's sources to learn about how to use it and which exact tests are provided. + ## Usage against an existing database -If you start your `mariadb` container instance with a data directory that already contains a database (specifically, a `mysql` subdirectory), the `$MYSQL_ROOT_PASSWORD` variable should be omitted from the run command line; it will in any case be ignored, and the pre-existing database will not be changed in any way. +If you start your `mariadb` container instance with a data directory that already contains a database (specifically, a `mysql` subdirectory), no environment variables that control initialization will be needed or examined, and no pre-existing databases will be changed. The only exception is the non-default `MARIADB_AUTO_UPGRADE` environment variable, that might cause `mysql_upgrade`/`mariadb-upgrade` to run, which might change the system tables. ## Creating database dumps Most of the normal tools will work, although their usage might be a little convoluted in some cases to ensure they have access to the `mysqld` server. A simple way to ensure this is to use `docker exec` and run the tool from the same container, similar to the following: ```console -$ docker exec some-mariadb sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > /some/path/on/your/host/all-databases.sql +$ docker exec some-mariadb sh -c 'exec mariadb-dump --all-databases -uroot -p"$MARIADB_ROOT_PASSWORD"' > /some/path/on/your/host/all-databases.sql ``` ## Restoring data from dump files -For restoring data. You can use `docker exec` command with `-i` flag, similar to the following: +For restoring data. You can use the `docker exec` command with the `-i` flag, similar to the following: + +```console +$ docker exec -i some-mariadb sh -c 'exec mariadb -uroot -p"$MARIADB_ROOT_PASSWORD"' < /some/path/on/your/host/all-databases.sql +``` + +If one or more databases, but neither `--all-databases` nor the `mysql` database, were dumped, these databases can be restored by placing the resulting sql file in the `/docker-entrypoint-initdb.d` directory. + +## Creating backups with Mariabackup + +To perform a backup using [Mariabackup](https://mariadb.com/kb/en/mariabackup/), a second container is started that shares the original container's data directory. An additional volume for the backup needs to be included in the second backup instance. Authentication against the MariaDB database instance is required to successfully complete the backup. In the example below a `mysql@localhost` user is used with the MariaDB server's unix socket shared with the backup container. + +```console +$ docker volume create some-mariadb-socket +$ docker run --name some-mariadb -v /my/own/datadir:/var/lib/mysql -v some-mariadb-socket:/var/run/mysqld -e MARIADB_MYSQL_LOCALHOST_USER=1 -e MARIADB_MYSQL_LOCALHOST_GRANTS="RELOAD, PROCESS, LOCK TABLES, BINLOG MONITOR" -e MARIADB_ROOT_PASSWORD=my-secret-pw -d mariadb:latest +``` + +Note: Privileges listed here are for 10.5+. For an exact list, see [the Knowledge Base documentation for Mariabackup: Authentication and Privileges](https://mariadb.com/kb/en/mariabackup-overview/#authentication-and-privileges). + +Mariabackup will run as the `mysql` user in the container, so the permissions on `/backup` will need to ensure that it can be written to by this user: ```console -$ docker exec -i some-mariadb sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD"' < /some/path/on/your/host/all-databases.sql +$ docker volume create some-mariadb-backup +$ docker run --rm some-mariadb-backup -v some-mariadb-backup:/backup mariadb:latest chown mysql: /backup ``` +To perform the backup: + +```console +$ docker run --user mysql -v some-mariadb-socket:/var/run/mysqld -v some-mariadb-backup:/backup -v /my/own/datadir:/var/lib/mysql --rm mariadb:latest mariabackup --backup --target-dir=/backup +``` + +## Restore backups with Mariabackup + +These steps restore the backup made with Mariabackup. + +At some point before doing the restore, the backup needs to be prepared. Perform the prepare like this: + +```console +$ docker run --user mysql --rm -v some-mariadb-backup:/backup mariadb:latest mariabackup --prepare --target-dir=/backup +``` + +Now that the image is prepared, start the container with both the data and the backup volumes and restore the backup: + +```console +$ docker run --user mysql --rm -v /my/new/datadir:/var/lib/mysql -v some-mariadb-backup:/backup mariadb:latest mariabackup --copy-back --target-dir=/backup +``` + +With `/my/new/datadir` containing the restored backup, start normally as this is an initialized data directory: + +```console +$ docker run --name some-mariadb -v /my/new/datadir:/var/lib/mysql -d mariadb:latest +``` + +For further information on Mariabackup, see the [Mariabackup Knowledge Base](https://mariadb.com/kb/en/mariabackup-overview/). + +## How to reset root and user passwords + +If you have an existing data directory and wish to reset the root and user passwords, and to create a database on which the user can fully modify, perform the following steps. + +First create a `passwordreset.sql` file: + +```text +CREATE USER IF NOT EXISTS root@localhost IDENTIFIED BY 'thisismyrootpassword'; +SET PASSWORD FOR root@localhost = PASSWORD('thisismyrootpassword'); +GRANT ALL ON *.* TO root@localhost WITH GRANT OPTION; +CREATE USER IF NOT EXISTS root@'%' IDENTIFIED BY 'thisismyrootpassword'; +SET PASSWORD FOR root@'%' = PASSWORD('thisismyrootpassword'); +GRANT ALL ON *.* TO root@'%' WITH GRANT OPTION; +CREATE USER IF NOT EXISTS myuser@'%' IDENTIFIED BY 'thisismyuserpassword'; +SET PASSWORD FOR myuser@'%' = PASSWORD('thisismyuserpassword'); +CREATE DATABASE IF NOT EXISTS databasename; +GRANT ALL ON databasename.* TO myuser@'%'; +``` + +Adjust `myuser`, `databasename` and passwords as needed. + +Then: + +```console +$ docker run --rm -v /my/own/datadir:/var/lib/mysql -v /my/own/passwordreset.sql:/passwordreset.sql:z mariadb:latest --init-file=/passwordreset.sql +``` + +On restarting the MariaDB container on this `/my/own/datadir`, the `root` and `myuser` passwords will be reset. + +## How to install MariaDB plugins + +MariaDB has many plugins, most are not enabled by default, some are in the mariadb container, others need to be installed from additional packages. + +The following methods summarize the [MariaDB Blog article - Installing plugins in the MariaDB Docker Library Container](https://mariadb.org/installing-plugins-in-the-mariadb-docker-library-container/) on this topic. + +### Which plugins does the container contain? + +To see which plugins are available in the mariadb: + +```console +$ docker run --rm mariadb:latest ls -C /usr/lib/mysql/plugin +``` + +### Enabling a plugin using flags + +Using the `--plugin-load-add` flag with the plugin name (can be repeated), the plugins will be loaded and ready when the container is started: + +For example enable the `simple\_password\_check` plugin: + +```console +$ docker run --name some-mariadb -e MARIADB_ROOT_PASSWORD=my-secret-pw --network=host -d mariadb:latest --plugin-load-add=simple_password_check +``` + +### Enabling a plugin in the configuration files + +`plugin-load-add` can be used as a configuration option to load plugins. The example below load the [FederatedX Storage Engine](https://mariadb.com/kb/en/federatedx-storage-engine/). + +```console +$ printf "[mariadb]\nplugin-load-add=ha_federatedx\n" > /my/custom/federatedx.conf +$ docker run --name some-mariadb -v /my/custom:/etc/mysql/conf.d -e MARIADB_ROOT_PASSWORD=my-secret-pw -d mariadb:latest +``` + +### Install a plugin using SQL in /docker-entrypoint-initdb.d + +[`INSTALL SONAME`](https://mariadb.com/kb/en/install-soname/) can be used to install a plugin as part of the database initialization. + +Create the SQL file used in initialization: + +```console +$ echo 'INSTALL SONAME "disks";' > my_initdb/disks.sql +``` + +In this case the `my\_initdb` is a `/docker-entrypoint-initdb.d` directory per "Initializing a fresh instance" section above. + +### Identifing additional plugins in additional packages + +A number of plugins are in separate packages to reduce their installation size. The package names of MariaDB created plugins can be determined using the following command: + +```console +$ docker run --rm mariadb:latest sh -c 'apt-get update -qq && apt-cache search mariadb-plugin' +``` + +### Creating a image with plugins from additional packages + +A new image needs to be created when using additional packages. The mariadb image can be used as a base however: + +In the following the [CONNECT Storage Engine](https://mariadb.com/kb/en/connect/) is installed: + +```dockerfile +FROM mariadb:latest +RUN apt-get update && \ + apt-get install mariadb-plugin-connect -y && \ + rm -rf /var/lib/apt/lists/* +``` + +Installing plugins from packages creates a configuration file in the directory `/etc/mysql/mariadb.conf.d/` that loads the plugin on startup. + # License View [license information](https://mariadb.com/kb/en/library/licensing-faq/) for the software contained in this image. diff --git a/mariadb/content.md b/mariadb/content.md index e9e205437b9c..dd8746491a77 100644 --- a/mariadb/content.md +++ b/mariadb/content.md @@ -1,10 +1,8 @@ # What is MariaDB? -MariaDB is a community-developed fork of the MySQL relational database management system intended to remain free under the GNU GPL. Being a fork of a leading open source software system, it is notable for being led by the original developers of MySQL, who forked it due to concerns over its acquisition by Oracle. Contributors are required to share their copyright with the MariaDB Foundation. +MariaDB Server is one of the most popular database servers in the world. It’s made by the original developers of MySQL and guaranteed to stay open source. Notable users include Wikipedia, DBS Bank, and ServiceNow. -The intent is also to maintain high compatibility with MySQL, ensuring a "drop-in" replacement capability with library binary equivalency and exact matching with MySQL APIs and commands. It includes the XtraDB storage engine for replacing InnoDB, as well as a new storage engine, Aria, that intends to be both a transactional and non-transactional engine perhaps even included in future versions of MySQL. - -> [wikipedia.org/wiki/MariaDB](https://en.wikipedia.org/wiki/MariaDB) +The intent is also to maintain high compatibility with MySQL, ensuring a library binary equivalency and exact matching with MySQL APIs and commands. MariaDB developers continue to develop new features and improve performance to better serve its users. %%LOGO%% @@ -12,20 +10,27 @@ The intent is also to maintain high compatibility with MySQL, ensuring a "drop-i ## Start a `%%IMAGE%%` server instance -Starting a MariaDB instance is simple: +Starting a MariaDB instance with the latest version is simple: ```console -$ docker run --name some-%%REPO%% -e MYSQL_ROOT_PASSWORD=my-secret-pw -d %%IMAGE%%:tag +$ docker run --detach --name some-%%REPO%% --env MARIADB_USER=example-user --env MARIADB_PASSWORD=my_cool_secret --env MARIADB_ROOT_PASSWORD=my-secret-pw %%IMAGE%%:latest ``` -... where `some-%%REPO%%` is the name you want to assign to your container, `my-secret-pw` is the password to be set for the MySQL root user and `tag` is the tag specifying the MySQL version you want. See the list above for relevant tags. +or: + +```console +$ docker network create some-network +$ docker run --detach --network some-network --name some-%%REPO%% --env MARIADB_USER=example-user --env MARIADB_PASSWORD=my_cool_secret --env MARIADB_ROOT_PASSWORD=my-secret-pw %%IMAGE%%:latest +``` -## Connect to MariaDB from the MySQL command line client +... where `some-network` is a newly created network (other than `bridge` as the default network), `some-%%REPO%%` is the name you want to assign to your container, `my-secret-pw` is the password to be set for the MariaDB root user. See the list above for relevant tags to match your needs and environment. -The following command starts another `%%IMAGE%%` container instance and runs the `mysql` command line client against your original `%%IMAGE%%` container, allowing you to execute SQL statements against your database instance: +## Connect to MariaDB from the MySQL/MariaDB command line client + +The following command starts another `%%IMAGE%%` container instance and runs the `mariadb` command line client against your original `%%IMAGE%%` container, allowing you to execute SQL statements against your database instance: ```console -$ docker run -it --network some-network --rm %%IMAGE%% mysql -hsome-%%REPO%% -uexample-user -p +$ docker run -it --network some-network --rm %%IMAGE%% mariadb -hsome-%%REPO%% -uexample-user -p ``` ... where `some-%%REPO%%` is the name of your original `%%IMAGE%%` container (connected to the `some-network` Docker network). @@ -33,16 +38,24 @@ $ docker run -it --network some-network --rm %%IMAGE%% mysql -hsome-%%REPO%% -ue This image can also be used as a client for non-Docker or remote instances: ```console -$ docker run -it --rm %%IMAGE%% mysql -hsome.mysql.host -usome-mysql-user -p +$ docker run -it --rm %%IMAGE%% mariadb -h -u example-user -p +``` + +That will give you a standard MariaDB prompt. You can test it with: + +```console +MariaDB [(none)]> SELECT VERSION(); ``` -More information about the MySQL command line client can be found in the [MySQL documentation](http://dev.mysql.com/doc/en/mysql.html) +... which should give you the version. You can then use `exit` to leave the MariaDB command line client and the client container. + +More information about the MariaDB command-line client can be found in the [MariaDB Knowledge Base](https://mariadb.com/kb/en/mysql-command-line-client/) ## %%STACK%% Run `docker stack deploy -c stack.yml %%REPO%%` (or `docker-compose -f stack.yml up`), wait for it to initialize completely, and visit `http://swarm-ip:8080`, `http://localhost:8080`, or `http://host-ip:8080` (as appropriate). -## Container shell access and viewing MySQL logs +## Container shell access and viewing MariaDB logs The `docker exec` command allows you to run commands inside a Docker container. The following command line will give you a bash shell inside your `%%IMAGE%%` container: @@ -56,71 +69,104 @@ The log is available through Docker's container log: $ docker logs some-%%REPO%% ``` -## Using a custom MySQL configuration file +## Using a custom MariaDB configuration file + +Custom configuration files should end in `.cnf` and be mounted at the directory `/etc/mysql/conf.d`. These files should contain the minimal changes from the MariaDB workload required for your application/environment. A MariaDB configuration file will have a `[mariadb]` group followed by `variable` = `value` settings per [Setting Server System Variables](https://mariadb.com/kb/en/server-system-variables/#setting-server-system-variables) or [option-prefix-variable](https://mariadb.com/kb/en/configuring-mariadb-with-option-files/#option-prefixes). -The startup configuration is specified in the file `/etc/mysql/my.cnf`, and that file in turn includes any files found in the `/etc/mysql/conf.d` directory that end with `.cnf`. Settings in files in this directory will augment and/or override settings in `/etc/mysql/my.cnf`. If you want to use a customized MySQL configuration, you can create your alternative configuration file in a directory on the host machine and then mount that directory location as `/etc/mysql/conf.d` inside the `%%IMAGE%%` container. +The `%%IMAGE%%` image configuration contains the Ubuntu MariaDB variables with two custom changes for the container: -If `/my/custom/config-file.cnf` is the path and name of your custom configuration file, you can start your `%%IMAGE%%` container like this (note that only the directory path of the custom config file is used in this command): + [host-cache-size=0](https://mariadb.com/kb/en/server-system-variables/#host_cache_size) + [skip-name-resolve](https://mariadb.com/kb/en/server-system-variables/#skip_name_resolve) + +These disable the authentication of `user@hostname` users. To re-enable the `skip-name-resolve` use `disable-skip-name-resolve` as variable or arguement. When enabled, the `host-cache-size` should be sufficient for the number of containers connecting to the `%%IMAGE%%`. + +To view the resulting configuration of your `%%IMAGE%%` container: ```console -$ docker run --name some-%%REPO%% -v /my/custom:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=my-secret-pw -d %%IMAGE%%:tag +$ docker run --name some-%%REPO%% -v /my/custom:/etc/mysql/conf.d --rm %%IMAGE%%:latest my_print_defaults --mysqld ``` -This will start a new container `some-%%REPO%%` where the MariaDB instance uses the combined startup settings from `/etc/mysql/my.cnf` and `/etc/mysql/conf.d/config-file.cnf`, with settings from the latter taking precedence. - ### Configuration without a `cnf` file -Many configuration options can be passed as flags to `mysqld`. This will give you the flexibility to customize the container without needing a `cnf` file. For example, if you want to change the default encoding and collation for all tables to use UTF-8 (`utf8mb4`) just run the following: +Many configuration options can be passed as flags to `mariadbd`. This will give you the flexibility to customize the container without needing a `cnf` file. For example, if you want to run on port 3808 just run the following: ```console -$ docker run --name some-%%REPO%% -e MYSQL_ROOT_PASSWORD=my-secret-pw -d %%IMAGE%%:tag --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci +$ docker run --name some-%%REPO%% -e MARIADB_ROOT_PASSWORD=my-secret-pw -d %%IMAGE%%:latest --port 3808 ``` If you would like to see a complete list of available options, just run: ```console -$ docker run -it --rm %%IMAGE%%:tag --verbose --help +$ docker run -it --rm %%IMAGE%%:latest --verbose --help ``` ## Environment Variables -When you start the `%%IMAGE%%` image, you can adjust the configuration of the MariaDB instance by passing one or more environment variables on the `docker run` command line. Do note that none of the variables below will have any effect if you start the container with a data directory that already contains a database: any pre-existing database will always be left untouched on container startup. +When you start the `%%IMAGE%%` image, you can adjust the initialization of the MariaDB instance by passing one or more environment variables on the `docker run` command line. Do note that none of the variables below will have any effect if you start the container with a data directory that already contains a database: any pre-existing database will always be left untouched on container startup. + +From tag 10.2.38, 10.3.29, 10.4.19, 10.5.10 onwards, and all 10.6 and later tags, the `MARIADB_*` equivalent variables are provided. `MARIADB_*` variants will always be used in preference to `MYSQL_*` variants. + +One of `MARIADB_RANDOM_ROOT_PASSWORD`, `MARIADB_ROOT_PASSWORD_HASH`, `MARIADB_ROOT_PASSWORD` or `MARIADB_ALLOW_EMPTY_ROOT_PASSWORD` (or equivalents, including `*_FILE`), is required. The other environment variables are optional. + +### `MARIADB_ROOT_PASSWORD` / `MYSQL_ROOT_PASSWORD`, `MARIADB_ROOT_PASSWORD_HASH` + +This specifies the password that will be set for the MariaDB `root` superuser account. In the above example, it was set to `my-secret-pw`. + +In order to have no plaintext secret in the deployment, `MARIADB_ROOT_PASSWORD_HASH` can be used as it is just the hash of the password. The hash can be generated with `SELECT PASSWORD('thepassword')` as a SQL query. + +### `MARIADB_ALLOW_EMPTY_ROOT_PASSWORD` / `MYSQL_ALLOW_EMPTY_PASSWORD` + +Set to a non-empty value, like `yes`, to allow the container to be started with a blank password for the root user. *NOTE*: Setting this variable to `yes` is not recommended unless you really know what you are doing, since this will leave your MariaDB instance completely unprotected, allowing anyone to gain complete superuser access. + +### `MARIADB_RANDOM_ROOT_PASSWORD` / `MYSQL_RANDOM_ROOT_PASSWORD` + +Set to a non-empty value, like `yes`, to generate a random initial password for the root user. The generated root password will be printed to stdout (`GENERATED ROOT PASSWORD: .....`). + +### `MARIADB_ROOT_HOST` / `MYSQL_ROOT_HOST` + +This is the hostname part of the root user created. By default this is `%`, however it can be set to any default [MariaDB allowed hostname component](https://mariadb.com/kb/en/create-user/#host-name-component). Setting this to `localhost` will prevent any root user being accessible except via the unix socket. + +### `MARIADB_MYSQL_LOCALHOST_USER` / `MARIADB_MYSQL_LOCALHOST_GRANTS` + +Set `MARIADB_MYSQL_LOCALHOST_USER` to a non-empty value to create the `mysql@locahost` database user. This user is especially useful for a variety of health checks and backup scripts. -### `MYSQL_ROOT_PASSWORD` +The `mysql@localhost` user gets [USAGE](https://mariadb.com/kb/en/grant/#the-usage-privilege) privileges by default. If more access is required, additional [global privileges](https://mariadb.com/kb/en/grant/#global-privileges) in the form of a comma separated list can be provided. If you are sharing a volume containing MariaDB's unix socket (`/var/run/mysqld` by default), privileges beyond `USAGE` can result in confidentiality, integrity and availability risks, so use a minimal set. See the example below on using Mariabackup. The `healthcheck.sh` script also documents the required privileges for each health check test. -This variable is mandatory and specifies the password that will be set for the MariaDB `root` superuser account. In the above example, it was set to `my-secret-pw`. +### `MARIADB_DATABASE` / `MYSQL_DATABASE` -### `MYSQL_DATABASE` +This variable allows you to specify the name of a database to be created on image startup. -This variable is optional and allows you to specify the name of a database to be created on image startup. If a user/password was supplied (see below) then that user will be granted superuser access ([corresponding to `GRANT ALL`](http://dev.mysql.com/doc/en/adding-users.html)) to this database. +### `MARIADB_USER` / `MYSQL_USER`, `MARIADB_PASSWORD` / `MYSQL_PASSWORD`, `MARIADB_PASSWORD_HASH` -### `MYSQL_USER`, `MYSQL_PASSWORD` +These are used in conjunction to create a new user and to set that user's password. Both user and password variables are required for a user to be created. This user will be granted all access ([corresponding to `GRANT ALL`](https://mariadb.com/kb/en/grant/#the-all-privileges-privilege)) to the `MARIADB_DATABASE` database. -These variables are optional, used in conjunction to create a new user and to set that user's password. This user will be granted superuser permissions (see above) for the database specified by the `MYSQL_DATABASE` variable. Both variables are required for a user to be created. +See `MARIADB_ROOT_PASSWORD_HASH` above for how to get a password hash for `MARIADB_PASSWORD_HASH`. -Do note that there is no need to use this mechanism to create the root superuser, that user gets created by default with the password specified by the `MYSQL_ROOT_PASSWORD` variable. +Do note that there is no need to use this mechanism to create the root superuser, that user gets created by default with the password specified by the `MARIADB_ROOT_PASSWORD*` variable. -### `MYSQL_ALLOW_EMPTY_PASSWORD` +### `MARIADB_INITDB_SKIP_TZINFO` / `MYSQL_INITDB_SKIP_TZINFO` -This is an optional variable. Set to `yes` to allow the container to be started with a blank password for the root user. *NOTE*: Setting this variable to `yes` is not recommended unless you really know what you are doing, since this will leave your MariaDB instance completely unprotected, allowing anyone to gain complete superuser access. +By default, the entrypoint script automatically loads the timezone data needed for the `CONVERT_TZ()` function. If it is not needed, any non-empty value disables timezone loading. -### `MYSQL_RANDOM_ROOT_PASSWORD` +### `MARIADB_AUTO_UPGRADE` / `MARIADB_DISABLE_UPGRADE_BACKUP` -This is an optional variable. Set to `yes` to generate a random initial password for the root user (using `pwgen`). The generated root password will be printed to stdout (`GENERATED ROOT PASSWORD: .....`). +Set `MARIADB_AUTO_UPGRADE` to a non-empty value to have the entrypoint check whether `mysql_upgrade`/`mariadb-upgrade` needs to run, and if so, run the upgrade before starting the MariaDB server. + +Before the upgrade, a backup of the system database is created in the top of the datadir with the name `system_mysql_backup_*.sql.zst`. This backup process can be disabled with by setting `MARIADB_DISABLE_UPGRADE_BACKUP` to a non-empty value. ## Docker Secrets 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/` files. For example: ```console -$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD_FILE=/run/secrets/mysql-root -d %%IMAGE%%:tag +$ docker run --name some-mysql -e MARIADB_ROOT_PASSWORD_FILE=/run/secrets/mysql-root -d %%IMAGE%%:latest ``` -Currently, this is only supported for `MYSQL_ROOT_PASSWORD`, `MYSQL_ROOT_HOST`, `MYSQL_DATABASE`, `MYSQL_USER`, and `MYSQL_PASSWORD`. +Currently, this is only supported for `MARIADB_ROOT_PASSWORD`, `MARIADB_ROOT_PASSWORD_HASH`, `MARIADB_ROOT_HOST`, `MARIADB_DATABASE`, `MARIADB_USER`, `MARIADB_PASSWORD` and `MARIADB_PASSWORD_HASH` (and `MYSQL_*` equivalents of these). # Initializing a fresh instance -When a container is started for the first time, a new database with the specified name will be created and initialized with the provided configuration variables. Furthermore, it will execute files with extensions `.sh`, `.sql` and `.sql.gz` that are found in `/docker-entrypoint-initdb.d`. Files will be executed in alphabetical order. You can easily populate your `%%IMAGE%%` services by [mounting a SQL dump into that directory](https://docs.docker.com/engine/tutorials/dockervolumes/#mount-a-host-file-as-a-data-volume) and provide [custom images](https://docs.docker.com/reference/builder/) with contributed data. SQL files will be imported by default to the database specified by the `MYSQL_DATABASE` variable. +When a container is started for the first time, a new database with the specified name will be created and initialized with the provided configuration variables. Furthermore, it will execute files with extensions `.sh`, `.sql`, `.sql.gz`, `.sql.xz` and `.sql.zst` that are found in `/docker-entrypoint-initdb.d`. Files will be executed in alphabetical order. `.sh` files without file execute permission are sourced rather than executed. You can easily populate your `%%IMAGE%%` services by [mounting a SQL dump into that directory](https://docs.docker.com/engine/tutorials/dockervolumes/#mount-a-host-file-as-a-data-volume) and provide [custom images](https://docs.docker.com/reference/builder/) with contributed data. SQL files will be imported by default to the database specified by the `MARIADB_DATABASE` / `MYSQL_DATABASE` variable. # Caveats @@ -137,31 +183,182 @@ The Docker documentation is a good starting point for understanding the differen 2. Start your `%%IMAGE%%` container like this: ```console - $ docker run --name some-%%REPO%% -v /my/own/datadir:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d %%IMAGE%%:tag + $ docker run --name some-%%REPO%% -v /my/own/datadir:/var/lib/mysql -e MARIADB_ROOT_PASSWORD=my-secret-pw -d %%IMAGE%%:latest ``` -The `-v /my/own/datadir:/var/lib/mysql` part of the command mounts the `/my/own/datadir` directory from the underlying host system as `/var/lib/mysql` inside the container, where MySQL by default will write its data files. +The `-v /my/own/datadir:/var/lib/mysql` part of the command mounts the `/my/own/datadir` directory from the underlying host system as `/var/lib/mysql` inside the container, where MariaDB by default will write its data files. -## No connections until MySQL init completes +## No connections until MariaDB init completes If there is no database initialized when the container starts, then a default database will be created. While this is the expected behavior, this means that it will not accept incoming connections until such initialization completes. This may cause issues when using automation tools, such as `docker-compose`, which start several containers simultaneously. +## Health/Liveness/Readiness Checking + +See [the "Official Images" FAQ](https://github.com/docker-library/faq#healthcheck) for why there is no default `HEALTHCHECK` directive. However, you can use the `/usr/local/bin/healthcheck.sh` script to choose from a (non-exhaustive) list of tests to check for whatever you consider health/liveness/readiness. Refer to the script's sources to learn about how to use it and which exact tests are provided. + ## Usage against an existing database -If you start your `%%IMAGE%%` container instance with a data directory that already contains a database (specifically, a `mysql` subdirectory), the `$MYSQL_ROOT_PASSWORD` variable should be omitted from the run command line; it will in any case be ignored, and the pre-existing database will not be changed in any way. +If you start your `%%IMAGE%%` container instance with a data directory that already contains a database (specifically, a `mysql` subdirectory), no environment variables that control initialization will be needed or examined, and no pre-existing databases will be changed. The only exception is the non-default `MARIADB_AUTO_UPGRADE` environment variable, that might cause `mysql_upgrade`/`mariadb-upgrade` to run, which might change the system tables. ## Creating database dumps Most of the normal tools will work, although their usage might be a little convoluted in some cases to ensure they have access to the `mysqld` server. A simple way to ensure this is to use `docker exec` and run the tool from the same container, similar to the following: ```console -$ docker exec some-%%REPO%% sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > /some/path/on/your/host/all-databases.sql +$ docker exec some-%%REPO%% sh -c 'exec mariadb-dump --all-databases -uroot -p"$MARIADB_ROOT_PASSWORD"' > /some/path/on/your/host/all-databases.sql ``` ## Restoring data from dump files -For restoring data. You can use `docker exec` command with `-i` flag, similar to the following: +For restoring data. You can use the `docker exec` command with the `-i` flag, similar to the following: + +```console +$ docker exec -i some-%%REPO%% sh -c 'exec mariadb -uroot -p"$MARIADB_ROOT_PASSWORD"' < /some/path/on/your/host/all-databases.sql +``` + +If one or more databases, but neither `--all-databases` nor the `mysql` database, were dumped, these databases can be restored by placing the resulting sql file in the `/docker-entrypoint-initdb.d` directory. + +## Creating backups with Mariabackup + +To perform a backup using [Mariabackup](https://mariadb.com/kb/en/mariabackup/), a second container is started that shares the original container's data directory. An additional volume for the backup needs to be included in the second backup instance. Authentication against the MariaDB database instance is required to successfully complete the backup. In the example below a `mysql@localhost` user is used with the MariaDB server's unix socket shared with the backup container. + +```console +$ docker volume create some-%%REPO%%-socket +$ docker run --name some-%%REPO%% -v /my/own/datadir:/var/lib/mysql -v some-%%REPO%%-socket:/var/run/mysqld -e MARIADB_MYSQL_LOCALHOST_USER=1 -e MARIADB_MYSQL_LOCALHOST_GRANTS="RELOAD, PROCESS, LOCK TABLES, BINLOG MONITOR" -e MARIADB_ROOT_PASSWORD=my-secret-pw -d %%IMAGE%%:latest +``` + +Note: Privileges listed here are for 10.5+. For an exact list, see [the Knowledge Base documentation for Mariabackup: Authentication and Privileges](https://mariadb.com/kb/en/mariabackup-overview/#authentication-and-privileges). + +Mariabackup will run as the `mysql` user in the container, so the permissions on `/backup` will need to ensure that it can be written to by this user: + +```console +$ docker volume create some-%%REPO%%-backup +$ docker run --rm some-%%REPO%%-backup -v some-%%REPO%%-backup:/backup %%IMAGE%%:latest chown mysql: /backup +``` + +To perform the backup: + +```console +$ docker run --user mysql -v some-%%REPO%%-socket:/var/run/mysqld -v some-%%REPO%%-backup:/backup -v /my/own/datadir:/var/lib/mysql --rm %%IMAGE%%:latest mariabackup --backup --target-dir=/backup +``` + +## Restore backups with Mariabackup + +These steps restore the backup made with Mariabackup. + +At some point before doing the restore, the backup needs to be prepared. Perform the prepare like this: + +```console +$ docker run --user mysql --rm -v some-%%REPO%%-backup:/backup %%IMAGE%%:latest mariabackup --prepare --target-dir=/backup +``` + +Now that the image is prepared, start the container with both the data and the backup volumes and restore the backup: + +```console +$ docker run --user mysql --rm -v /my/new/datadir:/var/lib/mysql -v some-%%REPO%%-backup:/backup %%IMAGE%%:latest mariabackup --copy-back --target-dir=/backup +``` + +With `/my/new/datadir` containing the restored backup, start normally as this is an initialized data directory: + +```console +$ docker run --name some-%%REPO%% -v /my/new/datadir:/var/lib/mysql -d %%IMAGE%%:latest +``` + +For further information on Mariabackup, see the [Mariabackup Knowledge Base](https://mariadb.com/kb/en/mariabackup-overview/). + +## How to reset root and user passwords + +If you have an existing data directory and wish to reset the root and user passwords, and to create a database on which the user can fully modify, perform the following steps. + +First create a `passwordreset.sql` file: + +```text +CREATE USER IF NOT EXISTS root@localhost IDENTIFIED BY 'thisismyrootpassword'; +SET PASSWORD FOR root@localhost = PASSWORD('thisismyrootpassword'); +GRANT ALL ON *.* TO root@localhost WITH GRANT OPTION; +CREATE USER IF NOT EXISTS root@'%' IDENTIFIED BY 'thisismyrootpassword'; +SET PASSWORD FOR root@'%' = PASSWORD('thisismyrootpassword'); +GRANT ALL ON *.* TO root@'%' WITH GRANT OPTION; +CREATE USER IF NOT EXISTS myuser@'%' IDENTIFIED BY 'thisismyuserpassword'; +SET PASSWORD FOR myuser@'%' = PASSWORD('thisismyuserpassword'); +CREATE DATABASE IF NOT EXISTS databasename; +GRANT ALL ON databasename.* TO myuser@'%'; +``` + +Adjust `myuser`, `databasename` and passwords as needed. + +Then: + +```console +$ docker run --rm -v /my/own/datadir:/var/lib/mysql -v /my/own/passwordreset.sql:/passwordreset.sql:z %%IMAGE%%:latest --init-file=/passwordreset.sql +``` + +On restarting the MariaDB container on this `/my/own/datadir`, the `root` and `myuser` passwords will be reset. + +## How to install MariaDB plugins + +MariaDB has many plugins, most are not enabled by default, some are in the %%IMAGE%% container, others need to be installed from additional packages. + +The following methods summarize the [MariaDB Blog article - Installing plugins in the MariaDB Docker Library Container](https://mariadb.org/installing-plugins-in-the-mariadb-docker-library-container/) on this topic. + +### Which plugins does the container contain? + +To see which plugins are available in the %%IMAGE%%: + +```console +$ docker run --rm %%IMAGE%%:latest ls -C /usr/lib/mysql/plugin +``` + +### Enabling a plugin using flags + +Using the `--plugin-load-add` flag with the plugin name (can be repeated), the plugins will be loaded and ready when the container is started: + +For example enable the `simple\_password\_check` plugin: + +```console +$ docker run --name some-%%REPO%% -e MARIADB_ROOT_PASSWORD=my-secret-pw --network=host -d %%IMAGE%%:latest --plugin-load-add=simple_password_check +``` + +### Enabling a plugin in the configuration files + +`plugin-load-add` can be used as a configuration option to load plugins. The example below load the [FederatedX Storage Engine](https://mariadb.com/kb/en/federatedx-storage-engine/). ```console -$ docker exec -i some-%%REPO%% sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD"' < /some/path/on/your/host/all-databases.sql +$ printf "[mariadb]\nplugin-load-add=ha_federatedx\n" > /my/custom/federatedx.conf +$ docker run --name some-%%REPO%% -v /my/custom:/etc/mysql/conf.d -e MARIADB_ROOT_PASSWORD=my-secret-pw -d %%IMAGE%%:latest ``` + +### Install a plugin using SQL in /docker-entrypoint-initdb.d + +[`INSTALL SONAME`](https://mariadb.com/kb/en/install-soname/) can be used to install a plugin as part of the database initialization. + +Create the SQL file used in initialization: + +```console +$ echo 'INSTALL SONAME "disks";' > my_initdb/disks.sql +``` + +In this case the `my\_initdb` is a `/docker-entrypoint-initdb.d` directory per "Initializing a fresh instance" section above. + +### Identifing additional plugins in additional packages + +A number of plugins are in separate packages to reduce their installation size. The package names of MariaDB created plugins can be determined using the following command: + +```console +$ docker run --rm %%IMAGE%%:latest sh -c 'apt-get update -qq && apt-cache search mariadb-plugin' +``` + +### Creating a image with plugins from additional packages + +A new image needs to be created when using additional packages. The %%IMAGE%% image can be used as a base however: + +In the following the [CONNECT Storage Engine](https://mariadb.com/kb/en/connect/) is installed: + +```dockerfile +FROM %%IMAGE%%:latest +RUN apt-get update && \ + apt-get install mariadb-plugin-connect -y && \ + rm -rf /var/lib/apt/lists/* +``` + +Installing plugins from packages creates a configuration file in the directory `/etc/mysql/mariadb.conf.d/` that loads the plugin on startup. diff --git a/mariadb/get-help.md b/mariadb/get-help.md new file mode 100644 index 000000000000..9f87e7b498d8 --- /dev/null +++ b/mariadb/get-help.md @@ -0,0 +1,3 @@ +[Database Adminstrators (Stack Exchange)](https://dba.stackexchange.com/questions/tagged/docker+mariadb), [MariaDB Knowledge Base](https://mariadb.com/kb/en/docker-and-mariadb/) ([Ask a Question here](https://mariadb.com/kb/en/docker-and-mariadb/ask) available). + +Also see the ["Getting Help with MariaDB" article on the MariaDB Knowledge Base](https://mariadb.com/kb/en/getting-help-with-mariadb/). diff --git a/mariadb/github-repo b/mariadb/github-repo index 5ef8d698b566..b8c401d9883d 100644 --- a/mariadb/github-repo +++ b/mariadb/github-repo @@ -1 +1 @@ -https://github.com/docker-library/mariadb +https://github.com/MariaDB/mariadb-docker diff --git a/mariadb/issues.md b/mariadb/issues.md new file mode 100644 index 000000000000..47700639f962 --- /dev/null +++ b/mariadb/issues.md @@ -0,0 +1 @@ +Issues can be filed on [https://jira.mariadb.org/](https://jira.mariadb.org/) under the "MDEV" Project and "Docker" Component, or on [GitHub](%%GITHUB-REPO%%/issues) diff --git a/mariadb/logo.png b/mariadb/logo.png index 5c4efbd9cb096382d4554e20ef5b6c0405dff44c..fb112daedcf938e47c5e10107097ea156ba41aa9 100644 GIT binary patch literal 16087 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� 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 literal 16832 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 -This image is based on the popular [Alpine Linux project](http://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. +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. -This variant is highly recommended when final image size being as small as possible is desired. The main caveat to note is that it does use [musl libc](http://www.musl-libc.org) instead of [glibc and friends](http://www.etalabs.net/compare_libcs.html), so certain software might run into issues depending on the depth of their libc requirements. However, most software doesn't have an issue with this, so this variant is usually a very safe choice. 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. +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. 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). diff --git a/matomo/content.md b/matomo/content.md index c59bfa3d5067..6eccf13475b5 100644 --- a/matomo/content.md +++ b/matomo/content.md @@ -68,4 +68,7 @@ We'd love to hear your feedback and suggestions in the issue tracker: [github.co ## GeoIP -This product includes GeoLite data created by MaxMind, available from [http://www.maxmind.com](http://www.maxmind.com). +~~This product includes GeoLite data created by MaxMind, available from [http://www.maxmind.com](http://www.maxmind.com).~~ + +- https://blog.maxmind.com/2019/12/18/significant-changes-to-accessing-and-using-geolite2-databases/ +- https://matomo.org/faq/how-to/faq_163/ diff --git a/maven/README.md b/maven/README.md index 0221f55ab2f0..492cc1983416 100644 --- a/maven/README.md +++ b/maven/README.md @@ -17,30 +17,36 @@ WARNING: # Quick reference - **Maintained by**: - [the Maven Project](https://github.com/carlossg/docker-maven) + [Carlos Sanchez](https://github.com/carlossg/docker-maven) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`3.6.3-jdk-11`, `3.6-jdk-11`, `3-jdk-11`, `3.6.3-openjdk-11`, `3.6-openjdk-11`, `3-openjdk-11`](https://github.com/carlossg/docker-maven/blob/26ba49149787c85b9c51222b47c00879b2a0afde/openjdk-11/Dockerfile) -- [`3.6.3-jdk-11-openj9`, `3.6-jdk-11-openj9`, `3-jdk-11-openj9`, `3.6.3-adoptopenjdk-11-openj9`, `3.6-adoptopenjdk-11-openj9`, `3-adoptopenjdk-11-openj9`](https://github.com/carlossg/docker-maven/blob/26ba49149787c85b9c51222b47c00879b2a0afde/adoptopenjdk-11-openj9/Dockerfile) -- [`3.6.3-jdk-11-slim`, `3.6-jdk-11-slim`, `3-jdk-11-slim`, `3.6.3-openjdk-11-slim`, `3.6-openjdk-11-slim`, `3-openjdk-11-slim`](https://github.com/carlossg/docker-maven/blob/26ba49149787c85b9c51222b47c00879b2a0afde/openjdk-11-slim/Dockerfile) -- [`3.6.3-jdk-14`, `3.6-jdk-14`, `3-jdk-14`, `3.6.3-openjdk-14`, `3.6.3`, `3.6.3-openjdk`, `3.6-openjdk-14`, `3.6`, `3.6-openjdk`, `3-openjdk-14`, `3`, `latest`, `3-openjdk`, `openjdk`](https://github.com/carlossg/docker-maven/blob/26ba49149787c85b9c51222b47c00879b2a0afde/openjdk-14/Dockerfile) -- [`3.6.3-jdk-8`, `3.6-jdk-8`, `3-jdk-8`, `3.6.3-openjdk-8`, `3.6-openjdk-8`, `3-openjdk-8`](https://github.com/carlossg/docker-maven/blob/26ba49149787c85b9c51222b47c00879b2a0afde/openjdk-8/Dockerfile) -- [`3.6.3-jdk-8-openj9`, `3.6-jdk-8-openj9`, `3-jdk-8-openj9`, `3.6.3-adoptopenjdk-8-openj9`, `3.6-adoptopenjdk-8-openj9`, `3-adoptopenjdk-8-openj9`](https://github.com/carlossg/docker-maven/blob/26ba49149787c85b9c51222b47c00879b2a0afde/adoptopenjdk-8-openj9/Dockerfile) -- [`3.6.3-jdk-8-slim`, `3.6-jdk-8-slim`, `3-jdk-8-slim`, `3.6.3-openjdk-8-slim`, `3.6-openjdk-8-slim`, `3-openjdk-8-slim`](https://github.com/carlossg/docker-maven/blob/26ba49149787c85b9c51222b47c00879b2a0afde/openjdk-8-slim/Dockerfile) -- [`3.6.3-openjdk-14-slim`, `3.6.3-slim`, `3.6-openjdk-14-slim`, `3.6-slim`, `3-openjdk-14-slim`, `slim`](https://github.com/carlossg/docker-maven/blob/440e1f708e8fa5ea4d6ef509d22aee6d8265b209/openjdk-14-slim/Dockerfile) -- [`3.6.3-openjdk-15`, `3.6-openjdk-15`, `3-openjdk-15`](https://github.com/carlossg/docker-maven/blob/4ba4f1c3b6600e64c8c430dfea2ef65ff18608ff/openjdk-15/Dockerfile) -- [`3.6.3-adoptopenjdk-11`, `3.6-adoptopenjdk-11`, `3-adoptopenjdk-11`](https://github.com/carlossg/docker-maven/blob/d98fc55d68cbd5fa8df9e59c95678e1d702b0925/adoptopenjdk-11/Dockerfile) -- [`3.6.3-adoptopenjdk-14`, `3.6.3-adoptopenjdk`, `3.6-adoptopenjdk-14`, `3.6-adoptopenjdk`, `3-adoptopenjdk-14`, `3-adoptopenjdk`, `adoptopenjdk`](https://github.com/carlossg/docker-maven/blob/5768b638a84739d0ad85dbcbe42018075550b109/adoptopenjdk-14/Dockerfile) -- [`3.6.3-adoptopenjdk-14-openj9`, `3.6-adoptopenjdk-14-openj9`, `3-adoptopenjdk-14-openj9`](https://github.com/carlossg/docker-maven/blob/5768b638a84739d0ad85dbcbe42018075550b109/adoptopenjdk-14-openj9/Dockerfile) -- [`3.6.3-adoptopenjdk-8`, `3.6-adoptopenjdk-8`, `3-adoptopenjdk-8`](https://github.com/carlossg/docker-maven/blob/d98fc55d68cbd5fa8df9e59c95678e1d702b0925/adoptopenjdk-8/Dockerfile) -- [`3.6.3-ibmjava-8`, `3.6.3-ibmjava`, `3.6-ibmjava-8`, `3.6-ibmjava`, `3-ibmjava-8`, `3-ibmjava`, `ibmjava`](https://github.com/carlossg/docker-maven/blob/d3dd6bc261c6173c5e52e3a7a36b6a3d8d2800b4/ibmjava-8/Dockerfile) -- [`3.6.3-ibmjava-8-alpine`, `3.6.3-ibmjava-alpine`, `3.6-ibmjava-8-alpine`, `3.6-ibmjava-alpine`, `3-ibmjava-8-alpine`, `ibmjava-alpine`](https://github.com/carlossg/docker-maven/blob/d3dd6bc261c6173c5e52e3a7a36b6a3d8d2800b4/ibmjava-8-alpine/Dockerfile) -- [`3.6.3-amazoncorretto-11`, `3.6.3-amazoncorretto`, `3.6-amazoncorretto-11`, `3.6-amazoncorretto`, `3-amazoncorretto-11`, `3-amazoncorretto`, `amazoncorretto`](https://github.com/carlossg/docker-maven/blob/d3dd6bc261c6173c5e52e3a7a36b6a3d8d2800b4/amazoncorretto-11/Dockerfile) -- [`3.6.3-amazoncorretto-8`, `3.6-amazoncorretto-8`, `3-amazoncorretto-8`](https://github.com/carlossg/docker-maven/blob/d3dd6bc261c6173c5e52e3a7a36b6a3d8d2800b4/amazoncorretto-8/Dockerfile) +- [`3.8.7-openjdk-18`, `3.8-openjdk-18`, `3-openjdk-18`](https://github.com/carlossg/docker-maven/blob/34e7d27260ee61c6866922c523e04b53ba098337/openjdk-18/Dockerfile) +- [`3.8.7-openjdk-18-slim`, `3.8-openjdk-18-slim`, `3-openjdk-18-slim`](https://github.com/carlossg/docker-maven/blob/34e7d27260ee61c6866922c523e04b53ba098337/openjdk-18-slim/Dockerfile) +- [`3.8.7-eclipse-temurin-11`, `3.8-eclipse-temurin-11`, `3-eclipse-temurin-11`](https://github.com/carlossg/docker-maven/blob/34e7d27260ee61c6866922c523e04b53ba098337/eclipse-temurin-11/Dockerfile) +- [`3.8.7-eclipse-temurin-11-alpine`, `3.8-eclipse-temurin-11-alpine`, `3-eclipse-temurin-11-alpine`](https://github.com/carlossg/docker-maven/blob/34e7d27260ee61c6866922c523e04b53ba098337/eclipse-temurin-11-alpine/Dockerfile) +- [`3.8.7-eclipse-temurin-11-focal`, `3.8-eclipse-temurin-11-focal`, `3-eclipse-temurin-11-focal`](https://github.com/carlossg/docker-maven/blob/34e7d27260ee61c6866922c523e04b53ba098337/eclipse-temurin-11-focal/Dockerfile) +- [`3.8.7-eclipse-temurin-17`, `3.8.7`, `3.8.7-eclipse-temurin`, `3.8-eclipse-temurin-17`, `3.8`, `3.8-eclipse-temurin`, `3-eclipse-temurin-17`, `3`, `latest`, `3-eclipse-temurin`, `eclipse-temurin`](https://github.com/carlossg/docker-maven/blob/34e7d27260ee61c6866922c523e04b53ba098337/eclipse-temurin-17/Dockerfile) +- [`3.8.7-eclipse-temurin-17-alpine`, `3.8-eclipse-temurin-17-alpine`, `3-eclipse-temurin-17-alpine`](https://github.com/carlossg/docker-maven/blob/34e7d27260ee61c6866922c523e04b53ba098337/eclipse-temurin-17-alpine/Dockerfile) +- [`3.8.7-eclipse-temurin-17-focal`, `3.8-eclipse-temurin-17-focal`, `3-eclipse-temurin-17-focal`](https://github.com/carlossg/docker-maven/blob/34e7d27260ee61c6866922c523e04b53ba098337/eclipse-temurin-17-focal/Dockerfile) +- [`3.8.7-eclipse-temurin-19`, `3.8-eclipse-temurin-19`, `3-eclipse-temurin-19`](https://github.com/carlossg/docker-maven/blob/34e7d27260ee61c6866922c523e04b53ba098337/eclipse-temurin-19/Dockerfile) +- [`3.8.7-eclipse-temurin-19-alpine`, `3.8-eclipse-temurin-19-alpine`, `3-eclipse-temurin-19-alpine`](https://github.com/carlossg/docker-maven/blob/34e7d27260ee61c6866922c523e04b53ba098337/eclipse-temurin-19-alpine/Dockerfile) +- [`3.8.7-eclipse-temurin-19-focal`, `3.8-eclipse-temurin-19-focal`, `3-eclipse-temurin-19-focal`](https://github.com/carlossg/docker-maven/blob/34e7d27260ee61c6866922c523e04b53ba098337/eclipse-temurin-19-focal/Dockerfile) +- [`3.8.7-eclipse-temurin-8`, `3.8-eclipse-temurin-8`, `3-eclipse-temurin-8`](https://github.com/carlossg/docker-maven/blob/34e7d27260ee61c6866922c523e04b53ba098337/eclipse-temurin-8/Dockerfile) +- [`3.8.7-eclipse-temurin-8-alpine`, `3.8-eclipse-temurin-8-alpine`, `3-eclipse-temurin-8-alpine`](https://github.com/carlossg/docker-maven/blob/34e7d27260ee61c6866922c523e04b53ba098337/eclipse-temurin-8-alpine/Dockerfile) +- [`3.8.7-eclipse-temurin-8-focal`, `3.8-eclipse-temurin-8-focal`, `3-eclipse-temurin-8-focal`](https://github.com/carlossg/docker-maven/blob/34e7d27260ee61c6866922c523e04b53ba098337/eclipse-temurin-8-focal/Dockerfile) +- [`3.8.7-ibmjava-8`, `3.8.7-ibmjava`, `3.8-ibmjava-8`, `3.8-ibmjava`, `3-ibmjava-8`, `3-ibmjava`, `ibmjava`](https://github.com/carlossg/docker-maven/blob/34e7d27260ee61c6866922c523e04b53ba098337/ibmjava-8/Dockerfile) +- [`3.8.7-ibm-semeru-11-focal`, `3.8-ibm-semeru-11-focal`, `3-ibm-semeru-11-focal`](https://github.com/carlossg/docker-maven/blob/34e7d27260ee61c6866922c523e04b53ba098337/ibm-semeru-11-focal/Dockerfile) +- [`3.8.7-ibm-semeru-17-focal`, `3.8-ibm-semeru-17-focal`, `3-ibm-semeru-17-focal`](https://github.com/carlossg/docker-maven/blob/34e7d27260ee61c6866922c523e04b53ba098337/ibm-semeru-17-focal/Dockerfile) +- [`3.8.7-amazoncorretto-11`, `3.8.7-amazoncorretto`, `3.8-amazoncorretto-11`, `3.8-amazoncorretto`, `3-amazoncorretto-11`, `3-amazoncorretto`, `amazoncorretto`](https://github.com/carlossg/docker-maven/blob/34e7d27260ee61c6866922c523e04b53ba098337/amazoncorretto-11/Dockerfile) +- [`3.8.7-amazoncorretto-17`, `3.8-amazoncorretto-17`, `3-amazoncorretto-17`](https://github.com/carlossg/docker-maven/blob/34e7d27260ee61c6866922c523e04b53ba098337/amazoncorretto-17/Dockerfile) +- [`3.8.7-amazoncorretto-19`, `3.8-amazoncorretto-19`, `3-amazoncorretto-19`](https://github.com/carlossg/docker-maven/blob/34e7d27260ee61c6866922c523e04b53ba098337/amazoncorretto-19/Dockerfile) +- [`3.8.7-amazoncorretto-8`, `3.8-amazoncorretto-8`, `3-amazoncorretto-8`](https://github.com/carlossg/docker-maven/blob/34e7d27260ee61c6866922c523e04b53ba098337/amazoncorretto-8/Dockerfile) +- [`3.8.7-sapmachine-11`, `3.8-sapmachine-11`, `3-sapmachine-11`](https://github.com/carlossg/docker-maven/blob/34e7d27260ee61c6866922c523e04b53ba098337/sapmachine-11/Dockerfile) +- [`3.8.7-sapmachine-17`, `3.8.7-sapmachine`, `3.8-sapmachine-17`, `3.8-sapmachine`, `3-sapmachine-17`, `3-sapmachine`, `sapmachine`](https://github.com/carlossg/docker-maven/blob/34e7d27260ee61c6866922c523e04b53ba098337/sapmachine-17/Dockerfile) # Quick reference (cont.) @@ -55,7 +61,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/maven`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fmaven) + [official-images repo's `library/maven` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fmaven) [official-images repo's `library/maven` file](https://github.com/docker-library/official-images/blob/master/library/maven) ([history](https://github.com/docker-library/official-images/commits/master/library/maven)) - **Source of this description**: @@ -136,15 +142,17 @@ The `maven` images come in many flavors, each designed for a specific use case. 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. +Some of these tags may have names like focal in them. These are the suite code names for releases of [Ubuntu](https://wiki.ubuntu.com/Releases) 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 Ubuntu. + ## `maven:-slim` This image does not contain the common packages contained in the default tag and only contains the minimal packages needed to run `maven`. Unless you are working in an environment where *only* the `maven` image will be deployed and you have space constraints, we highly recommend using the default image of this repository. ## `maven:-alpine` -This image is based on the popular [Alpine Linux project](http://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. +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. -This variant is highly recommended when final image size being as small as possible is desired. The main caveat to note is that it does use [musl libc](http://www.musl-libc.org) instead of [glibc and friends](http://www.etalabs.net/compare_libcs.html), so certain software might run into issues depending on the depth of their libc requirements. However, most software doesn't have an issue with this, so this variant is usually a very safe choice. 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. +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. 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). diff --git a/maven/maintainer.md b/maven/maintainer.md index ab3ef11baa7b..a0cfecfa4385 100644 --- a/maven/maintainer.md +++ b/maven/maintainer.md @@ -1 +1 @@ -[the Maven Project](%%GITHUB-REPO%%) +[Carlos Sanchez](%%GITHUB-REPO%%) diff --git a/mediawiki/README.md b/mediawiki/README.md index fccc15e42286..01e6c704823a 100644 --- a/mediawiki/README.md +++ b/mediawiki/README.md @@ -17,16 +17,22 @@ WARNING: # Quick reference - **Maintained by**: - [Wikimedia Foundation & Docker Community](https://github.com/wikimedia/mediawiki-docker) + [MediaWiki community & Docker Community](https://github.com/wikimedia/mediawiki-docker) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`1.34.1`, `1.34`, `stable`, `latest`](https://github.com/wikimedia/mediawiki-docker/blob/672a803dfb39e86b8dc1f4b57fde4c6df6304050/1.34/Dockerfile) -- [`1.33.3`, `1.33`, `legacy`](https://github.com/wikimedia/mediawiki-docker/blob/672a803dfb39e86b8dc1f4b57fde4c6df6304050/1.33/Dockerfile) -- [`1.31.7`, `1.31`, `lts`, `legacylts`](https://github.com/wikimedia/mediawiki-docker/blob/672a803dfb39e86b8dc1f4b57fde4c6df6304050/1.31/Dockerfile) +- [`1.39.1`, `1.39`, `stable`, `lts`, `latest`](https://github.com/wikimedia/mediawiki-docker/blob/096c7f23b12f5694eed54e7dd7bbf71d9e69c3ec/1.39/apache/Dockerfile) +- [`1.39.1-fpm`, `1.39-fpm`, `stable-fpm`, `lts-fpm`](https://github.com/wikimedia/mediawiki-docker/blob/096c7f23b12f5694eed54e7dd7bbf71d9e69c3ec/1.39/fpm/Dockerfile) +- [`1.39.1-fpm-alpine`, `1.39-fpm-alpine`, `stable-fpm-alpine`, `lts-fpm-alpine`](https://github.com/wikimedia/mediawiki-docker/blob/096c7f23b12f5694eed54e7dd7bbf71d9e69c3ec/1.39/fpm-alpine/Dockerfile) +- [`1.38.5`, `1.38`, `legacy`](https://github.com/wikimedia/mediawiki-docker/blob/096c7f23b12f5694eed54e7dd7bbf71d9e69c3ec/1.38/apache/Dockerfile) +- [`1.38.5-fpm`, `1.38-fpm`, `legacy-fpm`](https://github.com/wikimedia/mediawiki-docker/blob/096c7f23b12f5694eed54e7dd7bbf71d9e69c3ec/1.38/fpm/Dockerfile) +- [`1.38.5-fpm-alpine`, `1.38-fpm-alpine`, `legacy-fpm-alpine`](https://github.com/wikimedia/mediawiki-docker/blob/096c7f23b12f5694eed54e7dd7bbf71d9e69c3ec/1.38/fpm-alpine/Dockerfile) +- [`1.35.9`, `1.35`, `legacylts`](https://github.com/wikimedia/mediawiki-docker/blob/096c7f23b12f5694eed54e7dd7bbf71d9e69c3ec/1.35/apache/Dockerfile) +- [`1.35.9-fpm`, `1.35-fpm`, `legacylts-fpm`](https://github.com/wikimedia/mediawiki-docker/blob/096c7f23b12f5694eed54e7dd7bbf71d9e69c3ec/1.35/fpm/Dockerfile) +- [`1.35.9-fpm-alpine`, `1.35-fpm-alpine`, `legacylts-fpm-alpine`](https://github.com/wikimedia/mediawiki-docker/blob/096c7f23b12f5694eed54e7dd7bbf71d9e69c3ec/1.35/fpm-alpine/Dockerfile) # Quick reference (cont.) @@ -34,14 +40,14 @@ WARNING: [https://phabricator.wikimedia.org/project/view/3094/](https://phabricator.wikimedia.org/project/view/3094/) - **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) - [`amd64`](https://hub.docker.com/r/amd64/mediawiki/), [`arm32v5`](https://hub.docker.com/r/arm32v5/mediawiki/), [`arm32v7`](https://hub.docker.com/r/arm32v7/mediawiki/), [`arm64v8`](https://hub.docker.com/r/arm64v8/mediawiki/), [`i386`](https://hub.docker.com/r/i386/mediawiki/), [`ppc64le`](https://hub.docker.com/r/ppc64le/mediawiki/) + [`amd64`](https://hub.docker.com/r/amd64/mediawiki/), [`arm32v5`](https://hub.docker.com/r/arm32v5/mediawiki/), [`arm32v6`](https://hub.docker.com/r/arm32v6/mediawiki/), [`arm32v7`](https://hub.docker.com/r/arm32v7/mediawiki/), [`arm64v8`](https://hub.docker.com/r/arm64v8/mediawiki/), [`i386`](https://hub.docker.com/r/i386/mediawiki/), [`ppc64le`](https://hub.docker.com/r/ppc64le/mediawiki/) - **Published image artifact details**: [repo-info repo's `repos/mediawiki/` directory](https://github.com/docker-library/repo-info/blob/master/repos/mediawiki) ([history](https://github.com/docker-library/repo-info/commits/master/repos/mediawiki)) (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/mediawiki`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fmediawiki) + [official-images repo's `library/mediawiki` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fmediawiki) [official-images repo's `library/mediawiki` file](https://github.com/docker-library/official-images/blob/master/library/mediawiki) ([history](https://github.com/docker-library/official-images/commits/master/library/mediawiki)) - **Source of this description**: @@ -53,7 +59,7 @@ MediaWiki is free and open-source wiki software. Originally developed by Magnus > [wikipedia.org/wiki/MediaWiki](https://en.wikipedia.org/wiki/MediaWiki) -![logo](https://raw.githubusercontent.com/docker-library/docs/0e325698c0f701882e333c6cb112a0f1fa98a003/mediawiki/logo.png) +![logo](https://raw.githubusercontent.com/docker-library/docs/27b797857efd9253c0981c09696f579a167062d4/mediawiki/logo.svg?sanitize=true) # How to use this image @@ -114,11 +120,12 @@ services: links: - database volumes: - - /var/www/html/images + - images:/var/www/html/images # After initial setup, download LocalSettings.php to the same directory as # this yaml and uncomment the following line and use compose to restart # the mediawiki service # - ./LocalSettings.php:/var/www/html/LocalSettings.php + # This key also defines the name of the database host used during setup instead of the default "localhost" database: image: mariadb restart: always @@ -128,9 +135,15 @@ services: MYSQL_USER: wikiuser MYSQL_PASSWORD: example MYSQL_RANDOM_ROOT_PASSWORD: 'yes' + volumes: + - db:/var/lib/mysql + +volumes: + images: + db: ``` -[![Try in PWD](https://github.com/play-with-docker/stacks/raw/cff22438cb4195ace27f9b15784bbb497047afa7/assets/images/button.png)](http://play-with-docker.com?stack=https://raw.githubusercontent.com/docker-library/docs/7b72bad5e2c684fa5829aecd3bf5b17a6e685963/mediawiki/stack.yml) +[![Try in PWD](https://github.com/play-with-docker/stacks/raw/cff22438cb4195ace27f9b15784bbb497047afa7/assets/images/button.png)](http://play-with-docker.com?stack=https://raw.githubusercontent.com/docker-library/docs/8fc63a1c6c985353af894baed5f7f4ae73c056f7/mediawiki/stack.yml) Run `docker stack deploy -c stack.yml mediawiki` (or `docker-compose -f stack.yml up`), wait for it to initialize completely, and visit `http://swarm-ip:8080`, `http://localhost:8080`, or `http://host-ip:8080` (as appropriate). @@ -144,6 +157,22 @@ The following Docker Hub features can help with the task of keeping your depende - [Automated Builds](https://docs.docker.com/docker-hub/builds/) let Docker Hub automatically build your Dockerfile each time you push changes to it. +# Image Variants + +The `mediawiki` images come in many flavors, each designed for a specific use case. + +## `mediawiki:` + +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. + +## `mediawiki:-alpine` + +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. + +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. + +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). + # License View [license information](https://phabricator.wikimedia.org/source/mediawiki/browse/master/COPYING) for the software contained in this image. diff --git a/mediawiki/logo.png b/mediawiki/logo.png deleted file mode 100644 index f5c10179aee1acaaeee617d004b12581ad8ebb0e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 252240 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

r+D4&J$Lg;p&-VIDg@2(!R?w&% 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

*J$tc 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mediawiki/maintainer.md b/mediawiki/maintainer.md index 63f4f82a8975..5712c56de031 100644 --- a/mediawiki/maintainer.md +++ b/mediawiki/maintainer.md @@ -1 +1 @@ -[Wikimedia Foundation & Docker Community](%%GITHUB-REPO%%) +[MediaWiki community & Docker Community](%%GITHUB-REPO%%) diff --git a/mediawiki/stack.yml b/mediawiki/stack.yml index 04e637fb45ad..3406c3b857d3 100644 --- a/mediawiki/stack.yml +++ b/mediawiki/stack.yml @@ -12,11 +12,12 @@ services: links: - database volumes: - - /var/www/html/images + - images:/var/www/html/images # After initial setup, download LocalSettings.php to the same directory as # this yaml and uncomment the following line and use compose to restart # the mediawiki service # - ./LocalSettings.php:/var/www/html/LocalSettings.php + # This key also defines the name of the database host used during setup instead of the default "localhost" database: image: mariadb restart: always @@ -26,3 +27,9 @@ services: MYSQL_USER: wikiuser MYSQL_PASSWORD: example MYSQL_RANDOM_ROOT_PASSWORD: 'yes' + volumes: + - db:/var/lib/mysql + +volumes: + images: + db: diff --git a/memcached/README.md b/memcached/README.md index a19da0f8dd02..ed6c110e4979 100644 --- a/memcached/README.md +++ b/memcached/README.md @@ -20,12 +20,12 @@ WARNING: [the Docker Community](https://github.com/docker-library/memcached) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`1.6.6`, `1.6`, `1`, `latest`](https://github.com/docker-library/memcached/blob/4538128227a0e422e59df735d67b03ee23d39637/debian/Dockerfile) -- [`1.6.6-alpine`, `1.6-alpine`, `1-alpine`, `alpine`](https://github.com/docker-library/memcached/blob/4538128227a0e422e59df735d67b03ee23d39637/alpine/Dockerfile) +- [`1.6.18`, `1.6`, `1`, `latest`, `1.6.18-bullseye`, `1.6-bullseye`, `1-bullseye`, `bullseye`](https://github.com/docker-library/memcached/blob/32c314b7d14f704aa7596d748a3024043c6e9a7e/debian/Dockerfile) +- [`1.6.18-alpine`, `1.6-alpine`, `1-alpine`, `alpine`, `1.6.18-alpine3.17`, `1.6-alpine3.17`, `1-alpine3.17`, `alpine3.17`](https://github.com/docker-library/memcached/blob/32c314b7d14f704aa7596d748a3024043c6e9a7e/alpine/Dockerfile) # Quick reference (cont.) @@ -33,14 +33,14 @@ WARNING: [https://github.com/docker-library/memcached/issues](https://github.com/docker-library/memcached/issues) - **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) - [`amd64`](https://hub.docker.com/r/amd64/memcached/), [`arm32v5`](https://hub.docker.com/r/arm32v5/memcached/), [`arm32v6`](https://hub.docker.com/r/arm32v6/memcached/), [`arm32v7`](https://hub.docker.com/r/arm32v7/memcached/), [`arm64v8`](https://hub.docker.com/r/arm64v8/memcached/), [`i386`](https://hub.docker.com/r/i386/memcached/), [`mips64le`](https://hub.docker.com/r/mips64le/memcached/), [`ppc64le`](https://hub.docker.com/r/ppc64le/memcached/), [`s390x`](https://hub.docker.com/r/s390x/memcached/) + [`amd64`](https://hub.docker.com/r/amd64/memcached/), [`arm32v5`](https://hub.docker.com/r/arm32v5/memcached/), [`arm32v7`](https://hub.docker.com/r/arm32v7/memcached/), [`arm64v8`](https://hub.docker.com/r/arm64v8/memcached/), [`i386`](https://hub.docker.com/r/i386/memcached/), [`mips64le`](https://hub.docker.com/r/mips64le/memcached/), [`ppc64le`](https://hub.docker.com/r/ppc64le/memcached/), [`s390x`](https://hub.docker.com/r/s390x/memcached/) - **Published image artifact details**: [repo-info repo's `repos/memcached/` directory](https://github.com/docker-library/repo-info/blob/master/repos/memcached) ([history](https://github.com/docker-library/repo-info/commits/master/repos/memcached)) (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/memcached`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fmemcached) + [official-images repo's `library/memcached` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fmemcached) [official-images repo's `library/memcached` file](https://github.com/docker-library/official-images/blob/master/library/memcached) ([history](https://github.com/docker-library/official-images/commits/master/library/memcached)) - **Source of this description**: @@ -78,11 +78,13 @@ The `memcached` images come in many flavors, each designed for a specific use ca 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. +Some of these tags may have names like 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. + ## `memcached:-alpine` -This image is based on the popular [Alpine Linux project](http://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. +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. -This variant is highly recommended when final image size being as small as possible is desired. The main caveat to note is that it does use [musl libc](http://www.musl-libc.org) instead of [glibc and friends](http://www.etalabs.net/compare_libcs.html), so certain software might run into issues depending on the depth of their libc requirements. However, most software doesn't have an issue with this, so this variant is usually a very safe choice. 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. +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. 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). diff --git a/mongo-express/README.md b/mongo-express/README.md index 0bc0c1e78e90..ae5c05387ea8 100644 --- a/mongo-express/README.md +++ b/mongo-express/README.md @@ -20,11 +20,12 @@ WARNING: [mongo-express](https://github.com/mongo-express/mongo-express-docker) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`0.54.0`, `0.54`, `latest`](https://github.com/mongo-express/mongo-express-docker/blob/4b43fe8a1206434cb32a006cd155dd71462f092f/Dockerfile) +- [`1.0.0-alpha.4`, `1.0.0-alpha`, `latest`](https://github.com/mongo-express/mongo-express-docker/blob/26e7ea94e4d222de7d52531caee52149ac093c26/Dockerfile) +- [`0.54.0`, `0.54`](https://github.com/mongo-express/mongo-express-docker/blob/4b43fe8a1206434cb32a006cd155dd71462f092f/Dockerfile) # Quick reference (cont.) @@ -39,7 +40,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/mongo-express`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fmongo-express) + [official-images repo's `library/mongo-express` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fmongo-express) [official-images repo's `library/mongo-express` file](https://github.com/docker-library/official-images/blob/master/library/mongo-express) ([history](https://github.com/docker-library/official-images/commits/master/library/mongo-express)) - **Source of this description**: diff --git a/mongo/README.md b/mongo/README.md index 6cd6b6f5a46a..8d3541d21b09 100644 --- a/mongo/README.md +++ b/mongo/README.md @@ -20,7 +20,7 @@ WARNING: [the Docker Community](https://github.com/docker-library/mongo) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links @@ -28,39 +28,69 @@ WARNING: ## Simple Tags -- [`3.6.18-xenial`, `3.6-xenial`, `3-xenial`](https://github.com/docker-library/mongo/blob/be3c690cae52447831b977dab9c6a66dc993df65/3.6/Dockerfile) -- [`3.6.18-windowsservercore-ltsc2016`, `3.6-windowsservercore-ltsc2016`, `3-windowsservercore-ltsc2016`](https://github.com/docker-library/mongo/blob/be3c690cae52447831b977dab9c6a66dc993df65/3.6/windows/windowsservercore-ltsc2016/Dockerfile) -- [`3.6.18-windowsservercore-1809`, `3.6-windowsservercore-1809`, `3-windowsservercore-1809`](https://github.com/docker-library/mongo/blob/be3c690cae52447831b977dab9c6a66dc993df65/3.6/windows/windowsservercore-1809/Dockerfile) -- [`4.0.18-xenial`, `4.0-xenial`](https://github.com/docker-library/mongo/blob/3a626c5e0de4943f0b7d0aeaf9511526d13bfb60/4.0/Dockerfile) -- [`4.0.18-windowsservercore-ltsc2016`, `4.0-windowsservercore-ltsc2016`](https://github.com/docker-library/mongo/blob/0e738a2b4ce1968d09d2a9acf84585f3cb0ba467/4.0/windows/windowsservercore-ltsc2016/Dockerfile) -- [`4.0.18-windowsservercore-1809`, `4.0-windowsservercore-1809`](https://github.com/docker-library/mongo/blob/0e738a2b4ce1968d09d2a9acf84585f3cb0ba467/4.0/windows/windowsservercore-1809/Dockerfile) -- [`4.2.6-bionic`, `4.2-bionic`, `4-bionic`, `bionic`](https://github.com/docker-library/mongo/blob/336871eaeddbf2e61ba3ca61cad33221f83cc710/4.2/Dockerfile) -- [`4.2.6-windowsservercore-ltsc2016`, `4.2-windowsservercore-ltsc2016`, `4-windowsservercore-ltsc2016`, `windowsservercore-ltsc2016`](https://github.com/docker-library/mongo/blob/336871eaeddbf2e61ba3ca61cad33221f83cc710/4.2/windows/windowsservercore-ltsc2016/Dockerfile) -- [`4.2.6-windowsservercore-1809`, `4.2-windowsservercore-1809`, `4-windowsservercore-1809`, `windowsservercore-1809`](https://github.com/docker-library/mongo/blob/336871eaeddbf2e61ba3ca61cad33221f83cc710/4.2/windows/windowsservercore-1809/Dockerfile) +- [`6.0.3-focal`, `6.0-focal`, `6-focal`, `focal`](https://github.com/docker-library/mongo/blob/fe7b66f65c5169d86c17c8d26789c8f868fa82c9/6.0/Dockerfile) +- [`6.0.3-windowsservercore-ltsc2022`, `6.0-windowsservercore-ltsc2022`, `6-windowsservercore-ltsc2022`, `windowsservercore-ltsc2022`](https://github.com/docker-library/mongo/blob/b828cbca8f06a7c2bc88c7700bb781c6ca13479f/6.0/windows/windowsservercore-ltsc2022/Dockerfile) +- [`6.0.3-windowsservercore-1809`, `6.0-windowsservercore-1809`, `6-windowsservercore-1809`, `windowsservercore-1809`](https://github.com/docker-library/mongo/blob/b828cbca8f06a7c2bc88c7700bb781c6ca13479f/6.0/windows/windowsservercore-1809/Dockerfile) +- [`6.0.3-nanoserver-ltsc2022`, `6.0-nanoserver-ltsc2022`, `6-nanoserver-ltsc2022`, `nanoserver-ltsc2022`](https://github.com/docker-library/mongo/blob/b828cbca8f06a7c2bc88c7700bb781c6ca13479f/6.0/windows/nanoserver-ltsc2022/Dockerfile) +- [`6.0.3-nanoserver-1809`, `6.0-nanoserver-1809`, `6-nanoserver-1809`, `nanoserver-1809`](https://github.com/docker-library/mongo/blob/b828cbca8f06a7c2bc88c7700bb781c6ca13479f/6.0/windows/nanoserver-1809/Dockerfile) +- [`5.0.14-focal`, `5.0-focal`, `5-focal`](https://github.com/docker-library/mongo/blob/fe7b66f65c5169d86c17c8d26789c8f868fa82c9/5.0/Dockerfile) +- [`5.0.14-windowsservercore-ltsc2022`, `5.0-windowsservercore-ltsc2022`, `5-windowsservercore-ltsc2022`](https://github.com/docker-library/mongo/blob/d27f80ddeafa162ab0a2f73a733c52f5e54bf817/5.0/windows/windowsservercore-ltsc2022/Dockerfile) +- [`5.0.14-windowsservercore-1809`, `5.0-windowsservercore-1809`, `5-windowsservercore-1809`](https://github.com/docker-library/mongo/blob/d27f80ddeafa162ab0a2f73a733c52f5e54bf817/5.0/windows/windowsservercore-1809/Dockerfile) +- [`5.0.14-nanoserver-ltsc2022`, `5.0-nanoserver-ltsc2022`, `5-nanoserver-ltsc2022`](https://github.com/docker-library/mongo/blob/d27f80ddeafa162ab0a2f73a733c52f5e54bf817/5.0/windows/nanoserver-ltsc2022/Dockerfile) +- [`5.0.14-nanoserver-1809`, `5.0-nanoserver-1809`, `5-nanoserver-1809`](https://github.com/docker-library/mongo/blob/d27f80ddeafa162ab0a2f73a733c52f5e54bf817/5.0/windows/nanoserver-1809/Dockerfile) +- [`4.4.18-focal`, `4.4-focal`, `4-focal`](https://github.com/docker-library/mongo/blob/fe7b66f65c5169d86c17c8d26789c8f868fa82c9/4.4/Dockerfile) +- [`4.4.18-windowsservercore-ltsc2022`, `4.4-windowsservercore-ltsc2022`, `4-windowsservercore-ltsc2022`](https://github.com/docker-library/mongo/blob/065527f98244e16f3cc252c1ed369244cc5ebc30/4.4/windows/windowsservercore-ltsc2022/Dockerfile) +- [`4.4.18-windowsservercore-1809`, `4.4-windowsservercore-1809`, `4-windowsservercore-1809`](https://github.com/docker-library/mongo/blob/065527f98244e16f3cc252c1ed369244cc5ebc30/4.4/windows/windowsservercore-1809/Dockerfile) +- [`4.4.18-nanoserver-ltsc2022`, `4.4-nanoserver-ltsc2022`, `4-nanoserver-ltsc2022`](https://github.com/docker-library/mongo/blob/065527f98244e16f3cc252c1ed369244cc5ebc30/4.4/windows/nanoserver-ltsc2022/Dockerfile) +- [`4.4.18-nanoserver-1809`, `4.4-nanoserver-1809`, `4-nanoserver-1809`](https://github.com/docker-library/mongo/blob/065527f98244e16f3cc252c1ed369244cc5ebc30/4.4/windows/nanoserver-1809/Dockerfile) +- [`4.2.23-bionic`, `4.2-bionic`](https://github.com/docker-library/mongo/blob/fe7b66f65c5169d86c17c8d26789c8f868fa82c9/4.2/Dockerfile) +- [`4.2.23-windowsservercore-ltsc2022`, `4.2-windowsservercore-ltsc2022`](https://github.com/docker-library/mongo/blob/c830e47022955d24bad50f1237ef7b713792bf9e/4.2/windows/windowsservercore-ltsc2022/Dockerfile) +- [`4.2.23-windowsservercore-1809`, `4.2-windowsservercore-1809`](https://github.com/docker-library/mongo/blob/c830e47022955d24bad50f1237ef7b713792bf9e/4.2/windows/windowsservercore-1809/Dockerfile) +- [`4.2.23-nanoserver-ltsc2022`, `4.2-nanoserver-ltsc2022`](https://github.com/docker-library/mongo/blob/c830e47022955d24bad50f1237ef7b713792bf9e/4.2/windows/nanoserver-ltsc2022/Dockerfile) +- [`4.2.23-nanoserver-1809`, `4.2-nanoserver-1809`](https://github.com/docker-library/mongo/blob/c830e47022955d24bad50f1237ef7b713792bf9e/4.2/windows/nanoserver-1809/Dockerfile) ## Shared Tags -- `3.6.18`, `3.6`, `3`: - - [`3.6.18-xenial`](https://github.com/docker-library/mongo/blob/be3c690cae52447831b977dab9c6a66dc993df65/3.6/Dockerfile) - - [`3.6.18-windowsservercore-ltsc2016`](https://github.com/docker-library/mongo/blob/be3c690cae52447831b977dab9c6a66dc993df65/3.6/windows/windowsservercore-ltsc2016/Dockerfile) - - [`3.6.18-windowsservercore-1809`](https://github.com/docker-library/mongo/blob/be3c690cae52447831b977dab9c6a66dc993df65/3.6/windows/windowsservercore-1809/Dockerfile) -- `3.6.18-windowsservercore`, `3.6-windowsservercore`, `3-windowsservercore`: - - [`3.6.18-windowsservercore-ltsc2016`](https://github.com/docker-library/mongo/blob/be3c690cae52447831b977dab9c6a66dc993df65/3.6/windows/windowsservercore-ltsc2016/Dockerfile) - - [`3.6.18-windowsservercore-1809`](https://github.com/docker-library/mongo/blob/be3c690cae52447831b977dab9c6a66dc993df65/3.6/windows/windowsservercore-1809/Dockerfile) -- `4.0.18`, `4.0`: - - [`4.0.18-xenial`](https://github.com/docker-library/mongo/blob/3a626c5e0de4943f0b7d0aeaf9511526d13bfb60/4.0/Dockerfile) - - [`4.0.18-windowsservercore-ltsc2016`](https://github.com/docker-library/mongo/blob/0e738a2b4ce1968d09d2a9acf84585f3cb0ba467/4.0/windows/windowsservercore-ltsc2016/Dockerfile) - - [`4.0.18-windowsservercore-1809`](https://github.com/docker-library/mongo/blob/0e738a2b4ce1968d09d2a9acf84585f3cb0ba467/4.0/windows/windowsservercore-1809/Dockerfile) -- `4.0.18-windowsservercore`, `4.0-windowsservercore`: - - [`4.0.18-windowsservercore-ltsc2016`](https://github.com/docker-library/mongo/blob/0e738a2b4ce1968d09d2a9acf84585f3cb0ba467/4.0/windows/windowsservercore-ltsc2016/Dockerfile) - - [`4.0.18-windowsservercore-1809`](https://github.com/docker-library/mongo/blob/0e738a2b4ce1968d09d2a9acf84585f3cb0ba467/4.0/windows/windowsservercore-1809/Dockerfile) -- `4.2.6`, `4.2`, `4`, `latest`: - - [`4.2.6-bionic`](https://github.com/docker-library/mongo/blob/336871eaeddbf2e61ba3ca61cad33221f83cc710/4.2/Dockerfile) - - [`4.2.6-windowsservercore-ltsc2016`](https://github.com/docker-library/mongo/blob/336871eaeddbf2e61ba3ca61cad33221f83cc710/4.2/windows/windowsservercore-ltsc2016/Dockerfile) - - [`4.2.6-windowsservercore-1809`](https://github.com/docker-library/mongo/blob/336871eaeddbf2e61ba3ca61cad33221f83cc710/4.2/windows/windowsservercore-1809/Dockerfile) -- `4.2.6-windowsservercore`, `4.2-windowsservercore`, `4-windowsservercore`, `windowsservercore`: - - [`4.2.6-windowsservercore-ltsc2016`](https://github.com/docker-library/mongo/blob/336871eaeddbf2e61ba3ca61cad33221f83cc710/4.2/windows/windowsservercore-ltsc2016/Dockerfile) - - [`4.2.6-windowsservercore-1809`](https://github.com/docker-library/mongo/blob/336871eaeddbf2e61ba3ca61cad33221f83cc710/4.2/windows/windowsservercore-1809/Dockerfile) +- `6.0.3`, `6.0`, `6`, `latest`: + - [`6.0.3-focal`](https://github.com/docker-library/mongo/blob/fe7b66f65c5169d86c17c8d26789c8f868fa82c9/6.0/Dockerfile) + - [`6.0.3-windowsservercore-ltsc2022`](https://github.com/docker-library/mongo/blob/b828cbca8f06a7c2bc88c7700bb781c6ca13479f/6.0/windows/windowsservercore-ltsc2022/Dockerfile) + - [`6.0.3-windowsservercore-1809`](https://github.com/docker-library/mongo/blob/b828cbca8f06a7c2bc88c7700bb781c6ca13479f/6.0/windows/windowsservercore-1809/Dockerfile) +- `6.0.3-windowsservercore`, `6.0-windowsservercore`, `6-windowsservercore`, `windowsservercore`: + - [`6.0.3-windowsservercore-ltsc2022`](https://github.com/docker-library/mongo/blob/b828cbca8f06a7c2bc88c7700bb781c6ca13479f/6.0/windows/windowsservercore-ltsc2022/Dockerfile) + - [`6.0.3-windowsservercore-1809`](https://github.com/docker-library/mongo/blob/b828cbca8f06a7c2bc88c7700bb781c6ca13479f/6.0/windows/windowsservercore-1809/Dockerfile) +- `6.0.3-nanoserver`, `6.0-nanoserver`, `6-nanoserver`, `nanoserver`: + - [`6.0.3-nanoserver-ltsc2022`](https://github.com/docker-library/mongo/blob/b828cbca8f06a7c2bc88c7700bb781c6ca13479f/6.0/windows/nanoserver-ltsc2022/Dockerfile) + - [`6.0.3-nanoserver-1809`](https://github.com/docker-library/mongo/blob/b828cbca8f06a7c2bc88c7700bb781c6ca13479f/6.0/windows/nanoserver-1809/Dockerfile) +- `5.0.14`, `5.0`, `5`: + - [`5.0.14-focal`](https://github.com/docker-library/mongo/blob/fe7b66f65c5169d86c17c8d26789c8f868fa82c9/5.0/Dockerfile) + - [`5.0.14-windowsservercore-ltsc2022`](https://github.com/docker-library/mongo/blob/d27f80ddeafa162ab0a2f73a733c52f5e54bf817/5.0/windows/windowsservercore-ltsc2022/Dockerfile) + - [`5.0.14-windowsservercore-1809`](https://github.com/docker-library/mongo/blob/d27f80ddeafa162ab0a2f73a733c52f5e54bf817/5.0/windows/windowsservercore-1809/Dockerfile) +- `5.0.14-windowsservercore`, `5.0-windowsservercore`, `5-windowsservercore`: + - [`5.0.14-windowsservercore-ltsc2022`](https://github.com/docker-library/mongo/blob/d27f80ddeafa162ab0a2f73a733c52f5e54bf817/5.0/windows/windowsservercore-ltsc2022/Dockerfile) + - [`5.0.14-windowsservercore-1809`](https://github.com/docker-library/mongo/blob/d27f80ddeafa162ab0a2f73a733c52f5e54bf817/5.0/windows/windowsservercore-1809/Dockerfile) +- `5.0.14-nanoserver`, `5.0-nanoserver`, `5-nanoserver`: + - [`5.0.14-nanoserver-ltsc2022`](https://github.com/docker-library/mongo/blob/d27f80ddeafa162ab0a2f73a733c52f5e54bf817/5.0/windows/nanoserver-ltsc2022/Dockerfile) + - [`5.0.14-nanoserver-1809`](https://github.com/docker-library/mongo/blob/d27f80ddeafa162ab0a2f73a733c52f5e54bf817/5.0/windows/nanoserver-1809/Dockerfile) +- `4.4.18`, `4.4`, `4`: + - [`4.4.18-focal`](https://github.com/docker-library/mongo/blob/fe7b66f65c5169d86c17c8d26789c8f868fa82c9/4.4/Dockerfile) + - [`4.4.18-windowsservercore-ltsc2022`](https://github.com/docker-library/mongo/blob/065527f98244e16f3cc252c1ed369244cc5ebc30/4.4/windows/windowsservercore-ltsc2022/Dockerfile) + - [`4.4.18-windowsservercore-1809`](https://github.com/docker-library/mongo/blob/065527f98244e16f3cc252c1ed369244cc5ebc30/4.4/windows/windowsservercore-1809/Dockerfile) +- `4.4.18-windowsservercore`, `4.4-windowsservercore`, `4-windowsservercore`: + - [`4.4.18-windowsservercore-ltsc2022`](https://github.com/docker-library/mongo/blob/065527f98244e16f3cc252c1ed369244cc5ebc30/4.4/windows/windowsservercore-ltsc2022/Dockerfile) + - [`4.4.18-windowsservercore-1809`](https://github.com/docker-library/mongo/blob/065527f98244e16f3cc252c1ed369244cc5ebc30/4.4/windows/windowsservercore-1809/Dockerfile) +- `4.4.18-nanoserver`, `4.4-nanoserver`, `4-nanoserver`: + - [`4.4.18-nanoserver-ltsc2022`](https://github.com/docker-library/mongo/blob/065527f98244e16f3cc252c1ed369244cc5ebc30/4.4/windows/nanoserver-ltsc2022/Dockerfile) + - [`4.4.18-nanoserver-1809`](https://github.com/docker-library/mongo/blob/065527f98244e16f3cc252c1ed369244cc5ebc30/4.4/windows/nanoserver-1809/Dockerfile) +- `4.2.23`, `4.2`: + - [`4.2.23-bionic`](https://github.com/docker-library/mongo/blob/fe7b66f65c5169d86c17c8d26789c8f868fa82c9/4.2/Dockerfile) + - [`4.2.23-windowsservercore-ltsc2022`](https://github.com/docker-library/mongo/blob/c830e47022955d24bad50f1237ef7b713792bf9e/4.2/windows/windowsservercore-ltsc2022/Dockerfile) + - [`4.2.23-windowsservercore-1809`](https://github.com/docker-library/mongo/blob/c830e47022955d24bad50f1237ef7b713792bf9e/4.2/windows/windowsservercore-1809/Dockerfile) +- `4.2.23-windowsservercore`, `4.2-windowsservercore`: + - [`4.2.23-windowsservercore-ltsc2022`](https://github.com/docker-library/mongo/blob/c830e47022955d24bad50f1237ef7b713792bf9e/4.2/windows/windowsservercore-ltsc2022/Dockerfile) + - [`4.2.23-windowsservercore-1809`](https://github.com/docker-library/mongo/blob/c830e47022955d24bad50f1237ef7b713792bf9e/4.2/windows/windowsservercore-1809/Dockerfile) +- `4.2.23-nanoserver`, `4.2-nanoserver`: + - [`4.2.23-nanoserver-ltsc2022`](https://github.com/docker-library/mongo/blob/c830e47022955d24bad50f1237ef7b713792bf9e/4.2/windows/nanoserver-ltsc2022/Dockerfile) + - [`4.2.23-nanoserver-1809`](https://github.com/docker-library/mongo/blob/c830e47022955d24bad50f1237ef7b713792bf9e/4.2/windows/nanoserver-1809/Dockerfile) # Quick reference (cont.) @@ -68,14 +98,14 @@ WARNING: [https://github.com/docker-library/mongo/issues](https://github.com/docker-library/mongo/issues) - **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) - [`amd64`](https://hub.docker.com/r/amd64/mongo/), [`arm64v8`](https://hub.docker.com/r/arm64v8/mongo/), [`s390x`](https://hub.docker.com/r/s390x/mongo/), [`windows-amd64`](https://hub.docker.com/r/winamd64/mongo/) + [`amd64`](https://hub.docker.com/r/amd64/mongo/), [`arm64v8`](https://hub.docker.com/r/arm64v8/mongo/), [`windows-amd64`](https://hub.docker.com/r/winamd64/mongo/) - **Published image artifact details**: [repo-info repo's `repos/mongo/` directory](https://github.com/docker-library/repo-info/blob/master/repos/mongo) ([history](https://github.com/docker-library/repo-info/commits/master/repos/mongo)) (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/mongo`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fmongo) + [official-images repo's `library/mongo` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fmongo) [official-images repo's `library/mongo` file](https://github.com/docker-library/official-images/blob/master/library/mongo) ([history](https://github.com/docker-library/official-images/commits/master/library/mongo)) - **Source of this description**: @@ -103,10 +133,10 @@ $ docker run --name some-mongo -d mongo:tag ## Connect to MongoDB from another Docker container -The MongoDB server in the image listens on the standard MongoDB port, `27017`, so connecting via Docker networks will be the same as connecting to a remote `mongod`. The following example starts another MongoDB container instance and runs the `mongo` command line client against the original MongoDB container from the example above, allowing you to execute MongoDB statements against your database instance: +The MongoDB server in the image listens on the standard MongoDB port, `27017`, so connecting via Docker networks will be the same as connecting to a remote `mongod`. The following example starts another MongoDB container instance and runs the `mongosh` (use `mongo` with `4.x` versions) command line client against the original MongoDB container from the example above, allowing you to execute MongoDB statements against your database instance: ```console -$ docker run -it --network some-network --rm mongo mongo --host some-mongo test +$ docker run -it --network some-network --rm mongo mongosh --host some-mongo test ``` ... where `some-mongo` is the name of your original `mongo` container. @@ -136,9 +166,10 @@ services: environment: ME_CONFIG_MONGODB_ADMINUSERNAME: root ME_CONFIG_MONGODB_ADMINPASSWORD: example + ME_CONFIG_MONGODB_URL: mongodb://root:example@mongo:27017/ ``` -[![Try in PWD](https://github.com/play-with-docker/stacks/raw/cff22438cb4195ace27f9b15784bbb497047afa7/assets/images/button.png)](http://play-with-docker.com?stack=https://raw.githubusercontent.com/docker-library/docs/3a01591e2c903a8c3224fced78f3f22b817b6272/mongo/stack.yml) +[![Try in PWD](https://github.com/play-with-docker/stacks/raw/cff22438cb4195ace27f9b15784bbb497047afa7/assets/images/button.png)](http://play-with-docker.com?stack=https://raw.githubusercontent.com/docker-library/docs/f6c9b596064e2eed9c3b6ac75bea606cb6d94099/mongo/stack.yml) Run `docker stack deploy -c stack.yml mongo` (or `docker-compose -f stack.yml up`), wait for it to initialize completely, and visit `http://swarm-ip:8081`, `http://localhost:8081`, or `http://host-ip:8081` (as appropriate). @@ -214,7 +245,7 @@ When you start the `mongo` image, you can adjust the initialization of the Mongo These variables, used in conjunction, create a new user and set that user's password. This user is created in the `admin` [authentication database](https://docs.mongodb.com/manual/core/security-users/#user-authentication-database) and given [the role of `root`](https://docs.mongodb.com/manual/reference/built-in-roles/#root), which is [a "superuser" role](https://docs.mongodb.com/manual/core/security-built-in-roles/#superuser-roles). -The following is an example of using these two variables to create a MongoDB instance and then using the `mongo` cli to connect against the `admin` authentication database. +The following is an example of using these two variables to create a MongoDB instance and then using the `mongosh` cli (use `mongo` with `4.x` versions) to connect against the `admin` authentication database. ```console $ docker run -d --network some-network --name some-mongo \ @@ -223,7 +254,7 @@ $ docker run -d --network some-network --name some-mongo \ mongo $ docker run -it --rm --network some-network mongo \ - mongo --host some-mongo \ + mongosh --host some-mongo \ -u mongoadmin \ -p secret \ --authenticationDatabase admin \ @@ -252,7 +283,7 @@ Currently, this is only supported for `MONGO_INITDB_ROOT_USERNAME` and `MONGO_IN # Initializing a fresh instance -When a container is started for the first time it will execute files with extensions `.sh` and `.js` that are found in `/docker-entrypoint-initdb.d`. Files will be executed in alphabetical order. `.js` files will be executed by `mongo` using the database specified by the `MONGO_INITDB_DATABASE` variable, if it is present, or `test` otherwise. You may also switch databases within the `.js` script. +When a container is started for the first time it will execute files with extensions `.sh` and `.js` that are found in `/docker-entrypoint-initdb.d`. Files will be executed in alphabetical order. `.js` files will be executed by `mongosh` (`mongo` on versions below 6) using the database specified by the `MONGO_INITDB_DATABASE` variable, if it is present, or `test` otherwise. You may also switch databases within the `.js` script. # Authentication @@ -275,7 +306,7 @@ Important note: There are several ways to store data used by applications that r - Let Docker manage the storage of your database data [by writing the database files to disk on the host system using its own internal volume management](https://docs.docker.com/engine/tutorials/dockervolumes/#adding-a-data-volume). This is the default and is easy and fairly transparent to the user. The downside is that the files may be hard to locate for tools and applications that run directly on the host system, i.e. outside containers. - Create a data directory on the host system (outside the container) and [mount this to a directory visible from inside the container](https://docs.docker.com/engine/tutorials/dockervolumes/#mount-a-host-directory-as-a-data-volume). This places the database files in a known location on the host system, and makes it easy for tools and applications on the host system to access the files. The downside is that the user needs to make sure that the directory exists, and that e.g. directory permissions and other security mechanisms on the host system are set up correctly. -**WARNING (Windows & OS X)**: The default Docker setup on Windows and OS X uses a VirtualBox VM to host the Docker daemon. Unfortunately, the mechanism VirtualBox uses to share folders between the host system and the Docker container is not compatible with the memory mapped files used by MongoDB (see [vbox bug](https://www.virtualbox.org/ticket/819), [docs.mongodb.org](https://docs.mongodb.com/manual/administration/production-notes/#fsync-on-directories) and related [jira.mongodb.org](https://jira.mongodb.org/browse/SERVER-8600) bug). This means that it is not possible to run a MongoDB container with the data directory mapped to the host. +**WARNING (Windows & OS X)**: When running the Linux-based MongoDB images on Windows and OS X, the file systems used to share between the host system and the Docker container is not compatible with the memory mapped files used by MongoDB ([docs.mongodb.org](https://docs.mongodb.com/manual/administration/production-notes/#fsync---on-directories) and related [jira.mongodb.org](https://jira.mongodb.org/browse/SERVER-8600) bug). This means that it is not possible to run a MongoDB container with the data directory mapped to the host. To persist data between container restarts, we recommend using a local named volume instead (see `docker volume create`). Alternatively you can use the Windows-based images on Windows. The Docker documentation is a good starting point for understanding the different storage options and variations, and there are multiple blogs and forum postings that discuss and give advice in this area. We will simply show the basic procedure here for the latter option above: @@ -306,7 +337,7 @@ The `mongo` images come in many flavors, each designed for a specific use case. 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. -Some of these tags may have names like bionic or xenial in them. These are the suite code names for releases of [Ubuntu](https://wiki.ubuntu.com/Releases) 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 Ubuntu. +Some of these tags may have names like bionic or focal in them. These are the suite code names for releases of [Ubuntu](https://wiki.ubuntu.com/Releases) 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 Ubuntu. ## `mongo:-windowsservercore` diff --git a/mongo/content.md b/mongo/content.md index bf8fdc4aca40..c586238bd8ee 100644 --- a/mongo/content.md +++ b/mongo/content.md @@ -20,10 +20,10 @@ $ docker run --name some-%%REPO%% -d %%IMAGE%%:tag ## Connect to MongoDB from another Docker container -The MongoDB server in the image listens on the standard MongoDB port, `27017`, so connecting via Docker networks will be the same as connecting to a remote `mongod`. The following example starts another MongoDB container instance and runs the `mongo` command line client against the original MongoDB container from the example above, allowing you to execute MongoDB statements against your database instance: +The MongoDB server in the image listens on the standard MongoDB port, `27017`, so connecting via Docker networks will be the same as connecting to a remote `mongod`. The following example starts another MongoDB container instance and runs the `mongosh` (use `mongo` with `4.x` versions) command line client against the original MongoDB container from the example above, allowing you to execute MongoDB statements against your database instance: ```console -$ docker run -it --network some-network --rm %%IMAGE%% mongo --host some-%%REPO%% test +$ docker run -it --network some-network --rm %%IMAGE%% mongosh --host some-%%REPO%% test ``` ... where `some-%%REPO%%` is the name of your original `mongo` container. @@ -104,7 +104,7 @@ When you start the `%%REPO%%` image, you can adjust the initialization of the Mo These variables, used in conjunction, create a new user and set that user's password. This user is created in the `admin` [authentication database](https://docs.mongodb.com/manual/core/security-users/#user-authentication-database) and given [the role of `root`](https://docs.mongodb.com/manual/reference/built-in-roles/#root), which is [a "superuser" role](https://docs.mongodb.com/manual/core/security-built-in-roles/#superuser-roles). -The following is an example of using these two variables to create a MongoDB instance and then using the `mongo` cli to connect against the `admin` authentication database. +The following is an example of using these two variables to create a MongoDB instance and then using the `mongosh` cli (use `mongo` with `4.x` versions) to connect against the `admin` authentication database. ```console $ docker run -d --network some-network --name some-%%REPO%% \ @@ -113,7 +113,7 @@ $ docker run -d --network some-network --name some-%%REPO%% \ %%IMAGE%% $ docker run -it --rm --network some-network %%IMAGE%% \ - mongo --host some-mongo \ + mongosh --host some-mongo \ -u mongoadmin \ -p secret \ --authenticationDatabase admin \ @@ -142,7 +142,7 @@ Currently, this is only supported for `MONGO_INITDB_ROOT_USERNAME` and `MONGO_IN # Initializing a fresh instance -When a container is started for the first time it will execute files with extensions `.sh` and `.js` that are found in `/docker-entrypoint-initdb.d`. Files will be executed in alphabetical order. `.js` files will be executed by `mongo` using the database specified by the `MONGO_INITDB_DATABASE` variable, if it is present, or `test` otherwise. You may also switch databases within the `.js` script. +When a container is started for the first time it will execute files with extensions `.sh` and `.js` that are found in `/docker-entrypoint-initdb.d`. Files will be executed in alphabetical order. `.js` files will be executed by `mongosh` (`mongo` on versions below 6) using the database specified by the `MONGO_INITDB_DATABASE` variable, if it is present, or `test` otherwise. You may also switch databases within the `.js` script. # Authentication @@ -165,7 +165,7 @@ Important note: There are several ways to store data used by applications that r - Let Docker manage the storage of your database data [by writing the database files to disk on the host system using its own internal volume management](https://docs.docker.com/engine/tutorials/dockervolumes/#adding-a-data-volume). This is the default and is easy and fairly transparent to the user. The downside is that the files may be hard to locate for tools and applications that run directly on the host system, i.e. outside containers. - Create a data directory on the host system (outside the container) and [mount this to a directory visible from inside the container](https://docs.docker.com/engine/tutorials/dockervolumes/#mount-a-host-directory-as-a-data-volume). This places the database files in a known location on the host system, and makes it easy for tools and applications on the host system to access the files. The downside is that the user needs to make sure that the directory exists, and that e.g. directory permissions and other security mechanisms on the host system are set up correctly. -**WARNING (Windows & OS X)**: The default Docker setup on Windows and OS X uses a VirtualBox VM to host the Docker daemon. Unfortunately, the mechanism VirtualBox uses to share folders between the host system and the Docker container is not compatible with the memory mapped files used by MongoDB (see [vbox bug](https://www.virtualbox.org/ticket/819), [docs.mongodb.org](https://docs.mongodb.com/manual/administration/production-notes/#fsync-on-directories) and related [jira.mongodb.org](https://jira.mongodb.org/browse/SERVER-8600) bug). This means that it is not possible to run a MongoDB container with the data directory mapped to the host. +**WARNING (Windows & OS X)**: When running the Linux-based MongoDB images on Windows and OS X, the file systems used to share between the host system and the Docker container is not compatible with the memory mapped files used by MongoDB ([docs.mongodb.org](https://docs.mongodb.com/manual/administration/production-notes/#fsync---on-directories) and related [jira.mongodb.org](https://jira.mongodb.org/browse/SERVER-8600) bug). This means that it is not possible to run a MongoDB container with the data directory mapped to the host. To persist data between container restarts, we recommend using a local named volume instead (see `docker volume create`). Alternatively you can use the Windows-based images on Windows. The Docker documentation is a good starting point for understanding the different storage options and variations, and there are multiple blogs and forum postings that discuss and give advice in this area. We will simply show the basic procedure here for the latter option above: diff --git a/mongo/stack.yml b/mongo/stack.yml index cf63b58af655..7a287967fc60 100644 --- a/mongo/stack.yml +++ b/mongo/stack.yml @@ -18,3 +18,4 @@ services: environment: ME_CONFIG_MONGODB_ADMINUSERNAME: root ME_CONFIG_MONGODB_ADMINPASSWORD: example + ME_CONFIG_MONGODB_URL: mongodb://root:example@mongo:27017/ diff --git a/monica/README-short.txt b/monica/README-short.txt new file mode 100644 index 000000000000..34f1e72d1d7f --- /dev/null +++ b/monica/README-short.txt @@ -0,0 +1 @@ +Monica – the Personal Relationship Manager. diff --git a/monica/README.md b/monica/README.md new file mode 100644 index 000000000000..d84fefda154c --- /dev/null +++ b/monica/README.md @@ -0,0 +1,296 @@ + + +# Quick reference + +- **Maintained by**: + [Monica Team](https://github.com/monicahq/docker) + +- **Where to get help**: + [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) + +# Supported tags and respective `Dockerfile` links + +- [`3.7.0-apache`, `3.7-apache`, `3-apache`, `apache`, `3.7.0`, `3.7`, `3`, `latest`](https://github.com/monicahq/docker/blob/c0340b2017890e6a465d1d4ee03331d2effc0335/apache/Dockerfile) +- [`3.7.0-fpm-alpine`, `3.7-fpm-alpine`, `3-fpm-alpine`, `fpm-alpine`](https://github.com/monicahq/docker/blob/c0340b2017890e6a465d1d4ee03331d2effc0335/fpm-alpine/Dockerfile) +- [`3.7.0-fpm`, `3.7-fpm`, `3-fpm`, `fpm`](https://github.com/monicahq/docker/blob/c0340b2017890e6a465d1d4ee03331d2effc0335/fpm/Dockerfile) + +# Quick reference (cont.) + +- **Where to file issues**: + [https://github.com/monicahq/docker/issues](https://github.com/monicahq/docker/issues) + +- **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) + [`amd64`](https://hub.docker.com/r/amd64/monica/), [`arm32v5`](https://hub.docker.com/r/arm32v5/monica/), [`arm32v6`](https://hub.docker.com/r/arm32v6/monica/), [`arm32v7`](https://hub.docker.com/r/arm32v7/monica/), [`arm64v8`](https://hub.docker.com/r/arm64v8/monica/), [`i386`](https://hub.docker.com/r/i386/monica/), [`mips64le`](https://hub.docker.com/r/mips64le/monica/), [`ppc64le`](https://hub.docker.com/r/ppc64le/monica/), [`s390x`](https://hub.docker.com/r/s390x/monica/) + +- **Published image artifact details**: + [repo-info repo's `repos/monica/` directory](https://github.com/docker-library/repo-info/blob/master/repos/monica) ([history](https://github.com/docker-library/repo-info/commits/master/repos/monica)) + (image metadata, transfer size, etc) + +- **Image updates**: + [official-images repo's `library/monica` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fmonica) + [official-images repo's `library/monica` file](https://github.com/docker-library/official-images/blob/master/library/monica) ([history](https://github.com/docker-library/official-images/commits/master/library/monica)) + +- **Source of this description**: + [docs repo's `monica/` directory](https://github.com/docker-library/docs/tree/master/monica) ([history](https://github.com/docker-library/docs/commits/master/monica)) + +# What is Monica? + +Monica is a great open source personal relationship management system to organize the interactions with your loved ones. + +![logo](https://raw.githubusercontent.com/docker-library/docs/b962028212dbd77c9531dbcf8d5a81db79d4a735/monica/logo.svg?sanitize=true) + +## How to use this image + +There are two versions of the image you may choose from. + +The `apache` tag contains a full Monica installation with an apache webserver. This points to the default `latest` tag too. + +The `fpm` tag contains a fastCGI-Process that serves the web pages. This image should be combined with a webserver used as a proxy, like apache or nginx. + +### Using the apache image + +This image contains a webserver that exposes port 80. Run the container with: + +```console +docker run --name some-monica -d -p 8080:80 monica +``` + +### Using the fpm image + +This image serves a fastCGI server that exposes port 9000. You may need an additional web server that can proxy requests to the fpm port 9000 of the container. Run this container with: + +```console +docker run --name some-monica -d -p 9000:9000 monica:fpm +``` + +### Using an external database + +You'll need to setup an external database. Monica currently support MySQL/MariaDB database. You can also link a database container, e. g. `--link my-mysql:db`, and then use `db` as the database host on setup. More info is in the docker-compose section. + +### Persistent data storage + +To have a persistent storage for your datas, you may want to create volumes for your db, and for monica you will have to save the `/var/www/html/storage` directory. + +Run a container with this named volume: + +```console +docker run -d \ + -v monica_data:/var/www/html/storage \ + monica +``` + +### Run commands inside the container + +Like every Laravel application, the `php artisan` command is very usefull for Monica. To run a command inside the container, run + +```console +docker exec CONTAINER_ID php artisan COMMAND +``` + +or for docker-compose + +```console +docker-compose exec monica php artisan COMMAND +``` + +where `monica` is the name of the service in your `docker-compose.yml` file. + +## Configuration using environment variables + +The Monica image will use environment variables to setup the application. See [Monica documentation](https://github.com/monicahq/monica/blob/main/.env.example) for common used variables you should setup. + +## Running the image with docker-compose + +See some examples of docker-compose possibilities in the [example section](https://github.com/monicahq/docker/blob/master/.examples). + +--- + +### Apache version + +This version will use the apache image and add a mysql container. The volumes are set to keep your data persistent. This setup provides **no ssl encryption** and is intended to run behind a proxy. + +Make sure to pass in values for `APP_KEY` variable before you run this setup. + +1. Create a `docker-compose.yml` file + + ```yaml + version: "3.4" + + services: + app: + image: monica + depends_on: + - db + ports: + - 8080:80 + environment: + - APP_KEY= + - DB_HOST=db + - DB_USERNAME=monica + - DB_PASSWORD=secret + volumes: + - data:/var/www/html/storage + restart: always + + db: + image: mysql:5.7 + environment: + - MYSQL_RANDOM_ROOT_PASSWORD=true + - MYSQL_DATABASE=monica + - MYSQL_USER=monica + - MYSQL_PASSWORD=secret + volumes: + - mysql:/var/lib/mysql + restart: always + + volumes: + data: + name: data + mysql: + name: mysql + ``` + +2. Set a value for `APP_KEY` variable before you run this setup. It should be a random 32-character string. You can for instance copy and paste the output of `echo -n 'base64:'; openssl rand -base64 32`: + +3. Run + + ```console + docker-compose up -d + ``` + + Wait until all migrations are done and then access Monica at http://localhost:8080/ from your host system. If this looks ok, add your first user account. + +4. Run this command once: + + ```console + docker-compose exec app php artisan setup:production + ``` + +### FPM version + +When using FPM image, you will need another container with a webserver to proxy http requests. In this example we use nginx with a basic container to do this. + +1. Download `nginx.conf` and `Dockerfile` file for nginx image. An example can be found on the [`example section`](https://github.com/monicahq/docker/blob/master/.examples/supervisor/fpm/web/) + + ```sh + mkdir web + curl -sSL https://raw.githubusercontent.com/monicahq/docker/master/.examples/nginx-proxy/web/nginx.conf -o web/nginx.conf + curl -sSL https://raw.githubusercontent.com/monicahq/docker/master/.examples/nginx-proxy/web/Dockerfile -o web/Dockerfile + ``` + + The `web` container image should be pre-build before each deploy with: `docker-compose build`. + +2. Create a `docker-compose.yml` file + + ```yaml + version: "3.4" + + services: + app: + image: monica:fpm + depends_on: + - db + environment: + - APP_KEY= + - DB_HOST=db + - DB_USERNAME=monica + - DB_PASSWORD=secret + volumes: + - data:/var/www/html/storage + restart: always + + web: + build: ./web + ports: + - 8080:80 + depends_on: + - app + volumes: + - data:/var/www/html/storage:ro + restart: always + + db: + image: mysql:5.7 + environment: + - MYSQL_RANDOM_ROOT_PASSWORD=true + - MYSQL_DATABASE=monica + - MYSQL_USER=monica + - MYSQL_PASSWORD=secret + volumes: + - mysql:/var/lib/mysql + restart: always + + volumes: + data: + name: data + mysql: + name: mysql + ``` + +3. Set a value for `APP_KEY` variable before you run this setup. It should be a random 32-character string. You can for instance copy and paste the output of `echo -n 'base64:'; openssl rand -base64 32`: + +4. Run + + ```console + docker-compose up -d + ``` + + Wait until all migrations are done and then access Monica at http://localhost:8080/ from your host system. If this looks ok, add your first user account. + +5. Run this command once: + + ```console + docker-compose exec app php artisan setup:production + ``` + +## Make Monica available from the internet + +To expose your Monica instance for the internet, it's important to set environment variable `APP_ENV=production`. In this case `https` mode will be mandatory. + +### Using a proxy webserver on the host + +One way to expose your Monica instance is to use a proxy webserver from your host with SSL capabilities. This is possible with a reverse proxy. + +### Using a proxy webserver container + +See some examples of docker-compose possibilities in the [example section](https://github.com/monicahq/docker/blob/master/.examples) to show how to a proxy webserver with ssl capabilities. + +# Image Variants + +The `monica` images come in many flavors, each designed for a specific use case. + +## `monica:` + +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. + +## `monica:-alpine` + +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. + +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. + +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). + +# License + +View [license information](https://github.com/monicahq/monica/blob/main/LICENSE.md) for the software contained in this image. + +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). + +Some additional license information which was able to be auto-detected might be found in [the `repo-info` repository's `monica/` directory](https://github.com/docker-library/repo-info/tree/master/repos/monica). + +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. diff --git a/monica/content.md b/monica/content.md new file mode 100644 index 000000000000..5c5d7adb5708 --- /dev/null +++ b/monica/content.md @@ -0,0 +1,221 @@ +# What is Monica? + +Monica is a great open source personal relationship management system to organize the interactions with your loved ones. + +%%LOGO%% + +## How to use this image + +There are two versions of the image you may choose from. + +The `apache` tag contains a full Monica installation with an apache webserver. This points to the default `latest` tag too. + +The `fpm` tag contains a fastCGI-Process that serves the web pages. This image should be combined with a webserver used as a proxy, like apache or nginx. + +### Using the apache image + +This image contains a webserver that exposes port 80. Run the container with: + +```console +docker run --name some-%%REPO%% -d -p 8080:80 %%IMAGE%% +``` + +### Using the fpm image + +This image serves a fastCGI server that exposes port 9000. You may need an additional web server that can proxy requests to the fpm port 9000 of the container. Run this container with: + +```console +docker run --name some-%%REPO%% -d -p 9000:9000 %%IMAGE%%:fpm +``` + +### Using an external database + +You'll need to setup an external database. Monica currently support MySQL/MariaDB database. You can also link a database container, e. g. `--link my-mysql:db`, and then use `db` as the database host on setup. More info is in the docker-compose section. + +### Persistent data storage + +To have a persistent storage for your datas, you may want to create volumes for your db, and for monica you will have to save the `/var/www/html/storage` directory. + +Run a container with this named volume: + +```console +docker run -d \ + -v monica_data:/var/www/html/storage \ + %%IMAGE%% +``` + +### Run commands inside the container + +Like every Laravel application, the `php artisan` command is very usefull for Monica. To run a command inside the container, run + +```console +docker exec CONTAINER_ID php artisan COMMAND +``` + +or for docker-compose + +```console +docker-compose exec %%REPO%% php artisan COMMAND +``` + +where `%%REPO%%` is the name of the service in your `docker-compose.yml` file. + +## Configuration using environment variables + +The Monica image will use environment variables to setup the application. See [Monica documentation](https://github.com/monicahq/monica/blob/main/.env.example) for common used variables you should setup. + +## Running the image with docker-compose + +See some examples of docker-compose possibilities in the [example section](%%GITHUB-REPO%%/blob/master/.examples). + +--- + +### Apache version + +This version will use the apache image and add a mysql container. The volumes are set to keep your data persistent. This setup provides **no ssl encryption** and is intended to run behind a proxy. + +Make sure to pass in values for `APP_KEY` variable before you run this setup. + +1. Create a `docker-compose.yml` file + + ```yaml + version: "3.4" + + services: + app: + image: monica + depends_on: + - db + ports: + - 8080:80 + environment: + - APP_KEY= + - DB_HOST=db + - DB_USERNAME=monica + - DB_PASSWORD=secret + volumes: + - data:/var/www/html/storage + restart: always + + db: + image: mysql:5.7 + environment: + - MYSQL_RANDOM_ROOT_PASSWORD=true + - MYSQL_DATABASE=monica + - MYSQL_USER=monica + - MYSQL_PASSWORD=secret + volumes: + - mysql:/var/lib/mysql + restart: always + + volumes: + data: + name: data + mysql: + name: mysql + ``` + +2. Set a value for `APP_KEY` variable before you run this setup. It should be a random 32-character string. You can for instance copy and paste the output of `echo -n 'base64:'; openssl rand -base64 32`: + +3. Run + + ```console + docker-compose up -d + ``` + + Wait until all migrations are done and then access Monica at http://localhost:8080/ from your host system. If this looks ok, add your first user account. + +4. Run this command once: + + ```console + docker-compose exec app php artisan setup:production + ``` + +### FPM version + +When using FPM image, you will need another container with a webserver to proxy http requests. In this example we use nginx with a basic container to do this. + +1. Download `nginx.conf` and `Dockerfile` file for nginx image. An example can be found on the [`example section`](%%GITHUB-REPO%%/blob/master/.examples/supervisor/fpm/web/) + + ```sh + mkdir web + curl -sSL https://raw.githubusercontent.com/monicahq/docker/master/.examples/nginx-proxy/web/nginx.conf -o web/nginx.conf + curl -sSL https://raw.githubusercontent.com/monicahq/docker/master/.examples/nginx-proxy/web/Dockerfile -o web/Dockerfile + ``` + + The `web` container image should be pre-build before each deploy with: `docker-compose build`. + +2. Create a `docker-compose.yml` file + + ```yaml + version: "3.4" + + services: + app: + image: monica:fpm + depends_on: + - db + environment: + - APP_KEY= + - DB_HOST=db + - DB_USERNAME=monica + - DB_PASSWORD=secret + volumes: + - data:/var/www/html/storage + restart: always + + web: + build: ./web + ports: + - 8080:80 + depends_on: + - app + volumes: + - data:/var/www/html/storage:ro + restart: always + + db: + image: mysql:5.7 + environment: + - MYSQL_RANDOM_ROOT_PASSWORD=true + - MYSQL_DATABASE=monica + - MYSQL_USER=monica + - MYSQL_PASSWORD=secret + volumes: + - mysql:/var/lib/mysql + restart: always + + volumes: + data: + name: data + mysql: + name: mysql + ``` + +3. Set a value for `APP_KEY` variable before you run this setup. It should be a random 32-character string. You can for instance copy and paste the output of `echo -n 'base64:'; openssl rand -base64 32`: + +4. Run + + ```console + docker-compose up -d + ``` + + Wait until all migrations are done and then access Monica at http://localhost:8080/ from your host system. If this looks ok, add your first user account. + +5. Run this command once: + + ```console + docker-compose exec app php artisan setup:production + ``` + +## Make Monica available from the internet + +To expose your Monica instance for the internet, it's important to set environment variable `APP_ENV=production`. In this case `https` mode will be mandatory. + +### Using a proxy webserver on the host + +One way to expose your Monica instance is to use a proxy webserver from your host with SSL capabilities. This is possible with a reverse proxy. + +### Using a proxy webserver container + +See some examples of docker-compose possibilities in the [example section](%%GITHUB-REPO%%/blob/master/.examples) to show how to a proxy webserver with ssl capabilities. diff --git a/monica/github-repo b/monica/github-repo new file mode 100644 index 000000000000..10cb578beb3b --- /dev/null +++ b/monica/github-repo @@ -0,0 +1 @@ +https://github.com/monicahq/docker diff --git a/monica/license.md b/monica/license.md new file mode 100644 index 000000000000..c2fc8d064cc4 --- /dev/null +++ b/monica/license.md @@ -0,0 +1 @@ +View [license information](https://github.com/monicahq/monica/blob/main/LICENSE.md) for the software contained in this image. diff --git a/monica/logo.svg b/monica/logo.svg new file mode 100644 index 000000000000..3dd240f96db3 --- /dev/null +++ b/monica/logo.svg @@ -0,0 +1 @@ +Artboard 3.1Created using Figma \ No newline at end of file diff --git a/monica/maintainer.md b/monica/maintainer.md new file mode 100644 index 000000000000..bf1f56b278bb --- /dev/null +++ b/monica/maintainer.md @@ -0,0 +1 @@ +[Monica Team](%%GITHUB-REPO%%) diff --git a/mono/README.md b/mono/README.md index 2f36a0f2c7e5..06c903957f0a 100644 --- a/mono/README.md +++ b/mono/README.md @@ -20,16 +20,14 @@ WARNING: [the Mono Project](https://github.com/mono/docker) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`6.8.0.96`, `latest`, `6.8.0`, `6.8`, `6`](https://github.com/mono/docker/blob/65ca4c1ec4349dd187997f216d1fdcbfcb46b38a/6.8.0.96/Dockerfile) -- [`6.8.0.96-slim`, `slim`, `6.8.0-slim`, `6.8-slim`, `6-slim`](https://github.com/mono/docker/blob/65ca4c1ec4349dd187997f216d1fdcbfcb46b38a/6.8.0.96/slim/Dockerfile) -- [`6.6.0.161`, `6.6.0`, `6.6`](https://github.com/mono/docker/blob/4374af564e9ffd69f526135fb78c148d0a03012a/6.6.0.161/Dockerfile) -- [`6.6.0.161-slim`, `6.6.0-slim`, `6.6-slim`](https://github.com/mono/docker/blob/4374af564e9ffd69f526135fb78c148d0a03012a/6.6.0.161/slim/Dockerfile) -- [`5.20.1.34`, `5.20.1`, `5.20`, `5`](https://github.com/mono/docker/blob/c47c852008be6934ac650f282c18c70f2cfec72f/5.20.1.34/Dockerfile) -- [`5.20.1.34-slim`, `5.20.1-slim`, `5.20-slim`, `5-slim`](https://github.com/mono/docker/blob/c47c852008be6934ac650f282c18c70f2cfec72f/5.20.1.34/slim/Dockerfile) +- [`6.12.0.182`, `latest`, `6.12.0`, `6.12`, `6`](https://github.com/mono/docker/blob/9293c0cddf31a3dc829fccc6f8e1eb507a91cd34/6.12.0.182/Dockerfile) +- [`6.12.0.182-slim`, `slim`, `6.12.0-slim`, `6.12-slim`, `6-slim`](https://github.com/mono/docker/blob/9293c0cddf31a3dc829fccc6f8e1eb507a91cd34/6.12.0.182/slim/Dockerfile) +- [`6.10.0.104`, `6.10.0`, `6.10`](https://github.com/mono/docker/blob/0403aaf506b8f6859332a5035f660a7a228d3a97/6.10.0.104/Dockerfile) +- [`6.10.0.104-slim`, `6.10.0-slim`, `6.10-slim`](https://github.com/mono/docker/blob/0403aaf506b8f6859332a5035f660a7a228d3a97/6.10.0.104/slim/Dockerfile) # Quick reference (cont.) @@ -44,7 +42,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/mono`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fmono) + [official-images repo's `library/mono` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fmono) [official-images repo's `library/mono` file](https://github.com/docker-library/official-images/blob/master/library/mono) ([history](https://github.com/docker-library/official-images/commits/master/library/mono)) - **Source of this description**: @@ -61,30 +59,22 @@ Sponsored by Xamarin, Mono is an open source implementation of Microsoft's .NET # How to use this image -This image will run stand-alone Mono console apps. - -## Create a `Dockerfile` in your Mono app project - -This example Dockerfile will run an executable called `TestingConsoleApp.exe`. +To run a pre-built .exe file with the Mono image, use the following commands: ```dockerfile -FROM mono:3.10-onbuild -CMD [ "mono", "./TestingConsoleApp.exe" ] +FROM mono:latest +RUN mkdir /opt/app +COPY HelloWorld.exe /opt/app +CMD ["mono", "/opt/app/HelloWorld.exe"] ``` -Place this file in the root of your app, next to the `.sln` solution file. Modify the exectuable name to match what you want to run. - -This image includes `ONBUILD` triggers that adds your app source code to `/usr/src/app/source`, restores NuGet packages and compiles the app, placing the output in `/usr/src/app/build`. - -With the Dockerfile in place, you can build and run a Docker image with your app: +You can build and run the Docker Image as shown in the following example: ```console -$ docker build -t my-app . -$ docker run my-app +docker build -t monoapp . +docker run -it --rm monoapp ``` -You should see any output from your app now. - # Credits This Docker image is provided by Xamarin, for users of the Mono Project. diff --git a/mono/content.md b/mono/content.md index 209e65b8a18f..99510debf0df 100644 --- a/mono/content.md +++ b/mono/content.md @@ -9,30 +9,22 @@ Sponsored by Xamarin, Mono is an open source implementation of Microsoft's .NET # How to use this image -This image will run stand-alone Mono console apps. - -## Create a `Dockerfile` in your Mono app project - -This example Dockerfile will run an executable called `TestingConsoleApp.exe`. +To run a pre-built .exe file with the Mono image, use the following commands: ```dockerfile -FROM %%IMAGE%%:3.10-onbuild -CMD [ "mono", "./TestingConsoleApp.exe" ] +FROM %%IMAGE%%:latest +RUN mkdir /opt/app +COPY HelloWorld.exe /opt/app +CMD ["mono", "/opt/app/HelloWorld.exe"] ``` -Place this file in the root of your app, next to the `.sln` solution file. Modify the exectuable name to match what you want to run. - -This image includes `ONBUILD` triggers that adds your app source code to `/usr/src/app/source`, restores NuGet packages and compiles the app, placing the output in `/usr/src/app/build`. - -With the Dockerfile in place, you can build and run a Docker image with your app: +You can build and run the Docker Image as shown in the following example: ```console -$ docker build -t my-app . -$ docker run my-app +docker build -t monoapp . +docker run -it --rm monoapp ``` -You should see any output from your app now. - # Credits This Docker image is provided by Xamarin, for users of the Mono Project. diff --git a/mysql/README.md b/mysql/README.md index ad22f4dacd59..e67f93378d89 100644 --- a/mysql/README.md +++ b/mysql/README.md @@ -20,13 +20,14 @@ WARNING: [the Docker Community and the MySQL Team](https://github.com/docker-library/mysql) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`8.0.20`, `8.0`, `8`, `latest`](https://github.com/docker-library/mysql/blob/fef511444a9d2867c9e4e20f5b4062bc071c20a2/8.0/Dockerfile) -- [`5.7.30`, `5.7`, `5`](https://github.com/docker-library/mysql/blob/7397711170daed7ebba3bf373af143e5179906fc/5.7/Dockerfile) -- [`5.6.48`, `5.6`](https://github.com/docker-library/mysql/blob/d2ba5f1fd5c1f4002253b80575de9c759d22bb1e/5.6/Dockerfile) +- [`8.0.31`, `8.0`, `8`, `latest`, `8.0.31-oracle`, `8.0-oracle`, `8-oracle`, `oracle`](https://github.com/docker-library/mysql/blob/e0d43b2a29867c5b7d5c01a8fea30a086861df2b/8.0/Dockerfile.oracle) +- [`8.0.31-debian`, `8.0-debian`, `8-debian`, `debian`](https://github.com/docker-library/mysql/blob/e0d43b2a29867c5b7d5c01a8fea30a086861df2b/8.0/Dockerfile.debian) +- [`5.7.40`, `5.7`, `5`, `5.7.40-oracle`, `5.7-oracle`, `5-oracle`](https://github.com/docker-library/mysql/blob/e0d43b2a29867c5b7d5c01a8fea30a086861df2b/5.7/Dockerfile.oracle) +- [`5.7.40-debian`, `5.7-debian`, `5-debian`](https://github.com/docker-library/mysql/blob/e0d43b2a29867c5b7d5c01a8fea30a086861df2b/5.7/Dockerfile.debian) # Quick reference (cont.) @@ -34,14 +35,14 @@ WARNING: [https://github.com/docker-library/mysql/issues](https://github.com/docker-library/mysql/issues) - **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) - [`amd64`](https://hub.docker.com/r/amd64/mysql/) + [`amd64`](https://hub.docker.com/r/amd64/mysql/), [`arm64v8`](https://hub.docker.com/r/arm64v8/mysql/) - **Published image artifact details**: [repo-info repo's `repos/mysql/` directory](https://github.com/docker-library/repo-info/blob/master/repos/mysql) ([history](https://github.com/docker-library/repo-info/commits/master/repos/mysql)) (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/mysql`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fmysql) + [official-images repo's `library/mysql` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fmysql) [official-images repo's `library/mysql` file](https://github.com/docker-library/official-images/blob/master/library/mysql) ([history](https://github.com/docker-library/official-images/commits/master/library/mysql)) - **Source of this description**: @@ -97,6 +98,8 @@ services: db: image: mysql + # NOTE: use of "mysql_native_password" is not recommended: https://dev.mysql.com/doc/refman/8.0/en/upgrading-from-previous-series.html#upgrade-caching-sha2-password + # (this is just an example, not intended to be a production configuration) command: --default-authentication-plugin=mysql_native_password restart: always environment: @@ -109,7 +112,7 @@ services: - 8080:8080 ``` -[![Try in PWD](https://github.com/play-with-docker/stacks/raw/cff22438cb4195ace27f9b15784bbb497047afa7/assets/images/button.png)](http://play-with-docker.com?stack=https://raw.githubusercontent.com/docker-library/docs/b664a62bb7be3e0cbc2304e306ea42f33244fad1/mysql/stack.yml) +[![Try in PWD](https://github.com/play-with-docker/stacks/raw/cff22438cb4195ace27f9b15784bbb497047afa7/assets/images/button.png)](http://play-with-docker.com?stack=https://raw.githubusercontent.com/docker-library/docs/06990e05c934d425c74addcc5ea462f53de6c8cd/mysql/stack.yml) Run `docker stack deploy -c stack.yml mysql` (or `docker-compose -f stack.yml up`), wait for it to initialize completely, and visit `http://swarm-ip:8080`, `http://localhost:8080`, or `http://host-ip:8080` (as appropriate). @@ -175,15 +178,19 @@ Do note that there is no need to use this mechanism to create the root superuser ### `MYSQL_ALLOW_EMPTY_PASSWORD` -This is an optional variable. Set to `yes` to allow the container to be started with a blank password for the root user. *NOTE*: Setting this variable to `yes` is not recommended unless you really know what you are doing, since this will leave your MySQL instance completely unprotected, allowing anyone to gain complete superuser access. +This is an optional variable. Set to a non-empty value, like `yes`, to allow the container to be started with a blank password for the root user. *NOTE*: Setting this variable to `yes` is not recommended unless you really know what you are doing, since this will leave your MySQL instance completely unprotected, allowing anyone to gain complete superuser access. ### `MYSQL_RANDOM_ROOT_PASSWORD` -This is an optional variable. Set to `yes` to generate a random initial password for the root user (using `pwgen`). The generated root password will be printed to stdout (`GENERATED ROOT PASSWORD: .....`). +This is an optional variable. Set to a non-empty value, like `yes`, to generate a random initial password for the root user (using `pwgen`). The generated root password will be printed to stdout (`GENERATED ROOT PASSWORD: .....`). ### `MYSQL_ONETIME_PASSWORD` -Sets root (*not* the user specified in `MYSQL_USER`!) user as expired once init is complete, forcing a password change on first login. *NOTE*: This feature is supported on MySQL 5.6+ only. Using this option on MySQL 5.5 will throw an appropriate error during initialization. +Sets root (*not* the user specified in `MYSQL_USER`!) user as expired once init is complete, forcing a password change on first login. Any non-empty value will activate this setting. *NOTE*: This feature is supported on MySQL 5.6+ only. Using this option on MySQL 5.5 will throw an appropriate error during initialization. + +### `MYSQL_INITDB_SKIP_TZINFO` + +By default, the entrypoint script automatically loads the timezone data needed for the `CONVERT_TZ()` function. If it is not needed, any non-empty value disables timezone loading. ## Docker Secrets diff --git a/mysql/content.md b/mysql/content.md index 59a45a07c7e9..1e05ae1a8a18 100644 --- a/mysql/content.md +++ b/mysql/content.md @@ -102,15 +102,19 @@ Do note that there is no need to use this mechanism to create the root superuser ### `MYSQL_ALLOW_EMPTY_PASSWORD` -This is an optional variable. Set to `yes` to allow the container to be started with a blank password for the root user. *NOTE*: Setting this variable to `yes` is not recommended unless you really know what you are doing, since this will leave your MySQL instance completely unprotected, allowing anyone to gain complete superuser access. +This is an optional variable. Set to a non-empty value, like `yes`, to allow the container to be started with a blank password for the root user. *NOTE*: Setting this variable to `yes` is not recommended unless you really know what you are doing, since this will leave your MySQL instance completely unprotected, allowing anyone to gain complete superuser access. ### `MYSQL_RANDOM_ROOT_PASSWORD` -This is an optional variable. Set to `yes` to generate a random initial password for the root user (using `pwgen`). The generated root password will be printed to stdout (`GENERATED ROOT PASSWORD: .....`). +This is an optional variable. Set to a non-empty value, like `yes`, to generate a random initial password for the root user (using `pwgen`). The generated root password will be printed to stdout (`GENERATED ROOT PASSWORD: .....`). ### `MYSQL_ONETIME_PASSWORD` -Sets root (*not* the user specified in `MYSQL_USER`!) user as expired once init is complete, forcing a password change on first login. *NOTE*: This feature is supported on MySQL 5.6+ only. Using this option on MySQL 5.5 will throw an appropriate error during initialization. +Sets root (*not* the user specified in `MYSQL_USER`!) user as expired once init is complete, forcing a password change on first login. Any non-empty value will activate this setting. *NOTE*: This feature is supported on MySQL 5.6+ only. Using this option on MySQL 5.5 will throw an appropriate error during initialization. + +### `MYSQL_INITDB_SKIP_TZINFO` + +By default, the entrypoint script automatically loads the timezone data needed for the `CONVERT_TZ()` function. If it is not needed, any non-empty value disables timezone loading. ## Docker Secrets diff --git a/mysql/stack.yml b/mysql/stack.yml index ae410add45f6..ed16565b6311 100644 --- a/mysql/stack.yml +++ b/mysql/stack.yml @@ -5,6 +5,8 @@ services: db: image: mysql + # NOTE: use of "mysql_native_password" is not recommended: https://dev.mysql.com/doc/refman/8.0/en/upgrading-from-previous-series.html#upgrade-caching-sha2-password + # (this is just an example, not intended to be a production configuration) command: --default-authentication-plugin=mysql_native_password restart: always environment: diff --git a/nats-streaming/README-short.txt b/nats-streaming/README-short.txt index 3568f89f2c81..caea83c13a35 100644 --- a/nats-streaming/README-short.txt +++ b/nats-streaming/README-short.txt @@ -1 +1 @@ -NATS Streaming is an open-source, high-performance, cloud native messaging streaming system. +DEPRECATED; An open-source, high-performance, cloud native messaging streaming system. diff --git a/nats-streaming/README.md b/nats-streaming/README.md index b4399f92ae45..bd372cbc7730 100644 --- a/nats-streaming/README.md +++ b/nats-streaming/README.md @@ -14,13 +14,17 @@ WARNING: --> +# **DEPRECATION NOTICE** + +The NATS Streaming Server is being deprecated. Critical bug fixes and security fixes will be applied until June of 2023. NATS enabled applications requiring persistence should use [JetStream](https://docs.nats.io/jetstream/jetstream). + # Quick reference - **Maintained by**: [the NATS Project](https://github.com/nats-io/nats-streaming-docker) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links @@ -28,15 +32,20 @@ WARNING: ## Simple Tags -- [`0.17.0-linux`, `linux`](https://github.com/nats-io/nats-streaming-docker/blob/9716618a61deba8a7e28b69d53d95d698bde5117/amd64/Dockerfile) -- [`0.17.0-nanoserver-1809`, `nanoserver-1809`](https://github.com/nats-io/nats-streaming-docker/blob/9716618a61deba8a7e28b69d53d95d698bde5117/windows/nanoserver-1809/Dockerfile) -- [`0.17.0-windowsservercore`, `windowsservercore`](https://github.com/nats-io/nats-streaming-docker/blob/9716618a61deba8a7e28b69d53d95d698bde5117/windows/windowsservercore/Dockerfile) +- [`0.25.3-alpine3.17`, `0.25-alpine3.17`, `alpine3.17`, `0.25.3-alpine`, `0.25-alpine`, `alpine`](https://github.com/nats-io/nats-streaming-docker/blob/03eccc22a9512d3f18b42db735e7acb7070a2293/0.25.3/alpine3.17/Dockerfile) +- [`0.25.3-scratch`, `0.25-scratch`, `scratch`, `0.25.3-linux`, `0.25-linux`, `linux`](https://github.com/nats-io/nats-streaming-docker/blob/03eccc22a9512d3f18b42db735e7acb7070a2293/0.25.3/scratch/Dockerfile) +- [`0.25.3-windowsservercore-1809`, `0.25-windowsservercore-1809`, `windowsservercore-1809`](https://github.com/nats-io/nats-streaming-docker/blob/03eccc22a9512d3f18b42db735e7acb7070a2293/0.25.3/windowsservercore-1809/Dockerfile) +- [`0.25.3-nanoserver-1809`, `0.25-nanoserver-1809`, `nanoserver-1809`](https://github.com/nats-io/nats-streaming-docker/blob/03eccc22a9512d3f18b42db735e7acb7070a2293/0.25.3/nanoserver-1809/Dockerfile) ## Shared Tags -- `0.17.0`, `latest`: - - [`0.17.0-linux`](https://github.com/nats-io/nats-streaming-docker/blob/9716618a61deba8a7e28b69d53d95d698bde5117/amd64/Dockerfile) - - [`0.17.0-nanoserver-1809`](https://github.com/nats-io/nats-streaming-docker/blob/9716618a61deba8a7e28b69d53d95d698bde5117/windows/nanoserver-1809/Dockerfile) +- `0.25.3`, `0.25`, `latest`: + - [`0.25.3-scratch`](https://github.com/nats-io/nats-streaming-docker/blob/03eccc22a9512d3f18b42db735e7acb7070a2293/0.25.3/scratch/Dockerfile) + - [`0.25.3-nanoserver-1809`](https://github.com/nats-io/nats-streaming-docker/blob/03eccc22a9512d3f18b42db735e7acb7070a2293/0.25.3/nanoserver-1809/Dockerfile) +- `0.25.3-windowsservercore`, `0.25-windowsservercore`, `windowsservercore`: + - [`0.25.3-windowsservercore-1809`](https://github.com/nats-io/nats-streaming-docker/blob/03eccc22a9512d3f18b42db735e7acb7070a2293/0.25.3/windowsservercore-1809/Dockerfile) +- `0.25.3-nanoserver`, `0.25-nanoserver`, `nanoserver`: + - [`0.25.3-nanoserver-1809`](https://github.com/nats-io/nats-streaming-docker/blob/03eccc22a9512d3f18b42db735e7acb7070a2293/0.25.3/nanoserver-1809/Dockerfile) # Quick reference (cont.) @@ -51,7 +60,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/nats-streaming`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fnats-streaming) + [official-images repo's `library/nats-streaming` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fnats-streaming) [official-images repo's `library/nats-streaming` file](https://github.com/docker-library/official-images/blob/master/library/nats-streaming) ([history](https://github.com/docker-library/official-images/commits/master/library/nats-streaming)) - **Source of this description**: @@ -125,29 +134,30 @@ $ docker run -d -p 4222:4222 -p 8222:8222 nats-streaming Output that you would get if you had started with `-ti` instead of `d` (for daemon): ```bash -[1] 2020/02/11 19:45:55.379789 [INF] STREAM: Starting nats-streaming-server[test-cluster] version 0.17.0 -[1] 2020/02/11 19:45:55.379864 [INF] STREAM: ServerID: oe3fSgSCIfkPnbGvQch6k9 -[1] 2020/02/11 19:45:55.379867 [INF] STREAM: Go version: go1.13.7 -[1] 2020/02/11 19:45:55.379869 [INF] STREAM: Git commit: [f4b7190] -[1] 2020/02/11 19:45:55.380454 [INF] Starting nats-server version 2.1.4 -[1] 2020/02/11 19:45:55.380461 [INF] Git commit [fb009af] -[1] 2020/02/11 19:45:55.380619 [INF] Starting http monitor on 0.0.0.0:8222 -[1] 2020/02/11 19:45:55.380659 [INF] Listening for client connections on 0.0.0.0:4222 -[1] 2020/02/11 19:45:55.380662 [INF] Server id is NCIJ5WZMDXD3SRQFXAZNMO4C4BMEKVTZA33WLG4VPP7LRE37KIB5D4FX -[1] 2020/02/11 19:45:55.380664 [INF] Server is ready -[1] 2020/02/11 19:45:55.407105 [INF] STREAM: Recovering the state... -[1] 2020/02/11 19:45:55.407113 [INF] STREAM: No recovered state -[1] 2020/02/11 19:45:55.662310 [INF] STREAM: Message store is MEMORY -[1] 2020/02/11 19:45:55.662347 [INF] STREAM: ---------- Store Limits ---------- -[1] 2020/02/11 19:45:55.662351 [INF] STREAM: Channels: 100 * -[1] 2020/02/11 19:45:55.662355 [INF] STREAM: --------- Channels Limits -------- -[1] 2020/02/11 19:45:55.662358 [INF] STREAM: Subscriptions: 1000 * -[1] 2020/02/11 19:45:55.662361 [INF] STREAM: Messages : 1000000 * -[1] 2020/02/11 19:45:55.662364 [INF] STREAM: Bytes : 976.56 MB * -[1] 2020/02/11 19:45:55.662367 [INF] STREAM: Age : unlimited * -[1] 2020/02/11 19:45:55.662370 [INF] STREAM: Inactivity : unlimited * -[1] 2020/02/11 19:45:55.662374 [INF] STREAM: ---------------------------------- -[1] 2020/02/11 19:45:55.662377 [INF] STREAM: Streaming Server is ready +[1] 2022/10/11 14:57:50.404688 [INF] STREAM: Starting nats-streaming-server[test-cluster] version 0.25.2 +[1] 2022/10/11 14:57:50.404739 [INF] STREAM: ServerID: fbZJjwGYLBpNM5I8z23NSN +[1] 2022/10/11 14:57:50.404741 [INF] STREAM: Go version: go1.19.2 +[1] 2022/10/11 14:57:50.404743 [INF] STREAM: Git commit: [9e599667] +[1] 2022/10/11 14:57:50.406004 [INF] Starting nats-server +[1] 2022/10/11 14:57:50.406009 [INF] Version: 2.9.3 +[1] 2022/10/11 14:57:50.406011 [INF] Git: [25e82d7] +[1] 2022/10/11 14:57:50.406013 [INF] Name: NDQOBTB34ECZWAKAJAREPEXQPXGKUEJEZINCHV2CIHGGJQCSCVPQPU5W +[1] 2022/10/11 14:57:50.406015 [INF] ID: NDQOBTB34ECZWAKAJAREPEXQPXGKUEJEZINCHV2CIHGGJQCSCVPQPU5W +[1] 2022/10/11 14:57:50.406423 [INF] Listening for client connections on 0.0.0.0:4222 +[1] 2022/10/11 14:57:50.406679 [INF] Server is ready +[1] 2022/10/11 14:57:50.434935 [INF] STREAM: Recovering the state... +[1] 2022/10/11 14:57:50.434945 [INF] STREAM: No recovered state +[1] 2022/10/11 14:57:50.435271 [INF] STREAM: Message store is MEMORY +[1] 2022/10/11 14:57:50.435303 [INF] STREAM: ---------- Store Limits ---------- +[1] 2022/10/11 14:57:50.435306 [INF] STREAM: Channels: 100 * +[1] 2022/10/11 14:57:50.435308 [INF] STREAM: --------- Channels Limits -------- +[1] 2022/10/11 14:57:50.435310 [INF] STREAM: Subscriptions: 1000 * +[1] 2022/10/11 14:57:50.435311 [INF] STREAM: Messages : 1000000 * +[1] 2022/10/11 14:57:50.435313 [INF] STREAM: Bytes : 976.56 MB * +[1] 2022/10/11 14:57:50.435315 [INF] STREAM: Age : unlimited * +[1] 2022/10/11 14:57:50.435316 [INF] STREAM: Inactivity : unlimited * +[1] 2022/10/11 14:57:50.435318 [INF] STREAM: ---------------------------------- +[1] 2022/10/11 14:57:50.435320 [INF] STREAM: Streaming Server is ready ``` To use a file based store instead, you would run: @@ -155,29 +165,31 @@ To use a file based store instead, you would run: ```bash $ docker run -d -p 4222:4222 -p 8222:8222 nats-streaming -store file -dir datastore -[1] 2020/02/11 19:46:24.891825 [INF] STREAM: Starting nats-streaming-server[test-cluster] version 0.17.0 -[1] 2020/02/11 19:46:24.891863 [INF] STREAM: ServerID: y2zpmpnNLbnnLX4RGpW4HT -[1] 2020/02/11 19:46:24.891866 [INF] STREAM: Go version: go1.13.7 -[1] 2020/02/11 19:46:24.891868 [INF] STREAM: Git commit: [f4b7190] -[1] 2020/02/11 19:46:24.892633 [INF] Starting nats-server version 2.1.4 -[1] 2020/02/11 19:46:24.892653 [INF] Git commit [fb009af] -[1] 2020/02/11 19:46:24.892837 [INF] Listening for client connections on 0.0.0.0:4222 -[1] 2020/02/11 19:46:24.892857 [INF] Server id is NAB5BC4I4DY7UQ3NJVRYVSZ66SWMWQYCHMMMVO4KZDZU3WUDOBQZYH52 -[1] 2020/02/11 19:46:24.892860 [INF] Server is ready -[1] 2020/02/11 19:46:24.919546 [INF] STREAM: Recovering the state... -[1] 2020/02/11 19:46:24.919685 [INF] STREAM: No recovered state -[1] 2020/02/11 19:46:25.170492 [INF] STREAM: Message store is FILE -[1] 2020/02/11 19:46:25.170536 [INF] STREAM: Store location: datastore -[1] 2020/02/11 19:46:25.170563 [INF] STREAM: ---------- Store Limits ---------- -[1] 2020/02/11 19:46:25.170602 [INF] STREAM: Channels: 100 * -[1] 2020/02/11 19:46:25.170608 [INF] STREAM: --------- Channels Limits -------- -[1] 2020/02/11 19:46:25.170611 [INF] STREAM: Subscriptions: 1000 * -[1] 2020/02/11 19:46:25.170614 [INF] STREAM: Messages : 1000000 * -[1] 2020/02/11 19:46:25.170618 [INF] STREAM: Bytes : 976.56 MB * -[1] 2020/02/11 19:46:25.170621 [INF] STREAM: Age : unlimited * -[1] 2020/02/11 19:46:25.170624 [INF] STREAM: Inactivity : unlimited * -[1] 2020/02/11 19:46:25.170627 [INF] STREAM: ---------------------------------- -[1] 2020/02/11 19:46:25.170630 [INF] STREAM: Streaming Server is ready +[1] 2022/10/11 14:59:45.818823 [INF] STREAM: Starting nats-streaming-server[test-cluster] version 0.25.2 +[1] 2022/10/11 14:59:45.818874 [INF] STREAM: ServerID: mNhpLEpCO6WFqrnD9CYEZa +[1] 2022/10/11 14:59:45.818876 [INF] STREAM: Go version: go1.19.2 +[1] 2022/10/11 14:59:45.818877 [INF] STREAM: Git commit: [9e599667] +[1] 2022/10/11 14:59:45.820192 [INF] Starting nats-server +[1] 2022/10/11 14:59:45.820196 [INF] Version: 2.9.3 +[1] 2022/10/11 14:59:45.820198 [INF] Git: [25e82d7] +[1] 2022/10/11 14:59:45.820200 [INF] Name: NCDMFFEVOSPVVGQZVEQ3O5434LHF2KAPOR5LKAI7YEIAFIABTHQLZRLA +[1] 2022/10/11 14:59:45.820202 [INF] ID: NCDMFFEVOSPVVGQZVEQ3O5434LHF2KAPOR5LKAI7YEIAFIABTHQLZRLA +[1] 2022/10/11 14:59:45.820688 [INF] Listening for client connections on 0.0.0.0:4222 +[1] 2022/10/11 14:59:45.820849 [INF] Server is ready +[1] 2022/10/11 14:59:45.848443 [INF] STREAM: Recovering the state... +[1] 2022/10/11 14:59:45.848737 [INF] STREAM: No recovered state +[1] 2022/10/11 14:59:45.849050 [INF] STREAM: Message store is FILE +[1] 2022/10/11 14:59:45.849054 [INF] STREAM: Store location: datastore +[1] 2022/10/11 14:59:45.849070 [INF] STREAM: ---------- Store Limits ---------- +[1] 2022/10/11 14:59:45.849072 [INF] STREAM: Channels: 100 * +[1] 2022/10/11 14:59:45.849073 [INF] STREAM: --------- Channels Limits -------- +[1] 2022/10/11 14:59:45.849075 [INF] STREAM: Subscriptions: 1000 * +[1] 2022/10/11 14:59:45.849076 [INF] STREAM: Messages : 1000000 * +[1] 2022/10/11 14:59:45.849077 [INF] STREAM: Bytes : 976.56 MB * +[1] 2022/10/11 14:59:45.849078 [INF] STREAM: Age : unlimited * +[1] 2022/10/11 14:59:45.849079 [INF] STREAM: Inactivity : unlimited * +[1] 2022/10/11 14:59:45.849080 [INF] STREAM: ---------------------------------- +[1] 2022/10/11 14:59:45.849082 [INF] STREAM: Streaming Server is ready ``` You can also connect to a remote NATS Server running in a docker image. First, run NATS Server: @@ -191,24 +203,24 @@ Now, start the Streaming server and link it to the above docker image: ```bash $ docker run -d --link nats-main nats-streaming -store file -dir datastore -ns nats://nats-main:4222 -[1] 2020/02/11 19:46:40.206660 [INF] STREAM: Starting nats-streaming-server[test-cluster] version 0.17.0 -[1] 2020/02/11 19:46:40.206699 [INF] STREAM: ServerID: bon7pyyeNH4ClntI1fCJos -[1] 2020/02/11 19:46:40.206702 [INF] STREAM: Go version: go1.13.7 -[1] 2020/02/11 19:46:40.206704 [INF] STREAM: Git commit: [f4b7190] -[1] 2020/02/11 19:46:40.233833 [INF] STREAM: Recovering the state... -[1] 2020/02/11 19:46:40.233992 [INF] STREAM: No recovered state -[1] 2020/02/11 19:46:40.487836 [INF] STREAM: Message store is FILE -[1] 2020/02/11 19:46:40.487845 [INF] STREAM: Store location: datastore -[1] 2020/02/11 19:46:40.487884 [INF] STREAM: ---------- Store Limits ---------- -[1] 2020/02/11 19:46:40.487963 [INF] STREAM: Channels: 100 * -[1] 2020/02/11 19:46:40.487966 [INF] STREAM: --------- Channels Limits -------- -[1] 2020/02/11 19:46:40.487968 [INF] STREAM: Subscriptions: 1000 * -[1] 2020/02/11 19:46:40.487993 [INF] STREAM: Messages : 1000000 * -[1] 2020/02/11 19:46:40.487995 [INF] STREAM: Bytes : 976.56 MB * -[1] 2020/02/11 19:46:40.488023 [INF] STREAM: Age : unlimited * -[1] 2020/02/11 19:46:40.488025 [INF] STREAM: Inactivity : unlimited * -[1] 2020/02/11 19:46:40.488027 [INF] STREAM: ---------------------------------- -[1] 2020/02/11 19:46:40.488029 [INF] STREAM: Streaming Server is ready +[1] 2022/10/11 15:00:56.780184 [INF] STREAM: Starting nats-streaming-server[test-cluster] version 0.25.2 +[1] 2022/10/11 15:00:56.780235 [INF] STREAM: ServerID: jVQkB4KiIN4IVIuVoSumE0 +[1] 2022/10/11 15:00:56.780237 [INF] STREAM: Go version: go1.19.2 +[1] 2022/10/11 15:00:56.780241 [INF] STREAM: Git commit: [9e599667] +[1] 2022/10/11 15:00:56.809173 [INF] STREAM: Recovering the state... +[1] 2022/10/11 15:00:56.810336 [INF] STREAM: Recovered 0 channel(s) +[1] 2022/10/11 15:00:56.810612 [INF] STREAM: Message store is FILE +[1] 2022/10/11 15:00:56.810617 [INF] STREAM: Store location: datastore +[1] 2022/10/11 15:00:56.810633 [INF] STREAM: ---------- Store Limits ---------- +[1] 2022/10/11 15:00:56.810635 [INF] STREAM: Channels: 100 * +[1] 2022/10/11 15:00:56.810636 [INF] STREAM: --------- Channels Limits -------- +[1] 2022/10/11 15:00:56.810637 [INF] STREAM: Subscriptions: 1000 * +[1] 2022/10/11 15:00:56.810639 [INF] STREAM: Messages : 1000000 * +[1] 2022/10/11 15:00:56.810640 [INF] STREAM: Bytes : 976.56 MB * +[1] 2022/10/11 15:00:56.810641 [INF] STREAM: Age : unlimited * +[1] 2022/10/11 15:00:56.810642 [INF] STREAM: Inactivity : unlimited * +[1] 2022/10/11 15:00:56.810643 [INF] STREAM: ---------------------------------- +[1] 2022/10/11 15:00:56.810644 [INF] STREAM: Streaming Server is ready ``` Notice that the output shows that the NATS Server was not started, as opposed to the first output. @@ -232,22 +244,24 @@ Streaming Server Options: -hbt, --hb_timeout How long server waits for a heartbeat response -hbf, --hb_fail_count Number of failed heartbeats before server closes the client connection --ft_group Name of the FT Group. A group can be 2 or more servers with a single active server and all sharing the same datastore - -sl, --signal [=] Send signal to nats-streaming-server process (stop, quit, reopen) + -sl, --signal [=] Send signal to nats-streaming-server process (stop, quit, reopen, reload - only for embedded NATS Server) --encrypt Specify if server should use encryption at rest --encryption_cipher Cipher to use for encryption. Currently support AES and CHAHA (ChaChaPoly). Defaults to AES --encryption_key Encryption Key. It is recommended to specify it through the NATS_STREAMING_ENCRYPTION_KEY environment variable instead - + --replace_durable Replace the existing durable subscription instead of reporting a duplicate durable error + Streaming Server Clustering Options: - --clustered Run the server in a clustered configuration (default: false) - --cluster_node_id ID of the node within the cluster if there is no stored ID (default: random UUID) - --cluster_bootstrap Bootstrap the cluster if there is no existing state by electing self as leader (default: false) - --cluster_peers Comma separated list of cluster peer node IDs to bootstrap cluster state - --cluster_log_path Directory to store log replication data - --cluster_log_cache_size Number of log entries to cache in memory to reduce disk IO (default: 512) - --cluster_log_snapshots Number of log snapshots to retain (default: 2) - --cluster_trailing_logs Number of log entries to leave after a snapshot and compaction - --cluster_sync Do a file sync after every write to the replication log and message store - --cluster_raft_logging Enable logging from the Raft library (disabled by default) + --clustered Run the server in a clustered configuration (default: false) + --cluster_node_id ID of the node within the cluster if there is no stored ID (default: random UUID) + --cluster_bootstrap Bootstrap the cluster if there is no existing state by electing self as leader (default: false) + --cluster_peers Comma separated list of cluster peer node IDs to bootstrap cluster state + --cluster_log_path Directory to store log replication data + --cluster_log_cache_size Number of log entries to cache in memory to reduce disk IO (default: 512) + --cluster_log_snapshots Number of log snapshots to retain (default: 2) + --cluster_trailing_logs Number of log entries to leave after a snapshot and compaction + --cluster_sync Do a file sync after every write to the replication log and message store + --cluster_raft_logging Enable logging from the Raft library (disabled by default) + --cluster_allow_add_remove_node Enable the ability to send NATS requests to the leader to add/remove cluster nodes Streaming Server File Store Options: --file_compact_enabled Enable file compaction @@ -273,6 +287,7 @@ Streaming Server SQL Store Options: --sql_source Datasource used when opening an SQL connection to the database --sql_no_caching Enable/Disable caching for improved performance --sql_max_open_conns Maximum number of opened connections to the database + --sql_bulk_insert_limit Maximum number of messages stored with a single SQL "INSERT" statement Streaming Server TLS Options: -secure Use a TLS connection to the NATS server without @@ -299,7 +314,7 @@ Embedded NATS Server Options: Logging Options: -l, --log File to redirect log output -T, --logtime= Timestamp log entries (default: true) - -s, --syslog Enable syslog as log method + -s, --syslog Enable syslog as log method -r, --remote_syslog Syslog server addr (udp://localhost:514) -D, --debug= Enable debugging output -V, --trace= Trace the raw protocol @@ -329,7 +344,7 @@ Common Options: # Configuration -Details on how to configure further the NATS Streaming server can be found [here](https://github.com/nats-io/nats-streaming-server#configuring) +Details on how to configure further the NATS Streaming server can be found [here](https://docs.nats.io/nats-streaming-server/configuring) # Image Variants @@ -339,6 +354,14 @@ The `nats-streaming` images come in many flavors, each designed for a specific u 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. +## `nats-streaming:-alpine` + +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. + +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. + +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). + ## `nats-streaming:-windowsservercore` 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. diff --git a/nats-streaming/content.md b/nats-streaming/content.md index 9e1268a65ed6..0545e41334ee 100644 --- a/nats-streaming/content.md +++ b/nats-streaming/content.md @@ -66,29 +66,30 @@ $ docker run -d -p 4222:4222 -p 8222:8222 %%IMAGE%% Output that you would get if you had started with `-ti` instead of `d` (for daemon): ```bash -[1] 2020/02/11 19:45:55.379789 [INF] STREAM: Starting nats-streaming-server[test-cluster] version 0.17.0 -[1] 2020/02/11 19:45:55.379864 [INF] STREAM: ServerID: oe3fSgSCIfkPnbGvQch6k9 -[1] 2020/02/11 19:45:55.379867 [INF] STREAM: Go version: go1.13.7 -[1] 2020/02/11 19:45:55.379869 [INF] STREAM: Git commit: [f4b7190] -[1] 2020/02/11 19:45:55.380454 [INF] Starting nats-server version 2.1.4 -[1] 2020/02/11 19:45:55.380461 [INF] Git commit [fb009af] -[1] 2020/02/11 19:45:55.380619 [INF] Starting http monitor on 0.0.0.0:8222 -[1] 2020/02/11 19:45:55.380659 [INF] Listening for client connections on 0.0.0.0:4222 -[1] 2020/02/11 19:45:55.380662 [INF] Server id is NCIJ5WZMDXD3SRQFXAZNMO4C4BMEKVTZA33WLG4VPP7LRE37KIB5D4FX -[1] 2020/02/11 19:45:55.380664 [INF] Server is ready -[1] 2020/02/11 19:45:55.407105 [INF] STREAM: Recovering the state... -[1] 2020/02/11 19:45:55.407113 [INF] STREAM: No recovered state -[1] 2020/02/11 19:45:55.662310 [INF] STREAM: Message store is MEMORY -[1] 2020/02/11 19:45:55.662347 [INF] STREAM: ---------- Store Limits ---------- -[1] 2020/02/11 19:45:55.662351 [INF] STREAM: Channels: 100 * -[1] 2020/02/11 19:45:55.662355 [INF] STREAM: --------- Channels Limits -------- -[1] 2020/02/11 19:45:55.662358 [INF] STREAM: Subscriptions: 1000 * -[1] 2020/02/11 19:45:55.662361 [INF] STREAM: Messages : 1000000 * -[1] 2020/02/11 19:45:55.662364 [INF] STREAM: Bytes : 976.56 MB * -[1] 2020/02/11 19:45:55.662367 [INF] STREAM: Age : unlimited * -[1] 2020/02/11 19:45:55.662370 [INF] STREAM: Inactivity : unlimited * -[1] 2020/02/11 19:45:55.662374 [INF] STREAM: ---------------------------------- -[1] 2020/02/11 19:45:55.662377 [INF] STREAM: Streaming Server is ready +[1] 2022/10/11 14:57:50.404688 [INF] STREAM: Starting nats-streaming-server[test-cluster] version 0.25.2 +[1] 2022/10/11 14:57:50.404739 [INF] STREAM: ServerID: fbZJjwGYLBpNM5I8z23NSN +[1] 2022/10/11 14:57:50.404741 [INF] STREAM: Go version: go1.19.2 +[1] 2022/10/11 14:57:50.404743 [INF] STREAM: Git commit: [9e599667] +[1] 2022/10/11 14:57:50.406004 [INF] Starting nats-server +[1] 2022/10/11 14:57:50.406009 [INF] Version: 2.9.3 +[1] 2022/10/11 14:57:50.406011 [INF] Git: [25e82d7] +[1] 2022/10/11 14:57:50.406013 [INF] Name: NDQOBTB34ECZWAKAJAREPEXQPXGKUEJEZINCHV2CIHGGJQCSCVPQPU5W +[1] 2022/10/11 14:57:50.406015 [INF] ID: NDQOBTB34ECZWAKAJAREPEXQPXGKUEJEZINCHV2CIHGGJQCSCVPQPU5W +[1] 2022/10/11 14:57:50.406423 [INF] Listening for client connections on 0.0.0.0:4222 +[1] 2022/10/11 14:57:50.406679 [INF] Server is ready +[1] 2022/10/11 14:57:50.434935 [INF] STREAM: Recovering the state... +[1] 2022/10/11 14:57:50.434945 [INF] STREAM: No recovered state +[1] 2022/10/11 14:57:50.435271 [INF] STREAM: Message store is MEMORY +[1] 2022/10/11 14:57:50.435303 [INF] STREAM: ---------- Store Limits ---------- +[1] 2022/10/11 14:57:50.435306 [INF] STREAM: Channels: 100 * +[1] 2022/10/11 14:57:50.435308 [INF] STREAM: --------- Channels Limits -------- +[1] 2022/10/11 14:57:50.435310 [INF] STREAM: Subscriptions: 1000 * +[1] 2022/10/11 14:57:50.435311 [INF] STREAM: Messages : 1000000 * +[1] 2022/10/11 14:57:50.435313 [INF] STREAM: Bytes : 976.56 MB * +[1] 2022/10/11 14:57:50.435315 [INF] STREAM: Age : unlimited * +[1] 2022/10/11 14:57:50.435316 [INF] STREAM: Inactivity : unlimited * +[1] 2022/10/11 14:57:50.435318 [INF] STREAM: ---------------------------------- +[1] 2022/10/11 14:57:50.435320 [INF] STREAM: Streaming Server is ready ``` To use a file based store instead, you would run: @@ -96,29 +97,31 @@ To use a file based store instead, you would run: ```bash $ docker run -d -p 4222:4222 -p 8222:8222 %%IMAGE%% -store file -dir datastore -[1] 2020/02/11 19:46:24.891825 [INF] STREAM: Starting nats-streaming-server[test-cluster] version 0.17.0 -[1] 2020/02/11 19:46:24.891863 [INF] STREAM: ServerID: y2zpmpnNLbnnLX4RGpW4HT -[1] 2020/02/11 19:46:24.891866 [INF] STREAM: Go version: go1.13.7 -[1] 2020/02/11 19:46:24.891868 [INF] STREAM: Git commit: [f4b7190] -[1] 2020/02/11 19:46:24.892633 [INF] Starting nats-server version 2.1.4 -[1] 2020/02/11 19:46:24.892653 [INF] Git commit [fb009af] -[1] 2020/02/11 19:46:24.892837 [INF] Listening for client connections on 0.0.0.0:4222 -[1] 2020/02/11 19:46:24.892857 [INF] Server id is NAB5BC4I4DY7UQ3NJVRYVSZ66SWMWQYCHMMMVO4KZDZU3WUDOBQZYH52 -[1] 2020/02/11 19:46:24.892860 [INF] Server is ready -[1] 2020/02/11 19:46:24.919546 [INF] STREAM: Recovering the state... -[1] 2020/02/11 19:46:24.919685 [INF] STREAM: No recovered state -[1] 2020/02/11 19:46:25.170492 [INF] STREAM: Message store is FILE -[1] 2020/02/11 19:46:25.170536 [INF] STREAM: Store location: datastore -[1] 2020/02/11 19:46:25.170563 [INF] STREAM: ---------- Store Limits ---------- -[1] 2020/02/11 19:46:25.170602 [INF] STREAM: Channels: 100 * -[1] 2020/02/11 19:46:25.170608 [INF] STREAM: --------- Channels Limits -------- -[1] 2020/02/11 19:46:25.170611 [INF] STREAM: Subscriptions: 1000 * -[1] 2020/02/11 19:46:25.170614 [INF] STREAM: Messages : 1000000 * -[1] 2020/02/11 19:46:25.170618 [INF] STREAM: Bytes : 976.56 MB * -[1] 2020/02/11 19:46:25.170621 [INF] STREAM: Age : unlimited * -[1] 2020/02/11 19:46:25.170624 [INF] STREAM: Inactivity : unlimited * -[1] 2020/02/11 19:46:25.170627 [INF] STREAM: ---------------------------------- -[1] 2020/02/11 19:46:25.170630 [INF] STREAM: Streaming Server is ready +[1] 2022/10/11 14:59:45.818823 [INF] STREAM: Starting nats-streaming-server[test-cluster] version 0.25.2 +[1] 2022/10/11 14:59:45.818874 [INF] STREAM: ServerID: mNhpLEpCO6WFqrnD9CYEZa +[1] 2022/10/11 14:59:45.818876 [INF] STREAM: Go version: go1.19.2 +[1] 2022/10/11 14:59:45.818877 [INF] STREAM: Git commit: [9e599667] +[1] 2022/10/11 14:59:45.820192 [INF] Starting nats-server +[1] 2022/10/11 14:59:45.820196 [INF] Version: 2.9.3 +[1] 2022/10/11 14:59:45.820198 [INF] Git: [25e82d7] +[1] 2022/10/11 14:59:45.820200 [INF] Name: NCDMFFEVOSPVVGQZVEQ3O5434LHF2KAPOR5LKAI7YEIAFIABTHQLZRLA +[1] 2022/10/11 14:59:45.820202 [INF] ID: NCDMFFEVOSPVVGQZVEQ3O5434LHF2KAPOR5LKAI7YEIAFIABTHQLZRLA +[1] 2022/10/11 14:59:45.820688 [INF] Listening for client connections on 0.0.0.0:4222 +[1] 2022/10/11 14:59:45.820849 [INF] Server is ready +[1] 2022/10/11 14:59:45.848443 [INF] STREAM: Recovering the state... +[1] 2022/10/11 14:59:45.848737 [INF] STREAM: No recovered state +[1] 2022/10/11 14:59:45.849050 [INF] STREAM: Message store is FILE +[1] 2022/10/11 14:59:45.849054 [INF] STREAM: Store location: datastore +[1] 2022/10/11 14:59:45.849070 [INF] STREAM: ---------- Store Limits ---------- +[1] 2022/10/11 14:59:45.849072 [INF] STREAM: Channels: 100 * +[1] 2022/10/11 14:59:45.849073 [INF] STREAM: --------- Channels Limits -------- +[1] 2022/10/11 14:59:45.849075 [INF] STREAM: Subscriptions: 1000 * +[1] 2022/10/11 14:59:45.849076 [INF] STREAM: Messages : 1000000 * +[1] 2022/10/11 14:59:45.849077 [INF] STREAM: Bytes : 976.56 MB * +[1] 2022/10/11 14:59:45.849078 [INF] STREAM: Age : unlimited * +[1] 2022/10/11 14:59:45.849079 [INF] STREAM: Inactivity : unlimited * +[1] 2022/10/11 14:59:45.849080 [INF] STREAM: ---------------------------------- +[1] 2022/10/11 14:59:45.849082 [INF] STREAM: Streaming Server is ready ``` You can also connect to a remote NATS Server running in a docker image. First, run NATS Server: @@ -132,24 +135,24 @@ Now, start the Streaming server and link it to the above docker image: ```bash $ docker run -d --link nats-main %%IMAGE%% -store file -dir datastore -ns nats://nats-main:4222 -[1] 2020/02/11 19:46:40.206660 [INF] STREAM: Starting nats-streaming-server[test-cluster] version 0.17.0 -[1] 2020/02/11 19:46:40.206699 [INF] STREAM: ServerID: bon7pyyeNH4ClntI1fCJos -[1] 2020/02/11 19:46:40.206702 [INF] STREAM: Go version: go1.13.7 -[1] 2020/02/11 19:46:40.206704 [INF] STREAM: Git commit: [f4b7190] -[1] 2020/02/11 19:46:40.233833 [INF] STREAM: Recovering the state... -[1] 2020/02/11 19:46:40.233992 [INF] STREAM: No recovered state -[1] 2020/02/11 19:46:40.487836 [INF] STREAM: Message store is FILE -[1] 2020/02/11 19:46:40.487845 [INF] STREAM: Store location: datastore -[1] 2020/02/11 19:46:40.487884 [INF] STREAM: ---------- Store Limits ---------- -[1] 2020/02/11 19:46:40.487963 [INF] STREAM: Channels: 100 * -[1] 2020/02/11 19:46:40.487966 [INF] STREAM: --------- Channels Limits -------- -[1] 2020/02/11 19:46:40.487968 [INF] STREAM: Subscriptions: 1000 * -[1] 2020/02/11 19:46:40.487993 [INF] STREAM: Messages : 1000000 * -[1] 2020/02/11 19:46:40.487995 [INF] STREAM: Bytes : 976.56 MB * -[1] 2020/02/11 19:46:40.488023 [INF] STREAM: Age : unlimited * -[1] 2020/02/11 19:46:40.488025 [INF] STREAM: Inactivity : unlimited * -[1] 2020/02/11 19:46:40.488027 [INF] STREAM: ---------------------------------- -[1] 2020/02/11 19:46:40.488029 [INF] STREAM: Streaming Server is ready +[1] 2022/10/11 15:00:56.780184 [INF] STREAM: Starting nats-streaming-server[test-cluster] version 0.25.2 +[1] 2022/10/11 15:00:56.780235 [INF] STREAM: ServerID: jVQkB4KiIN4IVIuVoSumE0 +[1] 2022/10/11 15:00:56.780237 [INF] STREAM: Go version: go1.19.2 +[1] 2022/10/11 15:00:56.780241 [INF] STREAM: Git commit: [9e599667] +[1] 2022/10/11 15:00:56.809173 [INF] STREAM: Recovering the state... +[1] 2022/10/11 15:00:56.810336 [INF] STREAM: Recovered 0 channel(s) +[1] 2022/10/11 15:00:56.810612 [INF] STREAM: Message store is FILE +[1] 2022/10/11 15:00:56.810617 [INF] STREAM: Store location: datastore +[1] 2022/10/11 15:00:56.810633 [INF] STREAM: ---------- Store Limits ---------- +[1] 2022/10/11 15:00:56.810635 [INF] STREAM: Channels: 100 * +[1] 2022/10/11 15:00:56.810636 [INF] STREAM: --------- Channels Limits -------- +[1] 2022/10/11 15:00:56.810637 [INF] STREAM: Subscriptions: 1000 * +[1] 2022/10/11 15:00:56.810639 [INF] STREAM: Messages : 1000000 * +[1] 2022/10/11 15:00:56.810640 [INF] STREAM: Bytes : 976.56 MB * +[1] 2022/10/11 15:00:56.810641 [INF] STREAM: Age : unlimited * +[1] 2022/10/11 15:00:56.810642 [INF] STREAM: Inactivity : unlimited * +[1] 2022/10/11 15:00:56.810643 [INF] STREAM: ---------------------------------- +[1] 2022/10/11 15:00:56.810644 [INF] STREAM: Streaming Server is ready ``` Notice that the output shows that the NATS Server was not started, as opposed to the first output. @@ -173,22 +176,24 @@ Streaming Server Options: -hbt, --hb_timeout How long server waits for a heartbeat response -hbf, --hb_fail_count Number of failed heartbeats before server closes the client connection --ft_group Name of the FT Group. A group can be 2 or more servers with a single active server and all sharing the same datastore - -sl, --signal [=] Send signal to nats-streaming-server process (stop, quit, reopen) + -sl, --signal [=] Send signal to nats-streaming-server process (stop, quit, reopen, reload - only for embedded NATS Server) --encrypt Specify if server should use encryption at rest --encryption_cipher Cipher to use for encryption. Currently support AES and CHAHA (ChaChaPoly). Defaults to AES --encryption_key Encryption Key. It is recommended to specify it through the NATS_STREAMING_ENCRYPTION_KEY environment variable instead - + --replace_durable Replace the existing durable subscription instead of reporting a duplicate durable error + Streaming Server Clustering Options: - --clustered Run the server in a clustered configuration (default: false) - --cluster_node_id ID of the node within the cluster if there is no stored ID (default: random UUID) - --cluster_bootstrap Bootstrap the cluster if there is no existing state by electing self as leader (default: false) - --cluster_peers Comma separated list of cluster peer node IDs to bootstrap cluster state - --cluster_log_path Directory to store log replication data - --cluster_log_cache_size Number of log entries to cache in memory to reduce disk IO (default: 512) - --cluster_log_snapshots Number of log snapshots to retain (default: 2) - --cluster_trailing_logs Number of log entries to leave after a snapshot and compaction - --cluster_sync Do a file sync after every write to the replication log and message store - --cluster_raft_logging Enable logging from the Raft library (disabled by default) + --clustered Run the server in a clustered configuration (default: false) + --cluster_node_id ID of the node within the cluster if there is no stored ID (default: random UUID) + --cluster_bootstrap Bootstrap the cluster if there is no existing state by electing self as leader (default: false) + --cluster_peers Comma separated list of cluster peer node IDs to bootstrap cluster state + --cluster_log_path Directory to store log replication data + --cluster_log_cache_size Number of log entries to cache in memory to reduce disk IO (default: 512) + --cluster_log_snapshots Number of log snapshots to retain (default: 2) + --cluster_trailing_logs Number of log entries to leave after a snapshot and compaction + --cluster_sync Do a file sync after every write to the replication log and message store + --cluster_raft_logging Enable logging from the Raft library (disabled by default) + --cluster_allow_add_remove_node Enable the ability to send NATS requests to the leader to add/remove cluster nodes Streaming Server File Store Options: --file_compact_enabled Enable file compaction @@ -214,6 +219,7 @@ Streaming Server SQL Store Options: --sql_source Datasource used when opening an SQL connection to the database --sql_no_caching Enable/Disable caching for improved performance --sql_max_open_conns Maximum number of opened connections to the database + --sql_bulk_insert_limit Maximum number of messages stored with a single SQL "INSERT" statement Streaming Server TLS Options: -secure Use a TLS connection to the NATS server without @@ -240,7 +246,7 @@ Embedded NATS Server Options: Logging Options: -l, --log File to redirect log output -T, --logtime= Timestamp log entries (default: true) - -s, --syslog Enable syslog as log method + -s, --syslog Enable syslog as log method -r, --remote_syslog Syslog server addr (udp://localhost:514) -D, --debug= Enable debugging output -V, --trace= Trace the raw protocol @@ -270,4 +276,4 @@ Common Options: # Configuration -Details on how to configure further the NATS Streaming server can be found [here](https://github.com/nats-io/nats-streaming-server#configuring) +Details on how to configure further the NATS Streaming server can be found [here](https://docs.nats.io/nats-streaming-server/configuring) diff --git a/nats-streaming/deprecated.md b/nats-streaming/deprecated.md new file mode 100644 index 000000000000..db266bd8ecad --- /dev/null +++ b/nats-streaming/deprecated.md @@ -0,0 +1 @@ +The NATS Streaming Server is being deprecated. Critical bug fixes and security fixes will be applied until June of 2023. NATS enabled applications requiring persistence should use [JetStream](https://docs.nats.io/jetstream/jetstream). diff --git a/nats/README.md b/nats/README.md index 90486c4390b5..6fc68b71b404 100644 --- a/nats/README.md +++ b/nats/README.md @@ -20,7 +20,7 @@ WARNING: [the NATS Project](https://github.com/nats-io/nats-docker) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links @@ -28,22 +28,20 @@ WARNING: ## Simple Tags -- [`2.1.7-alpine3.11`, `2.1-alpine3.11`, `2-alpine3.11`, `alpine3.11`, `2.1.7-alpine`, `2.1-alpine`, `2-alpine`, `alpine`](https://github.com/nats-io/nats-docker/blob/8f8045b5c6c6f17a28b5bc12f0f18eb6380f435f/2.1.7/alpine3.11/Dockerfile) -- [`2.1.7-scratch`, `2.1-scratch`, `2-scratch`, `scratch`, `2.1.7-linux`, `2.1-linux`, `2-linux`, `linux`](https://github.com/nats-io/nats-docker/blob/8f8045b5c6c6f17a28b5bc12f0f18eb6380f435f/2.1.7/scratch/Dockerfile) -- [`2.1.7-windowsservercore-1809`, `2.1-windowsservercore-1809`, `2-windowsservercore-1809`, `windowsservercore-1809`](https://github.com/nats-io/nats-docker/blob/8f8045b5c6c6f17a28b5bc12f0f18eb6380f435f/2.1.7/windowsservercore-1809/Dockerfile) -- [`2.1.7-nanoserver-1809`, `2.1-nanoserver-1809`, `2-nanoserver-1809`, `nanoserver-1809`](https://github.com/nats-io/nats-docker/blob/8f8045b5c6c6f17a28b5bc12f0f18eb6380f435f/2.1.7/nanoserver-1809/Dockerfile) -- [`2.1.7-windowsservercore-ltsc2016`, `2.1-windowsservercore-ltsc2016`, `2-windowsservercore-ltsc2016`, `windowsservercore-ltsc2016`](https://github.com/nats-io/nats-docker/blob/8f8045b5c6c6f17a28b5bc12f0f18eb6380f435f/2.1.7/windowsservercore-ltsc2016/Dockerfile) +- [`2.9.11-alpine3.17`, `2.9-alpine3.17`, `2-alpine3.17`, `alpine3.17`, `2.9.11-alpine`, `2.9-alpine`, `2-alpine`, `alpine`](https://github.com/nats-io/nats-docker/blob/c17a8a1db7e3c98687bfacb1a2ba7a92753d5127/2.9.11/alpine3.17/Dockerfile) +- [`2.9.11-scratch`, `2.9-scratch`, `2-scratch`, `scratch`, `2.9.11-linux`, `2.9-linux`, `2-linux`, `linux`](https://github.com/nats-io/nats-docker/blob/c17a8a1db7e3c98687bfacb1a2ba7a92753d5127/2.9.11/scratch/Dockerfile) +- [`2.9.11-windowsservercore-1809`, `2.9-windowsservercore-1809`, `2-windowsservercore-1809`, `windowsservercore-1809`](https://github.com/nats-io/nats-docker/blob/c17a8a1db7e3c98687bfacb1a2ba7a92753d5127/2.9.11/windowsservercore-1809/Dockerfile) +- [`2.9.11-nanoserver-1809`, `2.9-nanoserver-1809`, `2-nanoserver-1809`, `nanoserver-1809`](https://github.com/nats-io/nats-docker/blob/c17a8a1db7e3c98687bfacb1a2ba7a92753d5127/2.9.11/nanoserver-1809/Dockerfile) ## Shared Tags -- `2.1.7`, `2.1`, `2`, `latest`: - - [`2.1.7-scratch`](https://github.com/nats-io/nats-docker/blob/8f8045b5c6c6f17a28b5bc12f0f18eb6380f435f/2.1.7/scratch/Dockerfile) - - [`2.1.7-nanoserver-1809`](https://github.com/nats-io/nats-docker/blob/8f8045b5c6c6f17a28b5bc12f0f18eb6380f435f/2.1.7/nanoserver-1809/Dockerfile) -- `2.1.7-windowsservercore`, `2.1-windowsservercore`, `2-windowsservercore`, `windowsservercore`: - - [`2.1.7-windowsservercore-1809`](https://github.com/nats-io/nats-docker/blob/8f8045b5c6c6f17a28b5bc12f0f18eb6380f435f/2.1.7/windowsservercore-1809/Dockerfile) - - [`2.1.7-windowsservercore-ltsc2016`](https://github.com/nats-io/nats-docker/blob/8f8045b5c6c6f17a28b5bc12f0f18eb6380f435f/2.1.7/windowsservercore-ltsc2016/Dockerfile) -- `2.1.7-nanoserver`, `2.1-nanoserver`, `2-nanoserver`, `nanoserver`: - - [`2.1.7-nanoserver-1809`](https://github.com/nats-io/nats-docker/blob/8f8045b5c6c6f17a28b5bc12f0f18eb6380f435f/2.1.7/nanoserver-1809/Dockerfile) +- `2.9.11`, `2.9`, `2`, `latest`: + - [`2.9.11-scratch`](https://github.com/nats-io/nats-docker/blob/c17a8a1db7e3c98687bfacb1a2ba7a92753d5127/2.9.11/scratch/Dockerfile) + - [`2.9.11-nanoserver-1809`](https://github.com/nats-io/nats-docker/blob/c17a8a1db7e3c98687bfacb1a2ba7a92753d5127/2.9.11/nanoserver-1809/Dockerfile) +- `2.9.11-windowsservercore`, `2.9-windowsservercore`, `2-windowsservercore`, `windowsservercore`: + - [`2.9.11-windowsservercore-1809`](https://github.com/nats-io/nats-docker/blob/c17a8a1db7e3c98687bfacb1a2ba7a92753d5127/2.9.11/windowsservercore-1809/Dockerfile) +- `2.9.11-nanoserver`, `2.9-nanoserver`, `2-nanoserver`, `nanoserver`: + - [`2.9.11-nanoserver-1809`](https://github.com/nats-io/nats-docker/blob/c17a8a1db7e3c98687bfacb1a2ba7a92753d5127/2.9.11/nanoserver-1809/Dockerfile) # Quick reference (cont.) @@ -58,7 +56,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/nats`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fnats) + [official-images repo's `library/nats` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fnats) [official-images repo's `library/nats` file](https://github.com/docker-library/official-images/blob/master/library/nats) ([history](https://github.com/docker-library/official-images/commits/master/library/nats)) - **Source of this description**: @@ -70,10 +68,6 @@ WARNING: `nats` is a high performance server for the NATS Messaging System. -# Backward Compatibility - -The routing protocol has been dramatically improved and adds support for accounts and multi-tenancy. The new protocol is not backward compatible with servers pre v2.0.0. - # Example usage ```bash @@ -100,38 +94,50 @@ The routing protocol has been dramatically improved and adds support for account # Check "docker run" for more information. $ docker run -d --name nats-main -p 4222:4222 -p 6222:6222 -p 8222:8222 nats -[INF] Starting nats-server version 2.1.7 -[INF] Git commit [bf0930e] +[INF] Starting nats-server +[INF] Version: 2.9.8 +[INF] Git: [60e335a] +[INF] Cluster: my_cluster +[INF] Name: NB3YN6SPZF6MWTLPGYLRE2AD5VVWSW443RO43YR5GC62I463QPYGOL5C +[INF] ID: NB3YN6SPZF6MWTLPGYLRE2AD5VVWSW443RO43YR5GC62I463QPYGOL5C +[INF] Using configuration file: /etc/nats/nats-server.conf +[INF] Starting http monitor on 0.0.0.0:8222 [INF] Listening for client connections on 0.0.0.0:4222 -[INF] Server id is NANEPV46X4QZ7FR5DD4U7WLWI6BWRLJXFTHO2FIJRGFSW5NLH3MOV7VZ [INF] Server is ready +[INF] Cluster name is my_cluster [INF] Listening for route connections on 0.0.0.0:6222 - ... # To run a second server and cluster them together.. # Note that since you are passing arguments, this overrides the CMD section # of the Dockerfile, so you need to pass all arguments, including the # config file. -$ docker run -d --name=nats-2 --link nats-main -p 4222:4222 -p 6222:6222 -p 8222:8222 nats -c nats-server.conf --routes=nats-route://ruser:T0pS3cr3t@nats-main:6222 +$ docker run -d --name=nats-2 --link nats-main -p 4222:4222 -p 6222:6222 -p 8222:8222 nats -c /etc/nats/nats-server.conf --routes=nats-route://ruser:T0pS3cr3t@nats-main:6222 # If you want to verify the routes are connected, try this instead: -$ docker run -d --name=nats-2 --link nats-main -p 4222:4222 -p 6222:6222 -p 8222:8222 nats -c nats-server.conf --routes=nats-route://ruser:T0pS3cr3t@nats-main:6222 -DV -[INF] Starting nats-server version 2.1.7 -[DBG] Go build version go1.13.10 -[INF] Git commit [bf0930e] +$ docker run -d --name=nats-2 --link nats-main -p 4222:4222 -p 6222:6222 -p 8222:8222 nats -c /etc/nats/nats-server.conf --routes=nats-route://ruser:T0pS3cr3t@nats-main:6222 -DV +[INF] Starting nats-server +[INF] Version: 2.9.8 +[INF] Git: [60e335a] +[DBG] Go build: go1.19.3 +[INF] Cluster: my_cluster +[INF] Name: NDFNAUTD4RKS2O7CMKMDMTV3DW5NIKFCQDDMXW2A5YXLUZWWX7RYFCKB +[INF] ID: NDFNAUTD4RKS2O7CMKMDMTV3DW5NIKFCQDDMXW2A5YXLUZWWX7RYFCKB +[INF] Using configuration file: /etc/nats/nats-server.conf +[DBG] Created system account: "$SYS" [INF] Starting http monitor on 0.0.0.0:8222 [INF] Listening for client connections on 0.0.0.0:4222 -[INF] Server id is NC5WVL732YIR7N2TH3EHLLTGBNYJMZUUJMYEVWTZ3KU6DQB6ROGPAWYM -[INF] Server is ready [DBG] Get non local IPs for "0.0.0.0" -[DBG] ip=172.17.0.3 +[DBG] ip=172.17.0.2 +[INF] Server is ready +[DBG] maxprocs: Leaving GOMAXPROCS=4: CPU quota undefined +[INF] Cluster name is my_cluster [INF] Listening for route connections on 0.0.0.0:6222 -[DBG] Trying to connect to route on nats-main:6222 -[DBG] 172.17.0.2:6222 - rid:1 - Route connect msg sent -[INF] 172.17.0.2:6222 - rid:1 - Route connection created -[DBG] 172.17.0.2:6222 - rid:1 - Registering remote route "ND2WROCKLR6NGB6E5RUV6FQNPQO475MWOR4IGM6E6AZNKVTKXDD6YCM5" -[DBG] 172.17.0.2:6222 - rid:1 - Sent local subscriptions to route +[DBG] Trying to connect to route on nats-main:6222 (172.17.0.3:6222) +[DBG] 172.17.0.3:6222 - rid:4 - Route connect msg sent +[INF] 172.17.0.3:6222 - rid:4 - Route connection created +[DBG] 172.17.0.3:6222 - rid:4 - Registering remote route "NDQAU6HVD44TI2X5R2QRYJEIQR3MMHCFTW2BTSXBILBOZHJ4Z7AR7GGR" +[DBG] 172.17.0.3:6222 - rid:4 - Sent local subscriptions to route ``` The server will load the configuration file below. Any command line flags can override these values. @@ -147,6 +153,8 @@ monitor_port: 8222 # This is for clustering multiple servers together. cluster { + # It is recommended to set a cluster name + name: "my_cluster" # Route connections to be received on any interface on port 6222 port: 6222 @@ -156,7 +164,7 @@ cluster { authorization { user: ruser password: T0pS3cr3t - timeout: 0.75 + timeout: 2 } # Routes are actively solicited and connected to from this server. @@ -170,16 +178,19 @@ cluster { ```bash Server Options: - -a, --addr Bind to host address (default: 0.0.0.0) + -a, --addr, --net Bind to host address (default: 0.0.0.0) -p, --port Use port for clients (default: 4222) + -n, --name + --server_name Server name (default: auto) -P, --pid File to store PID -m, --http_port Use port for http monitoring -ms,--https_port Use port for https monitoring -c, --config Configuration file + -t Test configuration and exit -sl,--signal [=] Send signal to nats-server process (stop, quit, reopen, reload) - can be either a PID (e.g. 1) or the path to a PID file (e.g. /var/run/nats-server.pid) + pid> can be either a PID (e.g. 1) or the path to a PID file (e.g. /var/run/nats-server.pid) --client_advertise Client URL to advertise to other servers - -t Test configuration and exit + --ports_file_dir

Creates a ports file in the specified directory (_.ports). Logging Options: -l, --log File to redirect log output @@ -191,6 +202,12 @@ Logging Options: -VV Verbose trace (traces system account as well) -DV Debug and trace -DVV Debug and verbose trace (traces system account as well) + --log_size_limit Logfile size limit (default: auto) + --max_traced_msg_len Maximum printable length for traced messages (default: unlimited) + +JetStream Options: + -js, --jetstream Enable JetStream functionality + -sd, --store_dir Set the storage directory Authorization Options: --user User required for connections @@ -207,10 +224,14 @@ TLS Options: Cluster Options: --routes Routes to solicit and connect --cluster Cluster URL for solicited routes - --no_advertise Advertise known cluster IPs to clients + --cluster_name Cluster Name, if not set one will be dynamically generated + --no_advertise Do not advertise known cluster information to clients --cluster_advertise Cluster URL to advertise to other servers --connect_retries For implicit routes, number of connect retries + --cluster_listen Cluster url from which members can solicit routes +Profiling Options: + --profile Profiling HTTP port Common Options: -h, --help Show this message @@ -228,9 +249,9 @@ This is the defacto image. If you are unsure about what your needs are, you prob ## `nats:-alpine` -This image is based on the popular [Alpine Linux project](http://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. +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. -This variant is highly recommended when final image size being as small as possible is desired. The main caveat to note is that it does use [musl libc](http://www.musl-libc.org) instead of [glibc and friends](http://www.etalabs.net/compare_libcs.html), so certain software might run into issues depending on the depth of their libc requirements. However, most software doesn't have an issue with this, so this variant is usually a very safe choice. 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. +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. 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). diff --git a/nats/content.md b/nats/content.md index b43cd879f5d7..b67d8f074f58 100644 --- a/nats/content.md +++ b/nats/content.md @@ -4,10 +4,6 @@ `nats` is a high performance server for the NATS Messaging System. -# Backward Compatibility - -The routing protocol has been dramatically improved and adds support for accounts and multi-tenancy. The new protocol is not backward compatible with servers pre v2.0.0. - # Example usage ```bash @@ -34,38 +30,50 @@ The routing protocol has been dramatically improved and adds support for account # Check "docker run" for more information. $ docker run -d --name nats-main -p 4222:4222 -p 6222:6222 -p 8222:8222 %%IMAGE%% -[INF] Starting nats-server version 2.1.7 -[INF] Git commit [bf0930e] +[INF] Starting nats-server +[INF] Version: 2.9.8 +[INF] Git: [60e335a] +[INF] Cluster: my_cluster +[INF] Name: NB3YN6SPZF6MWTLPGYLRE2AD5VVWSW443RO43YR5GC62I463QPYGOL5C +[INF] ID: NB3YN6SPZF6MWTLPGYLRE2AD5VVWSW443RO43YR5GC62I463QPYGOL5C +[INF] Using configuration file: /etc/nats/nats-server.conf +[INF] Starting http monitor on 0.0.0.0:8222 [INF] Listening for client connections on 0.0.0.0:4222 -[INF] Server id is NANEPV46X4QZ7FR5DD4U7WLWI6BWRLJXFTHO2FIJRGFSW5NLH3MOV7VZ [INF] Server is ready +[INF] Cluster name is my_cluster [INF] Listening for route connections on 0.0.0.0:6222 - ... # To run a second server and cluster them together.. # Note that since you are passing arguments, this overrides the CMD section # of the Dockerfile, so you need to pass all arguments, including the # config file. -$ docker run -d --name=nats-2 --link nats-main -p 4222:4222 -p 6222:6222 -p 8222:8222 %%IMAGE%% -c nats-server.conf --routes=nats-route://ruser:T0pS3cr3t@nats-main:6222 +$ docker run -d --name=nats-2 --link nats-main -p 4222:4222 -p 6222:6222 -p 8222:8222 %%IMAGE%% -c /etc/nats/nats-server.conf --routes=nats-route://ruser:T0pS3cr3t@nats-main:6222 # If you want to verify the routes are connected, try this instead: -$ docker run -d --name=nats-2 --link nats-main -p 4222:4222 -p 6222:6222 -p 8222:8222 %%IMAGE%% -c nats-server.conf --routes=nats-route://ruser:T0pS3cr3t@nats-main:6222 -DV -[INF] Starting nats-server version 2.1.7 -[DBG] Go build version go1.13.10 -[INF] Git commit [bf0930e] +$ docker run -d --name=nats-2 --link nats-main -p 4222:4222 -p 6222:6222 -p 8222:8222 %%IMAGE%% -c /etc/nats/nats-server.conf --routes=nats-route://ruser:T0pS3cr3t@nats-main:6222 -DV +[INF] Starting nats-server +[INF] Version: 2.9.8 +[INF] Git: [60e335a] +[DBG] Go build: go1.19.3 +[INF] Cluster: my_cluster +[INF] Name: NDFNAUTD4RKS2O7CMKMDMTV3DW5NIKFCQDDMXW2A5YXLUZWWX7RYFCKB +[INF] ID: NDFNAUTD4RKS2O7CMKMDMTV3DW5NIKFCQDDMXW2A5YXLUZWWX7RYFCKB +[INF] Using configuration file: /etc/nats/nats-server.conf +[DBG] Created system account: "$SYS" [INF] Starting http monitor on 0.0.0.0:8222 [INF] Listening for client connections on 0.0.0.0:4222 -[INF] Server id is NC5WVL732YIR7N2TH3EHLLTGBNYJMZUUJMYEVWTZ3KU6DQB6ROGPAWYM -[INF] Server is ready [DBG] Get non local IPs for "0.0.0.0" -[DBG] ip=172.17.0.3 +[DBG] ip=172.17.0.2 +[INF] Server is ready +[DBG] maxprocs: Leaving GOMAXPROCS=4: CPU quota undefined +[INF] Cluster name is my_cluster [INF] Listening for route connections on 0.0.0.0:6222 -[DBG] Trying to connect to route on nats-main:6222 -[DBG] 172.17.0.2:6222 - rid:1 - Route connect msg sent -[INF] 172.17.0.2:6222 - rid:1 - Route connection created -[DBG] 172.17.0.2:6222 - rid:1 - Registering remote route "ND2WROCKLR6NGB6E5RUV6FQNPQO475MWOR4IGM6E6AZNKVTKXDD6YCM5" -[DBG] 172.17.0.2:6222 - rid:1 - Sent local subscriptions to route +[DBG] Trying to connect to route on nats-main:6222 (172.17.0.3:6222) +[DBG] 172.17.0.3:6222 - rid:4 - Route connect msg sent +[INF] 172.17.0.3:6222 - rid:4 - Route connection created +[DBG] 172.17.0.3:6222 - rid:4 - Registering remote route "NDQAU6HVD44TI2X5R2QRYJEIQR3MMHCFTW2BTSXBILBOZHJ4Z7AR7GGR" +[DBG] 172.17.0.3:6222 - rid:4 - Sent local subscriptions to route ``` The server will load the configuration file below. Any command line flags can override these values. @@ -81,6 +89,8 @@ monitor_port: 8222 # This is for clustering multiple servers together. cluster { + # It is recommended to set a cluster name + name: "my_cluster" # Route connections to be received on any interface on port 6222 port: 6222 @@ -90,7 +100,7 @@ cluster { authorization { user: ruser password: T0pS3cr3t - timeout: 0.75 + timeout: 2 } # Routes are actively solicited and connected to from this server. @@ -104,16 +114,19 @@ cluster { ```bash Server Options: - -a, --addr Bind to host address (default: 0.0.0.0) + -a, --addr, --net Bind to host address (default: 0.0.0.0) -p, --port Use port for clients (default: 4222) + -n, --name + --server_name Server name (default: auto) -P, --pid File to store PID -m, --http_port Use port for http monitoring -ms,--https_port Use port for https monitoring -c, --config Configuration file + -t Test configuration and exit -sl,--signal [=] Send signal to nats-server process (stop, quit, reopen, reload) - can be either a PID (e.g. 1) or the path to a PID file (e.g. /var/run/nats-server.pid) + pid> can be either a PID (e.g. 1) or the path to a PID file (e.g. /var/run/nats-server.pid) --client_advertise Client URL to advertise to other servers - -t Test configuration and exit + --ports_file_dir Creates a ports file in the specified directory (_.ports). Logging Options: -l, --log File to redirect log output @@ -125,6 +138,12 @@ Logging Options: -VV Verbose trace (traces system account as well) -DV Debug and trace -DVV Debug and verbose trace (traces system account as well) + --log_size_limit Logfile size limit (default: auto) + --max_traced_msg_len Maximum printable length for traced messages (default: unlimited) + +JetStream Options: + -js, --jetstream Enable JetStream functionality + -sd, --store_dir Set the storage directory Authorization Options: --user User required for connections @@ -141,10 +160,14 @@ TLS Options: Cluster Options: --routes Routes to solicit and connect --cluster Cluster URL for solicited routes - --no_advertise Advertise known cluster IPs to clients + --cluster_name Cluster Name, if not set one will be dynamically generated + --no_advertise Do not advertise known cluster information to clients --cluster_advertise Cluster URL to advertise to other servers --connect_retries For implicit routes, number of connect retries + --cluster_listen Cluster url from which members can solicit routes +Profiling Options: + --profile Profiling HTTP port Common Options: -h, --help Show this message diff --git a/neo4j/README.md b/neo4j/README.md index 83f76234ea5c..192f685b504a 100644 --- a/neo4j/README.md +++ b/neo4j/README.md @@ -20,52 +20,16 @@ WARNING: [Neo4j](https://github.com/neo4j/docker-neo4j) - **Where to get help**: - [Stack Overflow](http://stackoverflow.com/questions/tagged/neo4j) + [Neo4j Community Forums](https://community.neo4j.com) # Supported tags and respective `Dockerfile` links -- [`4.0.4`, `4.0`, `latest`](https://github.com/neo4j/docker-neo4j-publish/blob/d5e5e4b1999611ecfa8ec59166acf1ddb703b21c/4.0.4/community/Dockerfile) -- [`4.0.4-enterprise`, `4.0-enterprise`, `enterprise`](https://github.com/neo4j/docker-neo4j-publish/blob/d5e5e4b1999611ecfa8ec59166acf1ddb703b21c/4.0.4/enterprise/Dockerfile) -- [`4.0.3`](https://github.com/neo4j/docker-neo4j-publish/blob/51ed84f02e569a0d86c6e634fab3ae6540806a7e/4.0.3/community/Dockerfile) -- [`4.0.3-enterprise`](https://github.com/neo4j/docker-neo4j-publish/blob/51ed84f02e569a0d86c6e634fab3ae6540806a7e/4.0.3/enterprise/Dockerfile) -- [`4.0.2`](https://github.com/neo4j/docker-neo4j-publish/blob/56d28624bc264497ed7fae8253a52a92611c6fee/4.0.2/community/Dockerfile) -- [`4.0.2-enterprise`](https://github.com/neo4j/docker-neo4j-publish/blob/56d28624bc264497ed7fae8253a52a92611c6fee/4.0.2/enterprise/Dockerfile) -- [`4.0.1`](https://github.com/neo4j/docker-neo4j-publish/blob/13c288e9c36ee22e682b459fb218c9239e2c1083/4.0.1/community/Dockerfile) -- [`4.0.1-enterprise`](https://github.com/neo4j/docker-neo4j-publish/blob/13c288e9c36ee22e682b459fb218c9239e2c1083/4.0.1/enterprise/Dockerfile) -- [`4.0.0`](https://github.com/neo4j/docker-neo4j-publish/blob/685fb314ef8e451217b6806028b9ac4dbf44d3fc/4.0.0/community/Dockerfile) -- [`4.0.0-enterprise`](https://github.com/neo4j/docker-neo4j-publish/blob/685fb314ef8e451217b6806028b9ac4dbf44d3fc/4.0.0/enterprise/Dockerfile) -- [`3.5.18`, `3.5`](https://github.com/neo4j/docker-neo4j-publish/blob/44c1a3d078dae162335e3c2c214513c1c193de2e/3.5.18/community/Dockerfile) -- [`3.5.18-enterprise`, `3.5-enterprise`](https://github.com/neo4j/docker-neo4j-publish/blob/44c1a3d078dae162335e3c2c214513c1c193de2e/3.5.18/enterprise/Dockerfile) -- [`3.5.17`](https://github.com/neo4j/docker-neo4j-publish/blob/617aeb42c7af81bb6dfdd6396eca4c42d98c41ce/3.5.17/community/Dockerfile) -- [`3.5.17-enterprise`](https://github.com/neo4j/docker-neo4j-publish/blob/617aeb42c7af81bb6dfdd6396eca4c42d98c41ce/3.5.17/enterprise/Dockerfile) -- [`3.5.16`](https://github.com/neo4j/docker-neo4j-publish/blob/db34a05ac7abf4b2818222294ac9dc93b13d54a2/3.5.16/community/Dockerfile) -- [`3.5.16-enterprise`](https://github.com/neo4j/docker-neo4j-publish/blob/db34a05ac7abf4b2818222294ac9dc93b13d54a2/3.5.16/enterprise/Dockerfile) -- [`3.5.15`](https://github.com/neo4j/docker-neo4j-publish/blob/a2b48dfb25b76250bced5e2d0c064615e3085379/3.5.15/community/Dockerfile) -- [`3.5.15-enterprise`](https://github.com/neo4j/docker-neo4j-publish/blob/a2b48dfb25b76250bced5e2d0c064615e3085379/3.5.15/enterprise/Dockerfile) -- [`3.5.14`](https://github.com/neo4j/docker-neo4j-publish/blob/574e0a1d5e5eb27a633148198c028d9a28899a9a/3.5.14/community/Dockerfile) -- [`3.5.14-enterprise`](https://github.com/neo4j/docker-neo4j-publish/blob/574e0a1d5e5eb27a633148198c028d9a28899a9a/3.5.14/enterprise/Dockerfile) -- [`3.5.13`](https://github.com/neo4j/docker-neo4j-publish/blob/846ee1e9ad2744182a52bc21eb6204858c1a8a48/3.5.13/community/Dockerfile) -- [`3.5.13-enterprise`](https://github.com/neo4j/docker-neo4j-publish/blob/846ee1e9ad2744182a52bc21eb6204858c1a8a48/3.5.13/enterprise/Dockerfile) -- [`3.5.12`](https://github.com/neo4j/docker-neo4j-publish/blob/b4715971c153883225394b2c66d6c8ecf8a1bc93/3.5.12/community/Dockerfile) -- [`3.5.12-enterprise`](https://github.com/neo4j/docker-neo4j-publish/blob/b4715971c153883225394b2c66d6c8ecf8a1bc93/3.5.12/enterprise/Dockerfile) -- [`3.5.11`](https://github.com/neo4j/docker-neo4j-publish/blob/c559931b4b33062e1b4fcbcd2f2e8278ff7b3390/3.5.11/community/Dockerfile) -- [`3.5.11-enterprise`](https://github.com/neo4j/docker-neo4j-publish/blob/c559931b4b33062e1b4fcbcd2f2e8278ff7b3390/3.5.11/enterprise/Dockerfile) -- [`3.5.8`](https://github.com/neo4j/docker-neo4j-publish/blob/53d8c355498de280a7b6ad4b9259bb8f132a1839/3.5.8/community/Dockerfile) -- [`3.5.8-enterprise`](https://github.com/neo4j/docker-neo4j-publish/blob/53d8c355498de280a7b6ad4b9259bb8f132a1839/3.5.8/enterprise/Dockerfile) -- [`3.5.7`](https://github.com/neo4j/docker-neo4j-publish/blob/ffc4f941cc9a301ad41d1649aa021c0fc727919b/3.5.7/community/Dockerfile) -- [`3.5.7-enterprise`](https://github.com/neo4j/docker-neo4j-publish/blob/ffc4f941cc9a301ad41d1649aa021c0fc727919b/3.5.7/enterprise/Dockerfile) -- [`3.5.6`](https://github.com/neo4j/docker-neo4j-publish/blob/c3d38b9d9fbe589282d4974ce66af1d3f3da0c22/3.5.6/community/Dockerfile) -- [`3.5.6-enterprise`](https://github.com/neo4j/docker-neo4j-publish/blob/c3d38b9d9fbe589282d4974ce66af1d3f3da0c22/3.5.6/enterprise/Dockerfile) -- [`3.4.18`, `3.4`](https://github.com/neo4j/docker-neo4j-publish/blob/cb8d887126ae0d0f25f4f9e08b01f1f6e451ca37/3.4.18/community/Dockerfile) -- [`3.4.18-enterprise`, `3.4-enterprise`](https://github.com/neo4j/docker-neo4j-publish/blob/cb8d887126ae0d0f25f4f9e08b01f1f6e451ca37/3.4.18/enterprise/Dockerfile) -- [`3.4.17`](https://github.com/neo4j/docker-neo4j-publish/blob/bed0c061a286bc50115cec609c644cecf773c6fe/3.4.17/community/Dockerfile) -- [`3.4.17-enterprise`](https://github.com/neo4j/docker-neo4j-publish/blob/bed0c061a286bc50115cec609c644cecf773c6fe/3.4.17/enterprise/Dockerfile) -- [`3.4.16`](https://github.com/neo4j/docker-neo4j-publish/blob/8dfb925dd168a35968d8113424e8a9a9bc6d6a6f/3.4.16/community/Dockerfile) -- [`3.4.16-enterprise`](https://github.com/neo4j/docker-neo4j-publish/blob/8dfb925dd168a35968d8113424e8a9a9bc6d6a6f/3.4.16/enterprise/Dockerfile) -- [`3.4.15`](https://github.com/neo4j/docker-neo4j-publish/blob/a097f1663938dc56b81ae88f1cf7caba0b40004c/3.4.15/community/Dockerfile) -- [`3.4.15-enterprise`](https://github.com/neo4j/docker-neo4j-publish/blob/a097f1663938dc56b81ae88f1cf7caba0b40004c/3.4.15/enterprise/Dockerfile) -- [`3.4.14`](https://github.com/neo4j/docker-neo4j-publish/blob/e3ddc2d97443a058c19cd5997d8c0df48c1956a9/3.4.14/community/Dockerfile) -- [`3.4.14-enterprise`](https://github.com/neo4j/docker-neo4j-publish/blob/e3ddc2d97443a058c19cd5997d8c0df48c1956a9/3.4.14/enterprise/Dockerfile) +- [`5.3.0`, `5.3.0-community`, `5.3`, `5`, `5-community`, `community`, `latest`](https://github.com/neo4j/docker-neo4j-publish/blob/2318e8788222c303a84b819f190271a531ef92ea/5.3.0/community/Dockerfile) +- [`5.3.0-enterprise`, `5.3-enterprise`, `5-enterprise`, `enterprise`](https://github.com/neo4j/docker-neo4j-publish/blob/2318e8788222c303a84b819f190271a531ef92ea/5.3.0/enterprise/Dockerfile) +- [`4.4.16`, `4.4.16-community`, `4.4`, `4.4-community`](https://github.com/neo4j/docker-neo4j-publish/blob/082867e61a5947ba35fc954a192a438f2238e868/4.4.16/community/Dockerfile) +- [`4.4.16-enterprise`, `4.4-enterprise`](https://github.com/neo4j/docker-neo4j-publish/blob/082867e61a5947ba35fc954a192a438f2238e868/4.4.16/enterprise/Dockerfile) +- [`4.3.23`, `4.3.23-community`, `4.3`, `4.3-community`](https://github.com/neo4j/docker-neo4j-publish/blob/082867e61a5947ba35fc954a192a438f2238e868/4.3.23/community/Dockerfile) +- [`4.3.23-enterprise`, `4.3-enterprise`](https://github.com/neo4j/docker-neo4j-publish/blob/082867e61a5947ba35fc954a192a438f2238e868/4.3.23/enterprise/Dockerfile) # Quick reference (cont.) @@ -73,24 +37,24 @@ WARNING: [https://github.com/neo4j/docker-neo4j/issues](https://github.com/neo4j/docker-neo4j/issues) - **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) - [`amd64`](https://hub.docker.com/r/amd64/neo4j/) + [`amd64`](https://hub.docker.com/r/amd64/neo4j/), [`arm64v8`](https://hub.docker.com/r/arm64v8/neo4j/) - **Published image artifact details**: [repo-info repo's `repos/neo4j/` directory](https://github.com/docker-library/repo-info/blob/master/repos/neo4j) ([history](https://github.com/docker-library/repo-info/commits/master/repos/neo4j)) (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/neo4j`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fneo4j) + [official-images repo's `library/neo4j` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fneo4j) [official-images repo's `library/neo4j` file](https://github.com/docker-library/official-images/blob/master/library/neo4j) ([history](https://github.com/docker-library/official-images/commits/master/library/neo4j)) - **Source of this description**: [docs repo's `neo4j/` directory](https://github.com/docker-library/docs/tree/master/neo4j) ([history](https://github.com/docker-library/docs/commits/master/neo4j)) -# What is neo4j? +# What is Neo4j? Neo4j is the world's leading graph database, with native graph storage and processing. You can learn more [here](http://neo4j.com/developer). -![logo](https://raw.githubusercontent.com/docker-library/docs/2289fb3b561c63750032ac74ff65034c0e486072/neo4j/logo.png) +![logo](https://raw.githubusercontent.com/docker-library/docs/56823e63d5b6dd7ddbb9d5d3c4a8947778055d8e/neo4j/logo.png) # How to use this image @@ -111,40 +75,7 @@ By default, this requires you to login with `neo4j/neo4j` and change the passwor # Documentation -For more examples and complete documentation please go to our manual [here](https://neo4j.com/docs/operations-manual/current/docker/introduction/). - -# Releases after 3.4.14 and 3.5.6 - -As of 11th June 2019 all new Neo4j Docker images will be released with a base image of debian-slim instead of alpine linux. This was prompted by [security concerns](https://github.com/docker-library/openjdk/issues/320), which caused the docker maintainers to pull the alpine images from the official `openjdk` images. - -Older Neo4j images have already been released with `openjdk:8-jre-alpine` as the base image. This means our old images can no longer be listed as "supported" on docker hub, although **they are still available for download**. - -In addition to the supported tags, we also have these legacy images of Neo4j available through docker hub: - -- `3.5.5`, `3.5.5-enterprise` and earlier patches -- `3.4.13`, `3.4.13-enterprise` and earlier patches -- `3.3`, `3.3-enterprise`, `3.3.9`, `3.3.9-enterprise` and earlier patches -- `3.2`, `3.2-enterprise`, `3.2.14`, `3.2.14-enterprise` and earlier patches - -A complete list of all available Neo4j images can be found here: https://github.com/neo4j/docker-neo4j-publish/tree/master - -## Migrating from Alpine Linux to Debian Slim - -If you have created a custom Dockerfile based off a `neo4j` image, the main change to be aware of is that debian uses the `aptitude` package manager instead of `apk`. In most cases you can just replace uses of `apk` with `apt`, but be aware that not all packages in `apk` may be available or have the same name. - -Alpine Linux provide a more complete comparison on their documentation page: - -https://wiki.alpinelinux.org/wiki/Comparison_with_other_distros - -## Changes to file permission requirements - -Some users have [raised concerns](https://github.com/neo4j/docker-neo4j/issues/130) that the Neo4j image changes file permissions on the host machine. - -By default, Neo4j runs as the user `neo4j` who only exists in the container, not on the host. That means that it's hard to set up mount folders on the host which this new user has write permissions for. We have updated the error messaging with advice about how to fix file permission errors. We also introduced writability checks and reduced the amount of file permission changes the image will perform. This has been found to interfere with some Kubernetes setups, so is currently an opt-in feature. - -To enforce stricter file permissions checking you can pass this environment variable to the container: - -`--env SECURE_FILE_PERMISSIONS=yes` +For more examples and complete documentation please go to our manual [here](http://neo4j.com/docs/operations-manual/current/deployment/single-instance/docker/). # License diff --git a/neo4j/content.md b/neo4j/content.md index c3be4b969d08..52e01ca799ff 100644 --- a/neo4j/content.md +++ b/neo4j/content.md @@ -1,4 +1,4 @@ -# What is neo4j? +# What is Neo4j? Neo4j is the world's leading graph database, with native graph storage and processing. You can learn more [here](http://neo4j.com/developer). @@ -23,37 +23,4 @@ By default, this requires you to login with `neo4j/neo4j` and change the passwor # Documentation -For more examples and complete documentation please go to our manual [here](https://neo4j.com/docs/operations-manual/current/docker/introduction/). - -# Releases after 3.4.14 and 3.5.6 - -As of 11th June 2019 all new Neo4j Docker images will be released with a base image of debian-slim instead of alpine linux. This was prompted by [security concerns](https://github.com/docker-library/openjdk/issues/320), which caused the docker maintainers to pull the alpine images from the official `openjdk` images. - -Older Neo4j images have already been released with `openjdk:8-jre-alpine` as the base image. This means our old images can no longer be listed as "supported" on docker hub, although **they are still available for download**. - -In addition to the supported tags, we also have these legacy images of Neo4j available through docker hub: - -- `3.5.5`, `3.5.5-enterprise` and earlier patches -- `3.4.13`, `3.4.13-enterprise` and earlier patches -- `3.3`, `3.3-enterprise`, `3.3.9`, `3.3.9-enterprise` and earlier patches -- `3.2`, `3.2-enterprise`, `3.2.14`, `3.2.14-enterprise` and earlier patches - -A complete list of all available Neo4j images can be found here: https://github.com/neo4j/docker-neo4j-publish/tree/master - -## Migrating from Alpine Linux to Debian Slim - -If you have created a custom Dockerfile based off a `neo4j` image, the main change to be aware of is that debian uses the `aptitude` package manager instead of `apk`. In most cases you can just replace uses of `apk` with `apt`, but be aware that not all packages in `apk` may be available or have the same name. - -Alpine Linux provide a more complete comparison on their documentation page: - -https://wiki.alpinelinux.org/wiki/Comparison_with_other_distros - -## Changes to file permission requirements - -Some users have [raised concerns](https://github.com/neo4j/docker-neo4j/issues/130) that the Neo4j image changes file permissions on the host machine. - -By default, Neo4j runs as the user `neo4j` who only exists in the container, not on the host. That means that it's hard to set up mount folders on the host which this new user has write permissions for. We have updated the error messaging with advice about how to fix file permission errors. We also introduced writability checks and reduced the amount of file permission changes the image will perform. This has been found to interfere with some Kubernetes setups, so is currently an opt-in feature. - -To enforce stricter file permissions checking you can pass this environment variable to the container: - -`--env SECURE_FILE_PERMISSIONS=yes` +For more examples and complete documentation please go to our manual [here](http://neo4j.com/docs/operations-manual/current/deployment/single-instance/docker/). diff --git a/neo4j/get-help.md b/neo4j/get-help.md index af0efede52b3..e7a73e1c63d8 100644 --- a/neo4j/get-help.md +++ b/neo4j/get-help.md @@ -1 +1 @@ -[Stack Overflow](http://stackoverflow.com/questions/tagged/neo4j) +[Neo4j Community Forums](https://community.neo4j.com) diff --git a/neo4j/logo.png b/neo4j/logo.png index 1d4b8f789c1b3282f8d5022d6bd8f59cfba624b1..a8b790741e36f565655cd51d6e26d8121eace29b 100644 GIT binary patch literal 233916 zcmeI53A|k6-N(-)goFqYOY9^niNQ4MNo(S;Y)R$HZ|tu-&H))rl9t9JELRlByT zty-$3_ARJ2NRZg62oW;x_dEAadNY}sJI|RjcV_N={`d2}vz+rh=Q+RgJkS5x&Y20j z@4DmQLCXwEl4S7MPmcL?lH`8L`=2d1fd98XKVwT?1{}Eaj$?SmW^RAucwPn`_Q}tG zCrQ>>MRG^~X6qyQa)IxT{nQQ%yg2_7i;P_F{YR(ok|Zl7W5;Z}=h3-j=7|Hw89Z84 zASw_Qhzdjnq5@HYs6bR8Di9Tj3Pc5>0#SjeKvW6Ns=#YEKe>BxEkK)|LQHm4ASw_Qhzdjnq5@HYs6bR8Di9Tj3Pc5>0#SjeKvW0eIfv7-Kp#2rtE8jm^BN>tmOa>+MB^~wt>||DwPu@+A z%Dt223ATw-`RJY8ad9m`mKQ$86%~jI^f3ia&M%(yOE!Y7IP-O31)RztTuh$7w|RXk znVsAPwmn3-(eh-%sbq_Rq5@HYs6dMfV$iaA$At5Kh z{`28jM$?~JoB^{1k|cj=8pl$$I~0QMV?A5Hs z=c92fV~gL1y!LIUGUDBF8zxD|Zv=#>7Wa(`L8caWOB(U z9MxBoQ}Qd7Ztw1M-*zzFsS~$H1)>5`fp$<}e10f%Bm0ol6|zWfXYXY@oYWqP%aj8w zI+Xyi;;vDFs6bSpB^4N$Y)ZPeuXTdHmUAF3e@k*F79}rP%l^fEqEjg<5nrPMQGuvH zJ1Q_fKOa2`mk=+SdGd3~2FZYA?T~n*QwdQk?i&?|3Pc53O@Tq&KhI5$uH{{cGPNi0*;(k$qs6bSp zH5GV+!Kq0+H8S-RA}gL&zR*i~Iys^C-b!>T71eB|4U^V->gpsu7oe3cNlZ&rpfwfv z0M~L4N%OJ9*;+oChHIG^@_6G$tWV4Kq+)DQfv7-Kpmh{*a(odO1`BoK{KI?j7Q6xP z!iUf^c0z7;a$5ct4)z@QfUiu9E|9}tx3CcG@sJ3kQwdQk?i&?|3iL$>qAZl7ExJYZwmuHn+)Vvnp(MA???M{+wjZ zOUA;_GKPo>LFJAO@_uC_iud#R@itHIVS!_K;LGs6bSpPbpvzgk|waJ3!l-gat!IqqxO2|kU>SeGHPp;Y*D9A&2?d5>*V+2=N1ujcm3o0AiAGwL~Z zbSm|z7sEycq5{1|fnl7;iSQ+G$f}X%r2hZGIGEPR0~O*vDZdmBWfW(%7QGOM;ugY* z*fV*9&rkDyBHN!xj>x&tAX-!)Di9Tj3e>59t@oqBO4Z7?CwPbB9084XU>u^0`6Dfd z<`*c?diw zB$x`tLe1M=X=`c!Q$X=q*@u4s|3}sSow9;@Cm;6hB7sr21Q51+g@+x zOSMwZ5wIGVH_ewzfcIFq%Ex?JYU){R;P_aPSKtLuOY`J2&=>L~r&-a|^Dm4}> z2F_rEoUrR*M*PV(LpoMg^PS)Yo$23?_?WL4+AbefchLwElijP@fMfoB; z3U|X@@EF(o&x4W^P_s2Kh@KoOkc1CImv@yPpDPTM(ARr%llcf zb}Bka>#$Js`de?Mwq|(e)QQa~poP`~x()0AUQk%B=i80DCbO>>Arp5{p% z%dPMicoxj7z17U0`@pGS*-vZc$C+S!UZ*tmhjIK44gyCzva$_{=x{I(h1hNE{0p#w z5v>~qyznc+x4??Xo`PQ4i`vt8T*te0F2{o{(Pp-mIDF0KFyOXu20RHCs-Dnsu`iGL zc9L|g1t`5<9^cmYop2ni2Nv>nGadC7FaaJ0hf7P(wI@Co^QW!nlVKxpc(^y3jY{)P zJ-WV4_)Fn1Ad@D)g*PBgxp;_hD?^sHJ(0Z(A?Ik?uLOI|(YjG!7~8)De+4U|G#5VP z;)LvL1#OG*JFq;os#(EU7;Vu!5B3s5&a;vGs-Xq*cvu~B(CX$e^!o54cp7FwBQ*+% z+q5`LW~*Lj-7bwElG?4U#2#0`M-ZY(*M03>oB)f1Jrx-WN5g-h>%O(Te~~bwAxmqX zQ<-_*^%`2wSU2ra z8d;s6o99{TOn55?cWl8f%01A^6=B!RY-W54tZ>R@TE6a4)4A;qH-O`JUDMjC@72(; z2n)X5fmZ6e*hTpSTm|n!Xywx^%}wj&U`1s^tsSjDiFP966-cY2*XwVv4wSP2e0e5> zUf1b_*{58Db$l0{N*&^r3u@o=d*Hxg=mk!j;j#*6dfx`en(QGo%hXWk_6)R}hF%LB z5`TxizzU_==3w<9@F>(X{*qNb3ysG-FcA)h!O(7ICHo+x&C7;+9Cn3Drc*f`LXV+S z*|$=pDZh_SC8coXf-S?B4pw`iLJLkS?Qa+TVsN6Mr)@P3XiMJ~YAb0HnidQ9v*2nC zR~*c37ku>@Hum&$0URPZ4PJ-P^J%61)z))31uS#zVylwS>!2RT{ubd6hib#r(ZL{4 zZ?h#ip);UaOKP&N0A_J6J?&&R;+PJ5d;nRWPqX5Cm2>$X*c0n%vw?6f*kEYZ`DcCH z8Jx>GFalcLhLFIYKt1`{a_A6Ocljqe6-4SyX6A81uH9SOr4@h~`T}sGx6!6Uu|?M| z^HHT*Rr~BR9b4GlRSfKsnK=%xgZ3I$OItf`(@CBWt3a!o^I6}7dU}ZV&i)K*L3b9N zN_Psi(RMH9x8V(FbOE&sT}q>m>4dpAHZ*cvdwt^XDTiV~?P(3YM(@Chun08TtZXlZ zo^a63(zDeai>oS~6RD?sIv+L`YO&~4P)SeT8_bLTbyzIpldX$fYugALPNYY|o{+VkUV9yt`Z=tpo@)CxsI}&}e^Jjx zdEY2Ktwi?$oy+%O8nlY7NkR^V)#^x)`Q(@I*E-_pb3uE9QyIxs`zly5W?>du3+%&i zAKVL1z$;(@wt_4*bu1R%m3hBDY|{Da_w`mRI;UZ95KM%-AS)Y6M2A6^6`+-ymE2>X zhWCRG@nx_Av=S;h6y6q0jRwNvuq;>^YzP~G6RkRgdY!c4bz0wqsc;#Trh~8QvVl`> z+==s_vlifBV*4McHo+TmK+`(|Cc!%sJf)2ewH*Xr>t$dRYy@g+xp7;) z+7dwFs6!)~^jpL8xeK-zQEiC@x*c{^GkQNThw9*Px~g)c2;oXK!Dd+mT27(Dl-A+3h?R_v{<4Ew^b z;RVP-N7H;e*a*ndtiZkqw%)tylJ>oMQb%|(><6oYnxyH;8O9#=NH_p~1IFz!(x$I# zxEG0Me@I)26EqXEC-q&ZCr|63{{X8)hF)h>_BW4bY1oou&n_V zjoV|Gr|Q+ybNCl*2+g!TIk=6uQcXiXKTP;BDNZ6fl@y}2Qjmcp=1i!kFc{XB^&zl0 zG}83`2f)2hZ<;SB4tqlNn8Qt1K)o$hTZF%ct-(UoXw$ju0l$ZO@BV*_I1Yw1Eq{W| zWsC9YT&P#iS;TP@d;y#zX|#C^TgkV8#}27{OZU}LTPB;;(sgL>R;Z_Zy+-)2L4OFf z=u|=#Yq9;eAwADRX~wSgvl;Jp*ahZ;o-kXR+rS^8p33KS!haUhng!-?u-jd$UZwk~ z-z4}hWZBv$x|(bRdz}KIUHsDXuywswO-HP}lh<{B@Vb=7AM#lz=Wyv7kaf?5C@Y%B zQUi}|BOxTsrTbbb?*~1ZehycdH@c8l9b0LdYW?gYjvvCpkjA1@Nuyeegz@7246N8{ z%`jc}Gn@`(N9gIy&mjv#MAz}!HBBM!bx4;$+7{v3guM&u(eFXR+nQbgnq?OLLtqkw z=+|{$E0U97en@LNxEmp@o~CCi91E3t%(w4;)2>M}XDtAGHr7nXICvGh>J{={J^lpC zLr(SVg8twjfuR=E}kw5N zH{%!t&9;R|z)_%MNvo%oyXT`eJz@KB5X(cT?p^o4pYU7Nnb_!5>J+egj=-_sut7hI*Y~bSjA0 zj^^;sWss&2+r>Q>7K2u>1xduokfzt*`QHe`pjOiXS%IZFo`vr}a0H~Od*NK+S>pXEKU z3})ffEf-$T(DaypTsV=XZBJyOjV#lBC8QlP4hySg}@z#Shne{2cT?Doc zTfyEZ5x<28zziN@p8vXF&!blJ9+Dj)O)t&#T?guCMbm0#!L-4kqYc&4a~S~^#E>#! z#jBoahOJEF-{4GWmHbFj=GYs&I}83k=bNxMI{BSo(Xe1O?``~!IP3wIg*0X(^IGsc z-%S%i3^T6+Aq8mO(9QW~9S*x}ibLy#uZMe5gl%My$B5k4fj1F`+7JS)54B#$Ejss4 zQwSd??D_Btw5mNv!c5}}DH6B0b$jCb4a7-i-bEHo`5FWlE-aB-?fId0Or%Q z*I#`$fejjPqQ>no@_}H_KaJ_&?}cB&thd z7_PhmSzqk(N6GG6ha4>QY0`Z+;amaMie``CHV7@aR)niTErn}1`)vkkw0nwhR)Vvj z)y?s8ol2UXiw7-{stD8eazk|ss5~?;Ihb2;ktrTPxHhdG- z0rP(vd!In(L0V^-=9qma%*+!9jH{&twUQ#%pesRWjFElYr< zYY1dX98tr5rMncnQ;(ExXyMQIkT$ylp`O}q-zHE?mrjqq285bvx)JUQ4cNr}@8j4` z2!-ltl0OD%@||Hz&GFx_!%h%d2NdJ-9P}t>gRPKg87t6kPQ?l|WDvY4*EHVTTl~F&X#JsnLU9gQY3mQ!Z^-S z&74$m5+;qFUgLJu^G?!jZ?)U}`RD6jUezo)cFeYWvVT`IAL?N0aSF!wNjMnNG%yXX zS>ApD_G+UwNP#p3q(MpPHdS{#aeuW`HCOcHF`JqH~`h^duBwrQNoP{KKf)un~ ziC1Y?3(YU??>t^LJ)JX%Eac5qxFm{^bvdx6a$*K8?9O@y~zD!N7$YnK_Y(;5B8tPzlc8&?RgPHNuWd80n zaVR29h1d?7H6o4njw?ABwRUA4tI({8+OK{e$V^MG8gqeVJ8s_K9%&2bg=45?H-vibk@&R0LTqv;sa z+*n*q&r%(9=3jx&K|Oi)?}WFPqUOX zMH{nHeGEToaZYl7{`VR7T8O?^nk}kEw5nn+B`mu*K|G{F5c9o_t9kN&h5d_PTOm7t z*3OM9&%vSEH0R)alup7pDw&$@4my=eL%Ws2cK!Y-KKvXW?)qhX-!lr-=2T9}Z%7du z2cN=m)E0*Hv+qE1-;QLZ5j@Crv1G6OMakZo4TtrNLh&elRe@@bIMksOHEhJZV=?ZY zcs2cLd(sYFTX$4*Dx0$X5LgbxwgPFLL-*ya*=JV$_@+P23OHlc8C9E4@_w{~VKYcu zN7&1E9_3=Fb}Tj*ZN^Tgvv>Nn0L6IXYdHm~XZZ2?MYz;ogirXR80$edGA-*VMVs-RGha;V_u6V!247lO%p*3lbr&U zoyw{CAvl2DA#~k&#nj=P9ADjyg_~{m<4o&RENe?ZRt>af zXlUA9`WxyPT^;JYM>$g$Z+_eaLgOvQXWTlJKNr7B=0y4>TX2;tJDxP@ z&hadze#ut!Rvu{3&683+oMFPp2>0bWZlg3MZ^{o(7>#+6r?x zEDG;IJDL;kp?A!Co<5SO($g-~V+TmP^2>RYi{N62y>UcnwpDN{Osw}S%zZeKmbJ}K zdt_5aW?h2Zu7xXWO&S@Wm7f))6PlsJj*f%>3hsu!X11;?nNGz?=ukaf;bfVb3hiji zl4u=cXph37FCYC<&Q{~g4Iwm6SAy-*0|slJxnt0OcLbK@3^BlB@DF zr`VLv7!J$j^U2Dr+3@b~=wQ;x7#hmL?L>3v__Zy{72%&?VUE_JfRnL{&ZVYPSp!0KG#>Sv2&co75UoWNC_l_KywHMJod0QB61AM#LUdXO z)v{yUCldu;C6+WTWqXzzK>5Z;CP{0{NYrvlij+H)v=O9T?Udq>nFTQ~YzS$Ftez*F zj-}MpA#LN;8%*u3xcVzv3n@_EshGgVIh2mm|FB^WtA*rknWWfCdN}84= z!FsJZMCjezp>r(iIT{=eYd3SjffMVM>x}YeWS)Bh$_-T+m&1c;8m|u%?vD_94G0pg zp$g1Aalp9pxnydg26~78p*2yh37*NbU1rw0bKI|P1=RWxsPS&GxsKz5{ zSUm{7hMHqOc3IlZ^oVOgs26aYTQ5*fE8}vUwR}CqhAQT`uHEoxEv7*Ei#ePTs(j&R z6&uwQn8uXK8!e_qZ%&TOWF7!#n?ud6%J$$GNVEu!&Uym2);#cAv9pdEPBK=Tq;0v-!@Ot(_!owickggYidHa)mpL9LUVnn6>wB z35wUItT~Q@_nE3&H8KmiV`8D^7><=od`!aJ%011;e?w@`-j@0&z+OPRnB!os2`*n> zR6h$fnp9yI8?cVmrfJAh+a{lZc5>7txA$A+N_`eBjro#$DKR^`gexm43d_Mdh62tY zJDi7O`7JlIxPG%9D-Q8gKA(DG?;T;MavJ}F^&zx!a0%0{@DNm6hs)+ZWA?i5fUO}k z->pcPz2Qzs(~~4vkJ(_3^jUB+B-HGY`~xcW?sO(P9A888q&=u3!JBIS2IW=;@O6*c z0FJg)iX&RTjs%@|cjoZlv)%2~%1-HP> zApv{wzBXiTg)e~>TZmbSc#HXsaAioq9^Th<+L+h_LMwffYGd(su*{Y-hiDK9F0 zwc!Lf9QFg}5L>~lbJQ)wTw?bP_+kx#E@7YVL#v$cJV~zXR2%|3HGeH3w$1Zn2&j}M zQ_XY0;uoF0pTWev4+98m;9M?DeoU|BJ2_i`mCVV%yWsC&w_2|~9g3OOG};|@410Ch z64n6@6Ac9{;P-;_C7~IARl=C*tpr|%Ry3X8kdz5CkC^vD@{0M<-iDQKsGe4c2Z4(z z9*0)6HA&Q$VaXJUQ%ALVu$!=+|C6v$H~UrEY#o-ScTg$5W_)kn8CK(gt=n4KDmxXE zeRS@HLN8)=GLjqc*UoYntf&fV_9ORgK#?5DI;C}!3Hfu9qxi+*d4E#!ZNi)k_DpPb zmouHqe>!=N*PCEDcmbkyIAL4ITfu-pL3G%=gHGkA&}uCu=YH%pSiy&$8$pt%;Ri6; z4>g*@IzEibIj7LxycNl|a4?Jqd)uvKF4p)uY>_fi?-1@!V7aYkFR}4&upU&ekE+EI zx206zho9e$E8VEI0Nr2EcNzK^l$=KDk7dGrR2nDaM18ezo!f@s#H=9JNls19P2S62 z!O)n_qN{~EiVq3=T-ONt_TTBtE}FI9nwHtA%4* zKla;%LAO@+1NL9LCz2iW&=FkdYQ(b`yn?wyJ!*YUf-*Cr?B zpQN+8FBSMsRQ{{;I)F;upM#v!LgRbBDct{JL3JqV5C@9{zl)`I=2mD zzi+T;V1r~rauzP>+T_Q%catOXgSqj0bBf;>9Lg5Nw;~Q`AmQiZs2}qGecad-1||N* z+|Z2-F8ni@kn651-u3W(;r%R5QfJ`s&1Nv?+VQ>?bAMZu$AJ~V@8CUXhM5+JYL0;| zQzpRP?3Li$QyR0Eb3N<|V<1#df)pA?$MQM^eg&^VGi(VCYESf=uvp3jP;?8czjU-} zQ;XR^xd_$*hcX>@jn<|L)aF!*CpRwlSaN9o1b%wqQY!V2Q;~1XrV;tsg$!s$u!Zs> z-#5$@MFFxYB=%@^Hd!%)Waub$>n1sY=I z%fN*&6?)Pfma!r~9PFw5HwW+`z@A{=%fQu0Y3*48S}CpvR?KN^DFPh<>ZxOy2v*QN zVQRN7d=2)2Gv02l-WSCkL=$KODyj^X@S3H#i9&Bla3aYzdvsynB@Y zhHwte+yg)1|JBJAIX}0uS+Ur{vj-7kceC?e;80Ahwlq8b3=CIK%Wyj3{{T9cf57|D zNHfna4_1C(ft4U_KGu<(2tS1K`IQYdn!OC;abB<^Z*E<@;LSdL8XS9|c=MJvtJ+SDN}B1~a=kyY1PobJt1NYBpl7 z2J?c$v8k+(fsUH7%&#q*W5;Z}XR26SwRJ+lnOI2Qs5y?~a?fxhN5#tue42EDrT(N$`Tb$p16pfsT)<|9frJ z@w@Oa*gLi1GXSEsfdUrV=Gn2iC+W3(pK4)!HVW-a1N&EWE?i>YW?_N#o>_B zlCV73T3;8|2P^3;Di$j()9`b+8L~9vrZ-&B^GIG7sxxvmQH#A{SC|B9c|ZIcrhs{Q z29)aQwa_6i0c!a%*Z|f8uaOQW3ui(!g&UJ~(DtgbvR8=cXP`6n-0e-R4uhe&^%e<; zR#}1OUz`(i6o~w#^dcT6iyug-+!x1UD=kx_^z>s!Xe>qPY9e;rI$DPU4y&92Rz6>V zEb@evq0V6w*a$uZk7EV+R_A*^TM27cZdMkHfEBU5rbR&~XXThxFLs-|y4QBU<(OEvU5Sf12XE!~!-dA`4f zbHMjmn)&8Icmytj4PaAHhZVqHmU$$LJWDj0nAgcPg_zgPhQX{F0=ZvHTZ>!_<~fe0 zw=yArJjMKBD*vxgjckH*u@GcuIWl2Ch7-oK^tj;6vWvRSW139*e*{)MyF-?`TZvh* zTCs^{Au3jYg)jJL#hIn^D8}3M^*ugZ01i=2@46x5_b(IQPr*uE2ashsQ%@P%2`^34 z(@J0GY~Jyl8)Y8n`A+`8s|^s(f8kDaplZ@=o1X+60J}m+UM@C7ZYErJHklnh=x(QG zZqG8am!8MhHkn3aH0@e|qjK+1`CmlOVhUB9Ex!?^2dL*WSKOYp?d1D(tB z&{L+fd9#zAI%ciMvA42qtvh$wZ#M5Afa|+_*S2q4!PCzzUdQjf*xj=Q-3VKj_RY$T zh`1NT`4H!zW4R1kx@8ogwY?*UjeZ3>l$W5V>@g1XJ-85NLT@o0^!ac+JlrUdi1ni|B zp5?r(2puB)8mtPf*Q+H_Rm>rUdqIbCIXH&hEYq=_1kb_2uokqVo(_@Py>;(&22=vlm5G4Gg#1E|?sp0S90Vd+Koardqm9lZVpIL7f6_$0VywH?f*QP+S= zl?nBeow>YVCDA&v~tVZ@v$>N2lEBk4MxEH&bB zX0jq23nO6x=;AHYcf)7cJYuSG2#YP}J2=dA5sZOtVM7=OjdU-_Pd zDR?)>ev|DJz}vJ#>@9Zg>3JesunvnjKk$FB23Qep-1&Z4UI&3rraz=HD>jc~BVY;k ztr-e5*Qxv?>iIV4NbiOVU};zh)KX1#HtOj!O@@Gur_|I)N1~>$gFO?SbWu-xdecBX zJ!Z71fC|)|7n#^>jwExR3U*@LJacFJ}9j&Q>+DLt0wkm|>b#^2JggJc(RJ6D)y zNGq~Qov62s28VNWCRTm}z@AJwb4X9eY8)=jwS}!7?W_sOPi^X{CeL=JB0-dZ5#tv;usa~MdgvwvqLF^e@^uQIUp)0_pN zyq%V})wM5t30ALV9)%Jxn`*_SqW)ZDj@O#3bNK5qQuPyx)5Y<3h-;E9%bl#e9DcDv zlW6rR5cRB2zrGaO;dDn0LTv^C>S}a^JC*VIek>|onOP8jJboh*uqsvl;#BoMe0X{? zoL<3%yemlVrVTYQ`Bu)>5;t!XZef1bFJHKQ`%^fFa$WYquEl?yPT_6BTmiRogq`{B zle{ig&AH48=dVhA#Eoe0GqLLf$D&0Aq5@HYzM;V4oMxpFfocjk^x9EpSKF(~wlJsi z!~BXkkWW*o?@63%!@`Biz1Vl?e8tU~sOR~ALvm{VGMvpMD)+q!>$C6IuI3PmX~i+v z!gX@?Ji=X`9Fuz!$Mjbm)z&yOoy*2-^S6i>EHIm+<>)2l=_}<3H=8Ar{c$G84A{ob+qukMHE)p$^DPCShzk9mGzI+yH#Q>falV!Ix4H7fp* zIDqX4H;va#`F@dFE-2yNAnsLM?wZrfI3ec{*j337^MB^fgk_OzCHB)J8?WQW zPDVb@cP}MJH+>25==b)=>9^ck02GQA6^IJ-gaWS6d@1li4ii_NJ_wAA-L0$FfMV0X z))<_Bb0J4vR>MJYE)$YZk-Y!qNE_AC<4Bt#dOOaeJjVZXk@zwkOYCu^6*Gp53Pc5( zp}+_ZIy~^e&SyLcHlVXG9mb7oX7gHo04;KvjRnkyGI400#SjeK!*ZO)_(!EhtN)dLvW9P z_pH=qm3u1V3rmJSMeN?dmZ=qbC*GWxklT7W#U?ZUVV|{ z$wdX~Q9$Ri4}2Zc)ZaRmd%@MXby;NxvtZ#T?M7$aW9c0Fnn==*=f0A^FpuKugJ@BK zs6bR8DiE$fe}ecpAA2ibg*5Xj1S>op<3ZolYvrAaH!${Nc^Wq#)_Z``@H#0R%L_P^ zo1#N0RVRLq3Pc5>0`n-~GxWL+ZP_caH?j(B4%@+KsCo+s+bh{@Hrx)AEA0^SeR-!c zmD>qdDJ0nE4>iJ;=Jb6?p7)$YiwZ;qq5@HY@(Sos4u{n`H`_Dup1q~OM`8Kidc3RC z;bV}wtoW}mGbmJroy$9w;UqA}Bib7@Sx;IPU|z)=C!<9Lq5@HYs6b@}?3IiKdm^P) zk0U9@@Xz8G^}gmlIDGz}l=m$4MjgYql>+PR@#XWAxE7$Tu31cMpH)C_l7&Yp zC*V}RyaN24i%hKic-K@`0q0rF-0_>enH;Djk{L|m_}I*7QGuvHR3IwQ90k0;<9Fa# zSY}q120# zr{eSEbA{iR&FVolUC-`A9{hD5kN?VKmZ)pQ@qJVvDi9Tj3e=>)L+tfqm{`-^0Xvm< zDn{^b;fKTT=d_gfv7-KAS&PuDks4WjgX?UQ#pa* zsgIKDIA~@QIP|w>^LIVJ1om(vPA10LQVI;+c;9cvwE!)3Nn&E60&^6wQGY9pgR8*d zu*|KpgW(274tWDyL(iq|9!8<}lP~;I*G0(@x%hjunP18nVN@V05EUq^fX>4os5%?I z4S#}$I27V#Jytb4HupM{>u0gc&Gih4bvl&E^jLn$^Y4B5Oth##R3Iu46=< z1M?*k#g9>es6bR8D+T<)s(0X7@VP9vz-{2O?;F-TA?`U=`^`0{<~Lz=*f(G|9_}?{ zP7GDv;7~r~H11@VGr2?MDjo#(L6zO(rl>$vASw_Qm|KBG`FJ^OI``LwPfkndL|h*H zGCT*5gOl=)!W8K76}PoJ6;hY{C_ju-*bT?BH>}Gy!*DP@sAi6J_DnpQs@T=6Tb-x2H{v3z|G?Ye&E^h) zHO;~tOfi`!<(Fb**V-g~V+O`X(lZ%?!!fS+ct05)5` zfv7-KASw_Qhzdjnq5{oS;A7`KuyB$LnK^dMwtF@+9r4&vfv7-KASw_Qhzdjnq5@HY ns6bR8Di9Tj3N%oGNgsXX&ig*G%>Q_Zu{-QK=IZSZ`2PO`HaY9o literal 16955 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 b#Prml)Wnp^!jq{WQyDy6{an^LB{Ts5286N& diff --git a/neurodebian/README.md b/neurodebian/README.md index 50c5676164c0..b89cf95d9b67 100644 --- a/neurodebian/README.md +++ b/neurodebian/README.md @@ -20,28 +20,26 @@ WARNING: [NeuroDebian](https://github.com/neurodebian/dockerfiles) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`trusty`, `nd14.04`](https://github.com/neurodebian/dockerfiles/blob/54ea480e6e3b2563e3e5dcd3df74ca3d280876e1/dockerfiles/trusty/Dockerfile) -- [`trusty-non-free`, `nd14.04-non-free`](https://github.com/neurodebian/dockerfiles/blob/54ea480e6e3b2563e3e5dcd3df74ca3d280876e1/dockerfiles/trusty-non-free/Dockerfile) -- [`xenial`, `nd16.04`](https://github.com/neurodebian/dockerfiles/blob/54ea480e6e3b2563e3e5dcd3df74ca3d280876e1/dockerfiles/xenial/Dockerfile) -- [`xenial-non-free`, `nd16.04-non-free`](https://github.com/neurodebian/dockerfiles/blob/54ea480e6e3b2563e3e5dcd3df74ca3d280876e1/dockerfiles/xenial-non-free/Dockerfile) -- [`bionic`, `nd18.04`](https://github.com/neurodebian/dockerfiles/blob/54ea480e6e3b2563e3e5dcd3df74ca3d280876e1/dockerfiles/bionic/Dockerfile) -- [`bionic-non-free`, `nd18.04-non-free`](https://github.com/neurodebian/dockerfiles/blob/54ea480e6e3b2563e3e5dcd3df74ca3d280876e1/dockerfiles/bionic-non-free/Dockerfile) -- [`focal`, `nd20.04`](https://github.com/neurodebian/dockerfiles/blob/54ea480e6e3b2563e3e5dcd3df74ca3d280876e1/dockerfiles/focal/Dockerfile) -- [`focal-non-free`, `nd20.04-non-free`](https://github.com/neurodebian/dockerfiles/blob/54ea480e6e3b2563e3e5dcd3df74ca3d280876e1/dockerfiles/focal-non-free/Dockerfile) -- [`jessie`, `nd80`](https://github.com/neurodebian/dockerfiles/blob/54ea480e6e3b2563e3e5dcd3df74ca3d280876e1/dockerfiles/jessie/Dockerfile) -- [`jessie-non-free`, `nd80-non-free`](https://github.com/neurodebian/dockerfiles/blob/54ea480e6e3b2563e3e5dcd3df74ca3d280876e1/dockerfiles/jessie-non-free/Dockerfile) -- [`stretch`, `nd90`](https://github.com/neurodebian/dockerfiles/blob/54ea480e6e3b2563e3e5dcd3df74ca3d280876e1/dockerfiles/stretch/Dockerfile) -- [`stretch-non-free`, `nd90-non-free`](https://github.com/neurodebian/dockerfiles/blob/54ea480e6e3b2563e3e5dcd3df74ca3d280876e1/dockerfiles/stretch-non-free/Dockerfile) -- [`buster`, `nd100`, `latest`](https://github.com/neurodebian/dockerfiles/blob/54ea480e6e3b2563e3e5dcd3df74ca3d280876e1/dockerfiles/buster/Dockerfile) -- [`buster-non-free`, `nd100-non-free`, `non-free`](https://github.com/neurodebian/dockerfiles/blob/54ea480e6e3b2563e3e5dcd3df74ca3d280876e1/dockerfiles/buster-non-free/Dockerfile) -- [`bullseye`, `nd110`](https://github.com/neurodebian/dockerfiles/blob/54ea480e6e3b2563e3e5dcd3df74ca3d280876e1/dockerfiles/bullseye/Dockerfile) -- [`bullseye-non-free`, `nd110-non-free`](https://github.com/neurodebian/dockerfiles/blob/54ea480e6e3b2563e3e5dcd3df74ca3d280876e1/dockerfiles/bullseye-non-free/Dockerfile) -- [`sid`, `nd`](https://github.com/neurodebian/dockerfiles/blob/54ea480e6e3b2563e3e5dcd3df74ca3d280876e1/dockerfiles/sid/Dockerfile) -- [`sid-non-free`, `nd-non-free`](https://github.com/neurodebian/dockerfiles/blob/54ea480e6e3b2563e3e5dcd3df74ca3d280876e1/dockerfiles/sid-non-free/Dockerfile) +- [`xenial`, `nd16.04`](https://github.com/neurodebian/dockerfiles/blob/53a254d17e6c1c21787ed44b6e848c1af46ea9be/dockerfiles/xenial/Dockerfile) +- [`xenial-non-free`, `nd16.04-non-free`](https://github.com/neurodebian/dockerfiles/blob/53a254d17e6c1c21787ed44b6e848c1af46ea9be/dockerfiles/xenial-non-free/Dockerfile) +- [`bionic`, `nd18.04`](https://github.com/neurodebian/dockerfiles/blob/53a254d17e6c1c21787ed44b6e848c1af46ea9be/dockerfiles/bionic/Dockerfile) +- [`bionic-non-free`, `nd18.04-non-free`](https://github.com/neurodebian/dockerfiles/blob/53a254d17e6c1c21787ed44b6e848c1af46ea9be/dockerfiles/bionic-non-free/Dockerfile) +- [`focal`, `nd20.04`](https://github.com/neurodebian/dockerfiles/blob/53a254d17e6c1c21787ed44b6e848c1af46ea9be/dockerfiles/focal/Dockerfile) +- [`focal-non-free`, `nd20.04-non-free`](https://github.com/neurodebian/dockerfiles/blob/53a254d17e6c1c21787ed44b6e848c1af46ea9be/dockerfiles/focal-non-free/Dockerfile) +- [`jammy`, `nd22.04`](https://github.com/neurodebian/dockerfiles/blob/53a254d17e6c1c21787ed44b6e848c1af46ea9be/dockerfiles/jammy/Dockerfile) +- [`jammy-non-free`, `nd22.04-non-free`](https://github.com/neurodebian/dockerfiles/blob/53a254d17e6c1c21787ed44b6e848c1af46ea9be/dockerfiles/jammy-non-free/Dockerfile) +- [`buster`, `nd100`](https://github.com/neurodebian/dockerfiles/blob/53a254d17e6c1c21787ed44b6e848c1af46ea9be/dockerfiles/buster/Dockerfile) +- [`buster-non-free`, `nd100-non-free`](https://github.com/neurodebian/dockerfiles/blob/53a254d17e6c1c21787ed44b6e848c1af46ea9be/dockerfiles/buster-non-free/Dockerfile) +- [`bullseye`, `nd110`, `latest`](https://github.com/neurodebian/dockerfiles/blob/53a254d17e6c1c21787ed44b6e848c1af46ea9be/dockerfiles/bullseye/Dockerfile) +- [`bullseye-non-free`, `nd110-non-free`, `non-free`](https://github.com/neurodebian/dockerfiles/blob/53a254d17e6c1c21787ed44b6e848c1af46ea9be/dockerfiles/bullseye-non-free/Dockerfile) +- [`bookworm`, `nd120`](https://github.com/neurodebian/dockerfiles/blob/53a254d17e6c1c21787ed44b6e848c1af46ea9be/dockerfiles/bookworm/Dockerfile) +- [`bookworm-non-free`, `nd120-non-free`](https://github.com/neurodebian/dockerfiles/blob/53a254d17e6c1c21787ed44b6e848c1af46ea9be/dockerfiles/bookworm-non-free/Dockerfile) +- [`sid`, `nd`](https://github.com/neurodebian/dockerfiles/blob/53a254d17e6c1c21787ed44b6e848c1af46ea9be/dockerfiles/sid/Dockerfile) +- [`sid-non-free`, `nd-non-free`](https://github.com/neurodebian/dockerfiles/blob/53a254d17e6c1c21787ed44b6e848c1af46ea9be/dockerfiles/sid-non-free/Dockerfile) # Quick reference (cont.) @@ -49,14 +47,14 @@ WARNING: [https://github.com/neurodebian/dockerfiles/issues](https://github.com/neurodebian/dockerfiles/issues) - **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) - [`amd64`](https://hub.docker.com/r/amd64/neurodebian/) + [`amd64`](https://hub.docker.com/r/amd64/neurodebian/), [`arm64v8`](https://hub.docker.com/r/arm64v8/neurodebian/), [`i386`](https://hub.docker.com/r/i386/neurodebian/) - **Published image artifact details**: [repo-info repo's `repos/neurodebian/` directory](https://github.com/docker-library/repo-info/blob/master/repos/neurodebian) ([history](https://github.com/docker-library/repo-info/commits/master/repos/neurodebian)) (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/neurodebian`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fneurodebian) + [official-images repo's `library/neurodebian` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fneurodebian) [official-images repo's `library/neurodebian` file](https://github.com/docker-library/official-images/blob/master/library/neurodebian) ([history](https://github.com/docker-library/official-images/commits/master/library/neurodebian)) - **Source of this description**: diff --git a/nextcloud/README.md b/nextcloud/README.md index 96fb445df978..71e0d37a71ce 100644 --- a/nextcloud/README.md +++ b/nextcloud/README.md @@ -20,22 +20,19 @@ WARNING: [Nextcloud](https://github.com/nextcloud/docker) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`16.0.10-apache`, `16.0-apache`, `16-apache`, `16.0.10`, `16.0`, `16`](https://github.com/nextcloud/docker/blob/b1825a188ba1918aa30d0b6ac18d0a32ff3ec707/16.0/apache/Dockerfile) -- [`16.0.10-fpm-alpine`, `16.0-fpm-alpine`, `16-fpm-alpine`](https://github.com/nextcloud/docker/blob/b1825a188ba1918aa30d0b6ac18d0a32ff3ec707/16.0/fpm-alpine/Dockerfile) -- [`16.0.10-fpm`, `16.0-fpm`, `16-fpm`](https://github.com/nextcloud/docker/blob/b1825a188ba1918aa30d0b6ac18d0a32ff3ec707/16.0/fpm/Dockerfile) -- [`17.0.6-apache`, `17.0-apache`, `17-apache`, `production-apache`, `17.0.6`, `17.0`, `17`, `production`](https://github.com/nextcloud/docker/blob/b1825a188ba1918aa30d0b6ac18d0a32ff3ec707/17.0/apache/Dockerfile) -- [`17.0.6-fpm-alpine`, `17.0-fpm-alpine`, `17-fpm-alpine`, `production-fpm-alpine`](https://github.com/nextcloud/docker/blob/b1825a188ba1918aa30d0b6ac18d0a32ff3ec707/17.0/fpm-alpine/Dockerfile) -- [`17.0.6-fpm`, `17.0-fpm`, `17-fpm`, `production-fpm`](https://github.com/nextcloud/docker/blob/b1825a188ba1918aa30d0b6ac18d0a32ff3ec707/17.0/fpm/Dockerfile) -- [`18.0.4-apache`, `18.0-apache`, `18-apache`, `apache`, `stable-apache`, `18.0.4`, `18.0`, `18`, `latest`, `stable`](https://github.com/nextcloud/docker/blob/b1825a188ba1918aa30d0b6ac18d0a32ff3ec707/18.0/apache/Dockerfile) -- [`18.0.4-fpm-alpine`, `18.0-fpm-alpine`, `18-fpm-alpine`, `fpm-alpine`, `stable-fpm-alpine`](https://github.com/nextcloud/docker/blob/b1825a188ba1918aa30d0b6ac18d0a32ff3ec707/18.0/fpm-alpine/Dockerfile) -- [`18.0.4-fpm`, `18.0-fpm`, `18-fpm`, `fpm`, `stable-fpm`](https://github.com/nextcloud/docker/blob/b1825a188ba1918aa30d0b6ac18d0a32ff3ec707/18.0/fpm/Dockerfile) -- [`19.0.0RC1-apache`, `19.0.0-rc-apache`, `19.0-rc-apache`, `19-rc-apache`, `19.0.0RC1`, `19.0.0-rc`, `19.0-rc`, `19-rc`](https://github.com/nextcloud/docker/blob/05c3a27d349566e8d3b79797b7300ab1e1bb6a79/19.0-rc/apache/Dockerfile) -- [`19.0.0RC1-fpm-alpine`, `19.0.0-rc-fpm-alpine`, `19.0-rc-fpm-alpine`, `19-rc-fpm-alpine`](https://github.com/nextcloud/docker/blob/05c3a27d349566e8d3b79797b7300ab1e1bb6a79/19.0-rc/fpm-alpine/Dockerfile) -- [`19.0.0RC1-fpm`, `19.0.0-rc-fpm`, `19.0-rc-fpm`, `19-rc-fpm`](https://github.com/nextcloud/docker/blob/05c3a27d349566e8d3b79797b7300ab1e1bb6a79/19.0-rc/fpm/Dockerfile) +- [`23.0.12-apache`, `23.0-apache`, `23-apache`, `23.0.12`, `23.0`, `23`](https://github.com/nextcloud/docker/blob/540648f7edee606349f4499e1c989e9c106331a9/23/apache/Dockerfile) +- [`23.0.12-fpm`, `23.0-fpm`, `23-fpm`](https://github.com/nextcloud/docker/blob/540648f7edee606349f4499e1c989e9c106331a9/23/fpm/Dockerfile) +- [`23.0.12-fpm-alpine`, `23.0-fpm-alpine`, `23-fpm-alpine`](https://github.com/nextcloud/docker/blob/540648f7edee606349f4499e1c989e9c106331a9/23/fpm-alpine/Dockerfile) +- [`24.0.8-apache`, `24.0-apache`, `24-apache`, `24.0.8`, `24.0`, `24`](https://github.com/nextcloud/docker/blob/540648f7edee606349f4499e1c989e9c106331a9/24/apache/Dockerfile) +- [`24.0.8-fpm`, `24.0-fpm`, `24-fpm`](https://github.com/nextcloud/docker/blob/540648f7edee606349f4499e1c989e9c106331a9/24/fpm/Dockerfile) +- [`24.0.8-fpm-alpine`, `24.0-fpm-alpine`, `24-fpm-alpine`](https://github.com/nextcloud/docker/blob/540648f7edee606349f4499e1c989e9c106331a9/24/fpm-alpine/Dockerfile) +- [`25.0.2-apache`, `25.0-apache`, `25-apache`, `apache`, `stable-apache`, `production-apache`, `25.0.2`, `25.0`, `25`, `latest`, `stable`, `production`](https://github.com/nextcloud/docker/blob/540648f7edee606349f4499e1c989e9c106331a9/25/apache/Dockerfile) +- [`25.0.2-fpm`, `25.0-fpm`, `25-fpm`, `fpm`, `stable-fpm`, `production-fpm`](https://github.com/nextcloud/docker/blob/540648f7edee606349f4499e1c989e9c106331a9/25/fpm/Dockerfile) +- [`25.0.2-fpm-alpine`, `25.0-fpm-alpine`, `25-fpm-alpine`, `fpm-alpine`, `stable-fpm-alpine`, `production-fpm-alpine`](https://github.com/nextcloud/docker/blob/540648f7edee606349f4499e1c989e9c106331a9/25/fpm-alpine/Dockerfile) # Quick reference (cont.) @@ -50,7 +47,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/nextcloud`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fnextcloud) + [official-images repo's `library/nextcloud` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fnextcloud) [official-images repo's `library/nextcloud` file](https://github.com/docker-library/official-images/blob/master/library/nextcloud) ([history](https://github.com/docker-library/official-images/commits/master/library/nextcloud)) - **Source of this description**: @@ -84,23 +81,23 @@ Now you can access Nextcloud at http://localhost:8080/ from your host system. ## Using the fpm image -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 Nextcloud 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 ...` or a `docker-compose` file). In both cases you don't want to map the fpm port to you host. +To use the fpm image, you need an additional web server, such as [nginx](https://docs.nextcloud.com/server/latest/admin_manual/installation/nginx.html), 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 Nextcloud 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 ...` or a `docker-compose` file). In both cases you don't want to map the fpm port to your host. ```console $ docker run -d nextcloud:fpm ``` -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. +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](#running-this-image-with-docker-compose). ## Using an external database -By default this container uses SQLite for data storage, but the Nextcloud setup wizard (appears on first run) allows connecting to an existing MySQL/MariaDB or PostgreSQL database. You can also link a database container, e. g. `--link my-mysql:mysql`, and then use `mysql` as the database host on setup. More info is in the docker-compose section. +By default, this container uses SQLite for data storage but the Nextcloud setup wizard (appears on first run) allows connecting to an existing MySQL/MariaDB or PostgreSQL database. You can also link a database container, e. g. `--link my-mysql:mysql`, and then use `mysql` as the database host on setup. More info is in the docker-compose section. ## Persistent data -The Nextcloud installation and all data beyond what lives in the database (file uploads, etc) is stored in the [unnamed docker volume](https://docs.docker.com/engine/tutorials/dockervolumes/#adding-a-data-volume) 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. +The Nextcloud installation and all data beyond what lives in the database (file uploads, etc.) are stored in the [unnamed docker volume](https://docs.docker.com/engine/tutorials/dockervolumes/#adding-a-data-volume) 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. -A named Docker volume or a mounted host directory should be used for upgrades and backups. To achieve this you need one volume for your database container and one for Nextcloud. +A named Docker volume or a mounted host directory should be used for upgrades and backups. To achieve this, you need one volume for your database container and one for Nextcloud. Nextcloud: @@ -120,10 +117,10 @@ Database: ```console $ docker run -d \ -v db:/var/lib/mysql \ - mariadb + mariadb:10.5 ``` -If you want to get fine grained access to your individual files, you can mount additional volumes for data, config, your theme and custom apps. The `data`, `config` are stored in respective subfolders inside `/var/www/html/`. The apps are split into core `apps` (which are shipped with Nextcloud and you don't need to take care of) and a `custom_apps` folder. If you use a custom theme it would go into the `themes` subfolder. +If you want to get fine grained access to your individual files, you can mount additional volumes for data, config, your theme and custom apps. The `data`, `config` files are stored in respective subfolders inside `/var/www/html/`. The apps are split into core `apps` (which are shipped with Nextcloud and you don't need to take care of) and a `custom_apps` folder. If you use a custom theme it would go into the `themes` subfolder. Overview of the folders that can be mounted as volumes: @@ -131,9 +128,9 @@ Overview of the folders that can be mounted as volumes: - `/var/www/html/custom_apps` installed / modified apps - `/var/www/html/config` local configuration - `/var/www/html/data` the actual data of your Nextcloud -- `/var/www/html/themes/` theming/branding +- `/var/www/html/themes/` theming/branding -If you want to use named volumes for all of these it would look like this +If you want to use named volumes for all of these, it would look like this: ```console $ docker run -d \ @@ -161,7 +158,7 @@ $ docker-compose exec --user www-data app php occ ## Auto configuration via environment variables -The nextcloud image supports auto configuration via environment variables. You can preconfigure everything that is asked on the install page on first run. To enable auto configuration, set your database connection via the following environment variables. ONLY use one database type! +The Nextcloud image supports auto configuration via environment variables. You can preconfigure everything that is asked on the install page on first run. To enable auto configuration, set your database connection via the following environment variables. You must specify all of the environment variables for a given database or the database environment variables defaults to SQLITE. ONLY use one database type! **SQLite**: @@ -181,55 +178,94 @@ The nextcloud image supports auto configuration via environment variables. You c - `POSTGRES_PASSWORD` Password for the database user using postgres. - `POSTGRES_HOST` Hostname of the database server using postgres. -If you set any values, they will not be asked in the install page on first run. With a complete configuration by using all variables for your database type, you can additionally configure your Nextcloud instance by setting admin user and password (only works if you set both): +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. See [Docker secrets](#docker=secrets) section below. + +If you set any group of values (i.e. all of `MYSQL_DATABASE`, `MYSQL_USER`, `MYSQL_PASSWORD`, `MYSQL_HOST`), they will not be asked in the install page on first run. With a complete configuration by using all variables for your database type, you can additionally configure your Nextcloud instance by setting admin user and password (only works if you set both): - `NEXTCLOUD_ADMIN_USER` Name of the Nextcloud admin user. - `NEXTCLOUD_ADMIN_PASSWORD` Password for the Nextcloud admin user. -If you want you can set the data directory and table prefix, otherwise default values will be used. +If you want, you can set the data directory, otherwise default value will be used. -- `NEXTCLOUD_DATA_DIR` (default: */var/www/html/data*) Configures the data directory where nextcloud stores all files from the users. -- `NEXTCLOUD_TABLE_PREFIX` (default: *""*) Optional prefix for the tables. Used to be `oc_` in the past +- `NEXTCLOUD_DATA_DIR` (default: `/var/www/html/data`) Configures the data directory where nextcloud stores all files from the users. -One or more trusted domains can be set by environment variable, too. They will be added to the configuration after install. +One or more trusted domains can be set through environment variable, too. They will be added to the configuration after install. - `NEXTCLOUD_TRUSTED_DOMAINS` (not set by default) Optional space-separated list of domains The install and update script is only triggered when a default command is used (`apache-foreground` or `php-fpm`). If you use a custom command you have to enable the install / update with -- `NEXTCLOUD_UPDATE` (default: *0*) +- `NEXTCLOUD_UPDATE` (default: `0`) -If you want to use Redis you have to create a separate [Redis](https://hub.docker.com/_/redis/) container in your setup / in your docker-compose file. To inform Nextcloud about the Redis container add: +If you want to use Redis you have to create a separate [Redis](https://hub.docker.com/_/redis/) container in your setup / in your docker-compose file. To inform Nextcloud about the Redis container, pass in the following parameters: - `REDIS_HOST` (not set by default) Name of Redis container -- `REDIS_HOST_PORT` (default: *6379*) Optional port for Redis, only use for external Redis servers that run on non-standard ports. +- `REDIS_HOST_PORT` (default: `6379`) Optional port for Redis, only use for external Redis servers that run on non-standard ports. +- `REDIS_HOST_PASSWORD` (not set by default) Redis password The use of Redis is recommended to prevent file locking problems. See the examples for further instructions. -To use a external SMTP server you have to provide the connection details. To configure Nextcloud to use SMTP add: +To use an external SMTP server, you have to provide the connection details. To configure Nextcloud to use SMTP add: -- `SMTP_HOST` (not set by default) hostname of the SMTP server -- `SMTP_SECURE` (empty by default) set to 'ssl' to use SSL on the connection. -- `SMTP_PORT` (default: *465* for SSL and *25* for non-secure connection) Optional port for SMTP connection. -- `SMTP_AUTHTYPE` (default: *LOGIN*) The method used for authentication. -- `SMTP_NAME` (empty by default) Username for the authentication. -- `SMTP_PASSWORD` (empty by default) Password for the authentication. -- `MAIL_FROM_ADDRESS` (not set by default) Use this address for the 'from' field in the mail envelopes sent by Nextcloud. -- `MAIL_DOMAIN` (not set by default) Set a different domain for the emails than the domain where Nextcloud is installed. +- `SMTP_HOST` (not set by default): The hostname of the SMTP server. +- `SMTP_SECURE` (empty by default): Set to `ssl` to use SSL, or `tls` to use STARTTLS. +- `SMTP_PORT` (default: `465` for SSL and `25` for non-secure connections): Optional port for the SMTP connection. Use `587` for an alternative port for STARTTLS. +- `SMTP_AUTHTYPE` (default: `LOGIN`): The method used for authentication. Use `PLAIN` if no authentication is required. +- `SMTP_NAME` (empty by default): The username for the authentication. +- `SMTP_PASSWORD` (empty by default): The password for the authentication. +- `MAIL_FROM_ADDRESS` (not set by default): Use this address for the 'from' field in the emails sent by Nextcloud. +- `MAIL_DOMAIN` (not set by default): Set a different domain for the emails than the domain where Nextcloud is installed. Check the [Nextcloud documentation](https://docs.nextcloud.com/server/latest/admin_manual/configuration_server/email_configuration.html) for other values to configure SMTP. +To use an external S3 compatible object store as primary storage, set the following variables: + +- `OBJECTSTORE_S3_HOST`: The hostname of the object storage server +- `OBJECTSTORE_S3_BUCKET`: The name of the bucket that Nextcloud should store the data in +- `OBJECTSTORE_S3_KEY`: AWS style access key +- `OBJECTSTORE_S3_SECRET`: AWS style secret access key +- `OBJECTSTORE_S3_PORT`: The port that the object storage server is being served over +- `OBJECTSTORE_S3_SSL` (default: `true`): Whether or not SSL/TLS should be used to communicate with object storage server +- `OBJECTSTORE_S3_REGION`: The region that the S3 bucket resides in. +- `OBJECTSTORE_S3_USEPATH_STYLE` (default: `false`): Not required for AWS S3 +- `OBJECTSTORE_S3_LEGACYAUTH` (default: `false`): Not required for AWS S3 +- `OBJECTSTORE_S3_OBJECT_PREFIX` (default: `urn:oid:`): Prefix to prepend to the fileid +- `OBJECTSTORE_S3_AUTOCREATE` (default: `true`): Create the container if it does not exist + +Check the [Nextcloud documentation](https://docs.nextcloud.com/server/latest/admin_manual/configuration_files/primary_storage.html#simple-storage-service-s3) for more information. + +To use an external OpenStack Swift object store as primary storage, set the following variables: + +- `OBJECTSTORE_SWIFT_URL`: The Swift identity (Keystone) endpoint +- `OBJECTSTORE_SWIFT_AUTOCREATE` (default: `false`): Whether or not Nextcloud should automatically create the Swift container +- `OBJECTSTORE_SWIFT_USER_NAME`: Swift username +- `OBJECTSTORE_SWIFT_USER_PASSWORD`: Swift user password +- `OBJECTSTORE_SWIFT_USER_DOMAIN` (default: `Default`): Swift user domain +- `OBJECTSTORE_SWIFT_PROJECT_NAME`: OpenStack project name +- `OBJECTSTORE_SWIFT_PROJECT_DOMAIN` (default: `Default`): OpenStack project domain +- `OBJECTSTORE_SWIFT_SERVICE_NAME` (default: `swift`): Swift service name +- `OBJECTSTORE_SWIFT_REGION`: Swift endpoint region +- `OBJECTSTORE_SWIFT_CONTAINER_NAME`: Swift container (bucket) that Nextcloud should store the data in + +Check the [Nextcloud documentation](https://docs.nextcloud.com/server/latest/admin_manual/configuration_files/primary_storage.html#openstack-swift) for more information. + +To customize other PHP limits you can simply change the following variables: + +- `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. +- `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. Check the [Nextcloud documentation](https://docs.nextcloud.com/server/latest/admin_manual/configuration_files/big_file_upload_configuration.html) for more information. + ## Using the apache image behind a reverse proxy and auto configure server host and protocol -The apache image will replace the remote addr (ip address visible to Nextcloud) with the ip address from `X-Real-IP` if the request is coming from a proxy in 10.0.0.0/8, 172.16.0.0/12 or 192.168.0.0/16 by default. If you want Nextcloud to pick up the server host (`HTTP_X_FORWARDED_HOST`), protocol (`HTTP_X_FORWARDED_PROTO`) and client ip (`HTTP_X_FORWARDED_FOR`) from a trusted proxy disable rewrite ip and the reverse proxies ip address to `TRUSTED_PROXIES`. +The apache image will replace the remote addr (IP address visible to Nextcloud) with the IP address from `X-Real-IP` if the request is coming from a proxy in `10.0.0.0/8`, `172.16.0.0/12` or `192.168.0.0/16` by default. If you want Nextcloud to pick up the server host (`HTTP_X_FORWARDED_HOST`), protocol (`HTTP_X_FORWARDED_PROTO`) and client IP (`HTTP_X_FORWARDED_FOR`) from a trusted proxy, then disable rewrite IP and add the reverse proxy's IP address to `TRUSTED_PROXIES`. -- `APACHE_DISABLE_REWRITE_IP` (not set by default): Set to 1 to disable rewrite ip. +- `APACHE_DISABLE_REWRITE_IP` (not set by default): Set to 1 to disable rewrite IP. - `TRUSTED_PROXIES` (empty by default): A space-separated list of trusted proxies. CIDR notation is supported for IPv4. If the `TRUSTED_PROXIES` approach does not work for you, try using fixed values for overwrite parameters. - `OVERWRITEHOST` (empty by default): Set the hostname of the proxy. Can also specify a port. - `OVERWRITEPROTOCOL` (empty by default): Set the protocol of the proxy, http or https. +- `OVERWRITECLIURL` (empty by default): Set the cli url of the proxy (e.g. https://mydnsname.example.com) - `OVERWRITEWEBROOT` (empty by default): Set the absolute path of the proxy. - `OVERWRITECONDADDR` (empty by default): Regex to overwrite the values dependent on the remote address. @@ -239,15 +275,15 @@ Keep in mind that once set, removing these environment variables won't remove th # Running this image with docker-compose -The easiest way to get a fully featured and functional setup is using a `docker-compose` file. There are too many different possibilities to setup your system, so here are only some examples what you have to look for. +The easiest way to get a fully featured and functional setup is using a `docker-compose` file. There are too many different possibilities to setup your system, so here are only some examples of what you have to look for. -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 to have your server reachable from the internet adding HTTPS-encryption is mandatory! See below for more information. +At first, make sure you have chosen the right base image (fpm or apache) and added features you wanted (see below). In every case, you would want to add a database container and docker volumes to get easy access to your persistent data. When you want to have your server reachable from the internet, adding HTTPS-encryption is mandatory! See below for more information. ## Base version - apache 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. -Make sure to set the variables `MYSQL_ROOT_PASSWORD` and `MYSQL_PASSWORD` before you run this setup. +Make sure to pass in values for `MYSQL_ROOT_PASSWORD` and `MYSQL_PASSWORD` variables before you run this setup. ```yaml version: '2' @@ -258,9 +294,9 @@ volumes: services: db: - image: mariadb - command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW + image: mariadb:10.5 restart: always + command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW volumes: - db:/var/lib/mysql environment: @@ -271,24 +307,29 @@ services: app: image: nextcloud + restart: always ports: - 8080:80 links: - db volumes: - nextcloud:/var/www/html - restart: always + environment: + - MYSQL_PASSWORD= + - MYSQL_DATABASE=nextcloud + - MYSQL_USER=nextcloud + - MYSQL_HOST=db ``` Then run `docker-compose up -d`, now you can access Nextcloud at http://localhost:8080/ from your host system. ## Base version - FPM -When using the FPM image you need another container that acts as web server on port 80 and proxies the requests to the Nextcloud container. In this example a simple nginx container is combined with the Nextcloud-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 Nextcloud installation. It gets access to all the volumes mounted to Nextcloud via the `volumes_from` option.The configuration for nginx is stored in the configuration file `nginx.conf`, that is mounted into the container. An example can be found in the examples section [here](https://github.com/nextcloud/docker/tree/master/.examples). +When using the FPM image, you need another container that acts as web server on port 80 and proxies the requests to the Nextcloud container. In this example a simple nginx container is combined with the Nextcloud-fpm image and a MariaDB database container. The data is stored in docker volumes. The nginx container also needs access to static files from your Nextcloud installation. It gets access to all the volumes mounted to Nextcloud via the `volumes_from` option.The configuration for nginx is stored in the configuration file `nginx.conf`, that is mounted into the container. An example can be found in the examples section [here](https://github.com/nextcloud/docker/tree/master/.examples). -As this setup does **not include encryption** it should to be run behind a proxy. +As this setup does **not include encryption**, it should be run behind a proxy. -Make sure to set the variables `MYSQL_ROOT_PASSWORD` and `MYSQL_PASSWORD` before you run this setup. +Make sure to pass in values for `MYSQL_ROOT_PASSWORD` and `MYSQL_PASSWORD` variables before you run this setup. ```yaml version: '2' @@ -299,9 +340,9 @@ volumes: services: db: - image: mariadb - command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW + image: mariadb:10.5 restart: always + command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW volumes: - db:/var/lib/mysql environment: @@ -312,14 +353,20 @@ services: app: image: nextcloud:fpm + restart: always links: - db volumes: - nextcloud:/var/www/html - restart: always + environment: + - MYSQL_PASSWORD= + - MYSQL_DATABASE=nextcloud + - MYSQL_USER=nextcloud + - MYSQL_HOST=db web: image: nginx + restart: always ports: - 8080:80 links: @@ -328,14 +375,13 @@ services: - ./nginx.conf:/etc/nginx/nginx.conf:ro volumes_from: - app - restart: always ``` Then run `docker-compose up -d`, now you can access Nextcloud at http://localhost:8080/ from your host system. # Docker Secrets -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/ files. For example: +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/` files. For example: ```yaml version: '3.2' @@ -384,34 +430,36 @@ volumes: secrets: nextcloud_admin_password: - file: ./nextcloud_admin_password.txt # put admin password to this file + file: ./nextcloud_admin_password.txt # put admin password in this file nextcloud_admin_user: - file: ./nextcloud_admin_user.txt # put admin username to this file + file: ./nextcloud_admin_user.txt # put admin username in this file postgres_db: - file: ./postgres_db.txt # put postgresql db name to this file + file: ./postgres_db.txt # put postgresql db name in this file postgres_password: - file: ./postgres_password.txt # put postgresql password to this file + file: ./postgres_password.txt # put postgresql password in this file postgres_user: - file: ./postgres_user.txt # put postgresql username to this file + file: ./postgres_user.txt # put postgresql username in this file ``` -Currently, this is only supported for `NEXTCLOUD_ADMIN_PASSWORD`, `NEXTCLOUD_ADMIN_USER`, `MYSQL_DB`, `MYSQL_PASSWORD`, `MYSQL_USER`, `POSTGRES_DB`, `POSTGRES_PASSWORD`, `POSTGRES_USER`. +Currently, this is only supported for `NEXTCLOUD_ADMIN_PASSWORD`, `NEXTCLOUD_ADMIN_USER`, `MYSQL_DATABASE`, `MYSQL_PASSWORD`, `MYSQL_USER`, `POSTGRES_DB`, `POSTGRES_PASSWORD`, `POSTGRES_USER`, `REDIS_HOST_PASSWORD` and `SMTP_PASSWORD`. + +If you set any group of values (i.e. all of `MYSQL_DATABASE_FILE`, `MYSQL_USER_FILE`, `MYSQL_PASSWORD_FILE`, `MYSQL_HOST`), the script will not use the corresponding group of environment variables (`MYSQL_DATABASE`, `MYSQL_USER`, `MYSQL_PASSWORD`, `MYSQL_HOST`). # Make your Nextcloud available from the internet -Until here your Nextcloud is just available from you docker host. If you want you Nextcloud available from the internet adding SSL encryption is mandatory. +Until here, your Nextcloud is just available from your docker host. If you want your Nextcloud available from the internet adding SSL encryption is mandatory. ## HTTPS - SSL encryption There are many different possibilities to introduce encryption depending on your setup. -We recommend using a reverse proxy in front of our Nextcloud installation. Your Nextcloud will only be reachable through the proxy, which encrypts all traffic to the clients. You can mount your manually generated certificates to the proxy or use a fully automated solution, which generates and renews the certificates for you. +We recommend using a reverse proxy in front of your Nextcloud installation. Your Nextcloud will only be reachable through the proxy, which encrypts all traffic to the clients. You can mount your manually generated certificates to the proxy or use a fully automated solution which generates and renews the certificates for you. In our [examples](https://github.com/nextcloud/docker/tree/master/.examples) section we have an example for a fully automated setup using a reverse proxy, a container for [Let's Encrypt](https://letsencrypt.org/) certificate handling, database and Nextcloud. It uses the popular [nginx-proxy](https://github.com/jwilder/nginx-proxy) and [docker-letsencrypt-nginx-proxy-companion](https://github.com/JrCs/docker-letsencrypt-nginx-proxy-companion) containers. Please check the according documentations before using this setup. # First use -When you first access your Nextcloud, the setup wizard will appear and ask you to choose an administrator account, password and the database connection. For the database use `db` as host and `nextcloud` as table and user name. Also enter the password you chose in your `docker-compose.yml` file. +When you first access your Nextcloud, the setup wizard will appear and ask you to choose an administrator account username, password and the database connection. For the database use `db` as host and `nextcloud` as table and user name. Also enter the password you chose in your `docker-compose.yml` file. # Update to a newer version @@ -441,32 +489,31 @@ $ docker-compose up -d A lot of people want to use additional functionality inside their Nextcloud installation. If the image does not include the packages you need, you can easily build your own image on top of it. Start your derived image with the `FROM` statement and add whatever you like. -```yaml +```dockerfile FROM nextcloud:apache RUN ... - ``` The [examples folder](https://github.com/nextcloud/docker/blob/master/.examples) gives a few examples on how to add certain functionalities, like including the cron job, smb-support or imap-authentication. -If you use your own Dockerfile you need to configure your docker-compose file accordingly. Switch out the `image` option with `build`. You have to specify the path to your Dockerfile. (in the example it's in the same directory next to the docker-compose file) +If you use your own Dockerfile, you need to configure your docker-compose file accordingly. Switch out the `image` option with `build`. You have to specify the path to your Dockerfile. (in the example it's in the same directory next to the docker-compose file) ```yaml app: build: . + restart: always links: - db volumes: - data:/var/www/html/data - config:/var/www/html/config - apps:/var/www/html/apps - restart: always ``` -If you intend to use another command to run the image. Make sure that you set `NEXTCLOUD_UPDATE=1` in your Dockerfile. Otherwise the installation and update will not work. +If you intend to use another command to run the image, make sure that you set `NEXTCLOUD_UPDATE=1` in your Dockerfile. Otherwise the installation and update will not work. -```yaml +```dockerfile FROM nextcloud:apache ... @@ -497,11 +544,22 @@ The `--pull` option tells docker to look for new versions of the base image. The You're already using Nextcloud and want to switch to docker? Great! Here are some things to look out for: 1. Define your whole Nextcloud infrastructure in a `docker-compose` file and run it with `docker-compose up -d` to get the base installation, volumes and database. Work from there. + 2. Restore your database from a mysqldump (nextcloud\_db\_1 is the name of your db container) + - To import from a MySQL dump use the following commands + ```console docker cp ./database.dmp nextcloud_db_1:/dmp - docker-compose exec db sh -c "mysql -u USER -pPASSWORD nextcloud < /dmp" + docker-compose exec db sh -c "mysql --user USER --password PASSWORD nextcloud < /dmp" + docker-compose exec db rm /dmp + ``` + + - To import from a PostgreSQL dump use to following commands + + ```console + docker cp ./database.dmp nextcloud_db_1:/dmp + docker-compose exec db sh -c "psql -U USER --set ON_ERROR_STOP=on nextcloud < /dmp" docker-compose exec db rm /dmp ``` @@ -509,23 +567,48 @@ You're already using Nextcloud and want to switch to docker? Great! Here are som 1. Set database connection + - In case of MySQL database + ```php 'dbhost' => 'db:3306', ``` + - In case of PostgreSQL database + + ```php + 'dbhost' => 'db:5432', + ``` + 2. Make sure you have no configuration for the `apps_paths`. Delete lines like these ```php - "apps_paths" => array ( + 'apps_paths' => array ( + 0 => array ( + 'path' => OC::$SERVERROOT.'/apps', + 'url' => '/apps', + 'writable' => true, + ), + ), + ``` + + 3. Make sure to have the `apps` directory non writable and the `custom_apps` directory writable + + ```php + 'apps_paths' => array ( 0 => array ( - "path" => OC::$SERVERROOT."/apps", - "url" => "/apps", - "writable" => true, + 'path' => '/var/www/html/apps', + 'url' => '/apps', + 'writable' => false, + ), + 1 => array ( + 'path' => '/var/www/html/custom_apps', + 'url' => '/custom_apps', + 'writable' => true, ), ), ``` - 3. Make sure your data directory is set to /var/www/html/data + 4. Make sure your data directory is set to /var/www/html/data ```php 'datadirectory' => '/var/www/html/data', @@ -534,18 +617,24 @@ You're already using Nextcloud and want to switch to docker? Great! Here are som 4. Copy your data (nextcloud_app_1 is the name of your Nextcloud container): ```console - docker cp ./data/ nextcloud_app_1:/var/www/html/data + docker cp ./data/ nextcloud_app_1:/var/www/html/ docker-compose exec app chown -R www-data:www-data /var/www/html/data - docker cp ./theming/ nextcloud_app_1:/var/www/html/theming + docker cp ./theming/ nextcloud_app_1:/var/www/html/ docker-compose exec app chown -R www-data:www-data /var/www/html/theming docker cp ./config/config.php nextcloud_app_1:/var/www/html/config docker-compose exec app chown -R www-data:www-data /var/www/html/config ``` + If you want to preserve the metadata of your files like timestamps, copy the data directly on the host to the named volume using plain `cp` like this: + + ```console + cp --preserve --recursive ./data/ /path/to/nextcloudVolume/data + ``` + 5. Copy only the custom apps you use (or simply redownload them from the web interface): ```console - docker cp ./apps/ nextcloud_data:/var/www/html/custom_apps + docker cp ./custom_apps/ nextcloud_data:/var/www/html/ docker-compose exec app chown -R www-data:www-data /var/www/html/custom_apps ``` @@ -563,9 +652,9 @@ This is the defacto image. If you are unsure about what your needs are, you prob ## `nextcloud:-alpine` -This image is based on the popular [Alpine Linux project](http://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. +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. -This variant is highly recommended when final image size being as small as possible is desired. The main caveat to note is that it does use [musl libc](http://www.musl-libc.org) instead of [glibc and friends](http://www.etalabs.net/compare_libcs.html), so certain software might run into issues depending on the depth of their libc requirements. However, most software doesn't have an issue with this, so this variant is usually a very safe choice. 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. +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. 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). diff --git a/nextcloud/content.md b/nextcloud/content.md index a8475e02c135..a2dbab047b16 100644 --- a/nextcloud/content.md +++ b/nextcloud/content.md @@ -26,23 +26,23 @@ Now you can access Nextcloud at http://localhost:8080/ from your host system. ## Using the fpm image -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 Nextcloud 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 ...` or a `docker-compose` file). In both cases you don't want to map the fpm port to you host. +To use the fpm image, you need an additional web server, such as [nginx](https://docs.nextcloud.com/server/latest/admin_manual/installation/nginx.html), 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 Nextcloud 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 ...` or a `docker-compose` file). In both cases you don't want to map the fpm port to your host. ```console $ docker run -d %%IMAGE%%:fpm ``` -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. +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](#running-this-image-with-docker-compose). ## Using an external database -By default this container uses SQLite for data storage, but the Nextcloud setup wizard (appears on first run) allows connecting to an existing MySQL/MariaDB or PostgreSQL database. You can also link a database container, e. g. `--link my-mysql:mysql`, and then use `mysql` as the database host on setup. More info is in the docker-compose section. +By default, this container uses SQLite for data storage but the Nextcloud setup wizard (appears on first run) allows connecting to an existing MySQL/MariaDB or PostgreSQL database. You can also link a database container, e. g. `--link my-mysql:mysql`, and then use `mysql` as the database host on setup. More info is in the docker-compose section. ## Persistent data -The Nextcloud installation and all data beyond what lives in the database (file uploads, etc) is stored in the [unnamed docker volume](https://docs.docker.com/engine/tutorials/dockervolumes/#adding-a-data-volume) 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. +The Nextcloud installation and all data beyond what lives in the database (file uploads, etc.) are stored in the [unnamed docker volume](https://docs.docker.com/engine/tutorials/dockervolumes/#adding-a-data-volume) 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. -A named Docker volume or a mounted host directory should be used for upgrades and backups. To achieve this you need one volume for your database container and one for Nextcloud. +A named Docker volume or a mounted host directory should be used for upgrades and backups. To achieve this, you need one volume for your database container and one for Nextcloud. Nextcloud: @@ -62,10 +62,10 @@ Database: ```console $ docker run -d \ -v db:/var/lib/mysql \ - mariadb + mariadb:10.5 ``` -If you want to get fine grained access to your individual files, you can mount additional volumes for data, config, your theme and custom apps. The `data`, `config` are stored in respective subfolders inside `/var/www/html/`. The apps are split into core `apps` (which are shipped with Nextcloud and you don't need to take care of) and a `custom_apps` folder. If you use a custom theme it would go into the `themes` subfolder. +If you want to get fine grained access to your individual files, you can mount additional volumes for data, config, your theme and custom apps. The `data`, `config` files are stored in respective subfolders inside `/var/www/html/`. The apps are split into core `apps` (which are shipped with Nextcloud and you don't need to take care of) and a `custom_apps` folder. If you use a custom theme it would go into the `themes` subfolder. Overview of the folders that can be mounted as volumes: @@ -73,9 +73,9 @@ Overview of the folders that can be mounted as volumes: - `/var/www/html/custom_apps` installed / modified apps - `/var/www/html/config` local configuration - `/var/www/html/data` the actual data of your Nextcloud -- `/var/www/html/themes/` theming/branding +- `/var/www/html/themes/` theming/branding -If you want to use named volumes for all of these it would look like this +If you want to use named volumes for all of these, it would look like this: ```console $ docker run -d \ @@ -103,7 +103,7 @@ $ docker-compose exec --user www-data app php occ ## Auto configuration via environment variables -The %%IMAGE%% image supports auto configuration via environment variables. You can preconfigure everything that is asked on the install page on first run. To enable auto configuration, set your database connection via the following environment variables. ONLY use one database type! +The Nextcloud image supports auto configuration via environment variables. You can preconfigure everything that is asked on the install page on first run. To enable auto configuration, set your database connection via the following environment variables. You must specify all of the environment variables for a given database or the database environment variables defaults to SQLITE. ONLY use one database type! **SQLite**: @@ -123,55 +123,94 @@ The %%IMAGE%% image supports auto configuration via environment variables. You c - `POSTGRES_PASSWORD` Password for the database user using postgres. - `POSTGRES_HOST` Hostname of the database server using postgres. -If you set any values, they will not be asked in the install page on first run. With a complete configuration by using all variables for your database type, you can additionally configure your Nextcloud instance by setting admin user and password (only works if you set both): +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. See [Docker secrets](#docker=secrets) section below. + +If you set any group of values (i.e. all of `MYSQL_DATABASE`, `MYSQL_USER`, `MYSQL_PASSWORD`, `MYSQL_HOST`), they will not be asked in the install page on first run. With a complete configuration by using all variables for your database type, you can additionally configure your Nextcloud instance by setting admin user and password (only works if you set both): - `NEXTCLOUD_ADMIN_USER` Name of the Nextcloud admin user. - `NEXTCLOUD_ADMIN_PASSWORD` Password for the Nextcloud admin user. -If you want you can set the data directory and table prefix, otherwise default values will be used. +If you want, you can set the data directory, otherwise default value will be used. -- `NEXTCLOUD_DATA_DIR` (default: */var/www/html/data*) Configures the data directory where nextcloud stores all files from the users. -- `NEXTCLOUD_TABLE_PREFIX` (default: *""*) Optional prefix for the tables. Used to be `oc_` in the past +- `NEXTCLOUD_DATA_DIR` (default: `/var/www/html/data`) Configures the data directory where nextcloud stores all files from the users. -One or more trusted domains can be set by environment variable, too. They will be added to the configuration after install. +One or more trusted domains can be set through environment variable, too. They will be added to the configuration after install. - `NEXTCLOUD_TRUSTED_DOMAINS` (not set by default) Optional space-separated list of domains The install and update script is only triggered when a default command is used (`apache-foreground` or `php-fpm`). If you use a custom command you have to enable the install / update with -- `NEXTCLOUD_UPDATE` (default: *0*) +- `NEXTCLOUD_UPDATE` (default: `0`) -If you want to use Redis you have to create a separate [Redis](https://hub.docker.com/_/redis/) container in your setup / in your docker-compose file. To inform Nextcloud about the Redis container add: +If you want to use Redis you have to create a separate [Redis](https://hub.docker.com/_/redis/) container in your setup / in your docker-compose file. To inform Nextcloud about the Redis container, pass in the following parameters: - `REDIS_HOST` (not set by default) Name of Redis container -- `REDIS_HOST_PORT` (default: *6379*) Optional port for Redis, only use for external Redis servers that run on non-standard ports. +- `REDIS_HOST_PORT` (default: `6379`) Optional port for Redis, only use for external Redis servers that run on non-standard ports. +- `REDIS_HOST_PASSWORD` (not set by default) Redis password The use of Redis is recommended to prevent file locking problems. See the examples for further instructions. -To use a external SMTP server you have to provide the connection details. To configure Nextcloud to use SMTP add: +To use an external SMTP server, you have to provide the connection details. To configure Nextcloud to use SMTP add: -- `SMTP_HOST` (not set by default) hostname of the SMTP server -- `SMTP_SECURE` (empty by default) set to 'ssl' to use SSL on the connection. -- `SMTP_PORT` (default: *465* for SSL and *25* for non-secure connection) Optional port for SMTP connection. -- `SMTP_AUTHTYPE` (default: *LOGIN*) The method used for authentication. -- `SMTP_NAME` (empty by default) Username for the authentication. -- `SMTP_PASSWORD` (empty by default) Password for the authentication. -- `MAIL_FROM_ADDRESS` (not set by default) Use this address for the 'from' field in the mail envelopes sent by Nextcloud. -- `MAIL_DOMAIN` (not set by default) Set a different domain for the emails than the domain where Nextcloud is installed. +- `SMTP_HOST` (not set by default): The hostname of the SMTP server. +- `SMTP_SECURE` (empty by default): Set to `ssl` to use SSL, or `tls` to use STARTTLS. +- `SMTP_PORT` (default: `465` for SSL and `25` for non-secure connections): Optional port for the SMTP connection. Use `587` for an alternative port for STARTTLS. +- `SMTP_AUTHTYPE` (default: `LOGIN`): The method used for authentication. Use `PLAIN` if no authentication is required. +- `SMTP_NAME` (empty by default): The username for the authentication. +- `SMTP_PASSWORD` (empty by default): The password for the authentication. +- `MAIL_FROM_ADDRESS` (not set by default): Use this address for the 'from' field in the emails sent by Nextcloud. +- `MAIL_DOMAIN` (not set by default): Set a different domain for the emails than the domain where Nextcloud is installed. Check the [Nextcloud documentation](https://docs.nextcloud.com/server/latest/admin_manual/configuration_server/email_configuration.html) for other values to configure SMTP. +To use an external S3 compatible object store as primary storage, set the following variables: + +- `OBJECTSTORE_S3_HOST`: The hostname of the object storage server +- `OBJECTSTORE_S3_BUCKET`: The name of the bucket that Nextcloud should store the data in +- `OBJECTSTORE_S3_KEY`: AWS style access key +- `OBJECTSTORE_S3_SECRET`: AWS style secret access key +- `OBJECTSTORE_S3_PORT`: The port that the object storage server is being served over +- `OBJECTSTORE_S3_SSL` (default: `true`): Whether or not SSL/TLS should be used to communicate with object storage server +- `OBJECTSTORE_S3_REGION`: The region that the S3 bucket resides in. +- `OBJECTSTORE_S3_USEPATH_STYLE` (default: `false`): Not required for AWS S3 +- `OBJECTSTORE_S3_LEGACYAUTH` (default: `false`): Not required for AWS S3 +- `OBJECTSTORE_S3_OBJECT_PREFIX` (default: `urn:oid:`): Prefix to prepend to the fileid +- `OBJECTSTORE_S3_AUTOCREATE` (default: `true`): Create the container if it does not exist + +Check the [Nextcloud documentation](https://docs.nextcloud.com/server/latest/admin_manual/configuration_files/primary_storage.html#simple-storage-service-s3) for more information. + +To use an external OpenStack Swift object store as primary storage, set the following variables: + +- `OBJECTSTORE_SWIFT_URL`: The Swift identity (Keystone) endpoint +- `OBJECTSTORE_SWIFT_AUTOCREATE` (default: `false`): Whether or not Nextcloud should automatically create the Swift container +- `OBJECTSTORE_SWIFT_USER_NAME`: Swift username +- `OBJECTSTORE_SWIFT_USER_PASSWORD`: Swift user password +- `OBJECTSTORE_SWIFT_USER_DOMAIN` (default: `Default`): Swift user domain +- `OBJECTSTORE_SWIFT_PROJECT_NAME`: OpenStack project name +- `OBJECTSTORE_SWIFT_PROJECT_DOMAIN` (default: `Default`): OpenStack project domain +- `OBJECTSTORE_SWIFT_SERVICE_NAME` (default: `swift`): Swift service name +- `OBJECTSTORE_SWIFT_REGION`: Swift endpoint region +- `OBJECTSTORE_SWIFT_CONTAINER_NAME`: Swift container (bucket) that Nextcloud should store the data in + +Check the [Nextcloud documentation](https://docs.nextcloud.com/server/latest/admin_manual/configuration_files/primary_storage.html#openstack-swift) for more information. + +To customize other PHP limits you can simply change the following variables: + +- `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. +- `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. Check the [Nextcloud documentation](https://docs.nextcloud.com/server/latest/admin_manual/configuration_files/big_file_upload_configuration.html) for more information. + ## Using the apache image behind a reverse proxy and auto configure server host and protocol -The apache image will replace the remote addr (ip address visible to Nextcloud) with the ip address from `X-Real-IP` if the request is coming from a proxy in 10.0.0.0/8, 172.16.0.0/12 or 192.168.0.0/16 by default. If you want Nextcloud to pick up the server host (`HTTP_X_FORWARDED_HOST`), protocol (`HTTP_X_FORWARDED_PROTO`) and client ip (`HTTP_X_FORWARDED_FOR`) from a trusted proxy disable rewrite ip and the reverse proxies ip address to `TRUSTED_PROXIES`. +The apache image will replace the remote addr (IP address visible to Nextcloud) with the IP address from `X-Real-IP` if the request is coming from a proxy in `10.0.0.0/8`, `172.16.0.0/12` or `192.168.0.0/16` by default. If you want Nextcloud to pick up the server host (`HTTP_X_FORWARDED_HOST`), protocol (`HTTP_X_FORWARDED_PROTO`) and client IP (`HTTP_X_FORWARDED_FOR`) from a trusted proxy, then disable rewrite IP and add the reverse proxy's IP address to `TRUSTED_PROXIES`. -- `APACHE_DISABLE_REWRITE_IP` (not set by default): Set to 1 to disable rewrite ip. +- `APACHE_DISABLE_REWRITE_IP` (not set by default): Set to 1 to disable rewrite IP. - `TRUSTED_PROXIES` (empty by default): A space-separated list of trusted proxies. CIDR notation is supported for IPv4. If the `TRUSTED_PROXIES` approach does not work for you, try using fixed values for overwrite parameters. - `OVERWRITEHOST` (empty by default): Set the hostname of the proxy. Can also specify a port. - `OVERWRITEPROTOCOL` (empty by default): Set the protocol of the proxy, http or https. +- `OVERWRITECLIURL` (empty by default): Set the cli url of the proxy (e.g. https://mydnsname.example.com) - `OVERWRITEWEBROOT` (empty by default): Set the absolute path of the proxy. - `OVERWRITECONDADDR` (empty by default): Regex to overwrite the values dependent on the remote address. @@ -181,15 +220,15 @@ Keep in mind that once set, removing these environment variables won't remove th # Running this image with docker-compose -The easiest way to get a fully featured and functional setup is using a `docker-compose` file. There are too many different possibilities to setup your system, so here are only some examples what you have to look for. +The easiest way to get a fully featured and functional setup is using a `docker-compose` file. There are too many different possibilities to setup your system, so here are only some examples of what you have to look for. -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 to have your server reachable from the internet adding HTTPS-encryption is mandatory! See below for more information. +At first, make sure you have chosen the right base image (fpm or apache) and added features you wanted (see below). In every case, you would want to add a database container and docker volumes to get easy access to your persistent data. When you want to have your server reachable from the internet, adding HTTPS-encryption is mandatory! See below for more information. ## Base version - apache 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. -Make sure to set the variables `MYSQL_ROOT_PASSWORD` and `MYSQL_PASSWORD` before you run this setup. +Make sure to pass in values for `MYSQL_ROOT_PASSWORD` and `MYSQL_PASSWORD` variables before you run this setup. ```yaml version: '2' @@ -200,9 +239,9 @@ volumes: services: db: - image: mariadb - command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW + image: mariadb:10.5 restart: always + command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW volumes: - db:/var/lib/mysql environment: @@ -213,24 +252,29 @@ services: app: image: %%IMAGE%% + restart: always ports: - 8080:80 links: - db volumes: - nextcloud:/var/www/html - restart: always + environment: + - MYSQL_PASSWORD= + - MYSQL_DATABASE=nextcloud + - MYSQL_USER=nextcloud + - MYSQL_HOST=db ``` Then run `docker-compose up -d`, now you can access Nextcloud at http://localhost:8080/ from your host system. ## Base version - FPM -When using the FPM image you need another container that acts as web server on port 80 and proxies the requests to the Nextcloud container. In this example a simple nginx container is combined with the Nextcloud-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 Nextcloud installation. It gets access to all the volumes mounted to Nextcloud via the `volumes_from` option.The configuration for nginx is stored in the configuration file `nginx.conf`, that is mounted into the container. An example can be found in the examples section [here](https://github.com/nextcloud/docker/tree/master/.examples). +When using the FPM image, you need another container that acts as web server on port 80 and proxies the requests to the Nextcloud container. In this example a simple nginx container is combined with the Nextcloud-fpm image and a MariaDB database container. The data is stored in docker volumes. The nginx container also needs access to static files from your Nextcloud installation. It gets access to all the volumes mounted to Nextcloud via the `volumes_from` option.The configuration for nginx is stored in the configuration file `nginx.conf`, that is mounted into the container. An example can be found in the examples section [here](https://github.com/nextcloud/docker/tree/master/.examples). -As this setup does **not include encryption** it should to be run behind a proxy. +As this setup does **not include encryption**, it should be run behind a proxy. -Make sure to set the variables `MYSQL_ROOT_PASSWORD` and `MYSQL_PASSWORD` before you run this setup. +Make sure to pass in values for `MYSQL_ROOT_PASSWORD` and `MYSQL_PASSWORD` variables before you run this setup. ```yaml version: '2' @@ -241,9 +285,9 @@ volumes: services: db: - image: mariadb - command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW + image: mariadb:10.5 restart: always + command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW volumes: - db:/var/lib/mysql environment: @@ -254,14 +298,20 @@ services: app: image: %%IMAGE%%:fpm + restart: always links: - db volumes: - nextcloud:/var/www/html - restart: always + environment: + - MYSQL_PASSWORD= + - MYSQL_DATABASE=nextcloud + - MYSQL_USER=nextcloud + - MYSQL_HOST=db web: image: nginx + restart: always ports: - 8080:80 links: @@ -270,14 +320,13 @@ services: - ./nginx.conf:/etc/nginx/nginx.conf:ro volumes_from: - app - restart: always ``` Then run `docker-compose up -d`, now you can access Nextcloud at http://localhost:8080/ from your host system. # Docker Secrets -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/ files. For example: +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/` files. For example: ```yaml version: '3.2' @@ -326,34 +375,36 @@ volumes: secrets: nextcloud_admin_password: - file: ./nextcloud_admin_password.txt # put admin password to this file + file: ./nextcloud_admin_password.txt # put admin password in this file nextcloud_admin_user: - file: ./nextcloud_admin_user.txt # put admin username to this file + file: ./nextcloud_admin_user.txt # put admin username in this file postgres_db: - file: ./postgres_db.txt # put postgresql db name to this file + file: ./postgres_db.txt # put postgresql db name in this file postgres_password: - file: ./postgres_password.txt # put postgresql password to this file + file: ./postgres_password.txt # put postgresql password in this file postgres_user: - file: ./postgres_user.txt # put postgresql username to this file + file: ./postgres_user.txt # put postgresql username in this file ``` -Currently, this is only supported for `NEXTCLOUD_ADMIN_PASSWORD`, `NEXTCLOUD_ADMIN_USER`, `MYSQL_DB`, `MYSQL_PASSWORD`, `MYSQL_USER`, `POSTGRES_DB`, `POSTGRES_PASSWORD`, `POSTGRES_USER`. +Currently, this is only supported for `NEXTCLOUD_ADMIN_PASSWORD`, `NEXTCLOUD_ADMIN_USER`, `MYSQL_DATABASE`, `MYSQL_PASSWORD`, `MYSQL_USER`, `POSTGRES_DB`, `POSTGRES_PASSWORD`, `POSTGRES_USER`, `REDIS_HOST_PASSWORD` and `SMTP_PASSWORD`. + +If you set any group of values (i.e. all of `MYSQL_DATABASE_FILE`, `MYSQL_USER_FILE`, `MYSQL_PASSWORD_FILE`, `MYSQL_HOST`), the script will not use the corresponding group of environment variables (`MYSQL_DATABASE`, `MYSQL_USER`, `MYSQL_PASSWORD`, `MYSQL_HOST`). # Make your Nextcloud available from the internet -Until here your Nextcloud is just available from you docker host. If you want you Nextcloud available from the internet adding SSL encryption is mandatory. +Until here, your Nextcloud is just available from your docker host. If you want your Nextcloud available from the internet adding SSL encryption is mandatory. ## HTTPS - SSL encryption There are many different possibilities to introduce encryption depending on your setup. -We recommend using a reverse proxy in front of our Nextcloud installation. Your Nextcloud will only be reachable through the proxy, which encrypts all traffic to the clients. You can mount your manually generated certificates to the proxy or use a fully automated solution, which generates and renews the certificates for you. +We recommend using a reverse proxy in front of your Nextcloud installation. Your Nextcloud will only be reachable through the proxy, which encrypts all traffic to the clients. You can mount your manually generated certificates to the proxy or use a fully automated solution which generates and renews the certificates for you. In our [examples](https://github.com/nextcloud/docker/tree/master/.examples) section we have an example for a fully automated setup using a reverse proxy, a container for [Let's Encrypt](https://letsencrypt.org/) certificate handling, database and Nextcloud. It uses the popular [nginx-proxy](https://github.com/jwilder/nginx-proxy) and [docker-letsencrypt-nginx-proxy-companion](https://github.com/JrCs/docker-letsencrypt-nginx-proxy-companion) containers. Please check the according documentations before using this setup. # First use -When you first access your Nextcloud, the setup wizard will appear and ask you to choose an administrator account, password and the database connection. For the database use `db` as host and `nextcloud` as table and user name. Also enter the password you chose in your `docker-compose.yml` file. +When you first access your Nextcloud, the setup wizard will appear and ask you to choose an administrator account username, password and the database connection. For the database use `db` as host and `nextcloud` as table and user name. Also enter the password you chose in your `docker-compose.yml` file. # Update to a newer version @@ -383,33 +434,32 @@ $ docker-compose up -d A lot of people want to use additional functionality inside their Nextcloud installation. If the image does not include the packages you need, you can easily build your own image on top of it. Start your derived image with the `FROM` statement and add whatever you like. -```yaml +```dockerfile FROM %%IMAGE%%:apache RUN ... - ``` The [examples folder](https://github.com/nextcloud/docker/blob/master/.examples) gives a few examples on how to add certain functionalities, like including the cron job, smb-support or imap-authentication. -If you use your own Dockerfile you need to configure your docker-compose file accordingly. Switch out the `image` option with `build`. You have to specify the path to your Dockerfile. (in the example it's in the same directory next to the docker-compose file) +If you use your own Dockerfile, you need to configure your docker-compose file accordingly. Switch out the `image` option with `build`. You have to specify the path to your Dockerfile. (in the example it's in the same directory next to the docker-compose file) ```yaml app: build: . + restart: always links: - db volumes: - data:/var/www/html/data - config:/var/www/html/config - apps:/var/www/html/apps - restart: always ``` -If you intend to use another command to run the image. Make sure that you set `NEXTCLOUD_UPDATE=1` in your Dockerfile. Otherwise the installation and update will not work. +If you intend to use another command to run the image, make sure that you set `NEXTCLOUD_UPDATE=1` in your Dockerfile. Otherwise the installation and update will not work. -```yaml -FROM nextcloud:apache +```dockerfile +FROM %%IMAGE%%:apache ... @@ -439,11 +489,22 @@ The `--pull` option tells docker to look for new versions of the base image. The You're already using Nextcloud and want to switch to docker? Great! Here are some things to look out for: 1. Define your whole Nextcloud infrastructure in a `docker-compose` file and run it with `docker-compose up -d` to get the base installation, volumes and database. Work from there. + 2. Restore your database from a mysqldump (nextcloud\_db\_1 is the name of your db container) + - To import from a MySQL dump use the following commands + ```console docker cp ./database.dmp nextcloud_db_1:/dmp - docker-compose exec db sh -c "mysql -u USER -pPASSWORD nextcloud < /dmp" + docker-compose exec db sh -c "mysql --user USER --password PASSWORD nextcloud < /dmp" + docker-compose exec db rm /dmp + ``` + + - To import from a PostgreSQL dump use to following commands + + ```console + docker cp ./database.dmp nextcloud_db_1:/dmp + docker-compose exec db sh -c "psql -U USER --set ON_ERROR_STOP=on nextcloud < /dmp" docker-compose exec db rm /dmp ``` @@ -451,23 +512,48 @@ You're already using Nextcloud and want to switch to docker? Great! Here are som 1. Set database connection + - In case of MySQL database + ```php 'dbhost' => 'db:3306', ``` + - In case of PostgreSQL database + + ```php + 'dbhost' => 'db:5432', + ``` + 2. Make sure you have no configuration for the `apps_paths`. Delete lines like these ```php - "apps_paths" => array ( + 'apps_paths' => array ( + 0 => array ( + 'path' => OC::$SERVERROOT.'/apps', + 'url' => '/apps', + 'writable' => true, + ), + ), + ``` + + 3. Make sure to have the `apps` directory non writable and the `custom_apps` directory writable + + ```php + 'apps_paths' => array ( 0 => array ( - "path" => OC::$SERVERROOT."/apps", - "url" => "/apps", - "writable" => true, + 'path' => '/var/www/html/apps', + 'url' => '/apps', + 'writable' => false, + ), + 1 => array ( + 'path' => '/var/www/html/custom_apps', + 'url' => '/custom_apps', + 'writable' => true, ), ), ``` - 3. Make sure your data directory is set to /var/www/html/data + 4. Make sure your data directory is set to /var/www/html/data ```php 'datadirectory' => '/var/www/html/data', @@ -476,18 +562,24 @@ You're already using Nextcloud and want to switch to docker? Great! Here are som 4. Copy your data (nextcloud_app_1 is the name of your Nextcloud container): ```console - docker cp ./data/ nextcloud_app_1:/var/www/html/data + docker cp ./data/ nextcloud_app_1:/var/www/html/ docker-compose exec app chown -R www-data:www-data /var/www/html/data - docker cp ./theming/ nextcloud_app_1:/var/www/html/theming + docker cp ./theming/ nextcloud_app_1:/var/www/html/ docker-compose exec app chown -R www-data:www-data /var/www/html/theming docker cp ./config/config.php nextcloud_app_1:/var/www/html/config docker-compose exec app chown -R www-data:www-data /var/www/html/config ``` + If you want to preserve the metadata of your files like timestamps, copy the data directly on the host to the named volume using plain `cp` like this: + + ```console + cp --preserve --recursive ./data/ /path/to/nextcloudVolume/data + ``` + 5. Copy only the custom apps you use (or simply redownload them from the web interface): ```console - docker cp ./apps/ nextcloud_data:/var/www/html/custom_apps + docker cp ./custom_apps/ nextcloud_data:/var/www/html/ docker-compose exec app chown -R www-data:www-data /var/www/html/custom_apps ``` diff --git a/nginx/README.md b/nginx/README.md index 473b311db076..95cdd9c79cbd 100644 --- a/nginx/README.md +++ b/nginx/README.md @@ -20,18 +20,19 @@ WARNING: [the NGINX Docker Maintainers](https://github.com/nginxinc/docker-nginx) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`1.17.10`, `mainline`, `1`, `1.17`, `latest`](https://github.com/nginxinc/docker-nginx/blob/594ce7a8bc26c85af88495ac94d5cd0096b306f7/mainline/buster/Dockerfile) -- [`1.17.10-perl`, `mainline-perl`, `1-perl`, `1.17-perl`, `perl`](https://github.com/nginxinc/docker-nginx/blob/594ce7a8bc26c85af88495ac94d5cd0096b306f7/mainline/buster-perl/Dockerfile) -- [`1.17.10-alpine`, `mainline-alpine`, `1-alpine`, `1.17-alpine`, `alpine`](https://github.com/nginxinc/docker-nginx/blob/594ce7a8bc26c85af88495ac94d5cd0096b306f7/mainline/alpine/Dockerfile) -- [`1.17.10-alpine-perl`, `mainline-alpine-perl`, `1-alpine-perl`, `1.17-alpine-perl`, `alpine-perl`](https://github.com/nginxinc/docker-nginx/blob/594ce7a8bc26c85af88495ac94d5cd0096b306f7/mainline/alpine-perl/Dockerfile) -- [`1.18.0`, `stable`, `1.18`](https://github.com/nginxinc/docker-nginx/blob/70e44865208627c5ada57242b46920205603c096/stable/buster/Dockerfile) -- [`1.18.0-perl`, `stable-perl`, `1.18-perl`](https://github.com/nginxinc/docker-nginx/blob/70e44865208627c5ada57242b46920205603c096/stable/buster-perl/Dockerfile) -- [`1.18.0-alpine`, `stable-alpine`, `1.18-alpine`](https://github.com/nginxinc/docker-nginx/blob/70e44865208627c5ada57242b46920205603c096/stable/alpine/Dockerfile) -- [`1.18.0-alpine-perl`, `stable-alpine-perl`, `1.18-alpine-perl`](https://github.com/nginxinc/docker-nginx/blob/70e44865208627c5ada57242b46920205603c096/stable/alpine-perl/Dockerfile) +- [`1.23.3`, `mainline`, `1`, `1.23`, `latest`](https://github.com/nginxinc/docker-nginx/blob/5ce65c3efd395ee2d82d32670f233140e92dba99/mainline/debian/Dockerfile) +- [`1.23.3-perl`, `mainline-perl`, `1-perl`, `1.23-perl`, `perl`](https://github.com/nginxinc/docker-nginx/blob/5ce65c3efd395ee2d82d32670f233140e92dba99/mainline/debian-perl/Dockerfile) +- [`1.23.3-alpine`, `mainline-alpine`, `1-alpine`, `1.23-alpine`, `alpine`](https://github.com/nginxinc/docker-nginx/blob/5ce65c3efd395ee2d82d32670f233140e92dba99/mainline/alpine/Dockerfile) +- [`1.23.3-alpine-perl`, `mainline-alpine-perl`, `1-alpine-perl`, `1.23-alpine-perl`, `alpine-perl`](https://github.com/nginxinc/docker-nginx/blob/5ce65c3efd395ee2d82d32670f233140e92dba99/mainline/alpine-perl/Dockerfile) +- [`1.23.3-alpine-slim`, `mainline-alpine-slim`, `1-alpine-slim`, `1.23-alpine-slim`, `alpine-slim`](https://github.com/nginxinc/docker-nginx/blob/5ce65c3efd395ee2d82d32670f233140e92dba99/mainline/alpine-slim/Dockerfile) +- [`1.22.1`, `stable`, `1.22`](https://github.com/nginxinc/docker-nginx/blob/fef51235521d1cdf8b05d8cb1378a526d2abf421/stable/debian/Dockerfile) +- [`1.22.1-perl`, `stable-perl`, `1.22-perl`](https://github.com/nginxinc/docker-nginx/blob/fef51235521d1cdf8b05d8cb1378a526d2abf421/stable/debian-perl/Dockerfile) +- [`1.22.1-alpine`, `stable-alpine`, `1.22-alpine`](https://github.com/nginxinc/docker-nginx/blob/fef51235521d1cdf8b05d8cb1378a526d2abf421/stable/alpine/Dockerfile) +- [`1.22.1-alpine-perl`, `stable-alpine-perl`, `1.22-alpine-perl`](https://github.com/nginxinc/docker-nginx/blob/fef51235521d1cdf8b05d8cb1378a526d2abf421/stable/alpine-perl/Dockerfile) # Quick reference (cont.) @@ -39,14 +40,14 @@ WARNING: [https://github.com/nginxinc/docker-nginx/issues](https://github.com/nginxinc/docker-nginx/issues) - **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) - [`amd64`](https://hub.docker.com/r/amd64/nginx/), [`arm32v6`](https://hub.docker.com/r/arm32v6/nginx/), [`arm32v7`](https://hub.docker.com/r/arm32v7/nginx/), [`arm64v8`](https://hub.docker.com/r/arm64v8/nginx/), [`i386`](https://hub.docker.com/r/i386/nginx/), [`ppc64le`](https://hub.docker.com/r/ppc64le/nginx/), [`s390x`](https://hub.docker.com/r/s390x/nginx/) + [`amd64`](https://hub.docker.com/r/amd64/nginx/), [`arm32v5`](https://hub.docker.com/r/arm32v5/nginx/), [`arm32v6`](https://hub.docker.com/r/arm32v6/nginx/), [`arm32v7`](https://hub.docker.com/r/arm32v7/nginx/), [`arm64v8`](https://hub.docker.com/r/arm64v8/nginx/), [`i386`](https://hub.docker.com/r/i386/nginx/), [`mips64le`](https://hub.docker.com/r/mips64le/nginx/), [`ppc64le`](https://hub.docker.com/r/ppc64le/nginx/), [`s390x`](https://hub.docker.com/r/s390x/nginx/) - **Published image artifact details**: [repo-info repo's `repos/nginx/` directory](https://github.com/docker-library/repo-info/blob/master/repos/nginx) ([history](https://github.com/docker-library/repo-info/commits/master/repos/nginx)) (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/nginx`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fnginx) + [official-images repo's `library/nginx` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fnginx) [official-images repo's `library/nginx` file](https://github.com/docker-library/official-images/blob/master/library/nginx) ([history](https://github.com/docker-library/official-images/commits/master/library/nginx)) - **Source of this description**: @@ -120,9 +121,9 @@ Then build the image with `docker build -t custom-nginx .` and run it as follows $ docker run --name my-custom-nginx-container -d custom-nginx ``` -### Using environment variables in nginx configuration +### Using environment variables in nginx configuration (new in 1.19) -Out-of-the-box, nginx doesn't support environment variables inside most configuration blocks. But `envsubst` may be used as a workaround if you need to generate your nginx configuration dynamically before nginx starts. +Out-of-the-box, nginx doesn't support environment variables inside most configuration blocks. But this image has a function, which will extract environment variables before nginx starts. Here is an example using docker-compose.yml: @@ -130,23 +131,41 @@ Here is an example using docker-compose.yml: web: image: nginx volumes: - - ./mysite.template:/etc/nginx/conf.d/mysite.template + - ./templates:/etc/nginx/templates ports: - "8080:80" environment: - NGINX_HOST=foobar.com - NGINX_PORT=80 - command: /bin/bash -c "envsubst < /etc/nginx/conf.d/mysite.template > /etc/nginx/conf.d/default.conf && exec nginx -g 'daemon off;'" ``` -The `mysite.template` file may then contain variable references like this: +By default, this function reads template files in `/etc/nginx/templates/*.template` and outputs the result of executing `envsubst` to `/etc/nginx/conf.d`. -`listen ${NGINX_PORT}; -` +So if you place `templates/default.conf.template` file, which contains variable references like this: + + listen ${NGINX_PORT}; + +outputs to `/etc/nginx/conf.d/default.conf` like this: + + listen 80; + +This behavior can be changed via the following environment variables: + +- `NGINX_ENVSUBST_TEMPLATE_DIR` + - A directory which contains template files (default: `/etc/nginx/templates`) + - When this directory doesn't exist, this function will do nothing about template processing. +- `NGINX_ENVSUBST_TEMPLATE_SUFFIX` + - A suffix of template files (default: `.template`) + - This function only processes the files whose name ends with this suffix. +- `NGINX_ENVSUBST_OUTPUT_DIR` + - A directory where the result of executing envsubst is output (default: `/etc/nginx/conf.d`) + - The output filename is the template filename with the suffix removed. + - ex.) `/etc/nginx/templates/default.conf.template` will be output with the filename `/etc/nginx/conf.d/default.conf`. + - This directory must be writable by the user running a container. ## Running nginx in read-only mode -To run nginx in read-only mode, you will need to mount a Docker volume to every location where nginx writes information. The default nginx configuration requires write access to `/var/cache` and `/var/run`. This can be easily accomplished by running nginx as follows: +To run nginx in read-only mode, you will need to mount a Docker volume to every location where nginx writes information. The default nginx configuration requires write access to `/var/cache/nginx` and `/var/run`. This can be easily accomplished by running nginx as follows: ```console $ docker run -d -p 80:80 --read-only -v $(pwd)/nginx-cache:/var/cache/nginx -v $(pwd)/nginx-pid:/var/run nginx @@ -172,6 +191,14 @@ web: command: [nginx-debug, '-g', 'daemon off;'] ``` +## Entrypoint quiet logs + +Since version 1.19.0, a verbose entrypoint was added. It provides information on what's happening during container startup. You can silence this output by setting environment variable `NGINX_ENTRYPOINT_QUIET_LOGS`: + +```console +$ docker run -d -e NGINX_ENTRYPOINT_QUIET_LOGS=1 nginx +``` + ## User and group id Since 1.17.0, both alpine- and debian-based images variants use the same user and group ids to drop the privileges for worker processes: @@ -208,15 +235,7 @@ http { } ``` -## Monitoring nginx with Amplify - -[Amplify](https://amplify.nginx.com/signup/) is a free monitoring tool that can be used to monitor microservice architectures based on nginx. Amplify is developed and maintained by the company behind the nginx software. - -With Amplify it is possible to collect and aggregate metrics across containers, and present a coherent set of visualizations of the key performance data, such as active connections or requests per second. It is also easy to quickly check for any performance degradations, traffic anomalies, and get a deeper insight into the nginx configuration in general. - -In order to use Amplify, a small Python-based agent software (Amplify Agent) should be [installed](https://github.com/nginxinc/docker-nginx-amplify) inside the container. - -For more information about Amplify, please check the official documentation [here](https://github.com/nginxinc/nginx-amplify-doc). +Alternatively, check out the official [Docker NGINX unprivileged image](https://hub.docker.com/r/nginxinc/nginx-unprivileged). # Image Variants @@ -226,14 +245,22 @@ The `nginx` images come in many flavors, each designed for a specific use case. 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. +## `nginx:-perl` / `nginx:-alpine-perl` + +Starting with nginx:1.13.0 / mainline and nginx:1.12.0 / stable, the perl module has been removed from the default images. A separate `-perl` tag variant is available if you wish to use the perl module. + ## `nginx:-alpine` -This image is based on the popular [Alpine Linux project](http://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. +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. -This variant is highly recommended when final image size being as small as possible is desired. The main caveat to note is that it does use [musl libc](http://www.musl-libc.org) instead of [glibc and friends](http://www.etalabs.net/compare_libcs.html), so certain software might run into issues depending on the depth of their libc requirements. However, most software doesn't have an issue with this, so this variant is usually a very safe choice. 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. +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. 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). +## `nginx:-slim` + +This image does not contain the common packages contained in the default tag and only contains the minimal packages needed to run `nginx`. Unless you are working in an environment where *only* the `nginx` image will be deployed and you have space constraints, we highly recommend using the default image of this repository. + # License View [license information](http://nginx.org/LICENSE) for the software contained in this image. diff --git a/nginx/content.md b/nginx/content.md index 8d8a26003eeb..802adcf100d9 100644 --- a/nginx/content.md +++ b/nginx/content.md @@ -66,9 +66,9 @@ Then build the image with `docker build -t custom-nginx .` and run it as follows $ docker run --name my-custom-nginx-container -d custom-nginx ``` -### Using environment variables in %%IMAGE%% configuration +### Using environment variables in %%IMAGE%% configuration (new in 1.19) -Out-of-the-box, %%IMAGE%% doesn't support environment variables inside most configuration blocks. But `envsubst` may be used as a workaround if you need to generate your %%IMAGE%% configuration dynamically before %%IMAGE%% starts. +Out-of-the-box, %%IMAGE%% doesn't support environment variables inside most configuration blocks. But this image has a function, which will extract environment variables before %%IMAGE%% starts. Here is an example using docker-compose.yml: @@ -76,23 +76,41 @@ Here is an example using docker-compose.yml: web: image: %%IMAGE%% volumes: - - ./mysite.template:/etc/nginx/conf.d/mysite.template + - ./templates:/etc/nginx/templates ports: - "8080:80" environment: - NGINX_HOST=foobar.com - NGINX_PORT=80 - command: /bin/bash -c "envsubst < /etc/nginx/conf.d/mysite.template > /etc/nginx/conf.d/default.conf && exec nginx -g 'daemon off;'" ``` -The `mysite.template` file may then contain variable references like this: +By default, this function reads template files in `/etc/nginx/templates/*.template` and outputs the result of executing `envsubst` to `/etc/nginx/conf.d`. -`listen ${NGINX_PORT}; -` +So if you place `templates/default.conf.template` file, which contains variable references like this: + + listen ${NGINX_PORT}; + +outputs to `/etc/nginx/conf.d/default.conf` like this: + + listen 80; + +This behavior can be changed via the following environment variables: + +- `NGINX_ENVSUBST_TEMPLATE_DIR` + - A directory which contains template files (default: `/etc/nginx/templates`) + - When this directory doesn't exist, this function will do nothing about template processing. +- `NGINX_ENVSUBST_TEMPLATE_SUFFIX` + - A suffix of template files (default: `.template`) + - This function only processes the files whose name ends with this suffix. +- `NGINX_ENVSUBST_OUTPUT_DIR` + - A directory where the result of executing envsubst is output (default: `/etc/nginx/conf.d`) + - The output filename is the template filename with the suffix removed. + - ex.) `/etc/nginx/templates/default.conf.template` will be output with the filename `/etc/nginx/conf.d/default.conf`. + - This directory must be writable by the user running a container. ## Running %%IMAGE%% in read-only mode -To run %%IMAGE%% in read-only mode, you will need to mount a Docker volume to every location where %%IMAGE%% writes information. The default %%IMAGE%% configuration requires write access to `/var/cache` and `/var/run`. This can be easily accomplished by running %%IMAGE%% as follows: +To run %%IMAGE%% in read-only mode, you will need to mount a Docker volume to every location where %%IMAGE%% writes information. The default %%IMAGE%% configuration requires write access to `/var/cache/nginx` and `/var/run`. This can be easily accomplished by running %%IMAGE%% as follows: ```console $ docker run -d -p 80:80 --read-only -v $(pwd)/nginx-cache:/var/cache/nginx -v $(pwd)/nginx-pid:/var/run nginx @@ -118,6 +136,14 @@ web: command: [nginx-debug, '-g', 'daemon off;'] ``` +## Entrypoint quiet logs + +Since version 1.19.0, a verbose entrypoint was added. It provides information on what's happening during container startup. You can silence this output by setting environment variable `NGINX_ENTRYPOINT_QUIET_LOGS`: + +```console +$ docker run -d -e NGINX_ENTRYPOINT_QUIET_LOGS=1 %%IMAGE%% +``` + ## User and group id Since 1.17.0, both alpine- and debian-based images variants use the same user and group ids to drop the privileges for worker processes: @@ -154,12 +180,4 @@ http { } ``` -## Monitoring nginx with Amplify - -[Amplify](https://amplify.nginx.com/signup/) is a free monitoring tool that can be used to monitor microservice architectures based on nginx. Amplify is developed and maintained by the company behind the nginx software. - -With Amplify it is possible to collect and aggregate metrics across containers, and present a coherent set of visualizations of the key performance data, such as active connections or requests per second. It is also easy to quickly check for any performance degradations, traffic anomalies, and get a deeper insight into the nginx configuration in general. - -In order to use Amplify, a small Python-based agent software (Amplify Agent) should be [installed](https://github.com/nginxinc/docker-nginx-amplify) inside the container. - -For more information about Amplify, please check the official documentation [here](https://github.com/nginxinc/nginx-amplify-doc). +Alternatively, check out the official [Docker NGINX unprivileged image](https://hub.docker.com/r/nginxinc/nginx-unprivileged). diff --git a/nginx/variant-perl.md b/nginx/variant-perl.md new file mode 100644 index 000000000000..2cf02570f455 --- /dev/null +++ b/nginx/variant-perl.md @@ -0,0 +1,3 @@ +## `%%IMAGE%%:-perl` / `%%IMAGE%%:-alpine-perl` + +Starting with %%IMAGE%%:1.13.0 / mainline and %%IMAGE%%:1.12.0 / stable, the perl module has been removed from the default images. A separate `-perl` tag variant is available if you wish to use the perl module. diff --git a/node/README.md b/node/README.md index 0477fb39f79e..57565d8f4bbf 100644 --- a/node/README.md +++ b/node/README.md @@ -20,38 +20,34 @@ WARNING: [The Node.js Docker Team](https://github.com/nodejs/docker-node) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`14.2.0-stretch`, `14.2-stretch`, `14-stretch`, `stretch`, `current-stretch`, `14.2.0`, `14.2`, `14`, `latest`, `current`](https://github.com/nodejs/docker-node/blob/910f8b1c0bdeee7bd464f0875297954bb86de9da/14/stretch/Dockerfile) -- [`14.2.0-stretch-slim`, `14.2-stretch-slim`, `14-stretch-slim`, `stretch-slim`, `current-stretch-slim`, `14.2.0-slim`, `14.2-slim`, `14-slim`, `slim`, `current-slim`](https://github.com/nodejs/docker-node/blob/910f8b1c0bdeee7bd464f0875297954bb86de9da/14/stretch-slim/Dockerfile) -- [`14.2.0-buster`, `14.2-buster`, `14-buster`, `buster`, `current-buster`](https://github.com/nodejs/docker-node/blob/910f8b1c0bdeee7bd464f0875297954bb86de9da/14/buster/Dockerfile) -- [`14.2.0-buster-slim`, `14.2-buster-slim`, `14-buster-slim`, `buster-slim`, `current-buster-slim`](https://github.com/nodejs/docker-node/blob/910f8b1c0bdeee7bd464f0875297954bb86de9da/14/buster-slim/Dockerfile) -- [`14.2.0-alpine3.10`, `14.2-alpine3.10`, `14-alpine3.10`, `alpine3.10`, `current-alpine3.10`](https://github.com/nodejs/docker-node/blob/910f8b1c0bdeee7bd464f0875297954bb86de9da/14/alpine3.10/Dockerfile) -- [`14.2.0-alpine3.11`, `14.2-alpine3.11`, `14-alpine3.11`, `alpine3.11`, `current-alpine3.11`, `14.2.0-alpine`, `14.2-alpine`, `14-alpine`, `alpine`, `current-alpine`](https://github.com/nodejs/docker-node/blob/910f8b1c0bdeee7bd464f0875297954bb86de9da/14/alpine3.11/Dockerfile) -- [`13.14.0-stretch`, `13.14-stretch`, `13-stretch`, `13.14.0`, `13.14`, `13`](https://github.com/nodejs/docker-node/blob/bf9fb2d1126062e27d0b763674064bb17da4718c/13/stretch/Dockerfile) -- [`13.14.0-stretch-slim`, `13.14-stretch-slim`, `13-stretch-slim`, `13.14.0-slim`, `13.14-slim`, `13-slim`](https://github.com/nodejs/docker-node/blob/bf9fb2d1126062e27d0b763674064bb17da4718c/13/stretch-slim/Dockerfile) -- [`13.14.0-buster`, `13.14-buster`, `13-buster`](https://github.com/nodejs/docker-node/blob/bf9fb2d1126062e27d0b763674064bb17da4718c/13/buster/Dockerfile) -- [`13.14.0-buster-slim`, `13.14-buster-slim`, `13-buster-slim`](https://github.com/nodejs/docker-node/blob/bf9fb2d1126062e27d0b763674064bb17da4718c/13/buster-slim/Dockerfile) -- [`13.14.0-alpine3.10`, `13.14-alpine3.10`, `13-alpine3.10`](https://github.com/nodejs/docker-node/blob/bf9fb2d1126062e27d0b763674064bb17da4718c/13/alpine3.10/Dockerfile) -- [`13.14.0-alpine3.11`, `13.14-alpine3.11`, `13-alpine3.11`, `13.14.0-alpine`, `13.14-alpine`, `13-alpine`](https://github.com/nodejs/docker-node/blob/bf9fb2d1126062e27d0b763674064bb17da4718c/13/alpine3.11/Dockerfile) -- [`12.16.3-stretch`, `12.16-stretch`, `12-stretch`, `erbium-stretch`, `lts-stretch`, `12.16.3`, `12.16`, `12`, `erbium`, `lts`](https://github.com/nodejs/docker-node/blob/10e2c2254c41237a266192070559734f12d8dae7/12/stretch/Dockerfile) -- [`12.16.3-stretch-slim`, `12.16-stretch-slim`, `12-stretch-slim`, `erbium-stretch-slim`, `lts-stretch-slim`, `12.16.3-slim`, `12.16-slim`, `12-slim`, `erbium-slim`, `lts-slim`](https://github.com/nodejs/docker-node/blob/10e2c2254c41237a266192070559734f12d8dae7/12/stretch-slim/Dockerfile) -- [`12.16.3-buster`, `12.16-buster`, `12-buster`, `erbium-buster`, `lts-buster`](https://github.com/nodejs/docker-node/blob/10e2c2254c41237a266192070559734f12d8dae7/12/buster/Dockerfile) -- [`12.16.3-buster-slim`, `12.16-buster-slim`, `12-buster-slim`, `erbium-buster-slim`, `lts-buster-slim`](https://github.com/nodejs/docker-node/blob/10e2c2254c41237a266192070559734f12d8dae7/12/buster-slim/Dockerfile) -- [`12.16.3-alpine3.9`, `12.16-alpine3.9`, `12-alpine3.9`, `erbium-alpine3.9`, `lts-alpine3.9`](https://github.com/nodejs/docker-node/blob/10e2c2254c41237a266192070559734f12d8dae7/12/alpine3.9/Dockerfile) -- [`12.16.3-alpine3.10`, `12.16-alpine3.10`, `12-alpine3.10`, `erbium-alpine3.10`, `lts-alpine3.10`](https://github.com/nodejs/docker-node/blob/10e2c2254c41237a266192070559734f12d8dae7/12/alpine3.10/Dockerfile) -- [`12.16.3-alpine3.11`, `12.16-alpine3.11`, `12-alpine3.11`, `erbium-alpine3.11`, `lts-alpine3.11`, `12.16.3-alpine`, `12.16-alpine`, `12-alpine`, `erbium-alpine`, `lts-alpine`](https://github.com/nodejs/docker-node/blob/10e2c2254c41237a266192070559734f12d8dae7/12/alpine3.11/Dockerfile) -- [`10.20.1-jessie`, `10.20-jessie`, `10-jessie`, `dubnium-jessie`](https://github.com/nodejs/docker-node/blob/d071b895dd1b8da6c566f45b971825fe5b087b21/10/jessie/Dockerfile) -- [`10.20.1-jessie-slim`, `10.20-jessie-slim`, `10-jessie-slim`, `dubnium-jessie-slim`](https://github.com/nodejs/docker-node/blob/d071b895dd1b8da6c566f45b971825fe5b087b21/10/jessie-slim/Dockerfile) -- [`10.20.1-stretch`, `10.20-stretch`, `10-stretch`, `dubnium-stretch`, `10.20.1`, `10.20`, `10`, `dubnium`](https://github.com/nodejs/docker-node/blob/d071b895dd1b8da6c566f45b971825fe5b087b21/10/stretch/Dockerfile) -- [`10.20.1-stretch-slim`, `10.20-stretch-slim`, `10-stretch-slim`, `dubnium-stretch-slim`, `10.20.1-slim`, `10.20-slim`, `10-slim`, `dubnium-slim`](https://github.com/nodejs/docker-node/blob/d071b895dd1b8da6c566f45b971825fe5b087b21/10/stretch-slim/Dockerfile) -- [`10.20.1-buster`, `10.20-buster`, `10-buster`, `dubnium-buster`](https://github.com/nodejs/docker-node/blob/d071b895dd1b8da6c566f45b971825fe5b087b21/10/buster/Dockerfile) -- [`10.20.1-buster-slim`, `10.20-buster-slim`, `10-buster-slim`, `dubnium-buster-slim`](https://github.com/nodejs/docker-node/blob/d071b895dd1b8da6c566f45b971825fe5b087b21/10/buster-slim/Dockerfile) -- [`10.20.1-alpine3.9`, `10.20-alpine3.9`, `10-alpine3.9`, `dubnium-alpine3.9`](https://github.com/nodejs/docker-node/blob/d071b895dd1b8da6c566f45b971825fe5b087b21/10/alpine3.9/Dockerfile) -- [`10.20.1-alpine3.10`, `10.20-alpine3.10`, `10-alpine3.10`, `dubnium-alpine3.10`](https://github.com/nodejs/docker-node/blob/d071b895dd1b8da6c566f45b971825fe5b087b21/10/alpine3.10/Dockerfile) -- [`10.20.1-alpine3.11`, `10.20-alpine3.11`, `10-alpine3.11`, `dubnium-alpine3.11`, `10.20.1-alpine`, `10.20-alpine`, `10-alpine`, `dubnium-alpine`](https://github.com/nodejs/docker-node/blob/d071b895dd1b8da6c566f45b971825fe5b087b21/10/alpine3.11/Dockerfile) +- [`19-alpine3.16`, `19.4-alpine3.16`, `19.4.0-alpine3.16`, `alpine3.16`, `current-alpine3.16`](https://github.com/nodejs/docker-node/blob/28ad5e0e5d0e80df44d897c9057ffd6419a3c7a5/19/alpine3.16/Dockerfile) +- [`19-alpine`, `19-alpine3.17`, `19.4-alpine`, `19.4-alpine3.17`, `19.4.0-alpine`, `19.4.0-alpine3.17`, `alpine`, `alpine3.17`, `current-alpine`, `current-alpine3.17`](https://github.com/nodejs/docker-node/blob/28ad5e0e5d0e80df44d897c9057ffd6419a3c7a5/19/alpine3.17/Dockerfile) +- [`19`, `19-bullseye`, `19.4`, `19.4-bullseye`, `19.4.0`, `19.4.0-bullseye`, `bullseye`, `current`, `current-bullseye`, `latest`](https://github.com/nodejs/docker-node/blob/28ad5e0e5d0e80df44d897c9057ffd6419a3c7a5/19/bullseye/Dockerfile) +- [`19-bullseye-slim`, `19-slim`, `19.4-bullseye-slim`, `19.4-slim`, `19.4.0-bullseye-slim`, `19.4.0-slim`, `bullseye-slim`, `current-bullseye-slim`, `current-slim`, `slim`](https://github.com/nodejs/docker-node/blob/28ad5e0e5d0e80df44d897c9057ffd6419a3c7a5/19/bullseye-slim/Dockerfile) +- [`19-buster`, `19.4-buster`, `19.4.0-buster`, `buster`, `current-buster`](https://github.com/nodejs/docker-node/blob/28ad5e0e5d0e80df44d897c9057ffd6419a3c7a5/19/buster/Dockerfile) +- [`19-buster-slim`, `19.4-buster-slim`, `19.4.0-buster-slim`, `buster-slim`, `current-buster-slim`](https://github.com/nodejs/docker-node/blob/28ad5e0e5d0e80df44d897c9057ffd6419a3c7a5/19/buster-slim/Dockerfile) +- [`18-alpine3.16`, `18.13-alpine3.16`, `18.13.0-alpine3.16`, `hydrogen-alpine3.16`, `lts-alpine3.16`](https://github.com/nodejs/docker-node/blob/86d8b5dbad62b7c58d2146dafaa7b35086ae2eb8/18/alpine3.16/Dockerfile) +- [`18-alpine`, `18-alpine3.17`, `18.13-alpine`, `18.13-alpine3.17`, `18.13.0-alpine`, `18.13.0-alpine3.17`, `hydrogen-alpine`, `hydrogen-alpine3.17`, `lts-alpine`, `lts-alpine3.17`](https://github.com/nodejs/docker-node/blob/86d8b5dbad62b7c58d2146dafaa7b35086ae2eb8/18/alpine3.17/Dockerfile) +- [`18`, `18-bullseye`, `18.13`, `18.13-bullseye`, `18.13.0`, `18.13.0-bullseye`, `hydrogen`, `hydrogen-bullseye`, `lts`, `lts-bullseye`, `lts-hydrogen`](https://github.com/nodejs/docker-node/blob/86d8b5dbad62b7c58d2146dafaa7b35086ae2eb8/18/bullseye/Dockerfile) +- [`18-bullseye-slim`, `18-slim`, `18.13-bullseye-slim`, `18.13-slim`, `18.13.0-bullseye-slim`, `18.13.0-slim`, `hydrogen-bullseye-slim`, `hydrogen-slim`, `lts-bullseye-slim`, `lts-slim`](https://github.com/nodejs/docker-node/blob/86d8b5dbad62b7c58d2146dafaa7b35086ae2eb8/18/bullseye-slim/Dockerfile) +- [`18-buster`, `18.13-buster`, `18.13.0-buster`, `hydrogen-buster`, `lts-buster`](https://github.com/nodejs/docker-node/blob/86d8b5dbad62b7c58d2146dafaa7b35086ae2eb8/18/buster/Dockerfile) +- [`18-buster-slim`, `18.13-buster-slim`, `18.13.0-buster-slim`, `hydrogen-buster-slim`, `lts-buster-slim`](https://github.com/nodejs/docker-node/blob/86d8b5dbad62b7c58d2146dafaa7b35086ae2eb8/18/buster-slim/Dockerfile) +- [`16-alpine3.16`, `16.19-alpine3.16`, `16.19.0-alpine3.16`, `gallium-alpine3.16`](https://github.com/nodejs/docker-node/blob/2a15356c778b366621aa370a4294c59ac1df9c6a/16/alpine3.16/Dockerfile) +- [`16-alpine`, `16-alpine3.17`, `16.19-alpine`, `16.19-alpine3.17`, `16.19.0-alpine`, `16.19.0-alpine3.17`, `gallium-alpine`, `gallium-alpine3.17`](https://github.com/nodejs/docker-node/blob/2a15356c778b366621aa370a4294c59ac1df9c6a/16/alpine3.17/Dockerfile) +- [`16-bullseye`, `16.19-bullseye`, `16.19.0-bullseye`, `gallium-bullseye`](https://github.com/nodejs/docker-node/blob/3f8018043408490439723ed3b71ab5578d69ea70/16/bullseye/Dockerfile) +- [`16-bullseye-slim`, `16.19-bullseye-slim`, `16.19.0-bullseye-slim`, `gallium-bullseye-slim`](https://github.com/nodejs/docker-node/blob/3f8018043408490439723ed3b71ab5578d69ea70/16/bullseye-slim/Dockerfile) +- [`16`, `16-buster`, `16.19`, `16.19-buster`, `16.19.0`, `16.19.0-buster`, `gallium`, `gallium-buster`](https://github.com/nodejs/docker-node/blob/3f8018043408490439723ed3b71ab5578d69ea70/16/buster/Dockerfile) +- [`16-buster-slim`, `16-slim`, `16.19-buster-slim`, `16.19-slim`, `16.19.0-buster-slim`, `16.19.0-slim`, `gallium-buster-slim`, `gallium-slim`](https://github.com/nodejs/docker-node/blob/3f8018043408490439723ed3b71ab5578d69ea70/16/buster-slim/Dockerfile) +- [`14-alpine3.16`, `14.21-alpine3.16`, `14.21.2-alpine3.16`, `fermium-alpine3.16`](https://github.com/nodejs/docker-node/blob/3f8018043408490439723ed3b71ab5578d69ea70/14/alpine3.16/Dockerfile) +- [`14-alpine`, `14-alpine3.17`, `14.21-alpine`, `14.21-alpine3.17`, `14.21.2-alpine`, `14.21.2-alpine3.17`, `fermium-alpine`, `fermium-alpine3.17`](https://github.com/nodejs/docker-node/blob/3f8018043408490439723ed3b71ab5578d69ea70/14/alpine3.17/Dockerfile) +- [`14-bullseye`, `14.21-bullseye`, `14.21.2-bullseye`, `fermium-bullseye`](https://github.com/nodejs/docker-node/blob/3f8018043408490439723ed3b71ab5578d69ea70/14/bullseye/Dockerfile) +- [`14-bullseye-slim`, `14.21-bullseye-slim`, `14.21.2-bullseye-slim`, `fermium-bullseye-slim`](https://github.com/nodejs/docker-node/blob/3f8018043408490439723ed3b71ab5578d69ea70/14/bullseye-slim/Dockerfile) +- [`14`, `14-buster`, `14.21`, `14.21-buster`, `14.21.2`, `14.21.2-buster`, `fermium`, `fermium-buster`](https://github.com/nodejs/docker-node/blob/3f8018043408490439723ed3b71ab5578d69ea70/14/buster/Dockerfile) +- [`14-buster-slim`, `14-slim`, `14.21-buster-slim`, `14.21-slim`, `14.21.2-buster-slim`, `14.21.2-slim`, `fermium-buster-slim`, `fermium-slim`](https://github.com/nodejs/docker-node/blob/3f8018043408490439723ed3b71ab5578d69ea70/14/buster-slim/Dockerfile) # Quick reference (cont.) @@ -59,14 +55,14 @@ WARNING: [https://github.com/nodejs/docker-node/issues](https://github.com/nodejs/docker-node/issues) - **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) - [`amd64`](https://hub.docker.com/r/amd64/node/), [`arm32v6`](https://hub.docker.com/r/arm32v6/node/), [`arm32v7`](https://hub.docker.com/r/arm32v7/node/), [`arm64v8`](https://hub.docker.com/r/arm64v8/node/), [`i386`](https://hub.docker.com/r/i386/node/), [`ppc64le`](https://hub.docker.com/r/ppc64le/node/), [`s390x`](https://hub.docker.com/r/s390x/node/) + [`amd64`](https://hub.docker.com/r/amd64/node/), [`arm32v6`](https://hub.docker.com/r/arm32v6/node/), [`arm32v7`](https://hub.docker.com/r/arm32v7/node/), [`arm64v8`](https://hub.docker.com/r/arm64v8/node/), [`ppc64le`](https://hub.docker.com/r/ppc64le/node/), [`s390x`](https://hub.docker.com/r/s390x/node/) - **Published image artifact details**: [repo-info repo's `repos/node/` directory](https://github.com/docker-library/repo-info/blob/master/repos/node) ([history](https://github.com/docker-library/repo-info/commits/master/repos/node)) (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/node`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fnode) + [official-images repo's `library/node` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fnode) [official-images repo's `library/node` file](https://github.com/docker-library/official-images/blob/master/library/node) ([history](https://github.com/docker-library/official-images/commits/master/library/node)) - **Source of this description**: @@ -96,22 +92,22 @@ The `node` images come in many flavors, each designed for a specific use case. 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. -Some of these tags may have names like buster, jessie, or stretch 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. +Some of these tags may have names like bullseye or buster 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. 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. -## `node:-slim` - -This image does not contain the common packages contained in the default tag and only contains the minimal packages needed to run `node`. Unless you are working in an environment where *only* the `node` image will be deployed and you have space constraints, we highly recommend using the default image of this repository. - ## `node:-alpine` -This image is based on the popular [Alpine Linux project](http://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. +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. -This variant is highly recommended when final image size being as small as possible is desired. The main caveat to note is that it does use [musl libc](http://www.musl-libc.org) instead of [glibc and friends](http://www.etalabs.net/compare_libcs.html), so certain software might run into issues depending on the depth of their libc requirements. However, most software doesn't have an issue with this, so this variant is usually a very safe choice. 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. +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. 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). +## `node:-slim` + +This image does not contain the common packages contained in the default tag and only contains the minimal packages needed to run `node`. Unless you are working in an environment where *only* the `node` image will be deployed and you have space constraints, we highly recommend using the default image of this repository. + # License View [license information](https://github.com/nodejs/node/blob/master/LICENSE) for Node.js or [license information](https://github.com/nodejs/docker-node/blob/master/LICENSE) for the Node.js Docker project. diff --git a/notary/README.md b/notary/README.md index fb509f482aaa..41b75ac2b245 100644 --- a/notary/README.md +++ b/notary/README.md @@ -20,12 +20,12 @@ WARNING: [Docker, Inc.](https://github.com/docker/notary-official-images) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`server-0.6.1-2`, `server`](https://github.com/docker/notary-official-images/blob/278bbe63ea6bfb67974fe969c77e02049fe47ab7/notary-server/Dockerfile) -- [`signer-0.6.1-2`, `signer`](https://github.com/docker/notary-official-images/blob/278bbe63ea6bfb67974fe969c77e02049fe47ab7/notary-signer/Dockerfile) +- [`server-0.7.0`, `server`](https://github.com/docker/notary-official-images/blob/77b9b7833f8dd6be07104b214193788795a320ff/notary-server/Dockerfile) +- [`signer-0.7.0`, `signer`](https://github.com/docker/notary-official-images/blob/77b9b7833f8dd6be07104b214193788795a320ff/notary-signer/Dockerfile) # Quick reference (cont.) @@ -40,7 +40,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/notary`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fnotary) + [official-images repo's `library/notary` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fnotary) [official-images repo's `library/notary` file](https://github.com/docker-library/official-images/blob/master/library/notary) ([history](https://github.com/docker-library/official-images/commits/master/library/notary)) - **Source of this description**: diff --git a/nuxeo/README-short.txt b/nuxeo/README-short.txt deleted file mode 100644 index 06e488e5bff2..000000000000 --- a/nuxeo/README-short.txt +++ /dev/null @@ -1 +0,0 @@ -Nuxeo is an open source Content Management Platform that is completely customizable. diff --git a/nuxeo/README.md b/nuxeo/README.md deleted file mode 100644 index e1650f344937..000000000000 --- a/nuxeo/README.md +++ /dev/null @@ -1,252 +0,0 @@ - - -# Quick reference - -- **Maintained by**: - [Nuxeo](https://github.com/nuxeo/docker-nuxeo) - -- **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) - -# Supported tags and respective `Dockerfile` links - -- [`7.10`, `7`, `LTS-2015`](https://github.com/nuxeo/docker-nuxeo/blob/f253a2398dbc39b42ca6ff84f2adeda8c1e8287e/7.10/Dockerfile) -- [`8.10`, `8`, `LTS-2016`](https://github.com/nuxeo/docker-nuxeo/blob/f253a2398dbc39b42ca6ff84f2adeda8c1e8287e/8.10/Dockerfile) -- [`9.10`, `9`, `LTS-2017`](https://github.com/nuxeo/docker-nuxeo/blob/f253a2398dbc39b42ca6ff84f2adeda8c1e8287e/9.10/Dockerfile) -- [`10.10`, `10`, `LTS-2019`, `LTS`, `FT`, `latest`](https://github.com/nuxeo/docker-nuxeo/blob/f253a2398dbc39b42ca6ff84f2adeda8c1e8287e/10.10/Dockerfile) - -# Quick reference (cont.) - -- **Where to file issues**: - [https://github.com/nuxeo/docker-nuxeo/issues](https://github.com/nuxeo/docker-nuxeo/issues) - -- **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) - [`amd64`](https://hub.docker.com/r/amd64/nuxeo/) - -- **Published image artifact details**: - [repo-info repo's `repos/nuxeo/` directory](https://github.com/docker-library/repo-info/blob/master/repos/nuxeo) ([history](https://github.com/docker-library/repo-info/commits/master/repos/nuxeo)) - (image metadata, transfer size, etc) - -- **Image updates**: - [official-images PRs with label `library/nuxeo`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fnuxeo) - [official-images repo's `library/nuxeo` file](https://github.com/docker-library/official-images/blob/master/library/nuxeo) ([history](https://github.com/docker-library/official-images/commits/master/library/nuxeo)) - -- **Source of this description**: - [docs repo's `nuxeo/` directory](https://github.com/docker-library/docs/tree/master/nuxeo) ([history](https://github.com/docker-library/docs/commits/master/nuxeo)) - -# What is Nuxeo ? - -The Nuxeo Platform is a highly customizable and extensible content management platform for building business applications. - -![logo](https://raw.githubusercontent.com/docker-library/docs/6538ea62bab8b051d0556c689c113202d48089ed/nuxeo/logo.png) - -# How to use this image - -## Start a bare nuxeo instance - -```console -$ docker run --name mynuxeo -p 8080:8080 -d nuxeo -``` - -This image includes `EXPOSE 8080` (the nuxeo port). The default Nuxeo configuration is applied which feature an embedded database (H2), and an embedded Elasticsearch instance. This setup is not suitable for production. See below to know how to setup a production ready container by specifying environment variables. - -The Nuxeo platform is accesible at http://${DOCKER_HOST}:8080/ and default User and Password are Administrator/Administrator. - -## Start a nuxeo with some additional packages - -```console -$ docker run --name mynuxeo --rm -ti -p 8080:8080 -e NUXEO_PACKAGES="nuxeo-web-ui nuxeo-dam nuxeo-drive nuxeo-showcase-content nuxeo-template-rendering nuxeo-template-rendering-samples nuxeo-spreadsheet" nuxeo -``` - -This will install the same image as above but comes with some demo Nuxeo packages to demonstrate its various usage (DAM, DM, search etc...) - -You can find additional informations on how to use this image in [Nuxeo documentation](https://doc.nuxeo.com/nxdoc/setting-up-your-nuxeo-environment/) - -## Environment Variables - -The Nuxeo image uses several environment variable that allow to specify a more specific setup. - -### `NUXEO_DB_TYPE` - -This defines the database type to use. By default it sets an H2 embedded database that is suitable for test purpose only. When specifying a DB type, other variable mays help : - -- `NUXEO_DB_HOST` : If `NUXEO_DB_TYPE` is defined, this variable is mandatory and has to point to the DB server host. -- `NUXEO_DB_NAME` : name of the database to use (`nuxeo` by default) -- `NUXEO_DB_USER` : user to connect to the database (`nuxeo` by default) -- `NUXEO_DB_PASSWORD` : the password to connect to the database (`nuxeo` by default) - -### `NUXEO_TEMPLATES` - -This variables allows to add additional [Nuxeo configuration templates](https://doc.nuxeo.com/x/0AB9) in the `nuxeo.templates` configuration variable. - -### `NUXEO_ES_HOSTS` - -This variables allows to setup an external Elasticsearch cluster. Use a comma separated list of Elasticsearch hosts with the 9300 port. Additional environment vars may be setup like : - -- `NUXEO_ES_CLUSTER_NAME` : name of the Elasticsearch cluster to join -- `NUXEO_ES_INDEX_NAME`: name of the index (`nuxeo` by default) -- `NUXEO_ES_REPLICAS` : number or replicas (`1` by default). If not 0, it means that your ES cluster must have enough node to fullfill the replicas setup. -- `NUXEO_ES_SHARDS` : number or shards (`5` by default). - -For instance : - - NUXEO_ES_HOSTS=es1:9300,es2:9300 - NUXEO_ES_CLUSTER_NAME=dockerCluster - NUXEO_ES_INDEX_NAME=nuxeo1 - NUXEO_ES_REPLICAS=0 - NUXEO_ES_SHARDS=5 - -### `NUXEO_REDIS_HOST` - -In order to use Redis, just set up this variable to the Redis host address. - -### `NUXEO_REDIS_PORT` - -If Redis is setup, you can ovewrite the default port configuration (default to 6379) - -### `NUXEO_CLID` - -Allow to setup a CLID for Nuxeo Connect registration. This parameter is in the form `part1\npart2`, so depending on the environment you may have to escape the `\` character. - -You can find additional informations the registration process in the [Nuxeo documentation](https://doc.nuxeo.com/nxdoc/setting-up-your-nuxeo-environment/) - -### `NUXEO_INSTALL_HOTFIX` - -This launch the install of latest Hotfixes. (`true` by default, but needs a `NUXEO_CLID` to be setup) - -### `NUXEO_PACKAGES` - -Allows to install [Nuxeo packages](https://doc.nuxeo.com/x/aAfF) at startup. - -### `NUXEO_URL` - -This variable sets the URL where your Nuxeo instance will be joinable. It's used for instance to refer to it when sending server's address in mails. - -### `NUXEO_DATA` - -Location of the Nuxeo data directory. (`/var/lib/nuxeo/data` by default). You will likely customize NUXEO_DATA to map it on docker volume so data like binaries stay persistent. - -### `NUXEO_LOG` - -Location of the Nuxeo log directory. (`/var/log/nuxeo` by default) - -### `NUXEO_AUTOMATION_TRACE` - -If set to "true", this will enable the [automation trace mode](https://doc.nuxeo.com/display/NXDOC/Automation+Tracing). - -### `NUXEO_DEV_MODE` - -If set to "true", this will enable the development mode that will allow [hot reload](https://doc.nuxeo.com/display/CORG/Supporting+Hot+Reload) when developing with [Nuxeo Studio](http://www.nuxeo.com/products/studio/). - -### `NUXEO_BINARY_STORE` - -Tells the location of the binary store which configure the [binary storage](https://doc.nuxeo.com/x/fYYZAQ) - -### `NUXEO_TRANSIENT_STORE` - -Tells the location of [the transient storage](http://doc.nuxeo.com/display/NXDOC/Transient+Store) - -### `NUXEO_DDL_MODE` - -Allows to setup [Database creation option](https://doc.nuxeo.com/x/hwQz#RepositoryConfiguration-DatabaseCreationOption) by fixing the `ddlMode` value. - -### `NUXEO_CUSTOM_PARAM` - -Allows to add custom parameters to `nuxeo.conf`. Multiple parameters can be splitted by a `\n`. For instance: - - NUXEO_CUSTOM_PARAM="repository.clustering.enabled=false\nrepository.clustering.delay=1000" - -# How to extend this image - -## Adding additional configuration - -If you would like to do additional setup in an image derived from this one, you can add a `/docker-entrypoint-initnuxeo.d/nuxeo.conf` file that will be appended to the end of the regular `nuxeo.conf` file. - -```dockerfile -FROM nuxeo:7.10 -COPY nuxeo.conf /docker-entrypoint-initnuxeo.d/nuxeo.conf -``` - -If you need a root account to run some installation steps in your `Dockerfile`, then you need to put those steps between two `USER` command as the image is run with the user `1000` (nuxeo). For instance: - -```dockerfile -FROM nuxeo:LTS -USER root -RUN apt-get update && apt-get install -y --no-install-recommends vim -USER 1000 -``` - -## Launching custom shell scripts - -You can add your own shell scripts in a special `/docker-entrypoint-initnuxeo.d` directory. When ending in `.sh`, they will be run on default entrypoint startup. - -## ffmpeg - -As it contains some non-free Codecs, we dont't ship a binary version of `ffmpeg` as part of this image. However, you can simply add the compilation in a derived images by adding these lines to your Dockerfile. - -```dockerfile -FROM nuxeo:7.10 - -USER root - -RUN echo "deb http://httpredir.debian.org/debian jessie non-free" >> /etc/apt/sources.list -RUN apt-get update && apt-get install -y --no-install-recommends libfaac-dev git - -WORKDIR /tmp -# Build ffmpeg -ENV BUILD_YASM true -ENV LIBFAAC true -RUN git clone https://github.com/nuxeo/ffmpeg-nuxeo.git -WORKDIR ffmpeg-nuxeo -RUN ./prepare-packages.sh \ - && ./build-yasm.sh \ - && ./build-x264.sh \ - && ./build-libvpx.sh \ - && ./build-ffmpeg.sh \ - && cd /tmp \ - && rm -Rf ffmpeg-nuxeo \ - && rm -rf /var/lib/apt/lists/* - -USER 1000 -``` - -## Using Oracle JVM - -For the same reasons as `ffmpeg` we don't ship the Oracle JVM and rely by default on OpenJDK. If you want to use the Hotspot JVM you cans add the following lines in a derived Dockerfile - -```dockerfile -RUN apt-get remove -y --purge openjdk-8-jdk \ - && add-apt-repository -y ppa:webupd8team/java && apt-get update \ - && echo "debconf shared/accepted-oracle-license-v1-1 select true" | debconf-set-selections \ - && echo "debconf shared/accepted-oracle-license-v1-1 seen true" | debconf-set-selections \ - && apt-get install -y oracle-java8-installer \ - && rm -rf /var/lib/apt/lists/* -``` - -## Why is this images so big ? - -This image is big because it contains a lot of features. The nuxeo distribution itself is about 250M and in order to make cool things work like generating thumbnails or converting document to PDF we need some additional tools that are bundled in the image. We hope that in the future we will be able to delegate those conversions to external services that would be bundled as additional docker images. - -# License - -View [license information](http://doc.nuxeo.com/x/gIK7) for the software contained in this image. - -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). - -Some additional license information which was able to be auto-detected might be found in [the `repo-info` repository's `nuxeo/` directory](https://github.com/docker-library/repo-info/tree/master/repos/nuxeo). - -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. diff --git a/nuxeo/content.md b/nuxeo/content.md deleted file mode 100644 index 9fa551b5241d..000000000000 --- a/nuxeo/content.md +++ /dev/null @@ -1,192 +0,0 @@ -# What is Nuxeo ? - -The Nuxeo Platform is a highly customizable and extensible content management platform for building business applications. - -%%LOGO%% - -# How to use this image - -## Start a bare nuxeo instance - -```console -$ docker run --name mynuxeo -p 8080:8080 -d %%IMAGE%% -``` - -This image includes `EXPOSE 8080` (the nuxeo port). The default Nuxeo configuration is applied which feature an embedded database (H2), and an embedded Elasticsearch instance. This setup is not suitable for production. See below to know how to setup a production ready container by specifying environment variables. - -The Nuxeo platform is accesible at http://${DOCKER_HOST}:8080/ and default User and Password are Administrator/Administrator. - -## Start a nuxeo with some additional packages - -```console -$ docker run --name mynuxeo --rm -ti -p 8080:8080 -e NUXEO_PACKAGES="nuxeo-web-ui nuxeo-dam nuxeo-drive nuxeo-showcase-content nuxeo-template-rendering nuxeo-template-rendering-samples nuxeo-spreadsheet" nuxeo -``` - -This will install the same image as above but comes with some demo Nuxeo packages to demonstrate its various usage (DAM, DM, search etc...) - -You can find additional informations on how to use this image in [Nuxeo documentation](https://doc.nuxeo.com/nxdoc/setting-up-your-nuxeo-environment/) - -## Environment Variables - -The Nuxeo image uses several environment variable that allow to specify a more specific setup. - -### `NUXEO_DB_TYPE` - -This defines the database type to use. By default it sets an H2 embedded database that is suitable for test purpose only. When specifying a DB type, other variable mays help : - -- `NUXEO_DB_HOST` : If `NUXEO_DB_TYPE` is defined, this variable is mandatory and has to point to the DB server host. -- `NUXEO_DB_NAME` : name of the database to use (`nuxeo` by default) -- `NUXEO_DB_USER` : user to connect to the database (`nuxeo` by default) -- `NUXEO_DB_PASSWORD` : the password to connect to the database (`nuxeo` by default) - -### `NUXEO_TEMPLATES` - -This variables allows to add additional [Nuxeo configuration templates](https://doc.nuxeo.com/x/0AB9) in the `nuxeo.templates` configuration variable. - -### `NUXEO_ES_HOSTS` - -This variables allows to setup an external Elasticsearch cluster. Use a comma separated list of Elasticsearch hosts with the 9300 port. Additional environment vars may be setup like : - -- `NUXEO_ES_CLUSTER_NAME` : name of the Elasticsearch cluster to join -- `NUXEO_ES_INDEX_NAME`: name of the index (`nuxeo` by default) -- `NUXEO_ES_REPLICAS` : number or replicas (`1` by default). If not 0, it means that your ES cluster must have enough node to fullfill the replicas setup. -- `NUXEO_ES_SHARDS` : number or shards (`5` by default). - -For instance : - - NUXEO_ES_HOSTS=es1:9300,es2:9300 - NUXEO_ES_CLUSTER_NAME=dockerCluster - NUXEO_ES_INDEX_NAME=nuxeo1 - NUXEO_ES_REPLICAS=0 - NUXEO_ES_SHARDS=5 - -### `NUXEO_REDIS_HOST` - -In order to use Redis, just set up this variable to the Redis host address. - -### `NUXEO_REDIS_PORT` - -If Redis is setup, you can ovewrite the default port configuration (default to 6379) - -### `NUXEO_CLID` - -Allow to setup a CLID for Nuxeo Connect registration. This parameter is in the form `part1\npart2`, so depending on the environment you may have to escape the `\` character. - -You can find additional informations the registration process in the [Nuxeo documentation](https://doc.nuxeo.com/nxdoc/setting-up-your-nuxeo-environment/) - -### `NUXEO_INSTALL_HOTFIX` - -This launch the install of latest Hotfixes. (`true` by default, but needs a `NUXEO_CLID` to be setup) - -### `NUXEO_PACKAGES` - -Allows to install [Nuxeo packages](https://doc.nuxeo.com/x/aAfF) at startup. - -### `NUXEO_URL` - -This variable sets the URL where your Nuxeo instance will be joinable. It's used for instance to refer to it when sending server's address in mails. - -### `NUXEO_DATA` - -Location of the Nuxeo data directory. (`/var/lib/nuxeo/data` by default). You will likely customize NUXEO_DATA to map it on docker volume so data like binaries stay persistent. - -### `NUXEO_LOG` - -Location of the Nuxeo log directory. (`/var/log/nuxeo` by default) - -### `NUXEO_AUTOMATION_TRACE` - -If set to "true", this will enable the [automation trace mode](https://doc.nuxeo.com/display/NXDOC/Automation+Tracing). - -### `NUXEO_DEV_MODE` - -If set to "true", this will enable the development mode that will allow [hot reload](https://doc.nuxeo.com/display/CORG/Supporting+Hot+Reload) when developing with [Nuxeo Studio](http://www.nuxeo.com/products/studio/). - -### `NUXEO_BINARY_STORE` - -Tells the location of the binary store which configure the [binary storage](https://doc.nuxeo.com/x/fYYZAQ) - -### `NUXEO_TRANSIENT_STORE` - -Tells the location of [the transient storage](http://doc.nuxeo.com/display/NXDOC/Transient+Store) - -### `NUXEO_DDL_MODE` - -Allows to setup [Database creation option](https://doc.nuxeo.com/x/hwQz#RepositoryConfiguration-DatabaseCreationOption) by fixing the `ddlMode` value. - -### `NUXEO_CUSTOM_PARAM` - -Allows to add custom parameters to `nuxeo.conf`. Multiple parameters can be splitted by a `\n`. For instance: - - NUXEO_CUSTOM_PARAM="repository.clustering.enabled=false\nrepository.clustering.delay=1000" - -# How to extend this image - -## Adding additional configuration - -If you would like to do additional setup in an image derived from this one, you can add a `/docker-entrypoint-initnuxeo.d/nuxeo.conf` file that will be appended to the end of the regular `nuxeo.conf` file. - -```dockerfile -FROM %%IMAGE%%:7.10 -COPY nuxeo.conf /docker-entrypoint-initnuxeo.d/nuxeo.conf -``` - -If you need a root account to run some installation steps in your `Dockerfile`, then you need to put those steps between two `USER` command as the image is run with the user `1000` (nuxeo). For instance: - -```dockerfile -FROM %%IMAGE%%:LTS -USER root -RUN apt-get update && apt-get install -y --no-install-recommends vim -USER 1000 -``` - -## Launching custom shell scripts - -You can add your own shell scripts in a special `/docker-entrypoint-initnuxeo.d` directory. When ending in `.sh`, they will be run on default entrypoint startup. - -## ffmpeg - -As it contains some non-free Codecs, we dont't ship a binary version of `ffmpeg` as part of this image. However, you can simply add the compilation in a derived images by adding these lines to your Dockerfile. - -```dockerfile -FROM %%IMAGE%%:7.10 - -USER root - -RUN echo "deb http://httpredir.debian.org/debian jessie non-free" >> /etc/apt/sources.list -RUN apt-get update && apt-get install -y --no-install-recommends libfaac-dev git - -WORKDIR /tmp -# Build ffmpeg -ENV BUILD_YASM true -ENV LIBFAAC true -RUN git clone https://github.com/nuxeo/ffmpeg-nuxeo.git -WORKDIR ffmpeg-nuxeo -RUN ./prepare-packages.sh \ - && ./build-yasm.sh \ - && ./build-x264.sh \ - && ./build-libvpx.sh \ - && ./build-ffmpeg.sh \ - && cd /tmp \ - && rm -Rf ffmpeg-nuxeo \ - && rm -rf /var/lib/apt/lists/* - -USER 1000 -``` - -## Using Oracle JVM - -For the same reasons as `ffmpeg` we don't ship the Oracle JVM and rely by default on OpenJDK. If you want to use the Hotspot JVM you cans add the following lines in a derived Dockerfile - -```dockerfile -RUN apt-get remove -y --purge openjdk-8-jdk \ - && add-apt-repository -y ppa:webupd8team/java && apt-get update \ - && echo "debconf shared/accepted-oracle-license-v1-1 select true" | debconf-set-selections \ - && echo "debconf shared/accepted-oracle-license-v1-1 seen true" | debconf-set-selections \ - && apt-get install -y oracle-java8-installer \ - && rm -rf /var/lib/apt/lists/* -``` - -## Why is this images so big ? - -This image is big because it contains a lot of features. The nuxeo distribution itself is about 250M and in order to make cool things work like generating thumbnails or converting document to PDF we need some additional tools that are bundled in the image. We hope that in the future we will be able to delegate those conversions to external services that would be bundled as additional docker images. diff --git a/nuxeo/github-repo b/nuxeo/github-repo deleted file mode 100644 index 6a3dabb9b19b..000000000000 --- a/nuxeo/github-repo +++ /dev/null @@ -1 +0,0 @@ -https://github.com/nuxeo/docker-nuxeo diff --git a/nuxeo/license.md b/nuxeo/license.md deleted file mode 100644 index 2a83ef4f31db..000000000000 --- a/nuxeo/license.md +++ /dev/null @@ -1 +0,0 @@ -View [license information](http://doc.nuxeo.com/x/gIK7) for the software contained in this image. diff --git a/nuxeo/logo.png b/nuxeo/logo.png deleted file mode 100644 index 2cb2146c31813da65367e8b8b3eccbfd57dbd495..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1821 zcmah~e@s(X6mCao2(IQ89csyJwFyBjW*c_kFVaFm*+4~#lKMpJGC`gWE3z>N*a^%B zwPO)QCyr^esjH=+qoaVh4U0Nv%SKloqKG`E2pwZ)x+?zKxv$08&18Sv_TJuezVm(O zo^x8ZYQ-{cAU}}BVsR6e%U82lFLlGdEPw-_0c&^JSS-$O338btuXnW9mONWFT{Cd3 zqh+&j#&Ql_n1ijvZPLi%)*V4PJuQdWn~%<@=hf><#pZVp?7!R@+1Huk?64gxIR3D- zuQIE7=34n(rHxb9+Ds4U?=PzHx9m$j-161B%*OfW@8LKSI173 zR^NQsb=X{3C3YOH&Hpx%=NQPiu(NOcx^ zeldq1{o0d=gh5k=>y4~}?6*|+55;Vw-+$13&E}|cRXzPZmA|KGdij}1Udrv(vf|dQ zEnhn<(WfV?K0hbmKh_erPr0U&2P}WYDf}LdZK|tYq$O10Cbl}<0L$1e5t`y8(!G}8 zZkmr#dRT2r+>cf&{H&ypp?R2vd^TCl^}&?J66}Q4O)K$Y*s@-ym1$Z+ifgl^_$0zA zA&F!zCNhw#cAK1E_0s=hy! z(vMf3tSN}mkO0Y}NLM0C<4y)rXR$Lx-0D~77zK_zbM)d5Xg=h|KG*O?zk7{-m?(JE zuygVGPu$ ze=apWUW=V8cd2e}2*RjYNJq(zSw^tK4od9?kw-~f)>Nyy->;fbW>t@m8m(Xn+ zUy2K6P=dONYisVUx5Er<6<28Dp=*pHvsmclHPG{=X?`RjM`%`w_ms>P8rkTj5isB9 zq*P>VT%AO{F&`Un^2g|4KFeAWABf1)$)jenD->6N`KKI$me&tHzB9tB{&B)7ABSCT~Ul2t4 zob=EhKsp(Es6@i@IcZJ?Q%HhB3q=V2$>D}}Ch5;m*Y9s!ke(D9HZR2!ta;Zh=hp4n zo|sl&TQ37>HpGi0;1S3yPuORHL?-l51|ACQwGmFl)LE`PDZ)I2c10Lcw%Z%WQa#)Y z6BXH8)3pdvXsDRbmzy+!Zkoe@9DliSi?}OF@(MX}3xvjIRBbu?rCK!?>s~;-nYPAp zFG`A6bmfZ0m+Y$)L(`me^TE)oOZR1-UJ`O`W}dzFZ+p{wgS`tI#}d;-rs{7Vv>Xf; z2>>V~h#I;o`>wMoOg(yJ((<%Q0v8#yh(_E+3G^RV-)x6eLIFbGVNS^u@3yC6Rf3*&pFSd!V8`%xLggnEcW=FASo}OQ=5-Y-{`6``-0}^Gp$SA{Ojn9Rc zFw`#!{g0stazPT%(%`ek>&~N4nn|Jr7OIk=BQPU`rddC|2oq*x&I%Yz&`Bf4GWZHW z6Vk&7STT?=ls#KClx2AFi*aBsrxjb`p}wS`;ol@69UQd|JT(^kj~lM%XVgZWsZzn; O9xEYkh1?XgarZx(Q7c&h diff --git a/nuxeo/maintainer.md b/nuxeo/maintainer.md deleted file mode 100644 index 0ad82eb66ba7..000000000000 --- a/nuxeo/maintainer.md +++ /dev/null @@ -1 +0,0 @@ -[Nuxeo](%%GITHUB-REPO%%) diff --git a/odoo/README.md b/odoo/README.md index 5bc25b79f4ea..3927f30bb58a 100644 --- a/odoo/README.md +++ b/odoo/README.md @@ -20,13 +20,13 @@ WARNING: [Odoo](https://github.com/odoo/docker) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`13.0`, `13`, `latest`](https://github.com/odoo/docker/blob/f116a674ca62595d0fbf1ded206ec2e4d962ebf0/13.0/Dockerfile) -- [`12.0`, `12`](https://github.com/odoo/docker/blob/f116a674ca62595d0fbf1ded206ec2e4d962ebf0/12.0/Dockerfile) -- [`11.0`, `11`](https://github.com/odoo/docker/blob/f116a674ca62595d0fbf1ded206ec2e4d962ebf0/11.0/Dockerfile) +- [`16.0`, `16`, `latest`](https://github.com/odoo/docker/blob/9674beb8a5ae48981bae2266b8c373d4eb7dd5e7/16.0/Dockerfile) +- [`15.0`, `15`](https://github.com/odoo/docker/blob/9674beb8a5ae48981bae2266b8c373d4eb7dd5e7/15.0/Dockerfile) +- [`14.0`, `14`](https://github.com/odoo/docker/blob/9674beb8a5ae48981bae2266b8c373d4eb7dd5e7/14.0/Dockerfile) # Quick reference (cont.) @@ -41,7 +41,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/odoo`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fodoo) + [official-images repo's `library/odoo` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fodoo) [official-images repo's `library/odoo` file](https://github.com/docker-library/official-images/blob/master/library/odoo) ([history](https://github.com/docker-library/official-images/commits/master/library/odoo)) - **Source of this description**: @@ -49,7 +49,7 @@ WARNING: # What is Odoo? -Odoo, formerly known as OpenERP, is a suite of open-source business apps written in Python and released under the AGPL license. This suite of applications covers all business needs, from Website/Ecommerce down to manufacturing, inventory and accounting, all seamlessly integrated. It is the first time ever a software editor managed to reach such a functional coverage. Odoo is the most installed business software in the world. Odoo is used by 2.000.000 users worldwide ranging from very small companies (1 user) to very large ones (300 000 users). +Odoo, formerly known as OpenERP, is a suite of open-source business apps written in Python and released under the LGPL license. This suite of applications covers all business needs, from Website/Ecommerce down to manufacturing, inventory and accounting, all seamlessly integrated. It is the first time ever a software editor managed to reach such a functional coverage. Odoo is the most installed business software in the world. Odoo is used by 2.000.000 users worldwide ranging from very small companies (1 user) to very large ones (300 000 users). > [www.odoo.com](https://www.odoo.com) @@ -62,7 +62,7 @@ This image requires a running PostgreSQL server. ## Start a PostgreSQL server ```console -$ docker run -d -e POSTGRES_USER=odoo -e POSTGRES_PASSWORD=odoo -e POSTGRES_DB=postgres --name db postgres:10 +$ docker run -d -e POSTGRES_USER=odoo -e POSTGRES_PASSWORD=odoo -e POSTGRES_DB=postgres --name db postgres:13 ``` ## Start an Odoo instance @@ -80,6 +80,24 @@ $ docker stop odoo $ docker start -a odoo ``` +## Use named volumes to preserve data + +When the Odoo container is created like described above, the odoo filestore is created inside the container. If the container is removed, the filestore is lost. The preferred way to prevent that is by using a Docker named [volume](https://docs.docker.com/storage/volumes/). + +```console +$ docker run -v odoo-data:/var/lib/odoo -d -p 8069:8069 --name odoo --link db:db -t odoo +``` + +With the above command, the volume named `odoo-data` will persist even if the container is removed and can be re-used by issuing the same command. + +The path `/var/lib/odoo` used as the mount point of the volume must match the odoo `data_dir` in the config file or as CLI parameters. + +Note that the same principle applies to the Postgresql container and a named volume can be used to preserve the database when the container is removed. So the database container could be started like this (before the odoo container): + +```console +$ docker run -d -v odoo-db:/var/lib/postgresql/data -e POSTGRES_USER=odoo -e POSTGRES_PASSWORD=odoo -e POSTGRES_DB=postgres --name db postgres:13 +``` + ## Stop and restart a PostgreSQL server When a PostgreSQL server is restarted, the Odoo instances linked to that server must be restarted as well because the server address has changed and the link is thus broken. @@ -94,7 +112,7 @@ The default configuration file for the server (located at `/etc/odoo/odoo.conf`) $ docker run -v /path/to/config:/etc/odoo -p 8069:8069 --name odoo --link db:db -t odoo ``` -Please use [this configuration template](https://github.com/odoo/docker/blob/master/12.0/odoo.conf) to write your custom configuration as we already set some arguments for running Odoo inside a Docker container. +Please use [this configuration template](https://github.com/odoo/docker/blob/master/14.0/odoo.conf) to write your custom configuration as we already set some arguments for running Odoo inside a Docker container. You can also directly specify Odoo arguments inline. Those arguments must be given after the keyword `--` in the command-line, as follows @@ -133,16 +151,16 @@ Tweak these environment variables to easily connect to a postgres server: The simplest `docker-compose.yml` file would be: ```yml -version: '2' +version: '3.1' services: web: - image: odoo:12.0 + image: odoo:14.0 depends_on: - db ports: - "8069:8069" db: - image: postgres:10 + image: postgres:13 environment: - POSTGRES_DB=postgres - POSTGRES_PASSWORD=odoo @@ -152,10 +170,10 @@ services: If the default postgres credentials does not suit you, tweak the environment variables: ```yml -version: '2' +version: '3.1' services: web: - image: odoo:12.0 + image: odoo:14.0 depends_on: - mydb ports: @@ -165,20 +183,25 @@ services: - USER=odoo - PASSWORD=myodoo mydb: - image: postgres:10 + image: postgres:13 environment: - POSTGRES_DB=postgres - POSTGRES_PASSWORD=myodoo - POSTGRES_USER=odoo ``` -Here's a last example showing you how to mount custom addons, how to use a custom configuration file and how to use volumes for the Odoo and postgres data dir: +Here's a last example showing you how to + +- mount custom addons located in `./addons` +- use a custom configuration file located in `.config/odoo.conf` +- use named volumes for the Odoo and postgres data dir +- use a `secrets` file named `odoo_pg_pass` that contains the postgreql password shared by both services ```yml -version: '2' +version: '3.1' services: web: - image: odoo:12.0 + image: odoo:14.0 depends_on: - db ports: @@ -187,18 +210,28 @@ services: - odoo-web-data:/var/lib/odoo - ./config:/etc/odoo - ./addons:/mnt/extra-addons + environment: + - PASSWORD_FILE=/run/secrets/postgresql_password + secrets: + - postgresql_password db: - image: postgres:10 + image: postgres:13 environment: - POSTGRES_DB=postgres - - POSTGRES_PASSWORD=odoo + - POSTGRES_PASSWORD_FILE=/run/secrets/postgresql_password - POSTGRES_USER=odoo - PGDATA=/var/lib/postgresql/data/pgdata volumes: - odoo-db-data:/var/lib/postgresql/data/pgdata + secrets: + - postgresql_password volumes: odoo-web-data: odoo-db-data: + +secrets: + postgresql_password: + file: odoo_pg_pass ``` To start your Odoo instance, go in the directory of the `docker-compose.yml` file you created from the previous examples and type: @@ -213,7 +246,7 @@ Odoo images are updated on a regular basis to make them use recent releases (a n Suppose you created a database from an Odoo instance named old-odoo, and you want to access this database from a new Odoo instance named new-odoo, e.g. because you've just downloaded a newer Odoo image. -By default, Odoo 12.0 uses a filestore (located at /var/lib/odoo/filestore/) for attachments. You should restore this filestore in your new Odoo instance by running +By default, Odoo 14.0 uses a filestore (located at /var/lib/odoo/filestore/) for attachments. You should restore this filestore in your new Odoo instance by running ```console $ docker run --volumes-from old-odoo -p 8070:8069 --name new-odoo --link db:db -t odoo @@ -223,7 +256,7 @@ You can also simply prevent Odoo from using the filestore by setting the system # License -View [license information](https://raw.githubusercontent.com/odoo/odoo/12.0/LICENSE) for the software contained in this image. +View [license information](https://raw.githubusercontent.com/odoo/odoo/14.0/LICENSE) for the software contained in this image. 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). diff --git a/odoo/content.md b/odoo/content.md index 22a8a6ee72b4..f9f054b55258 100644 --- a/odoo/content.md +++ b/odoo/content.md @@ -1,6 +1,6 @@ # What is Odoo? -Odoo, formerly known as OpenERP, is a suite of open-source business apps written in Python and released under the AGPL license. This suite of applications covers all business needs, from Website/Ecommerce down to manufacturing, inventory and accounting, all seamlessly integrated. It is the first time ever a software editor managed to reach such a functional coverage. Odoo is the most installed business software in the world. Odoo is used by 2.000.000 users worldwide ranging from very small companies (1 user) to very large ones (300 000 users). +Odoo, formerly known as OpenERP, is a suite of open-source business apps written in Python and released under the LGPL license. This suite of applications covers all business needs, from Website/Ecommerce down to manufacturing, inventory and accounting, all seamlessly integrated. It is the first time ever a software editor managed to reach such a functional coverage. Odoo is the most installed business software in the world. Odoo is used by 2.000.000 users worldwide ranging from very small companies (1 user) to very large ones (300 000 users). > [www.odoo.com](https://www.odoo.com) @@ -13,7 +13,7 @@ This image requires a running PostgreSQL server. ## Start a PostgreSQL server ```console -$ docker run -d -e POSTGRES_USER=odoo -e POSTGRES_PASSWORD=odoo -e POSTGRES_DB=postgres --name db postgres:10 +$ docker run -d -e POSTGRES_USER=odoo -e POSTGRES_PASSWORD=odoo -e POSTGRES_DB=postgres --name db postgres:13 ``` ## Start an Odoo instance @@ -31,6 +31,24 @@ $ docker stop odoo $ docker start -a odoo ``` +## Use named volumes to preserve data + +When the Odoo container is created like described above, the odoo filestore is created inside the container. If the container is removed, the filestore is lost. The preferred way to prevent that is by using a Docker named [volume](https://docs.docker.com/storage/volumes/). + +```console +$ docker run -v odoo-data:/var/lib/odoo -d -p 8069:8069 --name odoo --link db:db -t odoo +``` + +With the above command, the volume named `odoo-data` will persist even if the container is removed and can be re-used by issuing the same command. + +The path `/var/lib/odoo` used as the mount point of the volume must match the odoo `data_dir` in the config file or as CLI parameters. + +Note that the same principle applies to the Postgresql container and a named volume can be used to preserve the database when the container is removed. So the database container could be started like this (before the odoo container): + +```console +$ docker run -d -v odoo-db:/var/lib/postgresql/data -e POSTGRES_USER=odoo -e POSTGRES_PASSWORD=odoo -e POSTGRES_DB=postgres --name db postgres:13 +``` + ## Stop and restart a PostgreSQL server When a PostgreSQL server is restarted, the Odoo instances linked to that server must be restarted as well because the server address has changed and the link is thus broken. @@ -45,7 +63,7 @@ The default configuration file for the server (located at `/etc/odoo/odoo.conf`) $ docker run -v /path/to/config:/etc/odoo -p 8069:8069 --name odoo --link db:db -t %%IMAGE%% ``` -Please use [this configuration template](https://github.com/odoo/docker/blob/master/12.0/odoo.conf) to write your custom configuration as we already set some arguments for running Odoo inside a Docker container. +Please use [this configuration template](https://github.com/odoo/docker/blob/master/14.0/odoo.conf) to write your custom configuration as we already set some arguments for running Odoo inside a Docker container. You can also directly specify Odoo arguments inline. Those arguments must be given after the keyword `--` in the command-line, as follows @@ -84,16 +102,16 @@ Tweak these environment variables to easily connect to a postgres server: The simplest `docker-compose.yml` file would be: ```yml -version: '2' +version: '3.1' services: web: - image: %%IMAGE%%:12.0 + image: %%IMAGE%%:14.0 depends_on: - db ports: - "8069:8069" db: - image: postgres:10 + image: postgres:13 environment: - POSTGRES_DB=postgres - POSTGRES_PASSWORD=odoo @@ -103,10 +121,10 @@ services: If the default postgres credentials does not suit you, tweak the environment variables: ```yml -version: '2' +version: '3.1' services: web: - image: %%IMAGE%%:12.0 + image: %%IMAGE%%:14.0 depends_on: - mydb ports: @@ -116,20 +134,25 @@ services: - USER=odoo - PASSWORD=myodoo mydb: - image: postgres:10 + image: postgres:13 environment: - POSTGRES_DB=postgres - POSTGRES_PASSWORD=myodoo - POSTGRES_USER=odoo ``` -Here's a last example showing you how to mount custom addons, how to use a custom configuration file and how to use volumes for the Odoo and postgres data dir: +Here's a last example showing you how to + +- mount custom addons located in `./addons` +- use a custom configuration file located in `.config/odoo.conf` +- use named volumes for the Odoo and postgres data dir +- use a `secrets` file named `odoo_pg_pass` that contains the postgreql password shared by both services ```yml -version: '2' +version: '3.1' services: web: - image: %%IMAGE%%:12.0 + image: %%IMAGE%%:14.0 depends_on: - db ports: @@ -138,18 +161,28 @@ services: - odoo-web-data:/var/lib/odoo - ./config:/etc/odoo - ./addons:/mnt/extra-addons + environment: + - PASSWORD_FILE=/run/secrets/postgresql_password + secrets: + - postgresql_password db: - image: postgres:10 + image: postgres:13 environment: - POSTGRES_DB=postgres - - POSTGRES_PASSWORD=odoo + - POSTGRES_PASSWORD_FILE=/run/secrets/postgresql_password - POSTGRES_USER=odoo - PGDATA=/var/lib/postgresql/data/pgdata volumes: - odoo-db-data:/var/lib/postgresql/data/pgdata + secrets: + - postgresql_password volumes: odoo-web-data: odoo-db-data: + +secrets: + postgresql_password: + file: odoo_pg_pass ``` To start your Odoo instance, go in the directory of the `docker-compose.yml` file you created from the previous examples and type: @@ -164,7 +197,7 @@ Odoo images are updated on a regular basis to make them use recent releases (a n Suppose you created a database from an Odoo instance named old-odoo, and you want to access this database from a new Odoo instance named new-odoo, e.g. because you've just downloaded a newer Odoo image. -By default, Odoo 12.0 uses a filestore (located at /var/lib/odoo/filestore/) for attachments. You should restore this filestore in your new Odoo instance by running +By default, Odoo 14.0 uses a filestore (located at /var/lib/odoo/filestore/) for attachments. You should restore this filestore in your new Odoo instance by running ```console $ docker run --volumes-from old-odoo -p 8070:8069 --name new-odoo --link db:db -t %%IMAGE%% diff --git a/odoo/license.md b/odoo/license.md index 65e824098d64..31c83177006d 100644 --- a/odoo/license.md +++ b/odoo/license.md @@ -1 +1 @@ -View [license information](https://raw.githubusercontent.com/odoo/odoo/12.0/LICENSE) for the software contained in this image. +View [license information](https://raw.githubusercontent.com/odoo/odoo/14.0/LICENSE) for the software contained in this image. diff --git a/open-liberty/README-short.txt b/open-liberty/README-short.txt index ca1d1146f843..46fab7571f4c 100644 --- a/open-liberty/README-short.txt +++ b/open-liberty/README-short.txt @@ -1 +1 @@ -Official Open Liberty image. +Open Liberty multi-architecture images based on Ubuntu 18.04 diff --git a/open-liberty/README.md b/open-liberty/README.md index 5ac028cb8c42..05a65280c44d 100644 --- a/open-liberty/README.md +++ b/open-liberty/README.md @@ -24,14 +24,33 @@ WARNING: # Supported tags and respective `Dockerfile` links -- [`kernel`, `kernel-java8-openj9`](https://github.com/OpenLiberty/ci.docker/blob/17276f4286810d86d3a067c34dd60a06cfdb2c35/releases/latest/kernel/Dockerfile.ubuntu.adoptopenjdk8) -- [`full`, `full-java8-openj9`, `latest`](https://github.com/OpenLiberty/ci.docker/blob/17276f4286810d86d3a067c34dd60a06cfdb2c35/releases/latest/full/Dockerfile.ubuntu.adoptopenjdk8) -- [`20.0.0.5-kernel-java8-openj9`](https://github.com/OpenLiberty/ci.docker/blob/17276f4286810d86d3a067c34dd60a06cfdb2c35/releases/20.0.0.5/kernel/Dockerfile.ubuntu.adoptopenjdk8) -- [`20.0.0.5-full-java8-openj9`](https://github.com/OpenLiberty/ci.docker/blob/17276f4286810d86d3a067c34dd60a06cfdb2c35/releases/20.0.0.5/full/Dockerfile.ubuntu.adoptopenjdk8) -- [`20.0.0.3-kernel-java8-openj9`](https://github.com/OpenLiberty/ci.docker/blob/17276f4286810d86d3a067c34dd60a06cfdb2c35/releases/20.0.0.3/kernel/Dockerfile.ubuntu.adoptopenjdk8) -- [`20.0.0.3-full-java8-openj9`](https://github.com/OpenLiberty/ci.docker/blob/17276f4286810d86d3a067c34dd60a06cfdb2c35/releases/20.0.0.3/full/Dockerfile.ubuntu.adoptopenjdk8) -- [`19.0.0.12-kernel-java8-openj9`](https://github.com/OpenLiberty/ci.docker/blob/17276f4286810d86d3a067c34dd60a06cfdb2c35/releases/19.0.0.12/kernel/Dockerfile.ubuntu.adoptopenjdk8) -- [`19.0.0.12-full-java8-openj9`](https://github.com/OpenLiberty/ci.docker/blob/17276f4286810d86d3a067c34dd60a06cfdb2c35/releases/19.0.0.12/full/Dockerfile.ubuntu.adoptopenjdk8) +- [`beta`](https://github.com/OpenLiberty/ci.docker/blob/e93293a50a8dd38f6c8d35dd13b3972dfb18761a/releases/latest/beta/Dockerfile.ubuntu.openjdk8) +- [`beta-java11`](https://github.com/OpenLiberty/ci.docker/blob/e93293a50a8dd38f6c8d35dd13b3972dfb18761a/releases/latest/beta/Dockerfile.ubuntu.openjdk11) +- [`beta-java17`](https://github.com/OpenLiberty/ci.docker/blob/e93293a50a8dd38f6c8d35dd13b3972dfb18761a/releases/latest/beta/Dockerfile.ubuntu.openjdk17) +- [`kernel-slim`, `kernel-slim-java8-openj9`](https://github.com/OpenLiberty/ci.docker/blob/e93293a50a8dd38f6c8d35dd13b3972dfb18761a/releases/latest/kernel-slim/Dockerfile.ubuntu.openjdk8) +- [`kernel-slim-java11-openj9`](https://github.com/OpenLiberty/ci.docker/blob/e93293a50a8dd38f6c8d35dd13b3972dfb18761a/releases/latest/kernel-slim/Dockerfile.ubuntu.openjdk11) +- [`kernel-slim-java17-openj9`](https://github.com/OpenLiberty/ci.docker/blob/e93293a50a8dd38f6c8d35dd13b3972dfb18761a/releases/latest/kernel-slim/Dockerfile.ubuntu.openjdk17) +- [`full`, `full-java8-openj9`, `latest`](https://github.com/OpenLiberty/ci.docker/blob/e93293a50a8dd38f6c8d35dd13b3972dfb18761a/releases/latest/full/Dockerfile.ubuntu.openjdk8) +- [`full-java11-openj9`](https://github.com/OpenLiberty/ci.docker/blob/e93293a50a8dd38f6c8d35dd13b3972dfb18761a/releases/latest/full/Dockerfile.ubuntu.openjdk11) +- [`full-java17-openj9`](https://github.com/OpenLiberty/ci.docker/blob/e93293a50a8dd38f6c8d35dd13b3972dfb18761a/releases/latest/full/Dockerfile.ubuntu.openjdk17) +- [`22.0.0.13-kernel-slim-java8-openj9`](https://github.com/OpenLiberty/ci.docker/blob/e93293a50a8dd38f6c8d35dd13b3972dfb18761a/releases/22.0.0.13/kernel-slim/Dockerfile.ubuntu.openjdk8) +- [`22.0.0.13-kernel-slim-java11-openj9`](https://github.com/OpenLiberty/ci.docker/blob/e93293a50a8dd38f6c8d35dd13b3972dfb18761a/releases/22.0.0.13/kernel-slim/Dockerfile.ubuntu.openjdk11) +- [`22.0.0.13-kernel-slim-java17-openj9`](https://github.com/OpenLiberty/ci.docker/blob/e93293a50a8dd38f6c8d35dd13b3972dfb18761a/releases/22.0.0.13/kernel-slim/Dockerfile.ubuntu.openjdk17) +- [`22.0.0.13-full-java8-openj9`](https://github.com/OpenLiberty/ci.docker/blob/e93293a50a8dd38f6c8d35dd13b3972dfb18761a/releases/22.0.0.13/full/Dockerfile.ubuntu.openjdk8) +- [`22.0.0.13-full-java11-openj9`](https://github.com/OpenLiberty/ci.docker/blob/e93293a50a8dd38f6c8d35dd13b3972dfb18761a/releases/22.0.0.13/full/Dockerfile.ubuntu.openjdk11) +- [`22.0.0.13-full-java17-openj9`](https://github.com/OpenLiberty/ci.docker/blob/e93293a50a8dd38f6c8d35dd13b3972dfb18761a/releases/22.0.0.13/full/Dockerfile.ubuntu.openjdk17) +- [`22.0.0.12-kernel-slim-java8-openj9`](https://github.com/OpenLiberty/ci.docker/blob/e93293a50a8dd38f6c8d35dd13b3972dfb18761a/releases/22.0.0.12/kernel-slim/Dockerfile.ubuntu.openjdk8) +- [`22.0.0.12-kernel-slim-java11-openj9`](https://github.com/OpenLiberty/ci.docker/blob/e93293a50a8dd38f6c8d35dd13b3972dfb18761a/releases/22.0.0.12/kernel-slim/Dockerfile.ubuntu.openjdk11) +- [`22.0.0.12-kernel-slim-java17-openj9`](https://github.com/OpenLiberty/ci.docker/blob/e93293a50a8dd38f6c8d35dd13b3972dfb18761a/releases/22.0.0.12/kernel-slim/Dockerfile.ubuntu.openjdk17) +- [`22.0.0.12-full-java8-openj9`](https://github.com/OpenLiberty/ci.docker/blob/e93293a50a8dd38f6c8d35dd13b3972dfb18761a/releases/22.0.0.12/full/Dockerfile.ubuntu.openjdk8) +- [`22.0.0.12-full-java11-openj9`](https://github.com/OpenLiberty/ci.docker/blob/e93293a50a8dd38f6c8d35dd13b3972dfb18761a/releases/22.0.0.12/full/Dockerfile.ubuntu.openjdk11) +- [`22.0.0.12-full-java17-openj9`](https://github.com/OpenLiberty/ci.docker/blob/e93293a50a8dd38f6c8d35dd13b3972dfb18761a/releases/22.0.0.12/full/Dockerfile.ubuntu.openjdk17) +- [`22.0.0.9-kernel-slim-java8-openj9`](https://github.com/OpenLiberty/ci.docker/blob/e93293a50a8dd38f6c8d35dd13b3972dfb18761a/releases/22.0.0.9/kernel-slim/Dockerfile.ubuntu.openjdk8) +- [`22.0.0.9-kernel-slim-java11-openj9`](https://github.com/OpenLiberty/ci.docker/blob/e93293a50a8dd38f6c8d35dd13b3972dfb18761a/releases/22.0.0.9/kernel-slim/Dockerfile.ubuntu.openjdk11) +- [`22.0.0.9-kernel-slim-java17-openj9`](https://github.com/OpenLiberty/ci.docker/blob/e93293a50a8dd38f6c8d35dd13b3972dfb18761a/releases/22.0.0.9/kernel-slim/Dockerfile.ubuntu.openjdk17) +- [`22.0.0.9-full-java8-openj9`](https://github.com/OpenLiberty/ci.docker/blob/e93293a50a8dd38f6c8d35dd13b3972dfb18761a/releases/22.0.0.9/full/Dockerfile.ubuntu.openjdk8) +- [`22.0.0.9-full-java11-openj9`](https://github.com/OpenLiberty/ci.docker/blob/e93293a50a8dd38f6c8d35dd13b3972dfb18761a/releases/22.0.0.9/full/Dockerfile.ubuntu.openjdk11) +- [`22.0.0.9-full-java17-openj9`](https://github.com/OpenLiberty/ci.docker/blob/e93293a50a8dd38f6c8d35dd13b3972dfb18761a/releases/22.0.0.9/full/Dockerfile.ubuntu.openjdk17) # Quick reference (cont.) @@ -46,7 +65,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/open-liberty`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fopen-liberty) + [official-images repo's `library/open-liberty` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fopen-liberty) [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)) - **Source of this description**: @@ -54,9 +73,9 @@ WARNING: # Overview -The images in this repository contain Open Liberty. For more information about Open Liberty, see the [Open Liberty Website](https://openliberty.io/) site. +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/). -This repository contains OpenLiberty based on top of OpenJDK 8 Eclipse OpenJ9 with Ubuntu images only. See [here](https://hub.docker.com/r/openliberty/open-liberty) for Open Liberty based on Red Hat's Universal Base Image, which includes additional java options. +For more information on these images please see our [GitHub repository](https://github.com/OpenLiberty/ci.docker#container-images). # Image User @@ -103,12 +122,20 @@ Please note that this pattern will duplicate the docker layers for those artifac There are multiple tags available in this repository. -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. +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. ```dockerfile -FROM open-liberty:kernel -COPY --chown=1001:0 Sample1.war /config/dropins/ +FROM open-liberty:kernel-slim + +# Add server configuration COPY --chown=1001:0 server.xml /config/ +# This script will add the requested XML snippets to enable Liberty features and grow image to be fit-for-purpose using featureUtility. +# Only available in 'kernel-slim'. The 'full' tag already includes all features for convenience. +RUN features.sh + +# Add the application +COPY --chown=1001:0 Sample1.war /config/dropins/ +# This script will add the requested server configurations, apply any interim fixes and populate caches to optimize runtime. RUN configure.sh ``` @@ -188,13 +215,15 @@ To elaborate these capabilities this section assumes the standalone Spring Boot FROM open-liberty:kernel as staging COPY --chown=1001:0 hellospringboot.jar /staging/myFatApp.jar COPY --chown=1001:0 server.xml /config/ - RUN configure.sh && springBootUtility thin \ + RUN springBootUtility thin \ --sourceAppPath=/staging/myFatApp.jar \ --targetThinAppPath=/staging/myThinApp.jar \ --targetLibCachePath=/staging/lib.index.cache FROM open-liberty:kernel + COPY --chown=1001:0 server.xml /config COPY --from=staging /staging/lib.index.cache /lib.index.cache COPY --from=staging /staging/myThinApp.jar /config/dropins/spring/myThinApp.jar + RUN configure.sh ``` 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. @@ -258,6 +287,18 @@ WebSphere Liberty is a commercial distribution of Open Liberty. There is an offi - Use the `/output` folder for accessing the server output. - When adding your own SSL configuration use the `/config/configDropins/defaults/keystore.xml`. +# Image Variants + +The `open-liberty` images come in many flavors, each designed for a specific use case. + +## `open-liberty:` + +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. + +## `open-liberty:-slim` + +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. + # License View [license information](https://github.com/OpenLiberty/open-liberty/blob/master/LICENSE) for the software contained in this image. diff --git a/open-liberty/content.md b/open-liberty/content.md index 8ebff9d2c884..94e23ab627f7 100644 --- a/open-liberty/content.md +++ b/open-liberty/content.md @@ -1,8 +1,8 @@ # Overview -The images in this repository contain Open Liberty. For more information about Open Liberty, see the [Open Liberty Website](https://openliberty.io/) site. +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/). -This repository contains OpenLiberty based on top of OpenJDK 8 Eclipse OpenJ9 with Ubuntu images only. See [here](https://hub.docker.com/r/openliberty/open-liberty) for Open Liberty based on Red Hat's Universal Base Image, which includes additional java options. +For more information on these images please see our [GitHub repository](https://github.com/OpenLiberty/ci.docker#container-images). # Image User @@ -49,12 +49,20 @@ Please note that this pattern will duplicate the docker layers for those artifac There are multiple tags available in this repository. -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. +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. ```dockerfile -FROM %%IMAGE%%:kernel -COPY --chown=1001:0 Sample1.war /config/dropins/ +FROM %%IMAGE%%:kernel-slim + +# Add server configuration COPY --chown=1001:0 server.xml /config/ +# This script will add the requested XML snippets to enable Liberty features and grow image to be fit-for-purpose using featureUtility. +# Only available in 'kernel-slim'. The 'full' tag already includes all features for convenience. +RUN features.sh + +# Add the application +COPY --chown=1001:0 Sample1.war /config/dropins/ +# This script will add the requested server configurations, apply any interim fixes and populate caches to optimize runtime. RUN configure.sh ``` @@ -134,13 +142,15 @@ To elaborate these capabilities this section assumes the standalone Spring Boot FROM %%IMAGE%%:kernel as staging COPY --chown=1001:0 hellospringboot.jar /staging/myFatApp.jar COPY --chown=1001:0 server.xml /config/ - RUN configure.sh && springBootUtility thin \ + RUN springBootUtility thin \ --sourceAppPath=/staging/myFatApp.jar \ --targetThinAppPath=/staging/myThinApp.jar \ --targetLibCachePath=/staging/lib.index.cache FROM %%IMAGE%%:kernel + COPY --chown=1001:0 server.xml /config COPY --from=staging /staging/lib.index.cache /lib.index.cache COPY --from=staging /staging/myThinApp.jar /config/dropins/spring/myThinApp.jar + RUN configure.sh ``` 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. diff --git a/openjdk/README-short.txt b/openjdk/README-short.txt index fd22f6f13430..8bd9f5d5d5ae 100644 --- a/openjdk/README-short.txt +++ b/openjdk/README-short.txt @@ -1 +1 @@ -OpenJDK is an open-source implementation of the Java Platform, Standard Edition +Pre-release / non-production builds of OpenJDK diff --git a/openjdk/README.md b/openjdk/README.md index 0ca01dbe850f..877c15110afb 100644 --- a/openjdk/README.md +++ b/openjdk/README.md @@ -14,13 +14,27 @@ WARNING: --> +# **DEPRECATION NOTICE** + +This image is officially deprecated and all users are recommended to find and use suitable replacements ASAP. Some examples of other Official Image alternatives (listed in alphabetical order with no intentional or implied preference): + +- [`amazoncorretto`](https://hub.docker.com/_/amazoncorretto) +- [`eclipse-temurin`](https://hub.docker.com/_/eclipse-temurin) +- [`ibm-semeru-runtimes`](https://hub.docker.com/_/ibm-semeru-runtimes) +- [`ibmjava`](https://hub.docker.com/_/ibmjava) +- [`sapmachine`](https://hub.docker.com/_/sapmachine) + +See [docker-library/openjdk#505](https://github.com/docker-library/openjdk/issues/505) for more information. + +The only tags which will continue to receive updates beyond July 2022 will be Early Access builds (which are sourced from [jdk.java.net](https://jdk.java.net/)), as those are not published/supported by any of the above projects. + # Quick reference - **Maintained by**: [the Docker Community](https://github.com/docker-library/openjdk) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links @@ -28,96 +42,63 @@ WARNING: ## Simple Tags -- [`15-ea-23-jdk-oraclelinux7`, `15-ea-23-oraclelinux7`, `15-ea-jdk-oraclelinux7`, `15-ea-oraclelinux7`, `15-jdk-oraclelinux7`, `15-oraclelinux7`, `15-ea-23-jdk-oracle`, `15-ea-23-oracle`, `15-ea-jdk-oracle`, `15-ea-oracle`, `15-jdk-oracle`, `15-oracle`](https://github.com/docker-library/openjdk/blob/0a152d425165c851fbfc5b456191c4aeab9fc049/15/jdk/oracle/Dockerfile) -- [`15-ea-23-jdk-buster`, `15-ea-23-buster`, `15-ea-jdk-buster`, `15-ea-buster`, `15-jdk-buster`, `15-buster`](https://github.com/docker-library/openjdk/blob/0a152d425165c851fbfc5b456191c4aeab9fc049/15/jdk/Dockerfile) -- [`15-ea-23-jdk-slim-buster`, `15-ea-23-slim-buster`, `15-ea-jdk-slim-buster`, `15-ea-slim-buster`, `15-jdk-slim-buster`, `15-slim-buster`, `15-ea-23-jdk-slim`, `15-ea-23-slim`, `15-ea-jdk-slim`, `15-ea-slim`, `15-jdk-slim`, `15-slim`](https://github.com/docker-library/openjdk/blob/0a152d425165c851fbfc5b456191c4aeab9fc049/15/jdk/slim/Dockerfile) -- [`15-ea-10-jdk-alpine3.11`, `15-ea-10-alpine3.11`, `15-ea-jdk-alpine3.11`, `15-ea-alpine3.11`, `15-jdk-alpine3.11`, `15-alpine3.11`, `15-ea-10-jdk-alpine`, `15-ea-10-alpine`, `15-ea-jdk-alpine`, `15-ea-alpine`, `15-jdk-alpine`, `15-alpine`](https://github.com/docker-library/openjdk/blob/ee26e3735002dfb83551faf0f3b73822addc4799/15/jdk/alpine/Dockerfile) -- [`15-ea-23-jdk-windowsservercore-1809`, `15-ea-23-windowsservercore-1809`, `15-ea-jdk-windowsservercore-1809`, `15-ea-windowsservercore-1809`, `15-jdk-windowsservercore-1809`, `15-windowsservercore-1809`](https://github.com/docker-library/openjdk/blob/0a152d425165c851fbfc5b456191c4aeab9fc049/15/jdk/windows/windowsservercore-1809/Dockerfile) -- [`15-ea-23-jdk-windowsservercore-ltsc2016`, `15-ea-23-windowsservercore-ltsc2016`, `15-ea-jdk-windowsservercore-ltsc2016`, `15-ea-windowsservercore-ltsc2016`, `15-jdk-windowsservercore-ltsc2016`, `15-windowsservercore-ltsc2016`](https://github.com/docker-library/openjdk/blob/0a152d425165c851fbfc5b456191c4aeab9fc049/15/jdk/windows/windowsservercore-ltsc2016/Dockerfile) -- [`15-ea-23-jdk-nanoserver-1809`, `15-ea-23-nanoserver-1809`, `15-ea-jdk-nanoserver-1809`, `15-ea-nanoserver-1809`, `15-jdk-nanoserver-1809`, `15-nanoserver-1809`](https://github.com/docker-library/openjdk/blob/0a152d425165c851fbfc5b456191c4aeab9fc049/15/jdk/windows/nanoserver-1809/Dockerfile) -- [`14.0.1-jdk-oraclelinux7`, `14.0.1-oraclelinux7`, `14.0-jdk-oraclelinux7`, `14.0-oraclelinux7`, `14-jdk-oraclelinux7`, `14-oraclelinux7`, `jdk-oraclelinux7`, `oraclelinux7`, `14.0.1-jdk-oracle`, `14.0.1-oracle`, `14.0-jdk-oracle`, `14.0-oracle`, `14-jdk-oracle`, `14-oracle`, `jdk-oracle`, `oracle`](https://github.com/docker-library/openjdk/blob/cd0e316abc515747ef6c9edc8a40914b50163ad2/14/jdk/oracle/Dockerfile) -- [`14.0.1-jdk-buster`, `14.0.1-buster`, `14.0-jdk-buster`, `14.0-buster`, `14-jdk-buster`, `14-buster`, `jdk-buster`, `buster`](https://github.com/docker-library/openjdk/blob/cd0e316abc515747ef6c9edc8a40914b50163ad2/14/jdk/Dockerfile) -- [`14.0.1-jdk-slim-buster`, `14.0.1-slim-buster`, `14.0-jdk-slim-buster`, `14.0-slim-buster`, `14-jdk-slim-buster`, `14-slim-buster`, `jdk-slim-buster`, `slim-buster`, `14.0.1-jdk-slim`, `14.0.1-slim`, `14.0-jdk-slim`, `14.0-slim`, `14-jdk-slim`, `14-slim`, `jdk-slim`, `slim`](https://github.com/docker-library/openjdk/blob/cd0e316abc515747ef6c9edc8a40914b50163ad2/14/jdk/slim/Dockerfile) -- [`14.0.1-jdk-windowsservercore-1809`, `14.0.1-windowsservercore-1809`, `14.0-jdk-windowsservercore-1809`, `14.0-windowsservercore-1809`, `14-jdk-windowsservercore-1809`, `14-windowsservercore-1809`, `jdk-windowsservercore-1809`, `windowsservercore-1809`](https://github.com/docker-library/openjdk/blob/cd0e316abc515747ef6c9edc8a40914b50163ad2/14/jdk/windows/windowsservercore-1809/Dockerfile) -- [`14.0.1-jdk-windowsservercore-ltsc2016`, `14.0.1-windowsservercore-ltsc2016`, `14.0-jdk-windowsservercore-ltsc2016`, `14.0-windowsservercore-ltsc2016`, `14-jdk-windowsservercore-ltsc2016`, `14-windowsservercore-ltsc2016`, `jdk-windowsservercore-ltsc2016`, `windowsservercore-ltsc2016`](https://github.com/docker-library/openjdk/blob/cd0e316abc515747ef6c9edc8a40914b50163ad2/14/jdk/windows/windowsservercore-ltsc2016/Dockerfile) -- [`14.0.1-jdk-nanoserver-1809`, `14.0.1-nanoserver-1809`, `14.0-jdk-nanoserver-1809`, `14.0-nanoserver-1809`, `14-jdk-nanoserver-1809`, `14-nanoserver-1809`, `jdk-nanoserver-1809`, `nanoserver-1809`](https://github.com/docker-library/openjdk/blob/cd0e316abc515747ef6c9edc8a40914b50163ad2/14/jdk/windows/nanoserver-1809/Dockerfile) -- [`11.0.7-jdk-buster`, `11.0.7-buster`, `11.0-jdk-buster`, `11.0-buster`, `11-jdk-buster`, `11-buster`](https://github.com/docker-library/openjdk/blob/bce2fa373dc270cccf539a8e31b5f2a432d23738/11/jdk/Dockerfile) -- [`11.0.7-jdk-slim-buster`, `11.0.7-slim-buster`, `11.0-jdk-slim-buster`, `11.0-slim-buster`, `11-jdk-slim-buster`, `11-slim-buster`, `11.0.7-jdk-slim`, `11.0.7-slim`, `11.0-jdk-slim`, `11.0-slim`, `11-jdk-slim`, `11-slim`](https://github.com/docker-library/openjdk/blob/bce2fa373dc270cccf539a8e31b5f2a432d23738/11/jdk/slim/Dockerfile) -- [`11.0.7-jdk-windowsservercore-1809`, `11.0.7-windowsservercore-1809`, `11.0-jdk-windowsservercore-1809`, `11.0-windowsservercore-1809`, `11-jdk-windowsservercore-1809`, `11-windowsservercore-1809`](https://github.com/docker-library/openjdk/blob/bce2fa373dc270cccf539a8e31b5f2a432d23738/11/jdk/windows/windowsservercore-1809/Dockerfile) -- [`11.0.7-jdk-windowsservercore-ltsc2016`, `11.0.7-windowsservercore-ltsc2016`, `11.0-jdk-windowsservercore-ltsc2016`, `11.0-windowsservercore-ltsc2016`, `11-jdk-windowsservercore-ltsc2016`, `11-windowsservercore-ltsc2016`](https://github.com/docker-library/openjdk/blob/bce2fa373dc270cccf539a8e31b5f2a432d23738/11/jdk/windows/windowsservercore-ltsc2016/Dockerfile) -- [`11.0.7-jdk-nanoserver-1809`, `11.0.7-nanoserver-1809`, `11.0-jdk-nanoserver-1809`, `11.0-nanoserver-1809`, `11-jdk-nanoserver-1809`, `11-nanoserver-1809`](https://github.com/docker-library/openjdk/blob/3f6ab87ebe4bdea4470d0ff1e26f61dadd646c64/11/jdk/windows/nanoserver-1809/Dockerfile) -- [`11.0.7-jre-buster`, `11.0-jre-buster`, `11-jre-buster`](https://github.com/docker-library/openjdk/blob/bce2fa373dc270cccf539a8e31b5f2a432d23738/11/jre/Dockerfile) -- [`11.0.7-jre-slim-buster`, `11.0-jre-slim-buster`, `11-jre-slim-buster`, `11.0.7-jre-slim`, `11.0-jre-slim`, `11-jre-slim`](https://github.com/docker-library/openjdk/blob/bce2fa373dc270cccf539a8e31b5f2a432d23738/11/jre/slim/Dockerfile) -- [`11.0.7-jre-windowsservercore-1809`, `11.0-jre-windowsservercore-1809`, `11-jre-windowsservercore-1809`](https://github.com/docker-library/openjdk/blob/bce2fa373dc270cccf539a8e31b5f2a432d23738/11/jre/windows/windowsservercore-1809/Dockerfile) -- [`11.0.7-jre-windowsservercore-ltsc2016`, `11.0-jre-windowsservercore-ltsc2016`, `11-jre-windowsservercore-ltsc2016`](https://github.com/docker-library/openjdk/blob/bce2fa373dc270cccf539a8e31b5f2a432d23738/11/jre/windows/windowsservercore-ltsc2016/Dockerfile) -- [`11.0.7-jre-nanoserver-1809`, `11.0-jre-nanoserver-1809`, `11-jre-nanoserver-1809`](https://github.com/docker-library/openjdk/blob/3f6ab87ebe4bdea4470d0ff1e26f61dadd646c64/11/jre/windows/nanoserver-1809/Dockerfile) -- [`8u252-jdk-buster`, `8u252-buster`, `8-jdk-buster`, `8-buster`](https://github.com/docker-library/openjdk/blob/e24f1c142d0a2fa1852b5ea899b691483fc72a02/8/jdk/Dockerfile) -- [`8u252-jdk-slim-buster`, `8u252-slim-buster`, `8-jdk-slim-buster`, `8-slim-buster`, `8u252-jdk-slim`, `8u252-slim`, `8-jdk-slim`, `8-slim`](https://github.com/docker-library/openjdk/blob/e24f1c142d0a2fa1852b5ea899b691483fc72a02/8/jdk/slim/Dockerfile) -- [`8u252-jdk-windowsservercore-1809`, `8u252-windowsservercore-1809`, `8-jdk-windowsservercore-1809`, `8-windowsservercore-1809`](https://github.com/docker-library/openjdk/blob/e24f1c142d0a2fa1852b5ea899b691483fc72a02/8/jdk/windows/windowsservercore-1809/Dockerfile) -- [`8u252-jdk-windowsservercore-ltsc2016`, `8u252-windowsservercore-ltsc2016`, `8-jdk-windowsservercore-ltsc2016`, `8-windowsservercore-ltsc2016`](https://github.com/docker-library/openjdk/blob/e24f1c142d0a2fa1852b5ea899b691483fc72a02/8/jdk/windows/windowsservercore-ltsc2016/Dockerfile) -- [`8u252-jdk-nanoserver-1809`, `8u252-nanoserver-1809`, `8-jdk-nanoserver-1809`, `8-nanoserver-1809`](https://github.com/docker-library/openjdk/blob/3f6ab87ebe4bdea4470d0ff1e26f61dadd646c64/8/jdk/windows/nanoserver-1809/Dockerfile) -- [`8u252-jre-buster`, `8-jre-buster`](https://github.com/docker-library/openjdk/blob/e24f1c142d0a2fa1852b5ea899b691483fc72a02/8/jre/Dockerfile) -- [`8u252-jre-slim-buster`, `8-jre-slim-buster`, `8u252-jre-slim`, `8-jre-slim`](https://github.com/docker-library/openjdk/blob/e24f1c142d0a2fa1852b5ea899b691483fc72a02/8/jre/slim/Dockerfile) -- [`8u252-jre-windowsservercore-1809`, `8-jre-windowsservercore-1809`](https://github.com/docker-library/openjdk/blob/e24f1c142d0a2fa1852b5ea899b691483fc72a02/8/jre/windows/windowsservercore-1809/Dockerfile) -- [`8u252-jre-windowsservercore-ltsc2016`, `8-jre-windowsservercore-ltsc2016`](https://github.com/docker-library/openjdk/blob/e24f1c142d0a2fa1852b5ea899b691483fc72a02/8/jre/windows/windowsservercore-ltsc2016/Dockerfile) -- [`8u252-jre-nanoserver-1809`, `8-jre-nanoserver-1809`](https://github.com/docker-library/openjdk/blob/3f6ab87ebe4bdea4470d0ff1e26f61dadd646c64/8/jre/windows/nanoserver-1809/Dockerfile) +- [`21-ea-5-jdk-oraclelinux8`, `21-ea-5-oraclelinux8`, `21-ea-jdk-oraclelinux8`, `21-ea-oraclelinux8`, `21-jdk-oraclelinux8`, `21-oraclelinux8`, `21-ea-5-jdk-oracle`, `21-ea-5-oracle`, `21-ea-jdk-oracle`, `21-ea-oracle`, `21-jdk-oracle`, `21-oracle`](https://github.com/docker-library/openjdk/blob/bd86423db3e426763148dff5994388bfae7b98c6/21/jdk/oraclelinux8/Dockerfile) +- [`21-ea-5-jdk-oraclelinux7`, `21-ea-5-oraclelinux7`, `21-ea-jdk-oraclelinux7`, `21-ea-oraclelinux7`, `21-jdk-oraclelinux7`, `21-oraclelinux7`](https://github.com/docker-library/openjdk/blob/bd86423db3e426763148dff5994388bfae7b98c6/21/jdk/oraclelinux7/Dockerfile) +- [`21-ea-5-jdk-bullseye`, `21-ea-5-bullseye`, `21-ea-jdk-bullseye`, `21-ea-bullseye`, `21-jdk-bullseye`, `21-bullseye`](https://github.com/docker-library/openjdk/blob/bd86423db3e426763148dff5994388bfae7b98c6/21/jdk/bullseye/Dockerfile) +- [`21-ea-5-jdk-slim-bullseye`, `21-ea-5-slim-bullseye`, `21-ea-jdk-slim-bullseye`, `21-ea-slim-bullseye`, `21-jdk-slim-bullseye`, `21-slim-bullseye`, `21-ea-5-jdk-slim`, `21-ea-5-slim`, `21-ea-jdk-slim`, `21-ea-slim`, `21-jdk-slim`, `21-slim`](https://github.com/docker-library/openjdk/blob/bd86423db3e426763148dff5994388bfae7b98c6/21/jdk/slim-bullseye/Dockerfile) +- [`21-ea-5-jdk-buster`, `21-ea-5-buster`, `21-ea-jdk-buster`, `21-ea-buster`, `21-jdk-buster`, `21-buster`](https://github.com/docker-library/openjdk/blob/bd86423db3e426763148dff5994388bfae7b98c6/21/jdk/buster/Dockerfile) +- [`21-ea-5-jdk-slim-buster`, `21-ea-5-slim-buster`, `21-ea-jdk-slim-buster`, `21-ea-slim-buster`, `21-jdk-slim-buster`, `21-slim-buster`](https://github.com/docker-library/openjdk/blob/bd86423db3e426763148dff5994388bfae7b98c6/21/jdk/slim-buster/Dockerfile) +- [`21-ea-5-jdk-windowsservercore-ltsc2022`, `21-ea-5-windowsservercore-ltsc2022`, `21-ea-jdk-windowsservercore-ltsc2022`, `21-ea-windowsservercore-ltsc2022`, `21-jdk-windowsservercore-ltsc2022`, `21-windowsservercore-ltsc2022`](https://github.com/docker-library/openjdk/blob/bd86423db3e426763148dff5994388bfae7b98c6/21/jdk/windows/windowsservercore-ltsc2022/Dockerfile) +- [`21-ea-5-jdk-windowsservercore-1809`, `21-ea-5-windowsservercore-1809`, `21-ea-jdk-windowsservercore-1809`, `21-ea-windowsservercore-1809`, `21-jdk-windowsservercore-1809`, `21-windowsservercore-1809`](https://github.com/docker-library/openjdk/blob/bd86423db3e426763148dff5994388bfae7b98c6/21/jdk/windows/windowsservercore-1809/Dockerfile) +- [`21-ea-5-jdk-nanoserver-1809`, `21-ea-5-nanoserver-1809`, `21-ea-jdk-nanoserver-1809`, `21-ea-nanoserver-1809`, `21-jdk-nanoserver-1809`, `21-nanoserver-1809`](https://github.com/docker-library/openjdk/blob/bd86423db3e426763148dff5994388bfae7b98c6/21/jdk/windows/nanoserver-1809/Dockerfile) +- [`20-ea-31-jdk-oraclelinux8`, `20-ea-31-oraclelinux8`, `20-ea-jdk-oraclelinux8`, `20-ea-oraclelinux8`, `20-jdk-oraclelinux8`, `20-oraclelinux8`, `20-ea-31-jdk-oracle`, `20-ea-31-oracle`, `20-ea-jdk-oracle`, `20-ea-oracle`, `20-jdk-oracle`, `20-oracle`](https://github.com/docker-library/openjdk/blob/144d02bdeaa6b86a548d156e40638445a1836164/20/jdk/oraclelinux8/Dockerfile) +- [`20-ea-31-jdk-oraclelinux7`, `20-ea-31-oraclelinux7`, `20-ea-jdk-oraclelinux7`, `20-ea-oraclelinux7`, `20-jdk-oraclelinux7`, `20-oraclelinux7`](https://github.com/docker-library/openjdk/blob/144d02bdeaa6b86a548d156e40638445a1836164/20/jdk/oraclelinux7/Dockerfile) +- [`20-ea-31-jdk-bullseye`, `20-ea-31-bullseye`, `20-ea-jdk-bullseye`, `20-ea-bullseye`, `20-jdk-bullseye`, `20-bullseye`](https://github.com/docker-library/openjdk/blob/144d02bdeaa6b86a548d156e40638445a1836164/20/jdk/bullseye/Dockerfile) +- [`20-ea-31-jdk-slim-bullseye`, `20-ea-31-slim-bullseye`, `20-ea-jdk-slim-bullseye`, `20-ea-slim-bullseye`, `20-jdk-slim-bullseye`, `20-slim-bullseye`, `20-ea-31-jdk-slim`, `20-ea-31-slim`, `20-ea-jdk-slim`, `20-ea-slim`, `20-jdk-slim`, `20-slim`](https://github.com/docker-library/openjdk/blob/144d02bdeaa6b86a548d156e40638445a1836164/20/jdk/slim-bullseye/Dockerfile) +- [`20-ea-31-jdk-buster`, `20-ea-31-buster`, `20-ea-jdk-buster`, `20-ea-buster`, `20-jdk-buster`, `20-buster`](https://github.com/docker-library/openjdk/blob/144d02bdeaa6b86a548d156e40638445a1836164/20/jdk/buster/Dockerfile) +- [`20-ea-31-jdk-slim-buster`, `20-ea-31-slim-buster`, `20-ea-jdk-slim-buster`, `20-ea-slim-buster`, `20-jdk-slim-buster`, `20-slim-buster`](https://github.com/docker-library/openjdk/blob/144d02bdeaa6b86a548d156e40638445a1836164/20/jdk/slim-buster/Dockerfile) +- [`20-ea-31-jdk-windowsservercore-ltsc2022`, `20-ea-31-windowsservercore-ltsc2022`, `20-ea-jdk-windowsservercore-ltsc2022`, `20-ea-windowsservercore-ltsc2022`, `20-jdk-windowsservercore-ltsc2022`, `20-windowsservercore-ltsc2022`](https://github.com/docker-library/openjdk/blob/144d02bdeaa6b86a548d156e40638445a1836164/20/jdk/windows/windowsservercore-ltsc2022/Dockerfile) +- [`20-ea-31-jdk-windowsservercore-1809`, `20-ea-31-windowsservercore-1809`, `20-ea-jdk-windowsservercore-1809`, `20-ea-windowsservercore-1809`, `20-jdk-windowsservercore-1809`, `20-windowsservercore-1809`](https://github.com/docker-library/openjdk/blob/144d02bdeaa6b86a548d156e40638445a1836164/20/jdk/windows/windowsservercore-1809/Dockerfile) +- [`20-ea-31-jdk-nanoserver-1809`, `20-ea-31-nanoserver-1809`, `20-ea-jdk-nanoserver-1809`, `20-ea-nanoserver-1809`, `20-jdk-nanoserver-1809`, `20-nanoserver-1809`](https://github.com/docker-library/openjdk/blob/144d02bdeaa6b86a548d156e40638445a1836164/20/jdk/windows/nanoserver-1809/Dockerfile) +- [`18.0.2.1-jdk-oraclelinux8`, `18.0.2.1-oraclelinux8`, `18.0.2-jdk-oraclelinux8`, `18.0.2-oraclelinux8`, `18.0-jdk-oraclelinux8`, `18.0-oraclelinux8`, `18-jdk-oraclelinux8`, `18-oraclelinux8`, `jdk-oraclelinux8`, `oraclelinux8`, `18.0.2.1-jdk-oracle`, `18.0.2.1-oracle`, `18.0.2-jdk-oracle`, `18.0.2-oracle`, `18.0-jdk-oracle`, `18.0-oracle`, `18-jdk-oracle`, `18-oracle`, `jdk-oracle`, `oracle`](https://github.com/docker-library/openjdk/blob/4b928d2e5767b0e12058d3b5eceabeb0aa48aec3/18/jdk/oraclelinux8/Dockerfile) +- [`18.0.2.1-jdk-oraclelinux7`, `18.0.2.1-oraclelinux7`, `18.0.2-jdk-oraclelinux7`, `18.0.2-oraclelinux7`, `18.0-jdk-oraclelinux7`, `18.0-oraclelinux7`, `18-jdk-oraclelinux7`, `18-oraclelinux7`, `jdk-oraclelinux7`, `oraclelinux7`](https://github.com/docker-library/openjdk/blob/4b928d2e5767b0e12058d3b5eceabeb0aa48aec3/18/jdk/oraclelinux7/Dockerfile) +- [`18.0.2.1-jdk-bullseye`, `18.0.2.1-bullseye`, `18.0.2-jdk-bullseye`, `18.0.2-bullseye`, `18.0-jdk-bullseye`, `18.0-bullseye`, `18-jdk-bullseye`, `18-bullseye`, `jdk-bullseye`, `bullseye`](https://github.com/docker-library/openjdk/blob/4b928d2e5767b0e12058d3b5eceabeb0aa48aec3/18/jdk/bullseye/Dockerfile) +- [`18.0.2.1-jdk-slim-bullseye`, `18.0.2.1-slim-bullseye`, `18.0.2-jdk-slim-bullseye`, `18.0.2-slim-bullseye`, `18.0-jdk-slim-bullseye`, `18.0-slim-bullseye`, `18-jdk-slim-bullseye`, `18-slim-bullseye`, `jdk-slim-bullseye`, `slim-bullseye`, `18.0.2.1-jdk-slim`, `18.0.2.1-slim`, `18.0.2-jdk-slim`, `18.0.2-slim`, `18.0-jdk-slim`, `18.0-slim`, `18-jdk-slim`, `18-slim`, `jdk-slim`, `slim`](https://github.com/docker-library/openjdk/blob/4b928d2e5767b0e12058d3b5eceabeb0aa48aec3/18/jdk/slim-bullseye/Dockerfile) +- [`18.0.2.1-jdk-buster`, `18.0.2.1-buster`, `18.0.2-jdk-buster`, `18.0.2-buster`, `18.0-jdk-buster`, `18.0-buster`, `18-jdk-buster`, `18-buster`, `jdk-buster`, `buster`](https://github.com/docker-library/openjdk/blob/4b928d2e5767b0e12058d3b5eceabeb0aa48aec3/18/jdk/buster/Dockerfile) +- [`18.0.2.1-jdk-slim-buster`, `18.0.2.1-slim-buster`, `18.0.2-jdk-slim-buster`, `18.0.2-slim-buster`, `18.0-jdk-slim-buster`, `18.0-slim-buster`, `18-jdk-slim-buster`, `18-slim-buster`, `jdk-slim-buster`, `slim-buster`](https://github.com/docker-library/openjdk/blob/4b928d2e5767b0e12058d3b5eceabeb0aa48aec3/18/jdk/slim-buster/Dockerfile) +- [`18.0.2.1-jdk-windowsservercore-ltsc2022`, `18.0.2.1-windowsservercore-ltsc2022`, `18.0.2-jdk-windowsservercore-ltsc2022`, `18.0.2-windowsservercore-ltsc2022`, `18.0-jdk-windowsservercore-ltsc2022`, `18.0-windowsservercore-ltsc2022`, `18-jdk-windowsservercore-ltsc2022`, `18-windowsservercore-ltsc2022`, `jdk-windowsservercore-ltsc2022`, `windowsservercore-ltsc2022`](https://github.com/docker-library/openjdk/blob/4b928d2e5767b0e12058d3b5eceabeb0aa48aec3/18/jdk/windows/windowsservercore-ltsc2022/Dockerfile) +- [`18.0.2.1-jdk-windowsservercore-1809`, `18.0.2.1-windowsservercore-1809`, `18.0.2-jdk-windowsservercore-1809`, `18.0.2-windowsservercore-1809`, `18.0-jdk-windowsservercore-1809`, `18.0-windowsservercore-1809`, `18-jdk-windowsservercore-1809`, `18-windowsservercore-1809`, `jdk-windowsservercore-1809`, `windowsservercore-1809`](https://github.com/docker-library/openjdk/blob/4b928d2e5767b0e12058d3b5eceabeb0aa48aec3/18/jdk/windows/windowsservercore-1809/Dockerfile) +- [`18.0.2.1-jdk-nanoserver-1809`, `18.0.2.1-nanoserver-1809`, `18.0.2-jdk-nanoserver-1809`, `18.0.2-nanoserver-1809`, `18.0-jdk-nanoserver-1809`, `18.0-nanoserver-1809`, `18-jdk-nanoserver-1809`, `18-nanoserver-1809`, `jdk-nanoserver-1809`, `nanoserver-1809`](https://github.com/docker-library/openjdk/blob/4b928d2e5767b0e12058d3b5eceabeb0aa48aec3/18/jdk/windows/nanoserver-1809/Dockerfile) ## Shared Tags -- `15-ea-23-jdk`, `15-ea-23`, `15-ea-jdk`, `15-ea`, `15-jdk`, `15`: - - [`15-ea-23-jdk-oraclelinux7`](https://github.com/docker-library/openjdk/blob/0a152d425165c851fbfc5b456191c4aeab9fc049/15/jdk/oracle/Dockerfile) - - [`15-ea-23-jdk-windowsservercore-1809`](https://github.com/docker-library/openjdk/blob/0a152d425165c851fbfc5b456191c4aeab9fc049/15/jdk/windows/windowsservercore-1809/Dockerfile) - - [`15-ea-23-jdk-windowsservercore-ltsc2016`](https://github.com/docker-library/openjdk/blob/0a152d425165c851fbfc5b456191c4aeab9fc049/15/jdk/windows/windowsservercore-ltsc2016/Dockerfile) -- `15-ea-23-jdk-windowsservercore`, `15-ea-23-windowsservercore`, `15-ea-jdk-windowsservercore`, `15-ea-windowsservercore`, `15-jdk-windowsservercore`, `15-windowsservercore`: - - [`15-ea-23-jdk-windowsservercore-1809`](https://github.com/docker-library/openjdk/blob/0a152d425165c851fbfc5b456191c4aeab9fc049/15/jdk/windows/windowsservercore-1809/Dockerfile) - - [`15-ea-23-jdk-windowsservercore-ltsc2016`](https://github.com/docker-library/openjdk/blob/0a152d425165c851fbfc5b456191c4aeab9fc049/15/jdk/windows/windowsservercore-ltsc2016/Dockerfile) -- `15-ea-23-jdk-nanoserver`, `15-ea-23-nanoserver`, `15-ea-jdk-nanoserver`, `15-ea-nanoserver`, `15-jdk-nanoserver`, `15-nanoserver`: - - [`15-ea-23-jdk-nanoserver-1809`](https://github.com/docker-library/openjdk/blob/0a152d425165c851fbfc5b456191c4aeab9fc049/15/jdk/windows/nanoserver-1809/Dockerfile) -- `14.0.1-jdk`, `14.0.1`, `14.0-jdk`, `14.0`, `14-jdk`, `14`, `jdk`, `latest`: - - [`14.0.1-jdk-oraclelinux7`](https://github.com/docker-library/openjdk/blob/cd0e316abc515747ef6c9edc8a40914b50163ad2/14/jdk/oracle/Dockerfile) - - [`14.0.1-jdk-windowsservercore-1809`](https://github.com/docker-library/openjdk/blob/cd0e316abc515747ef6c9edc8a40914b50163ad2/14/jdk/windows/windowsservercore-1809/Dockerfile) - - [`14.0.1-jdk-windowsservercore-ltsc2016`](https://github.com/docker-library/openjdk/blob/cd0e316abc515747ef6c9edc8a40914b50163ad2/14/jdk/windows/windowsservercore-ltsc2016/Dockerfile) -- `14.0.1-jdk-windowsservercore`, `14.0.1-windowsservercore`, `14.0-jdk-windowsservercore`, `14.0-windowsservercore`, `14-jdk-windowsservercore`, `14-windowsservercore`, `jdk-windowsservercore`, `windowsservercore`: - - [`14.0.1-jdk-windowsservercore-1809`](https://github.com/docker-library/openjdk/blob/cd0e316abc515747ef6c9edc8a40914b50163ad2/14/jdk/windows/windowsservercore-1809/Dockerfile) - - [`14.0.1-jdk-windowsservercore-ltsc2016`](https://github.com/docker-library/openjdk/blob/cd0e316abc515747ef6c9edc8a40914b50163ad2/14/jdk/windows/windowsservercore-ltsc2016/Dockerfile) -- `14.0.1-jdk-nanoserver`, `14.0.1-nanoserver`, `14.0-jdk-nanoserver`, `14.0-nanoserver`, `14-jdk-nanoserver`, `14-nanoserver`, `jdk-nanoserver`, `nanoserver`: - - [`14.0.1-jdk-nanoserver-1809`](https://github.com/docker-library/openjdk/blob/cd0e316abc515747ef6c9edc8a40914b50163ad2/14/jdk/windows/nanoserver-1809/Dockerfile) -- `11.0.7-jdk`, `11.0.7`, `11.0-jdk`, `11.0`, `11-jdk`, `11`: - - [`11.0.7-jdk-buster`](https://github.com/docker-library/openjdk/blob/bce2fa373dc270cccf539a8e31b5f2a432d23738/11/jdk/Dockerfile) - - [`11.0.7-jdk-windowsservercore-1809`](https://github.com/docker-library/openjdk/blob/bce2fa373dc270cccf539a8e31b5f2a432d23738/11/jdk/windows/windowsservercore-1809/Dockerfile) - - [`11.0.7-jdk-windowsservercore-ltsc2016`](https://github.com/docker-library/openjdk/blob/bce2fa373dc270cccf539a8e31b5f2a432d23738/11/jdk/windows/windowsservercore-ltsc2016/Dockerfile) -- `11.0.7-jdk-windowsservercore`, `11.0.7-windowsservercore`, `11.0-jdk-windowsservercore`, `11.0-windowsservercore`, `11-jdk-windowsservercore`, `11-windowsservercore`: - - [`11.0.7-jdk-windowsservercore-1809`](https://github.com/docker-library/openjdk/blob/bce2fa373dc270cccf539a8e31b5f2a432d23738/11/jdk/windows/windowsservercore-1809/Dockerfile) - - [`11.0.7-jdk-windowsservercore-ltsc2016`](https://github.com/docker-library/openjdk/blob/bce2fa373dc270cccf539a8e31b5f2a432d23738/11/jdk/windows/windowsservercore-ltsc2016/Dockerfile) -- `11.0.7-jdk-nanoserver`, `11.0.7-nanoserver`, `11.0-jdk-nanoserver`, `11.0-nanoserver`, `11-jdk-nanoserver`, `11-nanoserver`: - - [`11.0.7-jdk-nanoserver-1809`](https://github.com/docker-library/openjdk/blob/3f6ab87ebe4bdea4470d0ff1e26f61dadd646c64/11/jdk/windows/nanoserver-1809/Dockerfile) -- `11.0.7-jre`, `11.0-jre`, `11-jre`: - - [`11.0.7-jre-buster`](https://github.com/docker-library/openjdk/blob/bce2fa373dc270cccf539a8e31b5f2a432d23738/11/jre/Dockerfile) - - [`11.0.7-jre-windowsservercore-1809`](https://github.com/docker-library/openjdk/blob/bce2fa373dc270cccf539a8e31b5f2a432d23738/11/jre/windows/windowsservercore-1809/Dockerfile) - - [`11.0.7-jre-windowsservercore-ltsc2016`](https://github.com/docker-library/openjdk/blob/bce2fa373dc270cccf539a8e31b5f2a432d23738/11/jre/windows/windowsservercore-ltsc2016/Dockerfile) -- `11.0.7-jre-windowsservercore`, `11.0-jre-windowsservercore`, `11-jre-windowsservercore`: - - [`11.0.7-jre-windowsservercore-1809`](https://github.com/docker-library/openjdk/blob/bce2fa373dc270cccf539a8e31b5f2a432d23738/11/jre/windows/windowsservercore-1809/Dockerfile) - - [`11.0.7-jre-windowsservercore-ltsc2016`](https://github.com/docker-library/openjdk/blob/bce2fa373dc270cccf539a8e31b5f2a432d23738/11/jre/windows/windowsservercore-ltsc2016/Dockerfile) -- `11.0.7-jre-nanoserver`, `11.0-jre-nanoserver`, `11-jre-nanoserver`: - - [`11.0.7-jre-nanoserver-1809`](https://github.com/docker-library/openjdk/blob/3f6ab87ebe4bdea4470d0ff1e26f61dadd646c64/11/jre/windows/nanoserver-1809/Dockerfile) -- `8u252-jdk`, `8u252`, `8-jdk`, `8`: - - [`8u252-jdk-buster`](https://github.com/docker-library/openjdk/blob/e24f1c142d0a2fa1852b5ea899b691483fc72a02/8/jdk/Dockerfile) - - [`8u252-jdk-windowsservercore-1809`](https://github.com/docker-library/openjdk/blob/e24f1c142d0a2fa1852b5ea899b691483fc72a02/8/jdk/windows/windowsservercore-1809/Dockerfile) - - [`8u252-jdk-windowsservercore-ltsc2016`](https://github.com/docker-library/openjdk/blob/e24f1c142d0a2fa1852b5ea899b691483fc72a02/8/jdk/windows/windowsservercore-ltsc2016/Dockerfile) -- `8u252-jdk-windowsservercore`, `8u252-windowsservercore`, `8-jdk-windowsservercore`, `8-windowsservercore`: - - [`8u252-jdk-windowsservercore-1809`](https://github.com/docker-library/openjdk/blob/e24f1c142d0a2fa1852b5ea899b691483fc72a02/8/jdk/windows/windowsservercore-1809/Dockerfile) - - [`8u252-jdk-windowsservercore-ltsc2016`](https://github.com/docker-library/openjdk/blob/e24f1c142d0a2fa1852b5ea899b691483fc72a02/8/jdk/windows/windowsservercore-ltsc2016/Dockerfile) -- `8u252-jdk-nanoserver`, `8u252-nanoserver`, `8-jdk-nanoserver`, `8-nanoserver`: - - [`8u252-jdk-nanoserver-1809`](https://github.com/docker-library/openjdk/blob/3f6ab87ebe4bdea4470d0ff1e26f61dadd646c64/8/jdk/windows/nanoserver-1809/Dockerfile) -- `8u252-jre`, `8-jre`: - - [`8u252-jre-buster`](https://github.com/docker-library/openjdk/blob/e24f1c142d0a2fa1852b5ea899b691483fc72a02/8/jre/Dockerfile) - - [`8u252-jre-windowsservercore-1809`](https://github.com/docker-library/openjdk/blob/e24f1c142d0a2fa1852b5ea899b691483fc72a02/8/jre/windows/windowsservercore-1809/Dockerfile) - - [`8u252-jre-windowsservercore-ltsc2016`](https://github.com/docker-library/openjdk/blob/e24f1c142d0a2fa1852b5ea899b691483fc72a02/8/jre/windows/windowsservercore-ltsc2016/Dockerfile) -- `8u252-jre-windowsservercore`, `8-jre-windowsservercore`: - - [`8u252-jre-windowsservercore-1809`](https://github.com/docker-library/openjdk/blob/e24f1c142d0a2fa1852b5ea899b691483fc72a02/8/jre/windows/windowsservercore-1809/Dockerfile) - - [`8u252-jre-windowsservercore-ltsc2016`](https://github.com/docker-library/openjdk/blob/e24f1c142d0a2fa1852b5ea899b691483fc72a02/8/jre/windows/windowsservercore-ltsc2016/Dockerfile) -- `8u252-jre-nanoserver`, `8-jre-nanoserver`: - - [`8u252-jre-nanoserver-1809`](https://github.com/docker-library/openjdk/blob/3f6ab87ebe4bdea4470d0ff1e26f61dadd646c64/8/jre/windows/nanoserver-1809/Dockerfile) +- `21-ea-5-jdk`, `21-ea-5`, `21-ea-jdk`, `21-ea`, `21-jdk`, `21`: + - [`21-ea-5-jdk-oraclelinux8`](https://github.com/docker-library/openjdk/blob/bd86423db3e426763148dff5994388bfae7b98c6/21/jdk/oraclelinux8/Dockerfile) + - [`21-ea-5-jdk-windowsservercore-ltsc2022`](https://github.com/docker-library/openjdk/blob/bd86423db3e426763148dff5994388bfae7b98c6/21/jdk/windows/windowsservercore-ltsc2022/Dockerfile) + - [`21-ea-5-jdk-windowsservercore-1809`](https://github.com/docker-library/openjdk/blob/bd86423db3e426763148dff5994388bfae7b98c6/21/jdk/windows/windowsservercore-1809/Dockerfile) +- `21-ea-5-jdk-windowsservercore`, `21-ea-5-windowsservercore`, `21-ea-jdk-windowsservercore`, `21-ea-windowsservercore`, `21-jdk-windowsservercore`, `21-windowsservercore`: + - [`21-ea-5-jdk-windowsservercore-ltsc2022`](https://github.com/docker-library/openjdk/blob/bd86423db3e426763148dff5994388bfae7b98c6/21/jdk/windows/windowsservercore-ltsc2022/Dockerfile) + - [`21-ea-5-jdk-windowsservercore-1809`](https://github.com/docker-library/openjdk/blob/bd86423db3e426763148dff5994388bfae7b98c6/21/jdk/windows/windowsservercore-1809/Dockerfile) +- `21-ea-5-jdk-nanoserver`, `21-ea-5-nanoserver`, `21-ea-jdk-nanoserver`, `21-ea-nanoserver`, `21-jdk-nanoserver`, `21-nanoserver`: + - [`21-ea-5-jdk-nanoserver-1809`](https://github.com/docker-library/openjdk/blob/bd86423db3e426763148dff5994388bfae7b98c6/21/jdk/windows/nanoserver-1809/Dockerfile) +- `20-ea-31-jdk`, `20-ea-31`, `20-ea-jdk`, `20-ea`, `20-jdk`, `20`: + - [`20-ea-31-jdk-oraclelinux8`](https://github.com/docker-library/openjdk/blob/144d02bdeaa6b86a548d156e40638445a1836164/20/jdk/oraclelinux8/Dockerfile) + - [`20-ea-31-jdk-windowsservercore-ltsc2022`](https://github.com/docker-library/openjdk/blob/144d02bdeaa6b86a548d156e40638445a1836164/20/jdk/windows/windowsservercore-ltsc2022/Dockerfile) + - [`20-ea-31-jdk-windowsservercore-1809`](https://github.com/docker-library/openjdk/blob/144d02bdeaa6b86a548d156e40638445a1836164/20/jdk/windows/windowsservercore-1809/Dockerfile) +- `20-ea-31-jdk-windowsservercore`, `20-ea-31-windowsservercore`, `20-ea-jdk-windowsservercore`, `20-ea-windowsservercore`, `20-jdk-windowsservercore`, `20-windowsservercore`: + - [`20-ea-31-jdk-windowsservercore-ltsc2022`](https://github.com/docker-library/openjdk/blob/144d02bdeaa6b86a548d156e40638445a1836164/20/jdk/windows/windowsservercore-ltsc2022/Dockerfile) + - [`20-ea-31-jdk-windowsservercore-1809`](https://github.com/docker-library/openjdk/blob/144d02bdeaa6b86a548d156e40638445a1836164/20/jdk/windows/windowsservercore-1809/Dockerfile) +- `20-ea-31-jdk-nanoserver`, `20-ea-31-nanoserver`, `20-ea-jdk-nanoserver`, `20-ea-nanoserver`, `20-jdk-nanoserver`, `20-nanoserver`: + - [`20-ea-31-jdk-nanoserver-1809`](https://github.com/docker-library/openjdk/blob/144d02bdeaa6b86a548d156e40638445a1836164/20/jdk/windows/nanoserver-1809/Dockerfile) +- `18.0.2.1-jdk`, `18.0.2.1`, `18.0.2-jdk`, `18.0.2`, `18.0-jdk`, `18.0`, `18-jdk`, `18`, `jdk`, `latest`: + - [`18.0.2.1-jdk-oraclelinux8`](https://github.com/docker-library/openjdk/blob/4b928d2e5767b0e12058d3b5eceabeb0aa48aec3/18/jdk/oraclelinux8/Dockerfile) + - [`18.0.2.1-jdk-windowsservercore-ltsc2022`](https://github.com/docker-library/openjdk/blob/4b928d2e5767b0e12058d3b5eceabeb0aa48aec3/18/jdk/windows/windowsservercore-ltsc2022/Dockerfile) + - [`18.0.2.1-jdk-windowsservercore-1809`](https://github.com/docker-library/openjdk/blob/4b928d2e5767b0e12058d3b5eceabeb0aa48aec3/18/jdk/windows/windowsservercore-1809/Dockerfile) +- `18.0.2.1-jdk-windowsservercore`, `18.0.2.1-windowsservercore`, `18.0.2-jdk-windowsservercore`, `18.0.2-windowsservercore`, `18.0-jdk-windowsservercore`, `18.0-windowsservercore`, `18-jdk-windowsservercore`, `18-windowsservercore`, `jdk-windowsservercore`, `windowsservercore`: + - [`18.0.2.1-jdk-windowsservercore-ltsc2022`](https://github.com/docker-library/openjdk/blob/4b928d2e5767b0e12058d3b5eceabeb0aa48aec3/18/jdk/windows/windowsservercore-ltsc2022/Dockerfile) + - [`18.0.2.1-jdk-windowsservercore-1809`](https://github.com/docker-library/openjdk/blob/4b928d2e5767b0e12058d3b5eceabeb0aa48aec3/18/jdk/windows/windowsservercore-1809/Dockerfile) +- `18.0.2.1-jdk-nanoserver`, `18.0.2.1-nanoserver`, `18.0.2-jdk-nanoserver`, `18.0.2-nanoserver`, `18.0-jdk-nanoserver`, `18.0-nanoserver`, `18-jdk-nanoserver`, `18-nanoserver`, `jdk-nanoserver`, `nanoserver`: + - [`18.0.2.1-jdk-nanoserver-1809`](https://github.com/docker-library/openjdk/blob/4b928d2e5767b0e12058d3b5eceabeb0aa48aec3/18/jdk/windows/nanoserver-1809/Dockerfile) # Quick reference (cont.) @@ -132,7 +113,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/openjdk`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fopenjdk) + [official-images repo's `library/openjdk` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fopenjdk) [official-images repo's `library/openjdk` file](https://github.com/docker-library/official-images/blob/master/library/openjdk) ([history](https://github.com/docker-library/official-images/commits/master/library/openjdk)) - **Source of this description**: @@ -155,7 +136,7 @@ Java is a registered trademark of Oracle and/or its affiliates. The most straightforward way to use this image is to use a Java container as both the build and runtime environment. In your `Dockerfile`, writing something along the lines of the following will compile and run your project: ```dockerfile -FROM openjdk:7 +FROM openjdk:11 COPY . /usr/src/myapp WORKDIR /usr/src/myapp RUN javac Main.java @@ -174,7 +155,7 @@ $ docker run -it --rm --name my-running-app my-java-app There may be occasions where it is not appropriate to run your app inside a container. To compile, but not run your app inside the Docker instance, you can write something like: ```console -$ docker run --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp openjdk:7 javac Main.java +$ docker run --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp openjdk:11 javac Main.java ``` This will add your current directory as a volume to the container, set the working directory to the volume, and run the command `javac Main.java` which will tell Java to compile the code in `Main.java` and output the Java class file to `Main.class`. @@ -207,21 +188,15 @@ The `openjdk` images come in many flavors, each designed for a specific use case 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. -Some of these tags may have names like buster 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. - -## `openjdk:` (from 12 onwards), `openjdk:-oracle` and `openjdk:-oraclelinux7` - -Starting with `openjdk:12` the default image as well as the `-oracle` and `-oraclelinux7` variants are based on the official [Oracle Linux 7 image](https://hub.docker.com/_/oraclelinux) which is provided under the GPLv2 as per the [Oracle Linux End User Agreement (EULA)](https://oss.oracle.com/ol7/EULA). - -The OpenJDK binaries in the default image as well as the `-oracle` and `-oraclelinux7` variants are built by Oracle and are sourced from the [OpenJDK community](https://openjdk.java.net/). These binaries are licensed under the [GPLv2 with the Classpath Exception](https://openjdk.java.net/legal/gplv2+ce.html). +Some of these tags may have names like bullseye or buster 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. -## `openjdk:-alpine` +## `openjdk:` (from 12 onwards), `openjdk:-oracle` and `openjdk:-oraclelinux8` -This image is based on the popular [Alpine Linux project](http://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. +Starting with `openjdk:12` the default image as well as the `-oracle` and `-oraclelinux8` variants are based on the official [Oracle Linux 8 image](https://hub.docker.com/_/oraclelinux) which is provided under the GPLv2 as per the [Oracle Linux End User Agreement (EULA)](https://oss.oracle.com/ol8/EULA). -This variant is highly recommended when final image size being as small as possible is desired. The main caveat to note is that it does use [musl libc](http://www.musl-libc.org) instead of [glibc and friends](http://www.etalabs.net/compare_libcs.html), so certain software might run into issues depending on the depth of their libc requirements. However, most software doesn't have an issue with this, so this variant is usually a very safe choice. 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. +The `-oraclelinux7` variants are based on the official [Oracle Linux 7 image](https://hub.docker.com/_/oraclelinux) which is provided under the GPLv2 as per the [Oracle Linux End User Agreement (EULA)](https://oss.oracle.com/ol7/EULA). -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). +The OpenJDK binaries are built by Oracle and are sourced from the [OpenJDK community](https://openjdk.java.net/). These binaries are licensed under the [GPLv2 with the Classpath Exception](https://openjdk.java.net/legal/gplv2+ce.html). ## `openjdk:-windowsservercore` diff --git a/openjdk/content.md b/openjdk/content.md index 0d6e18d0f475..dc35dfa42722 100644 --- a/openjdk/content.md +++ b/openjdk/content.md @@ -15,7 +15,7 @@ Java is a registered trademark of Oracle and/or its affiliates. The most straightforward way to use this image is to use a Java container as both the build and runtime environment. In your `Dockerfile`, writing something along the lines of the following will compile and run your project: ```dockerfile -FROM %%IMAGE%%:7 +FROM %%IMAGE%%:11 COPY . /usr/src/myapp WORKDIR /usr/src/myapp RUN javac Main.java @@ -34,7 +34,7 @@ $ docker run -it --rm --name my-running-app my-java-app There may be occasions where it is not appropriate to run your app inside a container. To compile, but not run your app inside the Docker instance, you can write something like: ```console -$ docker run --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp %%IMAGE%%:7 javac Main.java +$ docker run --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp %%IMAGE%%:11 javac Main.java ``` This will add your current directory as a volume to the container, set the working directory to the volume, and run the command `javac Main.java` which will tell Java to compile the code in `Main.java` and output the Java class file to `Main.class`. diff --git a/openjdk/deprecated.md b/openjdk/deprecated.md new file mode 100644 index 000000000000..5a3bdcd90695 --- /dev/null +++ b/openjdk/deprecated.md @@ -0,0 +1,11 @@ +This image is officially deprecated and all users are recommended to find and use suitable replacements ASAP. Some examples of other Official Image alternatives (listed in alphabetical order with no intentional or implied preference): + +- [`amazoncorretto`](https://hub.docker.com/_/amazoncorretto) +- [`eclipse-temurin`](https://hub.docker.com/_/eclipse-temurin) +- [`ibm-semeru-runtimes`](https://hub.docker.com/_/ibm-semeru-runtimes) +- [`ibmjava`](https://hub.docker.com/_/ibmjava) +- [`sapmachine`](https://hub.docker.com/_/sapmachine) + +See [docker-library/openjdk#505](https://github.com/docker-library/openjdk/issues/505) for more information. + +The only tags which will continue to receive updates beyond July 2022 will be Early Access builds (which are sourced from [jdk.java.net](https://jdk.java.net/)), as those are not published/supported by any of the above projects. diff --git a/openjdk/variant-alpine.md b/openjdk/variant-alpine.md new file mode 100644 index 000000000000..42365d4be16d --- /dev/null +++ b/openjdk/variant-alpine.md @@ -0,0 +1,7 @@ +## `%%IMAGE%%:-alpine` + +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. + +The OpenJDK port for Alpine is not in a supported release by OpenJDK, since it is not in the mainline code base. It is only available as early access builds of [OpenJDK Project Portola](http://openjdk.java.net/projects/portola). See also [this comment](https://github.com/docker-library/openjdk/pull/235#issuecomment-424599754). So this image follows what is available from the OpenJDK project's maintainers. + +What this means is that Alpine based images are only released for early access release versions of OpenJDK. Once a particular release becomes a "General-Availability" release, the Alpine version is dropped from the "Supported Tags"; they are still available to pull, but will no longer be updated. diff --git a/openjdk/variant-oracle.md b/openjdk/variant-oracle.md index 035bff6205c3..ba7ff1cb3aeb 100644 --- a/openjdk/variant-oracle.md +++ b/openjdk/variant-oracle.md @@ -1,5 +1,7 @@ -## `%%IMAGE%%:` (from 12 onwards), `%%IMAGE%%:-oracle` and `%%IMAGE%%:-oraclelinux7` +## `%%IMAGE%%:` (from 12 onwards), `%%IMAGE%%:-oracle` and `%%IMAGE%%:-oraclelinux8` -Starting with `openjdk:12` the default image as well as the `-oracle` and `-oraclelinux7` variants are based on the official [Oracle Linux 7 image](https://hub.docker.com/_/oraclelinux) which is provided under the GPLv2 as per the [Oracle Linux End User Agreement (EULA)](https://oss.oracle.com/ol7/EULA). +Starting with `openjdk:12` the default image as well as the `-oracle` and `-oraclelinux8` variants are based on the official [Oracle Linux 8 image](https://hub.docker.com/_/oraclelinux) which is provided under the GPLv2 as per the [Oracle Linux End User Agreement (EULA)](https://oss.oracle.com/ol8/EULA). -The OpenJDK binaries in the default image as well as the `-oracle` and `-oraclelinux7` variants are built by Oracle and are sourced from the [OpenJDK community](https://openjdk.java.net/). These binaries are licensed under the [GPLv2 with the Classpath Exception](https://openjdk.java.net/legal/gplv2+ce.html). +The `-oraclelinux7` variants are based on the official [Oracle Linux 7 image](https://hub.docker.com/_/oraclelinux) which is provided under the GPLv2 as per the [Oracle Linux End User Agreement (EULA)](https://oss.oracle.com/ol7/EULA). + +The OpenJDK binaries are built by Oracle and are sourced from the [OpenJDK community](https://openjdk.java.net/). These binaries are licensed under the [GPLv2 with the Classpath Exception](https://openjdk.java.net/legal/gplv2+ce.html). diff --git a/opensuse/README-short.txt b/opensuse/README-short.txt deleted file mode 100644 index 73d6a29c32fb..000000000000 --- a/opensuse/README-short.txt +++ /dev/null @@ -1 +0,0 @@ -DEPRECATED - for current images by the openSUSE Project see opensuse/leap and opensuse/tumbleweed. diff --git a/opensuse/README.md b/opensuse/README.md deleted file mode 100644 index 7e41df21dbec..000000000000 --- a/opensuse/README.md +++ /dev/null @@ -1,85 +0,0 @@ - - -# **DEPRECATION NOTICE** - -These images were removed in favor of the [`opensuse/leap`](https://hub.docker.com/r/opensuse/leap) and [`opensuse/tumbleweed`](https://hub.docker.com/r/opensuse/tumbleweed) images provided and maintained by the [openSUSE Project](https://www.opensuse.org/) release team. - -An archive for images of unsupported versions can be found at [`opensuse/archive`](https://hub.docker.com/r/opensuse/archive). - -# Quick reference - -- **Maintained by**: - [the SUSE containers team](https://github.com/openSUSE/docker-containers-build) - -- **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) - -# Supported tags and respective `Dockerfile` links - -**No supported tags** - -# Quick reference (cont.) - -- **Where to file issues**: - [https://github.com/openSUSE/docker-containers-build/issues](https://github.com/openSUSE/docker-containers-build/issues) - -- **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) - **No supported architectures** - -- **Published image artifact details**: - [repo-info repo's `repos/opensuse/` directory](https://github.com/docker-library/repo-info/blob/master/repos/opensuse) ([history](https://github.com/docker-library/repo-info/commits/master/repos/opensuse)) - (image metadata, transfer size, etc) - -- **Image updates**: - [official-images PRs with label `library/opensuse`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fopensuse) - [official-images repo's `library/opensuse` file](https://github.com/docker-library/official-images/blob/master/library/opensuse) ([history](https://github.com/docker-library/official-images/commits/master/library/opensuse)) - -- **Source of this description**: - [docs repo's `opensuse/` directory](https://github.com/docker-library/docs/tree/master/opensuse) ([history](https://github.com/docker-library/docs/commits/master/opensuse)) - -# openSUSE - -This project contains the stable releases of the openSUSE distribution. - -# Naming conventions - -Each image is tagged using both the release number (eg *"13.1"*) and the code name (eg *"Bottle"*). The latest stable release is always available using the "*latest*" tag. - -# Building - -These images are generated using [KIWI](https://github.com/openSUSE/kiwi). Their source file can be found on [this repository](https://github.com/openSUSE/docker-containers). - -# Repositories and packages - -The package selection is kept minimal to reduce the footprint of the image. - -However the following repositories are already part of the image: - -- OSS -- OSS Updates -- Non-OSS -- Non-OSS Updates - -# License - -View the [license information](https://en.opensuse.org/openSUSE:License) for the software contained in this image. Please note that individual packages installed may have their own licenses, which you also must follow. License information is available through the built-in package manager. - -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). - -Some additional license information which was able to be auto-detected might be found in [the `repo-info` repository's `opensuse/` directory](https://github.com/docker-library/repo-info/tree/master/repos/opensuse). - -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. diff --git a/opensuse/content.md b/opensuse/content.md deleted file mode 100644 index 1b695dd6b298..000000000000 --- a/opensuse/content.md +++ /dev/null @@ -1,22 +0,0 @@ -# openSUSE - -This project contains the stable releases of the openSUSE distribution. - -# Naming conventions - -Each image is tagged using both the release number (eg *"13.1"*) and the code name (eg *"Bottle"*). The latest stable release is always available using the "*latest*" tag. - -# Building - -These images are generated using [KIWI](https://github.com/openSUSE/kiwi). Their source file can be found on [this repository](https://github.com/openSUSE/docker-containers). - -# Repositories and packages - -The package selection is kept minimal to reduce the footprint of the image. - -However the following repositories are already part of the image: - -- OSS -- OSS Updates -- Non-OSS -- Non-OSS Updates diff --git a/opensuse/deprecated.md b/opensuse/deprecated.md deleted file mode 100644 index 3eb52c44bae6..000000000000 --- a/opensuse/deprecated.md +++ /dev/null @@ -1,3 +0,0 @@ -These images were removed in favor of the [`opensuse/leap`](https://hub.docker.com/r/opensuse/leap) and [`opensuse/tumbleweed`](https://hub.docker.com/r/opensuse/tumbleweed) images provided and maintained by the [openSUSE Project](https://www.opensuse.org/) release team. - -An archive for images of unsupported versions can be found at [`opensuse/archive`](https://hub.docker.com/r/opensuse/archive). diff --git a/opensuse/github-repo b/opensuse/github-repo deleted file mode 100644 index f9df505dec88..000000000000 --- a/opensuse/github-repo +++ /dev/null @@ -1 +0,0 @@ -https://github.com/openSUSE/docker-containers-build diff --git a/opensuse/license.md b/opensuse/license.md deleted file mode 100644 index 1d6e60f483b6..000000000000 --- a/opensuse/license.md +++ /dev/null @@ -1 +0,0 @@ -View the [license information](https://en.opensuse.org/openSUSE:License) for the software contained in this image. Please note that individual packages installed may have their own licenses, which you also must follow. License information is available through the built-in package manager. diff --git a/opensuse/logo.png b/opensuse/logo.png deleted file mode 100644 index 1d4d3568d60fdde6294b4e34f1405dfd6128579a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23435 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 MYGipCcL@>yKhm?OrvLx| diff --git a/opensuse/maintainer.md b/opensuse/maintainer.md deleted file mode 100644 index 7c8f0a78ed6b..000000000000 --- a/opensuse/maintainer.md +++ /dev/null @@ -1 +0,0 @@ -[the SUSE containers team](%%GITHUB-REPO%%) diff --git a/oraclelinux/README.md b/oraclelinux/README.md index c8628e7b3c4c..068c265fb465 100644 --- a/oraclelinux/README.md +++ b/oraclelinux/README.md @@ -17,21 +17,19 @@ WARNING: # Quick reference - **Maintained by**: - [the Oracle Linux Product Team](https://github.com/oracle/container-images) + [the Oracle Linux Container Team](https://github.com/oracle/container-images) - **Where to get help**: see the "Customer Support" and "Community Support" sections below # Supported tags and respective `Dockerfile` links -- [`8.2`, `8`](https://github.com/oracle/container-images/blob/f15c4cdc4a1483e541eb00d18c8058d2b5988fff/8.2/Dockerfile) -- [`8.1`](https://github.com/oracle/container-images/blob/f15c4cdc4a1483e541eb00d18c8058d2b5988fff/8.1/Dockerfile) -- [`8.0`](https://github.com/oracle/container-images/blob/f15c4cdc4a1483e541eb00d18c8058d2b5988fff/8.0/Dockerfile) -- [`8-slim`](https://github.com/oracle/container-images/blob/f15c4cdc4a1483e541eb00d18c8058d2b5988fff/8-slim/Dockerfile) -- [`7.8`, `7`, `latest`](https://github.com/oracle/container-images/blob/f15c4cdc4a1483e541eb00d18c8058d2b5988fff/7.8/Dockerfile) -- [`7-slim`](https://github.com/oracle/container-images/blob/f15c4cdc4a1483e541eb00d18c8058d2b5988fff/7-slim/Dockerfile) -- [`6.10`, `6`](https://github.com/oracle/container-images/blob/f15c4cdc4a1483e541eb00d18c8058d2b5988fff/6.10/Dockerfile) -- [`6-slim`](https://github.com/oracle/container-images/blob/f15c4cdc4a1483e541eb00d18c8058d2b5988fff/6-slim/Dockerfile) +- [`9`](https://github.com/oracle/container-images/blob/4205dc2e387076df43d84c44bd2617d8d0770873/9/Dockerfile) +- [`9-slim`](https://github.com/oracle/container-images/blob/4205dc2e387076df43d84c44bd2617d8d0770873/9-slim/Dockerfile) +- [`8.7`, `8`](https://github.com/oracle/container-images/blob/4205dc2e387076df43d84c44bd2617d8d0770873/8/Dockerfile) +- [`8-slim`](https://github.com/oracle/container-images/blob/4205dc2e387076df43d84c44bd2617d8d0770873/8-slim/Dockerfile) +- [`7.9`, `7`](https://github.com/oracle/container-images/blob/4205dc2e387076df43d84c44bd2617d8d0770873/7/Dockerfile) +- [`7-slim`](https://github.com/oracle/container-images/blob/4205dc2e387076df43d84c44bd2617d8d0770873/7-slim/Dockerfile) # Quick reference (cont.) @@ -46,7 +44,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/oraclelinux`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Foraclelinux) + [official-images repo's `library/oraclelinux` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Foraclelinux) [official-images repo's `library/oraclelinux` file](https://github.com/docker-library/official-images/blob/master/library/oraclelinux) ([history](https://github.com/docker-library/official-images/commits/master/library/oraclelinux)) - **Source of this description**: @@ -54,46 +52,49 @@ WARNING: # Oracle Linux -![logo](https://raw.githubusercontent.com/docker-library/docs/ac923d04bcfcf8de5128ab155ed9f1698374fdfc/oraclelinux/logo.png) +![logo](https://raw.githubusercontent.com/docker-library/docs/beed7adfe2814dd6e12207a2c58b515d87b8a184/oraclelinux/logo.png) Oracle Linux is an open-source operating system available under the GNU General Public License (GPLv2). Suitable for general purpose or Oracle workloads, it benefits from rigorous testing of more than 128,000 hours per day with real- world workloads and includes unique innovations such as Ksplice for zero- downtime kernel patching, DTrace for real-time diagnostics, the powerful Btrfs file system, and more. +> **NOTE:** the `oraclelinux` image intentionally does *not* provide a `latest` tag. You must specify [an existing tag](https://hub.docker.com/_/oraclelinux?tab=tags) when referencing this image. See *"Removal of the `latest` tag"* below for further details. + ## How to use these images -The Oracle Linux images are intended for use in the **FROM** field of a downstream `Dockerfile`. For example, to use the latest optimized Oracle Linux 7 image, specify `FROM oraclelinux:7-slim`. +The Oracle Linux images are intended for use in the **FROM** field of a downstream `Dockerfile`. For example, to use the latest optimized Oracle Linux 8 image, specify `FROM oraclelinux:8`. -## Official Resources +## Removal of `latest` tag -- [Learn more about Oracle Linux](https://oracle.com/linux) -- [Unbreakable Linux Network](https://linux.oracle.com) -- [Oracle Linux Yum Server](http://yum.oracle.com) +The `latest` tag was removed from the Oracle Linux official images in June 2020 to avoid breaking any downstream images caused by backwards-incompatible changes introduced by the release of a new version. Downstream images must specify the version, i.e. `oraclelinux:7` or `oraclelinux:8`. -## Social media resources +### Differences between `oraclelinux:8` and `oraclelinux:8-slim` -- [Twitter](https://twitter.com/OracleLinux) -- [Facebook](https://www.facebook.com/OracleLinux) -- [YouTube](https://www.youtube.com/user/OracleLinuxChannel) -- [Blog](http://blogs.oracle.com/linux) +Oracle recommends using `oraclelinux:8` for most images that extend Oracle Linux 8. -## Customer Support +The `oraclelinux:8-slim` variant is intended primarily to provide "just enough user space" for statically compiled binaries or microservices. Use of the `8-slim` variant is discouraged for general purposes, due to the inclusion of `microdnf` in place of `dnf` and signficantly reduced locale data. -Oracle provides support to Oracle Linux subscription customers via the [My Oracle Support](https://support.oracle.com) portal. The Oracle Linux Docker images are covered by Oracle Linux Basic and Premier support subscriptions. Customers should follow existing support procedures to obtain support for Oracle Linux running in a Docker container. +### Differences between `oraclelinux:7` and `oraclelinux:7-slim` -This image is officially supported for Oracle Linux customers with an active Oracle Linux Basic or Premier support subscription on both Oracle Linux 6 and Oracle Linux 7 running the Unbreakable Enterprise Kernel Release 4 and Oracle Container Runtime for Docker installed from the Unbreakable Linux Network (ULN) or the Oracle Linux yum server. +For images that want an Oracle Linux 7 user space, Oracle recommends using `oraclelinux:7-slim` as the base layer as it contains just enough packages for `yum` to be able to install more packages. -Oracle Linux users without an active support subscription can use either the Oracle distributed version of Oracle Container Runtime for Docker or the upstream version distributed by Docker. Support is limited to the community-based options outlined below. +The `oraclelinux:7` images is based on the package set of what would be installed on a bare-metal server when performing a minimal install of Oracle Linux. -### Oracle Linux 7 +## Changelog -Please review the [additional Linux programs supported under Oracle Linux support](https://docs.oracle.com/cd/E52668_01/E63013/html/ol7-lic-addl-packages.html) chapter for more information on the scope of support for the Oracle Container Runtime for Docker. +Oracle maintains a [CHANGELOG](https://github.com/oracle/container-images/blob/main/CHANGELOG.md) that documents by release date the errata applied and any CVE(s) that are mitigated in each update to the official images. -Please review the [Oracle Container Runtime for Docker User's Guide](https://docs.oracle.com/cd/E52668_01/E87205/html/index.html) for details on how to install or upgrade the Oracle Container Runtime for Docker on Oracle Linux 7. +## Official Resources -## Community Support +- [Oracle Linux documentation](https://docs.oracle.com/en/operating-systems/oracle-linux/index.html) +- [Oracle Linux Yum Server](http://yum.oracle.com) +- [Unbreakable Linux Network](https://linux.oracle.com) + +## Customer Support + +Oracle provides support to Oracle Linux subscription customers via the [My Oracle Support](https://support.oracle.com) portal. The Oracle Linux container images are covered by Oracle Linux Basic and Premier support subscriptions. Customers should follow existing support procedures to obtain support for Oracle Linux running in a container. -For Oracle Linux users without a paid support subscription, the following resources are available: +## Community Support -- The [Oracle Linux space](https://community.oracle.com/community/groundbreakers/server_&_storage_systems/linux/oracle_linux) on the [Oracle Technology Network Community](https://community.oracle.com/welcome). +Users without an Oracle Linux support subscription should either [open an issue](https://github.com/oracle/container-images/issues) or [start a discussion](https://github.com/oracle/container-images/discussions) in the [Oracle Linux container image repository](https://github.com/oracle/container-images) on GitHub. # License diff --git a/oraclelinux/content.md b/oraclelinux/content.md index a71aec4aa8e2..931bc8dc5acd 100644 --- a/oraclelinux/content.md +++ b/oraclelinux/content.md @@ -4,39 +4,42 @@ Oracle Linux is an open-source operating system available under the GNU General Public License (GPLv2). Suitable for general purpose or Oracle workloads, it benefits from rigorous testing of more than 128,000 hours per day with real- world workloads and includes unique innovations such as Ksplice for zero- downtime kernel patching, DTrace for real-time diagnostics, the powerful Btrfs file system, and more. +> **NOTE:** the `oraclelinux` image intentionally does *not* provide a `latest` tag. You must specify [an existing tag](https://hub.docker.com/_/oraclelinux?tab=tags) when referencing this image. See *"Removal of the `latest` tag"* below for further details. + ## How to use these images -The Oracle Linux images are intended for use in the **FROM** field of a downstream `Dockerfile`. For example, to use the latest optimized Oracle Linux 7 image, specify `FROM %%IMAGE%%:7-slim`. +The Oracle Linux images are intended for use in the **FROM** field of a downstream `Dockerfile`. For example, to use the latest optimized Oracle Linux 8 image, specify `FROM %%IMAGE%%:8`. -## Official Resources +## Removal of `latest` tag -- [Learn more about Oracle Linux](https://oracle.com/linux) -- [Unbreakable Linux Network](https://linux.oracle.com) -- [Oracle Linux Yum Server](http://yum.oracle.com) +The `latest` tag was removed from the Oracle Linux official images in June 2020 to avoid breaking any downstream images caused by backwards-incompatible changes introduced by the release of a new version. Downstream images must specify the version, i.e. `oraclelinux:7` or `oraclelinux:8`. -## Social media resources +### Differences between `oraclelinux:8` and `oraclelinux:8-slim` -- [Twitter](https://twitter.com/OracleLinux) -- [Facebook](https://www.facebook.com/OracleLinux) -- [YouTube](https://www.youtube.com/user/OracleLinuxChannel) -- [Blog](http://blogs.oracle.com/linux) +Oracle recommends using `oraclelinux:8` for most images that extend Oracle Linux 8. -## Customer Support +The `oraclelinux:8-slim` variant is intended primarily to provide "just enough user space" for statically compiled binaries or microservices. Use of the `8-slim` variant is discouraged for general purposes, due to the inclusion of `microdnf` in place of `dnf` and signficantly reduced locale data. -Oracle provides support to Oracle Linux subscription customers via the [My Oracle Support](https://support.oracle.com) portal. The Oracle Linux Docker images are covered by Oracle Linux Basic and Premier support subscriptions. Customers should follow existing support procedures to obtain support for Oracle Linux running in a Docker container. +### Differences between `oraclelinux:7` and `oraclelinux:7-slim` -This image is officially supported for Oracle Linux customers with an active Oracle Linux Basic or Premier support subscription on both Oracle Linux 6 and Oracle Linux 7 running the Unbreakable Enterprise Kernel Release 4 and Oracle Container Runtime for Docker installed from the Unbreakable Linux Network (ULN) or the Oracle Linux yum server. +For images that want an Oracle Linux 7 user space, Oracle recommends using `oraclelinux:7-slim` as the base layer as it contains just enough packages for `yum` to be able to install more packages. -Oracle Linux users without an active support subscription can use either the Oracle distributed version of Oracle Container Runtime for Docker or the upstream version distributed by Docker. Support is limited to the community-based options outlined below. +The `oraclelinux:7` images is based on the package set of what would be installed on a bare-metal server when performing a minimal install of Oracle Linux. -### Oracle Linux 7 +## Changelog -Please review the [additional Linux programs supported under Oracle Linux support](https://docs.oracle.com/cd/E52668_01/E63013/html/ol7-lic-addl-packages.html) chapter for more information on the scope of support for the Oracle Container Runtime for Docker. +Oracle maintains a [CHANGELOG](https://github.com/oracle/container-images/blob/main/CHANGELOG.md) that documents by release date the errata applied and any CVE(s) that are mitigated in each update to the official images. -Please review the [Oracle Container Runtime for Docker User's Guide](https://docs.oracle.com/cd/E52668_01/E87205/html/index.html) for details on how to install or upgrade the Oracle Container Runtime for Docker on Oracle Linux 7. +## Official Resources -## Community Support +- [Oracle Linux documentation](https://docs.oracle.com/en/operating-systems/oracle-linux/index.html) +- [Oracle Linux Yum Server](http://yum.oracle.com) +- [Unbreakable Linux Network](https://linux.oracle.com) + +## Customer Support + +Oracle provides support to Oracle Linux subscription customers via the [My Oracle Support](https://support.oracle.com) portal. The Oracle Linux container images are covered by Oracle Linux Basic and Premier support subscriptions. Customers should follow existing support procedures to obtain support for Oracle Linux running in a container. -For Oracle Linux users without a paid support subscription, the following resources are available: +## Community Support -- The [Oracle Linux space](https://community.oracle.com/community/groundbreakers/server_&_storage_systems/linux/oracle_linux) on the [Oracle Technology Network Community](https://community.oracle.com/welcome). +Users without an Oracle Linux support subscription should either [open an issue](https://github.com/oracle/container-images/issues) or [start a discussion](https://github.com/oracle/container-images/discussions) in the [Oracle Linux container image repository](https://github.com/oracle/container-images) on GitHub. diff --git a/oraclelinux/logo.png b/oraclelinux/logo.png index 1dbeb8cb834a3bd86fca4f7641147f1de606d8f9..0d980ee98484636dd5bae9e81d3da7c38abb5631 100644 GIT binary patch literal 20535 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 literal 4176 zcmb7Hc{r5s*B|>pD-o4b=1?zXU%B1UhJLW@HNju|WWg z;N<`)=-tFOfO6i`zoHKUeM}LcyKn(#Hh)`F15ovMDI5sI0kW~WZp`|3k^YE)07yB0 z9H3+nh+bF6+S&Pwfg=EbMX#v=Fu)98YETeBnOj@?Vq$G00;zPaBz^tWCHwDCnvJ7@E@HtT6lQ)J|7<~F_9J<`}FD4sHiB4yu5;f0!2=a zqOMNnBnp4;jP5f6TD8Wz5XbQc|dqk zXoxXBPRq)oH#So5-)F9_^6~MNl#~Pn1WZm&0%kK>TUitey}o|`{CTRsKY$s1efu&p zjLuHVnKS$1;*8Nz#@rk&G?dZS#v~A^SFTW9U0K`P^o)$;;w(U0q$zpFhu7U#Go%$s&_kL?U1nnTLnW%}q5o-xm~QEGz(keB=nd zv=q2yOick_STtI7b#-cLYGY&L&dv@HDJ-(_Z=Zu>9|WT1} z4IPD|fBp>ENh>U5V6kX4nwFY6H#gVN(9qxC@8;%~k&yw&%F4>Nwzdup4Jj!p>FVmz zVqyS2KEYp-nVCTDbaZq8r+^6mu^){V6ch{$3kMGBroB2iY>)_-rU5SJ*7x#iy*^O$wwUPmz+ zPnjdGq8GMyv6zL$DFTkUu{^#?coTJiv_HX|`MI&aM_;_{4di z)5!AC%JK;Nh-=m4C?E@(8dxe6#QJ3#Nc63YR`0ZM9DM;l5!|d+@wNHzs|Yd@`y}Pw zgL^^!pINLQELP%OMH`bYm1xCvy_1gxv(NA|)8A!H6uVBBmX*g8|KQ@jw8z8yqm@P9 z8atIo{m2z)+?i22hiK7D&kgxCT61exND$&!I@MrzT6XEw8E;bMH`~NdSSb$KlN0Ne zeche-La63P>AHB2j+>F>R{wi$0x#aq@^n6)skLg2@YcU3rJ?m*PW*_`J7|aE*6$g{ zTAm;$TgGGCq70XEmg)3p*{IJ)70u5N9`S zjm|UojXtI~Eu+dSqJr2>ZJW`JB>R>Hv?E1NoiDJePdnH1jrh2IF|6cSxV6nVSm;NR zG_G|ZC!}#|*{W#J8kS&GwJNxnU?-5=_M|6(%KXg35nBwMv?yGZ3kY&;bN(n<7c#xi zOWQ9$XZ_h&1$sD7N0EohV|mj@RNCm6-J2-M8|Lp^HBhpYXT|Y#+wK+H_EXuTp4yBW=zn=gqD!D1L!_~6}a4)CY0(e{e9;yMD{w8Z-z zjdQm5J#D1`z61}>%ditl@m8?7h#dC}@>0L#a@BXSSGq~QA%zTnc5<<)taKyN-$F#D zvPXBsFL~$m)jNiwi>1C+W7^KTV({H8NRcid@z&U@o(rM=V1o>dR&uqP`*=`NmqtXV zy;L0Rs2}PSU2~jOVSRz^nP3yV4sKX!k1sl!tVI}1d&Y%Re<7gO;az!0Bnk(gTuLrmVT|B@!VPrG|GaCz+(Cd*mbevX%sUf)c+l4>YMVQSd9Y(d3Kz4}|RTQ7uQD4Qia zY#O*L&fNa_*Bkk-V{n6#C-)qP6=kB_oE0*X+1p>+68mmBAUG=oG+%ps-FQUu2cvRq z%{uu_sip9RmfFcAI-hUobx1;75^8fYEre*E+`z@{Sw3T$mXmf=4%W6H+C%mHy|nwJ zXXvfxqt4N_8RNo%B-1sY^rZuZsSlsJ2gf%EPW`%7;CuBO>R>5HjIr<5tH%oBI0UEX z8O_%-LNGlU*orce-*1E7d1KV}bKFVwzBIL36UjdN`A2@Srwiv#a&=hT;N-LvUz4pO zKoA{2Ar$M;$~k{s%M&4w2;tg3XU=PxUYQLZE=qmdvQmLYpBEeK>NME z)4X?UtQyp4lG!Oq)rg8~_RkMFH^E(Xs1l49R{y8w&jV4Da zo%H+L>e0ibZs=JHQ}?pmRgK|LBiOs@pqyt|#3KoCWY$hX)b$qCohQfdE%+<@w1uzc ztHitH#Oj$8CuPs4ei5CApN5nVEKW+*vUGE_JpcI+ukamT%4d+1zQ;a6y5=(SV9Ito z;^&FqCWj)JRw)+~tB(wg;s0@Awot^$jYU$1TYa}wTI3u&{Vd>ygALEeF;M%C+93gx z&BmlcC=AuOP<`{;nbhJuqC%b0jW@wQU(OvL^B}!5Uc!`>!9-27#Px^n7VPxDG21zz z`&v&me+DUFpR?!P)ZxN4Z)<#s~NN&2Fzb%LQA52Oe$tl!Z^IDt~|U5G%(g zje}FzHeM^1^K*jpUU-J%JS4zgNs-Sl1QvXQ*A=TMYfFk0*u?jwCK=wZkn|l8tm6>P zAB{KZ@Mz^e^H2tCALL|WiBi3h;LE0$>EXI<7I+XfI;lDD4=K65f+^5@ym4C3C-IEa zs}z@~CLWwF`j!&zE;A#u=10;MVGf4SLEA1Je-U`R!qbPh!{H3I?@soI0yo2bv;Blo zs<#jLLLje|anwbw52+?;8l)L^rHB1#G958^Bc5#KUmDGFKsiKKoA?5$dC*`Q+U zEMWakX8-L(OX=GP(270<(Bde-s_Qtu?_#7$T_JkhV z3k@F_xITAHb8s%D5L#?!B|)57*~}3*-KALo}%=epk#-IP8PQkIsZ=NnB z_|Sih33L#9>G1xgUw?T_~ zwrk#Omnyrtx*O~}6LQX5%-VSfwHFk3`t7k+=9yp|x^8cbpz`=$K*SSI{Xn1Q}i&uat8TCuP zy;muvDj76CA_gr8sAAg}t1-SxxIC6I6W753f+h0eG}zBMb5|B3FB_TMvXIvv>~WGu zbvuv5O<~eCCT>f=0G;623j|M?sK=BX1fAth1ll6wkj$Nb4&JMCX019q#$JfBma?;y zRJ9QW*Lgb=0-kw`fFvQv@14}A!I(ChE^nx*6c|1(7?tvZZP-VwvKe`4QF^#STK}60 zP{0m`Fc!w9tBKE3mLLzA^&qN;*yV;lbPn7RpC}iBtCL2<$P$S9RI;n$+Z-gMGLChT zUFS`;JW>kzg_kLUUf3ldKRh_(OnAfN6>%QX?l)E`84>$6^cqhk#_;kOYFBHb&o`lb z7U_c%YgxU28#%9iMV}X%mQs6FOlWOC5cJ}KOnuIk#HMk4zWU-6{=QT7>@J_@4O5M+ z#`HUucEKk*1rz;Y@+tlwaTXdHjHvQ%Bz#5hk_#?V)6J1m!ZT^uPEa`qxe%_n%#RPs zzEb7@uc|^;A9(ewJ~}Rtq9*KjBy!X!&gh}z@j%+9|K{q6d)Z!hvN|fp0>I3ufqK!2 zUCx8=#77?$nwI=IrkYW8 zsh>P%b^NEh>yACYfCt>zWGfSS>8dJLB`;95bg2Xa77+JTyepwx`CeTjQzP5tn!`Z< z--7=;L-YRI0)IQ<#Q#s#C;zuM{%lWyIom_(CO=Qo^W*H-m;z19YtyhIs`#H@Cv#({ KQMG|{%>MwFT$~gD diff --git a/oraclelinux/maintainer.md b/oraclelinux/maintainer.md index 52003361a7c9..d6a920577652 100644 --- a/oraclelinux/maintainer.md +++ b/oraclelinux/maintainer.md @@ -1 +1 @@ -[the Oracle Linux Product Team](%%GITHUB-REPO%%) +[the Oracle Linux Container Team](%%GITHUB-REPO%%) diff --git a/orientdb/README.md b/orientdb/README.md index 6ea0d5e2845f..914ed0593d71 100644 --- a/orientdb/README.md +++ b/orientdb/README.md @@ -20,16 +20,18 @@ WARNING: [OrientDB](https://github.com/orientechnologies/orientdb-docker) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`3.0.31`, `3.0`, `latest`](https://github.com/orientechnologies/orientdb-docker/blob/7893b07ad8f78b66f1c724244a88a70a05669e6e/release/3.0.x/3.0.31/Dockerfile) -- [`3.0.31-tp3`, `3.0-tp3`](https://github.com/orientechnologies/orientdb-docker/blob/7893b07ad8f78b66f1c724244a88a70a05669e6e/release/3.0.x/3.0.31-tp3/Dockerfile) -- [`2.2.37`, `2.2`](https://github.com/orientechnologies/orientdb-docker/blob/76586496ae5457689bebdf76ebd267a3be1aa954/release/2.2.x/2.2.37/Dockerfile) -- [`2.2.37-spatial`](https://github.com/orientechnologies/orientdb-docker/blob/76586496ae5457689bebdf76ebd267a3be1aa954/release/2.2.x/2.2.37-spatial/Dockerfile) -- [`2.1.25`, `2.1`](https://github.com/orientechnologies/orientdb-docker/blob/76586496ae5457689bebdf76ebd267a3be1aa954/release/2.1.x/Dockerfile) -- [`2.0.18`, `2.0`](https://github.com/orientechnologies/orientdb-docker/blob/76586496ae5457689bebdf76ebd267a3be1aa954/release/2.0.x/Dockerfile) +- [`3.2.14`, `3.2`, `latest`](https://github.com/orientechnologies/orientdb-docker/blob/8f7ae4b76aa72cccdb849a1d8988e15a12d875c0/release/3.2.x/3.2.14/Dockerfile) +- [`3.2.14-tp3`, `3.2-tp3`](https://github.com/orientechnologies/orientdb-docker/blob/8f7ae4b76aa72cccdb849a1d8988e15a12d875c0/release/3.2.x/3.2.14-tp3/Dockerfile) +- [`3.1.20`, `3.1`](https://github.com/orientechnologies/orientdb-docker/blob/a8a42acbe19dad60a051afe08ed625e66587dd37/release/3.1.x/3.1.20/Dockerfile) +- [`3.1.20-tp3`, `3.1-tp3`](https://github.com/orientechnologies/orientdb-docker/blob/a8a42acbe19dad60a051afe08ed625e66587dd37/release/3.1.x/3.1.20-tp3/Dockerfile) +- [`3.0.44`, `3.0`](https://github.com/orientechnologies/orientdb-docker/blob/a8a42acbe19dad60a051afe08ed625e66587dd37/release/3.0.x/3.0.44/Dockerfile) +- [`3.0.44-tp3`, `3.0-tp3`](https://github.com/orientechnologies/orientdb-docker/blob/a8a42acbe19dad60a051afe08ed625e66587dd37/release/3.0.x/3.0.44-tp3/Dockerfile) +- [`2.2.37`, `2.2`](https://github.com/orientechnologies/orientdb-docker/blob/a8a42acbe19dad60a051afe08ed625e66587dd37/release/2.2.x/2.2.37/Dockerfile) +- [`2.2.37-spatial`](https://github.com/orientechnologies/orientdb-docker/blob/a8a42acbe19dad60a051afe08ed625e66587dd37/release/2.2.x/2.2.37-spatial/Dockerfile) # Quick reference (cont.) @@ -44,7 +46,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/orientdb`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Forientdb) + [official-images repo's `library/orientdb` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Forientdb) [official-images repo's `library/orientdb` file](https://github.com/docker-library/official-images/blob/master/library/orientdb) ([history](https://github.com/docker-library/official-images/commits/master/library/orientdb)) - **Source of this description**: diff --git a/percona/README.md b/percona/README.md index 0be116ca712e..79a1803212c4 100644 --- a/percona/README.md +++ b/percona/README.md @@ -20,16 +20,18 @@ WARNING: [Percona](https://github.com/percona/percona-docker) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`8.0.19-10-centos`, `8.0-centos`, `8-centos`, `8.0.19-10`, `8.0`, `8`, `ps-8.0.19-10`, `ps-8.0`, `ps-8`](https://github.com/percona/percona-docker/blob/c5a71b2b629df714f6dbe25974d754209a3f3bb4/percona-server.80/Dockerfile) -- [`5.7.29-centos`, `5.7-centos`, `5-centos`, `centos`, `5.7.29`, `5.7`, `5`, `ps-5.7.29`, `ps-5.7`, `ps-5`, `latest`](https://github.com/percona/percona-docker/blob/66a99d41ad3c8b25a7529dc3ea6d767ef0d525ba/percona-server.57/Dockerfile-dockerhub) -- [`5.6.48-centos`, `5.6-centos`, `5.6.48`, `5.6`, `ps-5.6.47`, `ps-5.6`](https://github.com/percona/percona-docker/blob/97f0dd85b9f99da75ea1b74727634ce15c1b5ea0/percona-server.56/Dockerfile-dockerhub) -- [`psmdb-4.2.6`, `psmdb-4.2`](https://github.com/percona/percona-docker/blob/c1b9ca0e068093c6eec7c85816f9d49e0b0b4a6a/percona-server-mongodb.42/Dockerfile) -- [`psmdb-4.0.18`, `psmdb-4.0`](https://github.com/percona/percona-docker/blob/46e9e40b837c631e383ef900c0f7ff3e2d02f916/percona-server-mongodb.40/Dockerfile) -- [`psmdb-3.6.17`, `psmdb-3.6`](https://github.com/percona/percona-docker/blob/6601b120cc7594fb9603268834b507d855e019dd/percona-server-mongodb.36/Dockerfile) +- [`8.0.29-21-centos`, `8.0-centos`, `8-centos`, `8.0.29-21`, `8.0`, `8`, `ps-8.0.29-21`, `ps-8.0`, `ps-8`](https://github.com/percona/percona-docker/blob/f7a1ff5101f7572296fec3f4f4d0d7a666a219a8/percona-server-8.0/Dockerfile) +- [`5.7.35-centos`, `5.7-centos`, `5-centos`, `centos`, `5.7.35`, `5.7`, `5`, `ps-5.7.35`, `ps-5.7`, `ps-5`, `latest`](https://github.com/percona/percona-docker/blob/f1697b98ebb86a8d684c4192fa382b00ae1860ff/percona-server-5.7/Dockerfile-dockerhub) +- [`5.6.51-2-centos`, `5.6-centos`, `5.6.51-2`, `5.6`, `ps-5.6.51-2`, `ps-5.6`](https://github.com/percona/percona-docker/blob/4510d49bcce5cfce58a42c198d55399b144add83/percona-server-5.6/Dockerfile-dockerhub) +- [`psmdb-5.0.10`, `psmdb-5.0`](https://github.com/percona/percona-docker/blob/0003693083fc3b6a904fd83a63096705aff46cca/percona-server-mongodb-5.0/Dockerfile) +- [`psmdb-4.4.15`, `psmdb-4.4`](https://github.com/percona/percona-docker/blob/93dc9be5c30c1da42e8f2dad03da5e17e6bc89a9/percona-server-mongodb-4.4/Dockerfile) +- [`psmdb-4.2.21`, `psmdb-4.2`](https://github.com/percona/percona-docker/blob/ee35507eeade832e18041d39ac67637202733e49/percona-server-mongodb-4.2/Dockerfile) +- [`psmdb-4.0.27`, `psmdb-4.0`](https://github.com/percona/percona-docker/blob/ef97f5cd2c747905dc6d724c245cce9f3e2ce0a1/percona-server-mongodb-4.0/Dockerfile) +- [`psmdb-3.6.23`, `psmdb-3.6`](https://github.com/percona/percona-docker/blob/b32c7e632fe0d8b058ce32c0430a1783cfd557a0/percona-server-mongodb-3.6/Dockerfile) # Quick reference (cont.) @@ -46,7 +48,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/percona`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fpercona) + [official-images repo's `library/percona` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fpercona) [official-images repo's `library/percona` file](https://github.com/docker-library/official-images/blob/master/library/percona) ([history](https://github.com/docker-library/official-images/commits/master/library/percona)) - **Source of this description**: @@ -74,7 +76,7 @@ $ docker run --name some-percona -e MYSQL_ROOT_PASSWORD=my-secret-pw -d percona: ... where `some-percona` is the name you want to assign to your container, `my-secret-pw` is the password to be set for the MySQL root user and `tag` is the tag specifying the MySQL version you want. See the list above for relevant tags. -## Connect to MariaDB from the MySQL command line client +## Connect to Percona Server from the MySQL command line client The following command starts another `percona` container instance and runs the `mysql` command line client against your original `percona` container, allowing you to execute SQL statements against your database instance: @@ -140,7 +142,7 @@ The startup configuration is specified in the file `/etc/my.cnf`, and that file If `/my/custom/config-file.cnf` is the path and name of your custom configuration file, you can start your `percona` container like this (note that only the directory path of the custom config file is used in this command): ```console -$ docker run --name some-percona -v /my/custom:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=my-secret-pw -d percona:tag +$ docker run --name some-percona -v /my/custom:/etc/my.cnf.d -e MYSQL_ROOT_PASSWORD=my-secret-pw -d percona:tag ``` This will start a new container `some-percona` where the Percona Server for MySQL instance uses the combined startup settings from `/etc/my.cnf` and `/etc/my.cnf.d/config-file.cnf`, with settings from the latter taking precedence. diff --git a/percona/content.md b/percona/content.md index 48a004cc3c11..84530d3e69ec 100644 --- a/percona/content.md +++ b/percona/content.md @@ -20,7 +20,7 @@ $ docker run --name some-%%REPO%% -e MYSQL_ROOT_PASSWORD=my-secret-pw -d %%IMAGE ... where `some-%%REPO%%` is the name you want to assign to your container, `my-secret-pw` is the password to be set for the MySQL root user and `tag` is the tag specifying the MySQL version you want. See the list above for relevant tags. -## Connect to MariaDB from the MySQL command line client +## Connect to Percona Server from the MySQL command line client The following command starts another `%%IMAGE%%` container instance and runs the `mysql` command line client against your original `%%IMAGE%%` container, allowing you to execute SQL statements against your database instance: @@ -63,7 +63,7 @@ The startup configuration is specified in the file `/etc/my.cnf`, and that file If `/my/custom/config-file.cnf` is the path and name of your custom configuration file, you can start your `%%IMAGE%%` container like this (note that only the directory path of the custom config file is used in this command): ```console -$ docker run --name some-%%REPO%% -v /my/custom:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=my-secret-pw -d %%IMAGE%%:tag +$ docker run --name some-%%REPO%% -v /my/custom:/etc/my.cnf.d -e MYSQL_ROOT_PASSWORD=my-secret-pw -d %%IMAGE%%:tag ``` This will start a new container `some-%%REPO%%` where the Percona Server for MySQL instance uses the combined startup settings from `/etc/my.cnf` and `/etc/my.cnf.d/config-file.cnf`, with settings from the latter taking precedence. diff --git a/perl/README.md b/perl/README.md index 9d25a17913ea..3e9acea8271d 100644 --- a/perl/README.md +++ b/perl/README.md @@ -20,34 +20,34 @@ WARNING: [the Perl Community](https://github.com/Perl/docker-perl) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`latest`, `5`, `5.30`, `5.30.2`, `5-buster`, `5.30-buster`, `5.30.2-buster`](https://github.com/perl/docker-perl/blob/054bceb46d86b0f76683bbae808de63323c21c98/5.030.002-main-buster/Dockerfile) -- [`5-stretch`, `5.30-stretch`, `5.30.2-stretch`](https://github.com/perl/docker-perl/blob/054bceb46d86b0f76683bbae808de63323c21c98/5.030.002-main-stretch/Dockerfile) -- [`slim`, `5-slim`, `5.30-slim`, `5.30.2-slim`, `slim-buster`, `5-slim-buster`, `5.30-slim-buster`, `5.30.2-slim-buster`](https://github.com/perl/docker-perl/blob/054bceb46d86b0f76683bbae808de63323c21c98/5.030.002-slim-buster/Dockerfile) -- [`slim-stretch`, `5-slim-stretch`, `5.30-slim-stretch`, `5.30.2-slim-stretch`](https://github.com/perl/docker-perl/blob/054bceb46d86b0f76683bbae808de63323c21c98/5.030.002-slim-stretch/Dockerfile) -- [`threaded`, `5-threaded`, `5.30-threaded`, `5.30.2-threaded`, `threaded-buster`, `5-threaded-buster`, `5.30-threaded-buster`, `5.30.2-threaded-buster`](https://github.com/perl/docker-perl/blob/054bceb46d86b0f76683bbae808de63323c21c98/5.030.002-main,threaded-buster/Dockerfile) -- [`threaded-stretch`, `5-threaded-stretch`, `5.30-threaded-stretch`, `5.30.2-threaded-stretch`](https://github.com/perl/docker-perl/blob/054bceb46d86b0f76683bbae808de63323c21c98/5.030.002-main,threaded-stretch/Dockerfile) -- [`slim-threaded`, `5-slim-threaded`, `5.30-slim-threaded`, `5.30.2-slim-threaded`, `slim-threaded-buster`, `5-slim-threaded-buster`, `5.30-slim-threaded-buster`, `5.30.2-slim-threaded-buster`](https://github.com/perl/docker-perl/blob/054bceb46d86b0f76683bbae808de63323c21c98/5.030.002-slim,threaded-buster/Dockerfile) -- [`slim-threaded-stretch`, `5-slim-threaded-stretch`, `5.30-slim-threaded-stretch`, `5.30.2-slim-threaded-stretch`](https://github.com/perl/docker-perl/blob/054bceb46d86b0f76683bbae808de63323c21c98/5.030.002-slim,threaded-stretch/Dockerfile) -- [`5.28`, `5.28.2`, `5.28-buster`, `5.28.2-buster`](https://github.com/perl/docker-perl/blob/054bceb46d86b0f76683bbae808de63323c21c98/5.028.002-main-buster/Dockerfile) -- [`5.28-stretch`, `5.28.2-stretch`](https://github.com/perl/docker-perl/blob/054bceb46d86b0f76683bbae808de63323c21c98/5.028.002-main-stretch/Dockerfile) -- [`5.28-slim`, `5.28.2-slim`, `5.28-slim-buster`, `5.28.2-slim-buster`](https://github.com/perl/docker-perl/blob/054bceb46d86b0f76683bbae808de63323c21c98/5.028.002-slim-buster/Dockerfile) -- [`5.28-slim-stretch`, `5.28.2-slim-stretch`](https://github.com/perl/docker-perl/blob/054bceb46d86b0f76683bbae808de63323c21c98/5.028.002-slim-stretch/Dockerfile) -- [`5.28-threaded`, `5.28.2-threaded`, `5.28-threaded-buster`, `5.28.2-threaded-buster`](https://github.com/perl/docker-perl/blob/054bceb46d86b0f76683bbae808de63323c21c98/5.028.002-main,threaded-buster/Dockerfile) -- [`5.28-threaded-stretch`, `5.28.2-threaded-stretch`](https://github.com/perl/docker-perl/blob/054bceb46d86b0f76683bbae808de63323c21c98/5.028.002-main,threaded-stretch/Dockerfile) -- [`5.28-slim-threaded`, `5.28.2-slim-threaded`, `5.28-slim-threaded-buster`, `5.28.2-slim-threaded-buster`](https://github.com/perl/docker-perl/blob/054bceb46d86b0f76683bbae808de63323c21c98/5.028.002-slim,threaded-buster/Dockerfile) -- [`5.28-slim-threaded-stretch`, `5.28.2-slim-threaded-stretch`](https://github.com/perl/docker-perl/blob/054bceb46d86b0f76683bbae808de63323c21c98/5.028.002-slim,threaded-stretch/Dockerfile) -- [`5.26`, `5.26.3`, `5.26-buster`, `5.26.3-buster`](https://github.com/perl/docker-perl/blob/054bceb46d86b0f76683bbae808de63323c21c98/5.026.003-main-buster/Dockerfile) -- [`5.26-stretch`, `5.26.3-stretch`](https://github.com/perl/docker-perl/blob/054bceb46d86b0f76683bbae808de63323c21c98/5.026.003-main-stretch/Dockerfile) -- [`5.26-slim`, `5.26.3-slim`, `5.26-slim-buster`, `5.26.3-slim-buster`](https://github.com/perl/docker-perl/blob/054bceb46d86b0f76683bbae808de63323c21c98/5.026.003-slim-buster/Dockerfile) -- [`5.26-slim-stretch`, `5.26.3-slim-stretch`](https://github.com/perl/docker-perl/blob/054bceb46d86b0f76683bbae808de63323c21c98/5.026.003-slim-stretch/Dockerfile) -- [`5.26-threaded`, `5.26.3-threaded`, `5.26-threaded-buster`, `5.26.3-threaded-buster`](https://github.com/perl/docker-perl/blob/054bceb46d86b0f76683bbae808de63323c21c98/5.026.003-main,threaded-buster/Dockerfile) -- [`5.26-threaded-stretch`, `5.26.3-threaded-stretch`](https://github.com/perl/docker-perl/blob/054bceb46d86b0f76683bbae808de63323c21c98/5.026.003-main,threaded-stretch/Dockerfile) -- [`5.26-slim-threaded`, `5.26.3-slim-threaded`, `5.26-slim-threaded-buster`, `5.26.3-slim-threaded-buster`](https://github.com/perl/docker-perl/blob/054bceb46d86b0f76683bbae808de63323c21c98/5.026.003-slim,threaded-buster/Dockerfile) -- [`5.26-slim-threaded-stretch`, `5.26.3-slim-threaded-stretch`](https://github.com/perl/docker-perl/blob/054bceb46d86b0f76683bbae808de63323c21c98/5.026.003-slim,threaded-stretch/Dockerfile) +- [`5.36.0`, `5.36`, `5`, `latest`, `5.36.0-bullseye`, `5.36-bullseye`, `5-bullseye`, `bullseye`](https://github.com/perl/docker-perl/blob/f70e8ace49994efef8e90cbf730554a3e3201da7/5.036.000-main-bullseye/Dockerfile) +- [`5.36.0-buster`, `5.36-buster`, `5-buster`, `buster`](https://github.com/perl/docker-perl/blob/f70e8ace49994efef8e90cbf730554a3e3201da7/5.036.000-main-buster/Dockerfile) +- [`5.36.0-slim`, `5.36-slim`, `5-slim`, `slim`, `5.36.0-slim-bullseye`, `5.36-slim-bullseye`, `5-slim-bullseye`, `slim-bullseye`](https://github.com/perl/docker-perl/blob/f70e8ace49994efef8e90cbf730554a3e3201da7/5.036.000-slim-bullseye/Dockerfile) +- [`5.36.0-slim-buster`, `5.36-slim-buster`, `5-slim-buster`, `slim-buster`](https://github.com/perl/docker-perl/blob/f70e8ace49994efef8e90cbf730554a3e3201da7/5.036.000-slim-buster/Dockerfile) +- [`5.36.0-threaded`, `5.36-threaded`, `5-threaded`, `threaded`, `5.36.0-threaded-bullseye`, `5.36-threaded-bullseye`, `5-threaded-bullseye`, `threaded-bullseye`](https://github.com/perl/docker-perl/blob/f70e8ace49994efef8e90cbf730554a3e3201da7/5.036.000-main,threaded-bullseye/Dockerfile) +- [`5.36.0-threaded-buster`, `5.36-threaded-buster`, `5-threaded-buster`, `threaded-buster`](https://github.com/perl/docker-perl/blob/f70e8ace49994efef8e90cbf730554a3e3201da7/5.036.000-main,threaded-buster/Dockerfile) +- [`5.36.0-slim-threaded`, `5.36-slim-threaded`, `5-slim-threaded`, `slim-threaded`, `5.36.0-slim-threaded-bullseye`, `5.36-slim-threaded-bullseye`, `5-slim-threaded-bullseye`, `slim-threaded-bullseye`](https://github.com/perl/docker-perl/blob/f70e8ace49994efef8e90cbf730554a3e3201da7/5.036.000-slim,threaded-bullseye/Dockerfile) +- [`5.36.0-slim-threaded-buster`, `5.36-slim-threaded-buster`, `5-slim-threaded-buster`, `slim-threaded-buster`](https://github.com/perl/docker-perl/blob/f70e8ace49994efef8e90cbf730554a3e3201da7/5.036.000-slim,threaded-buster/Dockerfile) +- [`5.34.1`, `5.34`, `5.34.1-bullseye`, `5.34-bullseye`](https://github.com/perl/docker-perl/blob/f70e8ace49994efef8e90cbf730554a3e3201da7/5.034.001-main-bullseye/Dockerfile) +- [`5.34.1-buster`, `5.34-buster`](https://github.com/perl/docker-perl/blob/f70e8ace49994efef8e90cbf730554a3e3201da7/5.034.001-main-buster/Dockerfile) +- [`5.34.1-slim`, `5.34-slim`, `5.34.1-slim-bullseye`, `5.34-slim-bullseye`](https://github.com/perl/docker-perl/blob/f70e8ace49994efef8e90cbf730554a3e3201da7/5.034.001-slim-bullseye/Dockerfile) +- [`5.34.1-slim-buster`, `5.34-slim-buster`](https://github.com/perl/docker-perl/blob/f70e8ace49994efef8e90cbf730554a3e3201da7/5.034.001-slim-buster/Dockerfile) +- [`5.34.1-threaded`, `5.34-threaded`, `5.34.1-threaded-bullseye`, `5.34-threaded-bullseye`](https://github.com/perl/docker-perl/blob/f70e8ace49994efef8e90cbf730554a3e3201da7/5.034.001-main,threaded-bullseye/Dockerfile) +- [`5.34.1-threaded-buster`, `5.34-threaded-buster`](https://github.com/perl/docker-perl/blob/f70e8ace49994efef8e90cbf730554a3e3201da7/5.034.001-main,threaded-buster/Dockerfile) +- [`5.34.1-slim-threaded`, `5.34-slim-threaded`, `5.34.1-slim-threaded-bullseye`, `5.34-slim-threaded-bullseye`](https://github.com/perl/docker-perl/blob/f70e8ace49994efef8e90cbf730554a3e3201da7/5.034.001-slim,threaded-bullseye/Dockerfile) +- [`5.34.1-slim-threaded-buster`, `5.34-slim-threaded-buster`](https://github.com/perl/docker-perl/blob/f70e8ace49994efef8e90cbf730554a3e3201da7/5.034.001-slim,threaded-buster/Dockerfile) +- [`5.32.1`, `5.32`, `5.32.1-bullseye`, `5.32-bullseye`](https://github.com/perl/docker-perl/blob/f70e8ace49994efef8e90cbf730554a3e3201da7/5.032.001-main-bullseye/Dockerfile) +- [`5.32.1-buster`, `5.32-buster`](https://github.com/perl/docker-perl/blob/f70e8ace49994efef8e90cbf730554a3e3201da7/5.032.001-main-buster/Dockerfile) +- [`5.32.1-slim`, `5.32-slim`, `5.32.1-slim-bullseye`, `5.32-slim-bullseye`](https://github.com/perl/docker-perl/blob/f70e8ace49994efef8e90cbf730554a3e3201da7/5.032.001-slim-bullseye/Dockerfile) +- [`5.32.1-slim-buster`, `5.32-slim-buster`](https://github.com/perl/docker-perl/blob/f70e8ace49994efef8e90cbf730554a3e3201da7/5.032.001-slim-buster/Dockerfile) +- [`5.32.1-threaded`, `5.32-threaded`, `5.32.1-threaded-bullseye`, `5.32-threaded-bullseye`](https://github.com/perl/docker-perl/blob/f70e8ace49994efef8e90cbf730554a3e3201da7/5.032.001-main,threaded-bullseye/Dockerfile) +- [`5.32.1-threaded-buster`, `5.32-threaded-buster`](https://github.com/perl/docker-perl/blob/f70e8ace49994efef8e90cbf730554a3e3201da7/5.032.001-main,threaded-buster/Dockerfile) +- [`5.32.1-slim-threaded`, `5.32-slim-threaded`, `5.32.1-slim-threaded-bullseye`, `5.32-slim-threaded-bullseye`](https://github.com/perl/docker-perl/blob/f70e8ace49994efef8e90cbf730554a3e3201da7/5.032.001-slim,threaded-bullseye/Dockerfile) +- [`5.32.1-slim-threaded-buster`, `5.32-slim-threaded-buster`](https://github.com/perl/docker-perl/blob/f70e8ace49994efef8e90cbf730554a3e3201da7/5.032.001-slim,threaded-buster/Dockerfile) # Quick reference (cont.) @@ -55,14 +55,14 @@ WARNING: [https://github.com/Perl/docker-perl/issues](https://github.com/Perl/docker-perl/issues) - **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) - [`amd64`](https://hub.docker.com/r/amd64/perl/), [`arm32v7`](https://hub.docker.com/r/arm32v7/perl/), [`arm64v8`](https://hub.docker.com/r/arm64v8/perl/), [`i386`](https://hub.docker.com/r/i386/perl/), [`ppc64le`](https://hub.docker.com/r/ppc64le/perl/), [`s390x`](https://hub.docker.com/r/s390x/perl/) + [`amd64`](https://hub.docker.com/r/amd64/perl/), [`arm32v5`](https://hub.docker.com/r/arm32v5/perl/), [`arm32v7`](https://hub.docker.com/r/arm32v7/perl/), [`arm64v8`](https://hub.docker.com/r/arm64v8/perl/), [`i386`](https://hub.docker.com/r/i386/perl/), [`mips64le`](https://hub.docker.com/r/mips64le/perl/), [`ppc64le`](https://hub.docker.com/r/ppc64le/perl/), [`s390x`](https://hub.docker.com/r/s390x/perl/) - **Published image artifact details**: [repo-info repo's `repos/perl/` directory](https://github.com/docker-library/repo-info/blob/master/repos/perl) ([history](https://github.com/docker-library/repo-info/commits/master/repos/perl)) (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/perl`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fperl) + [official-images repo's `library/perl` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fperl) [official-images repo's `library/perl` file](https://github.com/docker-library/official-images/blob/master/library/perl) ([history](https://github.com/docker-library/official-images/commits/master/library/perl)) - **Source of this description**: @@ -81,7 +81,7 @@ Perl is a high-level, general-purpose, interpreted, dynamic programming language ## Create a `Dockerfile` in your Perl app project ```dockerfile -FROM perl:5.20 +FROM perl:5.34 COPY . /usr/src/myapp WORKDIR /usr/src/myapp CMD [ "perl", "./your-daemon-or-script.pl" ] @@ -99,15 +99,23 @@ $ docker run -it --rm --name my-running-app my-perl-app For many simple, single file projects, you may find it inconvenient to write a complete `Dockerfile`. In such cases, you can run a Perl script by using the Perl Docker image directly: ```console -$ docker run -it --rm --name my-running-script -v "$PWD":/usr/src/myapp -w /usr/src/myapp perl:5.20 perl your-daemon-or-script.pl +$ docker run -it --rm --name my-running-script -v "$PWD":/usr/src/myapp -w /usr/src/myapp perl:5.34 perl your-daemon-or-script.pl ``` +## Coexisting with Debian's `/usr/bin/perl` + +The *perl* binary built for this image is installed in `/usr/local/bin/perl`, along with other standard tools in the Perl distribution such as `prove` and `perldoc`, as well as [`cpanm`](https://metacpan.org/pod/App::cpanminus) for installing [CPAN](https://www.cpan.org) modules. Containers running this image will also have their `PATH` enviroment set like `/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin` to ensure that this *perl* binary will be found *first* in normal usage. + +As this official image of Docker is built using the [buildpack-deps](https://hub.docker.com/_/buildpack-deps) image (or [debian:slim](https://hub.docker.com/_/debian) for `:slim` variants,) this image also contains a `/usr/bin/perl` as supplied by the [Debian](https://www.debian.org) project. This is needed for the underlying [dpkg](https://en.wikipedia.org/wiki/Dpkg)/[apt](https://en.wikipedia.org/wiki/APT_(software)) package management tools to work correctly, as docker-perl cannot be used here due to different configuration (such as `@INC` and installation paths, as well as other differences like whether `-Dusethreads` is included or not.) + +See also [Perl/docker-perl#26](https://github.com/Perl/docker-perl/issues/26) for an extended discussion. + ## Signal handling behavior notice As Perl will run as PID 1 by default in containers (unless an [ENTRYPOINT](https://docs.docker.com/engine/reference/builder/#entrypoint) is set,) special care needs to be considered when expecting to send signals (particularly SIGINT or SIGTERM) to it. For example, running ```console -$ docker run -it --name sleeping_beauty --rm perl:5.20 perl -E 'sleep 300' +$ docker run -it --name sleeping_beauty --rm perl:5.34 perl -E 'sleep 300' ``` and doing on another terminal, @@ -119,7 +127,7 @@ $ docker exec sleeping_beauty kill 1 will *not* stop the perl running on the `sleeping_beauty` container (it will keep running until the `sleep 300` finishes.) To do so, one must set a signal handler like this: ```console -$ docker run -it --name quick_nap --rm perl:5.20 perl -E '$SIG{TERM} = sub { $sig++; say "recv TERM" }; sleep 300; say "waking up" if $sig' +$ docker run -it --name quick_nap --rm perl:5.34 perl -E '$SIG{TERM} = sub { $sig++; say "recv TERM" }; sleep 300; say "waking up" if $sig' ``` so doing `docker exec quick_nap kill 1` (or the simpler `docker stop quick_nap`) will immediately stop the container, and print `recv TERM` in the other terminal. Note that the signal handler does not stop the perl process itself unless it calls a `die` or `exit`; in this case, perl will continue and print `waking up` *after* it receives the signal. @@ -133,13 +141,13 @@ See also [Signals in perlipc](https://perldoc.pl/perlipc#Signals) as well as [Pe Suppose you have a project that uses [Carton](https://metacpan.org/pod/Carton) to manage Perl dependencies. You can create a `perl:carton` image that makes use of the [ONBUILD](https://docs.docker.com/engine/reference/builder/#onbuild) instruction in its `Dockerfile`, like this: ```dockerfile -FROM perl:5.26 +FROM perl:5.34 RUN cpanm Carton \ && mkdir -p /usr/src/app WORKDIR /usr/src/app -ONBUILD COPY cpanfile* /usr/src/myapp +ONBUILD COPY cpanfile* /usr/src/app ONBUILD RUN carton install ONBUILD COPY . /usr/src/app @@ -160,7 +168,7 @@ The `perl` images come in many flavors, each designed for a specific use case. 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. -Some of these tags may have names like buster or stretch 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. +Some of these tags may have names like bullseye or buster 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. 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. diff --git a/perl/content.md b/perl/content.md index bbaa6841c98b..298e648c158b 100644 --- a/perl/content.md +++ b/perl/content.md @@ -11,7 +11,7 @@ Perl is a high-level, general-purpose, interpreted, dynamic programming language ## Create a `Dockerfile` in your Perl app project ```dockerfile -FROM %%IMAGE%%:5.20 +FROM %%IMAGE%%:5.34 COPY . /usr/src/myapp WORKDIR /usr/src/myapp CMD [ "perl", "./your-daemon-or-script.pl" ] @@ -29,15 +29,23 @@ $ docker run -it --rm --name my-running-app my-perl-app For many simple, single file projects, you may find it inconvenient to write a complete `Dockerfile`. In such cases, you can run a Perl script by using the Perl Docker image directly: ```console -$ docker run -it --rm --name my-running-script -v "$PWD":/usr/src/myapp -w /usr/src/myapp %%IMAGE%%:5.20 perl your-daemon-or-script.pl +$ docker run -it --rm --name my-running-script -v "$PWD":/usr/src/myapp -w /usr/src/myapp %%IMAGE%%:5.34 perl your-daemon-or-script.pl ``` +## Coexisting with Debian's `/usr/bin/perl` + +The *perl* binary built for this image is installed in `/usr/local/bin/perl`, along with other standard tools in the Perl distribution such as `prove` and `perldoc`, as well as [`cpanm`](https://metacpan.org/pod/App::cpanminus) for installing [CPAN](https://www.cpan.org) modules. Containers running this image will also have their `PATH` enviroment set like `/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin` to ensure that this *perl* binary will be found *first* in normal usage. + +As this official image of Docker is built using the [buildpack-deps](https://hub.docker.com/_/buildpack-deps) image (or [debian:slim](https://hub.docker.com/_/debian) for `:slim` variants,) this image also contains a `/usr/bin/perl` as supplied by the [Debian](https://www.debian.org) project. This is needed for the underlying [dpkg](https://en.wikipedia.org/wiki/Dpkg)/[apt](https://en.wikipedia.org/wiki/APT_(software)) package management tools to work correctly, as docker-perl cannot be used here due to different configuration (such as `@INC` and installation paths, as well as other differences like whether `-Dusethreads` is included or not.) + +See also [Perl/docker-perl#26](https://github.com/Perl/docker-perl/issues/26) for an extended discussion. + ## Signal handling behavior notice As Perl will run as PID 1 by default in containers (unless an [ENTRYPOINT](https://docs.docker.com/engine/reference/builder/#entrypoint) is set,) special care needs to be considered when expecting to send signals (particularly SIGINT or SIGTERM) to it. For example, running ```console -$ docker run -it --name sleeping_beauty --rm %%IMAGE%%:5.20 perl -E 'sleep 300' +$ docker run -it --name sleeping_beauty --rm %%IMAGE%%:5.34 perl -E 'sleep 300' ``` and doing on another terminal, @@ -49,7 +57,7 @@ $ docker exec sleeping_beauty kill 1 will *not* stop the perl running on the `sleeping_beauty` container (it will keep running until the `sleep 300` finishes.) To do so, one must set a signal handler like this: ```console -$ docker run -it --name quick_nap --rm %%IMAGE%%:5.20 perl -E '$SIG{TERM} = sub { $sig++; say "recv TERM" }; sleep 300; say "waking up" if $sig' +$ docker run -it --name quick_nap --rm %%IMAGE%%:5.34 perl -E '$SIG{TERM} = sub { $sig++; say "recv TERM" }; sleep 300; say "waking up" if $sig' ``` so doing `docker exec quick_nap kill 1` (or the simpler `docker stop quick_nap`) will immediately stop the container, and print `recv TERM` in the other terminal. Note that the signal handler does not stop the perl process itself unless it calls a `die` or `exit`; in this case, perl will continue and print `waking up` *after* it receives the signal. @@ -63,13 +71,13 @@ See also [Signals in perlipc](https://perldoc.pl/perlipc#Signals) as well as [Pe Suppose you have a project that uses [Carton](https://metacpan.org/pod/Carton) to manage Perl dependencies. You can create a `%%IMAGE%%:carton` image that makes use of the [ONBUILD](https://docs.docker.com/engine/reference/builder/#onbuild) instruction in its `Dockerfile`, like this: ```dockerfile -FROM %%IMAGE%%:5.26 +FROM %%IMAGE%%:5.34 RUN cpanm Carton \ && mkdir -p /usr/src/app WORKDIR /usr/src/app -ONBUILD COPY cpanfile* /usr/src/myapp +ONBUILD COPY cpanfile* /usr/src/app ONBUILD RUN carton install ONBUILD COPY . /usr/src/app diff --git a/photon/README.md b/photon/README.md index be3816ea179f..eadcc028bf62 100644 --- a/photon/README.md +++ b/photon/README.md @@ -20,13 +20,13 @@ WARNING: [VMware](https://github.com/vmware/photon-docker-image) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`3.0`, `3.0-20200424`, `latest`](https://github.com/vmware/photon-docker-image/blob/5a5ac7caccd1299e9481bac190806d89e5010615/docker/Dockerfile) -- [`1.0`, `1.0-20200515`](https://github.com/vmware/photon-docker-image/blob/4b3fff6435e5889c3e4fc89af12016365676ac20/docker/Dockerfile) -- [`2.0`, `2.0-20200515`](https://github.com/vmware/photon-docker-image/blob/099e5627d6a2911fc39bd4c161a15950e22de9ea/docker/Dockerfile) +- [`4.0`, `4.0-20230109`, `latest`](https://github.com/vmware/photon-docker-image/blob/e68ca5632dc2024988b06919cb9d38701331e0e5/docker/Dockerfile) +- [`3.0`, `3.0-20221224`](https://github.com/vmware/photon-docker-image/blob/7c169ad02494a1007e048757a55fb6f4f704449f/docker/Dockerfile) +- [`2.0`, `2.0-20221224`](https://github.com/vmware/photon-docker-image/blob/d420ffbab4ff9e1045217855073736775472694a/docker/Dockerfile) # Quick reference (cont.) @@ -41,7 +41,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/photon`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fphoton) + [official-images repo's `library/photon` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fphoton) [official-images repo's `library/photon` file](https://github.com/docker-library/official-images/blob/master/library/photon) ([history](https://github.com/docker-library/official-images/commits/master/library/photon)) - **Source of this description**: diff --git a/php-zendserver/README.md b/php-zendserver/README.md index ef22640ba15f..6640f6f3282d 100644 --- a/php-zendserver/README.md +++ b/php-zendserver/README.md @@ -20,13 +20,14 @@ WARNING: [Perforce Software, Inc.](https://github.com/zendtech/php-zendserver-docker) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`8.5`, `8.5-php5.6`, `5.6`](https://github.com/zendtech/php-zendserver-docker/blob/9dbdde8ed975da58a8bfdefeedf1e37ea24034f9/8.5/5.6/Dockerfile) -- [`9.1`](https://github.com/zendtech/php-zendserver-docker/blob/9dbdde8ed975da58a8bfdefeedf1e37ea24034f9/9.1/7.1/Dockerfile) -- [`2019.0`, `latest`](https://github.com/zendtech/php-zendserver-docker/blob/9dbdde8ed975da58a8bfdefeedf1e37ea24034f9/2019.0/Dockerfile) +- [`8.5`, `8.5-php5.6`, `5.6`](https://github.com/zendtech/php-zendserver-docker/blob/bcd65b82acb4f3b5b67f8c657c52f08bc52d8789/8.5/5.6/Dockerfile) +- [`9.1`](https://github.com/zendtech/php-zendserver-docker/blob/bcd65b82acb4f3b5b67f8c657c52f08bc52d8789/9.1/7.1/Dockerfile) +- [`2019.0`](https://github.com/zendtech/php-zendserver-docker/blob/bcd65b82acb4f3b5b67f8c657c52f08bc52d8789/2019.0/Dockerfile) +- [`2021.0`, `latest`](https://github.com/zendtech/php-zendserver-docker/blob/bcd65b82acb4f3b5b67f8c657c52f08bc52d8789/2021.0/Dockerfile) # Quick reference (cont.) @@ -41,7 +42,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/php-zendserver`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fphp-zendserver) + [official-images repo's `library/php-zendserver` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fphp-zendserver) [official-images repo's `library/php-zendserver` file](https://github.com/docker-library/official-images/blob/master/library/php-zendserver) ([history](https://github.com/docker-library/official-images/commits/master/library/php-zendserver)) - **Source of this description**: diff --git a/php/README.md b/php/README.md index cba286e36e0c..8e9c80ee9eaf 100644 --- a/php/README.md +++ b/php/README.md @@ -20,48 +20,49 @@ WARNING: [the Docker Community](https://github.com/docker-library/php) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`7.4.6-cli-buster`, `7.4-cli-buster`, `7-cli-buster`, `cli-buster`, `7.4.6-buster`, `7.4-buster`, `7-buster`, `buster`, `7.4.6-cli`, `7.4-cli`, `7-cli`, `cli`, `7.4.6`, `7.4`, `7`, `latest`](https://github.com/docker-library/php/blob/8c6d1f42185d2a3cd22f381ba4bcd95ec52fa31f/7.4/buster/cli/Dockerfile) -- [`7.4.6-apache-buster`, `7.4-apache-buster`, `7-apache-buster`, `apache-buster`, `7.4.6-apache`, `7.4-apache`, `7-apache`, `apache`](https://github.com/docker-library/php/blob/8c6d1f42185d2a3cd22f381ba4bcd95ec52fa31f/7.4/buster/apache/Dockerfile) -- [`7.4.6-fpm-buster`, `7.4-fpm-buster`, `7-fpm-buster`, `fpm-buster`, `7.4.6-fpm`, `7.4-fpm`, `7-fpm`, `fpm`](https://github.com/docker-library/php/blob/8c6d1f42185d2a3cd22f381ba4bcd95ec52fa31f/7.4/buster/fpm/Dockerfile) -- [`7.4.6-zts-buster`, `7.4-zts-buster`, `7-zts-buster`, `zts-buster`, `7.4.6-zts`, `7.4-zts`, `7-zts`, `zts`](https://github.com/docker-library/php/blob/8c6d1f42185d2a3cd22f381ba4bcd95ec52fa31f/7.4/buster/zts/Dockerfile) -- [`7.4.6-cli-alpine3.11`, `7.4-cli-alpine3.11`, `7-cli-alpine3.11`, `cli-alpine3.11`, `7.4.6-alpine3.11`, `7.4-alpine3.11`, `7-alpine3.11`, `alpine3.11`, `7.4.6-cli-alpine`, `7.4-cli-alpine`, `7-cli-alpine`, `cli-alpine`, `7.4.6-alpine`, `7.4-alpine`, `7-alpine`, `alpine`](https://github.com/docker-library/php/blob/8c6d1f42185d2a3cd22f381ba4bcd95ec52fa31f/7.4/alpine3.11/cli/Dockerfile) -- [`7.4.6-fpm-alpine3.11`, `7.4-fpm-alpine3.11`, `7-fpm-alpine3.11`, `fpm-alpine3.11`, `7.4.6-fpm-alpine`, `7.4-fpm-alpine`, `7-fpm-alpine`, `fpm-alpine`](https://github.com/docker-library/php/blob/8c6d1f42185d2a3cd22f381ba4bcd95ec52fa31f/7.4/alpine3.11/fpm/Dockerfile) -- [`7.4.6-zts-alpine3.11`, `7.4-zts-alpine3.11`, `7-zts-alpine3.11`, `zts-alpine3.11`, `7.4.6-zts-alpine`, `7.4-zts-alpine`, `7-zts-alpine`, `zts-alpine`](https://github.com/docker-library/php/blob/8c6d1f42185d2a3cd22f381ba4bcd95ec52fa31f/7.4/alpine3.11/zts/Dockerfile) -- [`7.4.6-cli-alpine3.10`, `7.4-cli-alpine3.10`, `7-cli-alpine3.10`, `cli-alpine3.10`, `7.4.6-alpine3.10`, `7.4-alpine3.10`, `7-alpine3.10`, `alpine3.10`](https://github.com/docker-library/php/blob/8c6d1f42185d2a3cd22f381ba4bcd95ec52fa31f/7.4/alpine3.10/cli/Dockerfile) -- [`7.4.6-fpm-alpine3.10`, `7.4-fpm-alpine3.10`, `7-fpm-alpine3.10`, `fpm-alpine3.10`](https://github.com/docker-library/php/blob/8c6d1f42185d2a3cd22f381ba4bcd95ec52fa31f/7.4/alpine3.10/fpm/Dockerfile) -- [`7.4.6-zts-alpine3.10`, `7.4-zts-alpine3.10`, `7-zts-alpine3.10`, `zts-alpine3.10`](https://github.com/docker-library/php/blob/8c6d1f42185d2a3cd22f381ba4bcd95ec52fa31f/7.4/alpine3.10/zts/Dockerfile) -- [`7.3.18-cli-buster`, `7.3-cli-buster`, `7.3.18-buster`, `7.3-buster`, `7.3.18-cli`, `7.3-cli`, `7.3.18`, `7.3`](https://github.com/docker-library/php/blob/a3cf31c9020559777c731d980047450cba744122/7.3/buster/cli/Dockerfile) -- [`7.3.18-apache-buster`, `7.3-apache-buster`, `7.3.18-apache`, `7.3-apache`](https://github.com/docker-library/php/blob/a3cf31c9020559777c731d980047450cba744122/7.3/buster/apache/Dockerfile) -- [`7.3.18-fpm-buster`, `7.3-fpm-buster`, `7.3.18-fpm`, `7.3-fpm`](https://github.com/docker-library/php/blob/a3cf31c9020559777c731d980047450cba744122/7.3/buster/fpm/Dockerfile) -- [`7.3.18-zts-buster`, `7.3-zts-buster`, `7.3.18-zts`, `7.3-zts`](https://github.com/docker-library/php/blob/a3cf31c9020559777c731d980047450cba744122/7.3/buster/zts/Dockerfile) -- [`7.3.18-cli-stretch`, `7.3-cli-stretch`, `7.3.18-stretch`, `7.3-stretch`](https://github.com/docker-library/php/blob/a3cf31c9020559777c731d980047450cba744122/7.3/stretch/cli/Dockerfile) -- [`7.3.18-apache-stretch`, `7.3-apache-stretch`](https://github.com/docker-library/php/blob/a3cf31c9020559777c731d980047450cba744122/7.3/stretch/apache/Dockerfile) -- [`7.3.18-fpm-stretch`, `7.3-fpm-stretch`](https://github.com/docker-library/php/blob/a3cf31c9020559777c731d980047450cba744122/7.3/stretch/fpm/Dockerfile) -- [`7.3.18-zts-stretch`, `7.3-zts-stretch`](https://github.com/docker-library/php/blob/a3cf31c9020559777c731d980047450cba744122/7.3/stretch/zts/Dockerfile) -- [`7.3.18-cli-alpine3.11`, `7.3-cli-alpine3.11`, `7.3.18-alpine3.11`, `7.3-alpine3.11`, `7.3.18-cli-alpine`, `7.3-cli-alpine`, `7.3.18-alpine`, `7.3-alpine`](https://github.com/docker-library/php/blob/a3cf31c9020559777c731d980047450cba744122/7.3/alpine3.11/cli/Dockerfile) -- [`7.3.18-fpm-alpine3.11`, `7.3-fpm-alpine3.11`, `7.3.18-fpm-alpine`, `7.3-fpm-alpine`](https://github.com/docker-library/php/blob/a3cf31c9020559777c731d980047450cba744122/7.3/alpine3.11/fpm/Dockerfile) -- [`7.3.18-zts-alpine3.11`, `7.3-zts-alpine3.11`, `7.3.18-zts-alpine`, `7.3-zts-alpine`](https://github.com/docker-library/php/blob/a3cf31c9020559777c731d980047450cba744122/7.3/alpine3.11/zts/Dockerfile) -- [`7.3.18-cli-alpine3.10`, `7.3-cli-alpine3.10`, `7.3.18-alpine3.10`, `7.3-alpine3.10`](https://github.com/docker-library/php/blob/a3cf31c9020559777c731d980047450cba744122/7.3/alpine3.10/cli/Dockerfile) -- [`7.3.18-fpm-alpine3.10`, `7.3-fpm-alpine3.10`](https://github.com/docker-library/php/blob/a3cf31c9020559777c731d980047450cba744122/7.3/alpine3.10/fpm/Dockerfile) -- [`7.3.18-zts-alpine3.10`, `7.3-zts-alpine3.10`](https://github.com/docker-library/php/blob/a3cf31c9020559777c731d980047450cba744122/7.3/alpine3.10/zts/Dockerfile) -- [`7.2.31-cli-buster`, `7.2-cli-buster`, `7.2.31-buster`, `7.2-buster`, `7.2.31-cli`, `7.2-cli`, `7.2.31`, `7.2`](https://github.com/docker-library/php/blob/057b438e69093c927a84cce4308c7ad08ccdd5b0/7.2/buster/cli/Dockerfile) -- [`7.2.31-apache-buster`, `7.2-apache-buster`, `7.2.31-apache`, `7.2-apache`](https://github.com/docker-library/php/blob/057b438e69093c927a84cce4308c7ad08ccdd5b0/7.2/buster/apache/Dockerfile) -- [`7.2.31-fpm-buster`, `7.2-fpm-buster`, `7.2.31-fpm`, `7.2-fpm`](https://github.com/docker-library/php/blob/057b438e69093c927a84cce4308c7ad08ccdd5b0/7.2/buster/fpm/Dockerfile) -- [`7.2.31-zts-buster`, `7.2-zts-buster`, `7.2.31-zts`, `7.2-zts`](https://github.com/docker-library/php/blob/057b438e69093c927a84cce4308c7ad08ccdd5b0/7.2/buster/zts/Dockerfile) -- [`7.2.31-cli-stretch`, `7.2-cli-stretch`, `7.2.31-stretch`, `7.2-stretch`](https://github.com/docker-library/php/blob/057b438e69093c927a84cce4308c7ad08ccdd5b0/7.2/stretch/cli/Dockerfile) -- [`7.2.31-apache-stretch`, `7.2-apache-stretch`](https://github.com/docker-library/php/blob/057b438e69093c927a84cce4308c7ad08ccdd5b0/7.2/stretch/apache/Dockerfile) -- [`7.2.31-fpm-stretch`, `7.2-fpm-stretch`](https://github.com/docker-library/php/blob/057b438e69093c927a84cce4308c7ad08ccdd5b0/7.2/stretch/fpm/Dockerfile) -- [`7.2.31-zts-stretch`, `7.2-zts-stretch`](https://github.com/docker-library/php/blob/057b438e69093c927a84cce4308c7ad08ccdd5b0/7.2/stretch/zts/Dockerfile) -- [`7.2.31-cli-alpine3.11`, `7.2-cli-alpine3.11`, `7.2.31-alpine3.11`, `7.2-alpine3.11`, `7.2.31-cli-alpine`, `7.2-cli-alpine`, `7.2.31-alpine`, `7.2-alpine`](https://github.com/docker-library/php/blob/057b438e69093c927a84cce4308c7ad08ccdd5b0/7.2/alpine3.11/cli/Dockerfile) -- [`7.2.31-fpm-alpine3.11`, `7.2-fpm-alpine3.11`, `7.2.31-fpm-alpine`, `7.2-fpm-alpine`](https://github.com/docker-library/php/blob/057b438e69093c927a84cce4308c7ad08ccdd5b0/7.2/alpine3.11/fpm/Dockerfile) -- [`7.2.31-zts-alpine3.11`, `7.2-zts-alpine3.11`, `7.2.31-zts-alpine`, `7.2-zts-alpine`](https://github.com/docker-library/php/blob/057b438e69093c927a84cce4308c7ad08ccdd5b0/7.2/alpine3.11/zts/Dockerfile) -- [`7.2.31-cli-alpine3.10`, `7.2-cli-alpine3.10`, `7.2.31-alpine3.10`, `7.2-alpine3.10`](https://github.com/docker-library/php/blob/057b438e69093c927a84cce4308c7ad08ccdd5b0/7.2/alpine3.10/cli/Dockerfile) -- [`7.2.31-fpm-alpine3.10`, `7.2-fpm-alpine3.10`](https://github.com/docker-library/php/blob/057b438e69093c927a84cce4308c7ad08ccdd5b0/7.2/alpine3.10/fpm/Dockerfile) -- [`7.2.31-zts-alpine3.10`, `7.2-zts-alpine3.10`](https://github.com/docker-library/php/blob/057b438e69093c927a84cce4308c7ad08ccdd5b0/7.2/alpine3.10/zts/Dockerfile) +- [`8.2.1-cli-bullseye`, `8.2-cli-bullseye`, `8-cli-bullseye`, `cli-bullseye`, `8.2.1-bullseye`, `8.2-bullseye`, `8-bullseye`, `bullseye`, `8.2.1-cli`, `8.2-cli`, `8-cli`, `cli`, `8.2.1`, `8.2`, `8`, `latest`](https://github.com/docker-library/php/blob/fdf3f68e6132f2a339897f3a5a3e118a5bf40ded/8.2/bullseye/cli/Dockerfile) +- [`8.2.1-apache-bullseye`, `8.2-apache-bullseye`, `8-apache-bullseye`, `apache-bullseye`, `8.2.1-apache`, `8.2-apache`, `8-apache`, `apache`](https://github.com/docker-library/php/blob/fdf3f68e6132f2a339897f3a5a3e118a5bf40ded/8.2/bullseye/apache/Dockerfile) +- [`8.2.1-fpm-bullseye`, `8.2-fpm-bullseye`, `8-fpm-bullseye`, `fpm-bullseye`, `8.2.1-fpm`, `8.2-fpm`, `8-fpm`, `fpm`](https://github.com/docker-library/php/blob/fdf3f68e6132f2a339897f3a5a3e118a5bf40ded/8.2/bullseye/fpm/Dockerfile) +- [`8.2.1-zts-bullseye`, `8.2-zts-bullseye`, `8-zts-bullseye`, `zts-bullseye`, `8.2.1-zts`, `8.2-zts`, `8-zts`, `zts`](https://github.com/docker-library/php/blob/fdf3f68e6132f2a339897f3a5a3e118a5bf40ded/8.2/bullseye/zts/Dockerfile) +- [`8.2.1-cli-buster`, `8.2-cli-buster`, `8-cli-buster`, `cli-buster`, `8.2.1-buster`, `8.2-buster`, `8-buster`, `buster`](https://github.com/docker-library/php/blob/fdf3f68e6132f2a339897f3a5a3e118a5bf40ded/8.2/buster/cli/Dockerfile) +- [`8.2.1-apache-buster`, `8.2-apache-buster`, `8-apache-buster`, `apache-buster`](https://github.com/docker-library/php/blob/fdf3f68e6132f2a339897f3a5a3e118a5bf40ded/8.2/buster/apache/Dockerfile) +- [`8.2.1-fpm-buster`, `8.2-fpm-buster`, `8-fpm-buster`, `fpm-buster`](https://github.com/docker-library/php/blob/fdf3f68e6132f2a339897f3a5a3e118a5bf40ded/8.2/buster/fpm/Dockerfile) +- [`8.2.1-zts-buster`, `8.2-zts-buster`, `8-zts-buster`, `zts-buster`](https://github.com/docker-library/php/blob/fdf3f68e6132f2a339897f3a5a3e118a5bf40ded/8.2/buster/zts/Dockerfile) +- [`8.2.1-cli-alpine3.17`, `8.2-cli-alpine3.17`, `8-cli-alpine3.17`, `cli-alpine3.17`, `8.2.1-alpine3.17`, `8.2-alpine3.17`, `8-alpine3.17`, `alpine3.17`, `8.2.1-cli-alpine`, `8.2-cli-alpine`, `8-cli-alpine`, `cli-alpine`, `8.2.1-alpine`, `8.2-alpine`, `8-alpine`, `alpine`](https://github.com/docker-library/php/blob/fdf3f68e6132f2a339897f3a5a3e118a5bf40ded/8.2/alpine3.17/cli/Dockerfile) +- [`8.2.1-fpm-alpine3.17`, `8.2-fpm-alpine3.17`, `8-fpm-alpine3.17`, `fpm-alpine3.17`, `8.2.1-fpm-alpine`, `8.2-fpm-alpine`, `8-fpm-alpine`, `fpm-alpine`](https://github.com/docker-library/php/blob/fdf3f68e6132f2a339897f3a5a3e118a5bf40ded/8.2/alpine3.17/fpm/Dockerfile) +- [`8.2.1-zts-alpine3.17`, `8.2-zts-alpine3.17`, `8-zts-alpine3.17`, `zts-alpine3.17`, `8.2.1-zts-alpine`, `8.2-zts-alpine`, `8-zts-alpine`, `zts-alpine`](https://github.com/docker-library/php/blob/fdf3f68e6132f2a339897f3a5a3e118a5bf40ded/8.2/alpine3.17/zts/Dockerfile) +- [`8.2.1-cli-alpine3.16`, `8.2-cli-alpine3.16`, `8-cli-alpine3.16`, `cli-alpine3.16`, `8.2.1-alpine3.16`, `8.2-alpine3.16`, `8-alpine3.16`, `alpine3.16`](https://github.com/docker-library/php/blob/fdf3f68e6132f2a339897f3a5a3e118a5bf40ded/8.2/alpine3.16/cli/Dockerfile) +- [`8.2.1-fpm-alpine3.16`, `8.2-fpm-alpine3.16`, `8-fpm-alpine3.16`, `fpm-alpine3.16`](https://github.com/docker-library/php/blob/fdf3f68e6132f2a339897f3a5a3e118a5bf40ded/8.2/alpine3.16/fpm/Dockerfile) +- [`8.2.1-zts-alpine3.16`, `8.2-zts-alpine3.16`, `8-zts-alpine3.16`, `zts-alpine3.16`](https://github.com/docker-library/php/blob/fdf3f68e6132f2a339897f3a5a3e118a5bf40ded/8.2/alpine3.16/zts/Dockerfile) +- [`8.1.14-cli-bullseye`, `8.1-cli-bullseye`, `8.1.14-bullseye`, `8.1-bullseye`, `8.1.14-cli`, `8.1-cli`, `8.1.14`, `8.1`](https://github.com/docker-library/php/blob/a4b05a8f2b992ca2e14032713b12c72cc7f545f3/8.1/bullseye/cli/Dockerfile) +- [`8.1.14-apache-bullseye`, `8.1-apache-bullseye`, `8.1.14-apache`, `8.1-apache`](https://github.com/docker-library/php/blob/a4b05a8f2b992ca2e14032713b12c72cc7f545f3/8.1/bullseye/apache/Dockerfile) +- [`8.1.14-fpm-bullseye`, `8.1-fpm-bullseye`, `8.1.14-fpm`, `8.1-fpm`](https://github.com/docker-library/php/blob/a4b05a8f2b992ca2e14032713b12c72cc7f545f3/8.1/bullseye/fpm/Dockerfile) +- [`8.1.14-zts-bullseye`, `8.1-zts-bullseye`, `8.1.14-zts`, `8.1-zts`](https://github.com/docker-library/php/blob/a4b05a8f2b992ca2e14032713b12c72cc7f545f3/8.1/bullseye/zts/Dockerfile) +- [`8.1.14-cli-buster`, `8.1-cli-buster`, `8.1.14-buster`, `8.1-buster`](https://github.com/docker-library/php/blob/a4b05a8f2b992ca2e14032713b12c72cc7f545f3/8.1/buster/cli/Dockerfile) +- [`8.1.14-apache-buster`, `8.1-apache-buster`](https://github.com/docker-library/php/blob/a4b05a8f2b992ca2e14032713b12c72cc7f545f3/8.1/buster/apache/Dockerfile) +- [`8.1.14-fpm-buster`, `8.1-fpm-buster`](https://github.com/docker-library/php/blob/a4b05a8f2b992ca2e14032713b12c72cc7f545f3/8.1/buster/fpm/Dockerfile) +- [`8.1.14-zts-buster`, `8.1-zts-buster`](https://github.com/docker-library/php/blob/a4b05a8f2b992ca2e14032713b12c72cc7f545f3/8.1/buster/zts/Dockerfile) +- [`8.1.14-cli-alpine3.17`, `8.1-cli-alpine3.17`, `8.1.14-alpine3.17`, `8.1-alpine3.17`, `8.1.14-cli-alpine`, `8.1-cli-alpine`, `8.1.14-alpine`, `8.1-alpine`](https://github.com/docker-library/php/blob/a4b05a8f2b992ca2e14032713b12c72cc7f545f3/8.1/alpine3.17/cli/Dockerfile) +- [`8.1.14-fpm-alpine3.17`, `8.1-fpm-alpine3.17`, `8.1.14-fpm-alpine`, `8.1-fpm-alpine`](https://github.com/docker-library/php/blob/a4b05a8f2b992ca2e14032713b12c72cc7f545f3/8.1/alpine3.17/fpm/Dockerfile) +- [`8.1.14-zts-alpine3.17`, `8.1-zts-alpine3.17`, `8.1.14-zts-alpine`, `8.1-zts-alpine`](https://github.com/docker-library/php/blob/a4b05a8f2b992ca2e14032713b12c72cc7f545f3/8.1/alpine3.17/zts/Dockerfile) +- [`8.1.14-cli-alpine3.16`, `8.1-cli-alpine3.16`, `8.1.14-alpine3.16`, `8.1-alpine3.16`](https://github.com/docker-library/php/blob/a4b05a8f2b992ca2e14032713b12c72cc7f545f3/8.1/alpine3.16/cli/Dockerfile) +- [`8.1.14-fpm-alpine3.16`, `8.1-fpm-alpine3.16`](https://github.com/docker-library/php/blob/a4b05a8f2b992ca2e14032713b12c72cc7f545f3/8.1/alpine3.16/fpm/Dockerfile) +- [`8.1.14-zts-alpine3.16`, `8.1-zts-alpine3.16`](https://github.com/docker-library/php/blob/a4b05a8f2b992ca2e14032713b12c72cc7f545f3/8.1/alpine3.16/zts/Dockerfile) +- [`8.0.27-cli-bullseye`, `8.0-cli-bullseye`, `8.0.27-bullseye`, `8.0-bullseye`, `8.0.27-cli`, `8.0-cli`, `8.0.27`, `8.0`](https://github.com/docker-library/php/blob/af4fd9abb0770f9dcbac5b7b8f30f20d28659c7c/8.0/bullseye/cli/Dockerfile) +- [`8.0.27-apache-bullseye`, `8.0-apache-bullseye`, `8.0.27-apache`, `8.0-apache`](https://github.com/docker-library/php/blob/af4fd9abb0770f9dcbac5b7b8f30f20d28659c7c/8.0/bullseye/apache/Dockerfile) +- [`8.0.27-fpm-bullseye`, `8.0-fpm-bullseye`, `8.0.27-fpm`, `8.0-fpm`](https://github.com/docker-library/php/blob/af4fd9abb0770f9dcbac5b7b8f30f20d28659c7c/8.0/bullseye/fpm/Dockerfile) +- [`8.0.27-zts-bullseye`, `8.0-zts-bullseye`, `8.0.27-zts`, `8.0-zts`](https://github.com/docker-library/php/blob/af4fd9abb0770f9dcbac5b7b8f30f20d28659c7c/8.0/bullseye/zts/Dockerfile) +- [`8.0.27-cli-buster`, `8.0-cli-buster`, `8.0.27-buster`, `8.0-buster`](https://github.com/docker-library/php/blob/af4fd9abb0770f9dcbac5b7b8f30f20d28659c7c/8.0/buster/cli/Dockerfile) +- [`8.0.27-apache-buster`, `8.0-apache-buster`](https://github.com/docker-library/php/blob/af4fd9abb0770f9dcbac5b7b8f30f20d28659c7c/8.0/buster/apache/Dockerfile) +- [`8.0.27-fpm-buster`, `8.0-fpm-buster`](https://github.com/docker-library/php/blob/af4fd9abb0770f9dcbac5b7b8f30f20d28659c7c/8.0/buster/fpm/Dockerfile) +- [`8.0.27-zts-buster`, `8.0-zts-buster`](https://github.com/docker-library/php/blob/af4fd9abb0770f9dcbac5b7b8f30f20d28659c7c/8.0/buster/zts/Dockerfile) +- [`8.0.27-cli-alpine3.16`, `8.0-cli-alpine3.16`, `8.0.27-alpine3.16`, `8.0-alpine3.16`, `8.0.27-cli-alpine`, `8.0-cli-alpine`, `8.0.27-alpine`, `8.0-alpine`](https://github.com/docker-library/php/blob/af4fd9abb0770f9dcbac5b7b8f30f20d28659c7c/8.0/alpine3.16/cli/Dockerfile) +- [`8.0.27-fpm-alpine3.16`, `8.0-fpm-alpine3.16`, `8.0.27-fpm-alpine`, `8.0-fpm-alpine`](https://github.com/docker-library/php/blob/af4fd9abb0770f9dcbac5b7b8f30f20d28659c7c/8.0/alpine3.16/fpm/Dockerfile) +- [`8.0.27-zts-alpine3.16`, `8.0-zts-alpine3.16`, `8.0.27-zts-alpine`, `8.0-zts-alpine`](https://github.com/docker-library/php/blob/af4fd9abb0770f9dcbac5b7b8f30f20d28659c7c/8.0/alpine3.16/zts/Dockerfile) # Quick reference (cont.) @@ -76,7 +77,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/php`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fphp) + [official-images repo's `library/php` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fphp) [official-images repo's `library/php` file](https://github.com/docker-library/official-images/blob/master/library/php) ([history](https://github.com/docker-library/official-images/commits/master/library/php)) - **Source of this description**: @@ -217,11 +218,10 @@ RUN curl -fsSL 'https://xcache.lighttpd.net/pub/Releases/3.2.0/xcache-3.2.0.tar. ## Running as an arbitrary user -For running the Apache variants as an arbitrary user, there are several choices: +For running the Apache variants as an arbitrary user, there are a couple choices: -- If your kernel [is version 4.11 or newer](https://github.com/moby/moby/issues/8460#issuecomment-312459310), you can add `--sysctl net.ipv4.ip_unprivileged_port_start=0` and then `--user` should work as it does for FPM. +- If your kernel [is version 4.11 or newer](https://github.com/moby/moby/issues/8460#issuecomment-312459310), you can add `--sysctl net.ipv4.ip_unprivileged_port_start=0` (which [will be the default in a future version of Docker](https://github.com/moby/moby/pull/41030)) and then `--user` should work as it does for FPM. - If you adjust the Apache configuration to use an "unprivileged" port (greater than 1024 by default), then `--user` should work as it does for FPM regardless of kernel version. -- Otherwise, setting `APACHE_RUN_USER` and/or `APACHE_RUN_GROUP` should have the desired effect (for example, `-e APACHE_RUN_USER=daemon` or `-e APACHE_RUN_USER=#1000` -- see [the Apache `User` directive documentation for details on the expected syntax](https://httpd.apache.org/docs/2.4/mod/mod_unixd.html#user)). For running the FPM variants as an arbitrary user, the `--user` flag to `docker run` should be used (which can accept both a username/group in the container's `/etc/passwd` file like `--user daemon` or a specific UID/GID like `--user 1000:1000`). @@ -252,16 +252,15 @@ FROM php:7.4-fpm-alpine # Use the default production configuration RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini" - -# Override with custom opcache settings -COPY config/opcache.ini $PHP_INI_DIR/conf.d/ ``` +In many production environments, it is also recommended to (build and) enable the PHP core OPcache extension for performance. See [the upstream OPcache documentation](https://www.php.net/manual/en/book.opcache.php) for more details. + # Image Variants The `php` images come in many flavors, each designed for a specific use case. -Some of these tags may have names like buster or stretch 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. +Some of these tags may have names like bullseye or buster 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. ## `php:-cli` @@ -326,11 +325,13 @@ Some potentially helpful resources: - [Stack Overflow discussion](https://stackoverflow.com/q/29905953/433558) - [Apache httpd Wiki example](https://wiki.apache.org/httpd/PHPFPMWordpress) +**WARNING:** the FastCGI protocol is inherently trusting, and thus *extremely* insecure to expose outside of a private container network -- unless you know *exactly* what you are doing (and are willing to accept the extreme risk), do not use Docker's `--publish` (`-p`) flag with this image variant. + ## `php:-alpine` -This image is based on the popular [Alpine Linux project](http://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. +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. -This variant is highly recommended when final image size being as small as possible is desired. The main caveat to note is that it does use [musl libc](http://www.musl-libc.org) instead of [glibc and friends](http://www.etalabs.net/compare_libcs.html), so certain software might run into issues depending on the depth of their libc requirements. However, most software doesn't have an issue with this, so this variant is usually a very safe choice. 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. +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. 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). diff --git a/php/content.md b/php/content.md index 21b11b5cc0ce..31a1008393bf 100644 --- a/php/content.md +++ b/php/content.md @@ -133,11 +133,10 @@ RUN curl -fsSL 'https://xcache.lighttpd.net/pub/Releases/3.2.0/xcache-3.2.0.tar. ## Running as an arbitrary user -For running the Apache variants as an arbitrary user, there are several choices: +For running the Apache variants as an arbitrary user, there are a couple choices: -- If your kernel [is version 4.11 or newer](https://github.com/moby/moby/issues/8460#issuecomment-312459310), you can add `--sysctl net.ipv4.ip_unprivileged_port_start=0` and then `--user` should work as it does for FPM. +- If your kernel [is version 4.11 or newer](https://github.com/moby/moby/issues/8460#issuecomment-312459310), you can add `--sysctl net.ipv4.ip_unprivileged_port_start=0` (which [will be the default in a future version of Docker](https://github.com/moby/moby/pull/41030)) and then `--user` should work as it does for FPM. - If you adjust the Apache configuration to use an "unprivileged" port (greater than 1024 by default), then `--user` should work as it does for FPM regardless of kernel version. -- Otherwise, setting `APACHE_RUN_USER` and/or `APACHE_RUN_GROUP` should have the desired effect (for example, `-e APACHE_RUN_USER=daemon` or `-e APACHE_RUN_USER=#1000` -- see [the Apache `User` directive documentation for details on the expected syntax](https://httpd.apache.org/docs/2.4/mod/mod_unixd.html#user)). For running the FPM variants as an arbitrary user, the `--user` flag to `docker run` should be used (which can accept both a username/group in the container's `/etc/passwd` file like `--user daemon` or a specific UID/GID like `--user 1000:1000`). @@ -168,7 +167,6 @@ FROM %%IMAGE%%:7.4-fpm-alpine # Use the default production configuration RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini" - -# Override with custom opcache settings -COPY config/opcache.ini $PHP_INI_DIR/conf.d/ ``` + +In many production environments, it is also recommended to (build and) enable the PHP core OPcache extension for performance. See [the upstream OPcache documentation](https://www.php.net/manual/en/book.opcache.php) for more details. diff --git a/php/variant-fpm.md b/php/variant-fpm.md index 5093b6ce22f6..06ba66065500 100644 --- a/php/variant-fpm.md +++ b/php/variant-fpm.md @@ -11,3 +11,5 @@ Some potentially helpful resources: - [very detailed article by Pascal Landau](https://www.pascallandau.com/blog/php-php-fpm-and-nginx-on-docker-in-windows-10/) - [Stack Overflow discussion](https://stackoverflow.com/q/29905953/433558) - [Apache httpd Wiki example](https://wiki.apache.org/httpd/PHPFPMWordpress) + +**WARNING:** the FastCGI protocol is inherently trusting, and thus *extremely* insecure to expose outside of a private container network -- unless you know *exactly* what you are doing (and are willing to accept the extreme risk), do not use Docker's `--publish` (`-p`) flag with this image variant. diff --git a/phpmyadmin/README-short.txt b/phpmyadmin/README-short.txt new file mode 100644 index 000000000000..23c2afd65b6f --- /dev/null +++ b/phpmyadmin/README-short.txt @@ -0,0 +1 @@ +phpMyAdmin - A web interface for MySQL and MariaDB. diff --git a/phpmyadmin/README.md b/phpmyadmin/README.md new file mode 100644 index 000000000000..22d73f2cea93 --- /dev/null +++ b/phpmyadmin/README.md @@ -0,0 +1,252 @@ + + +# Quick reference + +- **Maintained by**: + [phpMyAdmin](https://github.com/phpmyadmin/docker) + +- **Where to get help**: + [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) + +# Supported tags and respective `Dockerfile` links + +- [`5.2.0-apache`, `5.2-apache`, `5-apache`, `apache`, `5.2.0`, `5.2`, `5`, `latest`](https://github.com/phpmyadmin/docker/blob/71d54acc9309c04ed53a148ca1979b6cdc10c5b9/apache/Dockerfile) +- [`5.2.0-fpm`, `5.2-fpm`, `5-fpm`, `fpm`](https://github.com/phpmyadmin/docker/blob/71d54acc9309c04ed53a148ca1979b6cdc10c5b9/fpm/Dockerfile) +- [`5.2.0-fpm-alpine`, `5.2-fpm-alpine`, `5-fpm-alpine`, `fpm-alpine`](https://github.com/phpmyadmin/docker/blob/71d54acc9309c04ed53a148ca1979b6cdc10c5b9/fpm-alpine/Dockerfile) + +# Quick reference (cont.) + +- **Where to file issues**: + [https://github.com/phpmyadmin/docker/issues](https://github.com/phpmyadmin/docker/issues) + +- **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) + [`amd64`](https://hub.docker.com/r/amd64/phpmyadmin/), [`arm32v5`](https://hub.docker.com/r/arm32v5/phpmyadmin/), [`arm32v6`](https://hub.docker.com/r/arm32v6/phpmyadmin/), [`arm32v7`](https://hub.docker.com/r/arm32v7/phpmyadmin/), [`arm64v8`](https://hub.docker.com/r/arm64v8/phpmyadmin/), [`i386`](https://hub.docker.com/r/i386/phpmyadmin/), [`mips64le`](https://hub.docker.com/r/mips64le/phpmyadmin/), [`ppc64le`](https://hub.docker.com/r/ppc64le/phpmyadmin/), [`s390x`](https://hub.docker.com/r/s390x/phpmyadmin/) + +- **Published image artifact details**: + [repo-info repo's `repos/phpmyadmin/` directory](https://github.com/docker-library/repo-info/blob/master/repos/phpmyadmin) ([history](https://github.com/docker-library/repo-info/commits/master/repos/phpmyadmin)) + (image metadata, transfer size, etc) + +- **Image updates**: + [official-images repo's `library/phpmyadmin` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fphpmyadmin) + [official-images repo's `library/phpmyadmin` file](https://github.com/docker-library/official-images/blob/master/library/phpmyadmin) ([history](https://github.com/docker-library/official-images/commits/master/library/phpmyadmin)) + +- **Source of this description**: + [docs repo's `phpmyadmin/` directory](https://github.com/docker-library/docs/tree/master/phpmyadmin) ([history](https://github.com/docker-library/docs/commits/master/phpmyadmin)) + +# What is phpMyAdmin? + +phpMyAdmin is a free software tool written in PHP, intended to handle the administration of MySQL over the Web. phpMyAdmin supports a wide range of operations on MySQL and MariaDB. Frequently used operations (managing databases, tables, columns, relations, indexes, users, permissions, etc) can be performed via the user interface, while you still have the ability to directly execute any SQL statement. + +Run phpMyAdmin with Alpine, Apache and PHP FPM. + +![logo](https://raw.githubusercontent.com/docker-library/docs/1a06458dd2512b5bcda0a849738bb5ca32bf8ec0/phpmyadmin/logo.png) + +# How to use this image + +All of the following examples will bring you phpMyAdmin on `http://localhost:8080` where you can enjoy your happy MySQL administration. + +## Credentials + +phpMyAdmin connects using your MySQL server credentials. Please check your corresponding database server image for information on the default username and password or how to specify your own custom credentials during installation. + +The official MySQL and MariaDB images use the following environment variables to define these: + +- `MYSQL_ROOT_PASSWORD` - This variable is mandatory and specifies the password that will be set for the `root` superuser account. +- `MYSQL_USER`, `MYSQL_PASSWORD` - These variables are optional, used in conjunction to create a new user and to set that user's password. + +## Supported Docker Hub tags + +The following tags are available: + +- `latest`, `fpm`, and `fpm-alpine` are always the most recent released version +- Major versions, such as `5`, `5-fpm`, and `5-fpm-alpine` +- Specific minor versions, such as `5.0`, `5.0-fpm`, and `5-fpm-alpine` +- Specific patch versions, such as `5.0.0`, `5.0.0-fpm`, and `5.0.0-fpm-alpine`. Note that, on rare occasion, there may be an intermediary "docker-only" release, such as 4.9.2-1 + +A complete list of tags is [available at Docker Hub](https://hub.docker.com/_/phpmyadmin?tab=tags) + +## Image variants + +We provide three variations: + +- "apache" includes a full Apache webserver with PHP and includes everything needed to work out of the box. This is the default when only a version number is requested. +- "fpm" only starts a PHP FPM container. Use this variant if you already have a separate webserver. This includes more tools and is therefore a larger image than the "fpm-alpine" variation. +- "fpm-alpine" has a very small footprint. It is based on Alpine Linux and only starts a PHP FPM process. Use this variant if you already have a separate webserver. If you need more tools that are not available on Alpine Linux, use the fpm image instead. + +## Usage with linked server + +First you need to run a MySQL or MariaDB server in Docker, and the phpMyAdmin image needs to be linked to the running database container: + +```sh +docker run --name phpmyadmin -d --link mysql_db_server:db -p 8080:80 phpmyadmin +``` + +## Usage with external server + +You can specify a MySQL host in the `PMA_HOST` environment variable. You can also use `PMA_PORT` to specify the port of the server in case it's not the default one: + +```sh +docker run --name phpmyadmin -d -e PMA_HOST=dbhost -p 8080:80 phpmyadmin +``` + +## Usage with arbitrary server + +You can use arbitrary servers by adding the environment variable `PMA_ARBITRARY=1` to the startup command: + +```sh +docker run --name phpmyadmin -d -e PMA_ARBITRARY=1 -p 8080:80 phpmyadmin +``` + +## Usage with docker-compose and arbitrary server + +This will run phpMyAdmin with the arbitrary server option - allowing you to specify any MySQL/MariaDB server on the login page. + +... via [`docker stack deploy`](https://docs.docker.com/engine/reference/commandline/stack_deploy/) or [`docker-compose`](https://github.com/docker/compose) + +Example `stack.yml` for `phpmyadmin`: + +```yaml +version: '3.1' + +services: + db: + image: mariadb:10.6 + restart: always + environment: + MYSQL_ROOT_PASSWORD: notSecureChangeMe + + phpmyadmin: + image: phpmyadmin + restart: always + ports: + - 8080:80 + environment: + - PMA_ARBITRARY=1 +``` + +[![Try in PWD](https://github.com/play-with-docker/stacks/raw/cff22438cb4195ace27f9b15784bbb497047afa7/assets/images/button.png)](http://play-with-docker.com?stack=https://raw.githubusercontent.com/docker-library/docs/6372937f8f1ff823d2aaa102762be5bb5cd87f40/phpmyadmin/stack.yml) + +## Adding Custom Configuration + +You can add your own custom config.inc.php settings (such as Configuration Storage setup) by creating a file named `config.user.inc.php` with the various user defined settings in it, and then linking it into the container using: + +```sh +-v /some/local/directory/config.user.inc.php:/etc/phpmyadmin/config.user.inc.php +``` + +On the `docker run` line like this: + +```sh +docker run --name phpmyadmin -d --link mysql_db_server:db -p 8080:80 -v /some/local/directory/config.user.inc.php:/etc/phpmyadmin/config.user.inc.php phpmyadmin +``` + +Be sure to have `` + +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. + +## `phpmyadmin:-alpine` + +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. + +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. + +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). + +# License + +View [license information](https://github.com/phpmyadmin/docker/blob/master/LICENSE) for the software contained in this image. + +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). + +Some additional license information which was able to be auto-detected might be found in [the `repo-info` repository's `phpmyadmin/` directory](https://github.com/docker-library/repo-info/tree/master/repos/phpmyadmin). + +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. diff --git a/phpmyadmin/content.md b/phpmyadmin/content.md new file mode 100644 index 000000000000..20f8baf6d0ea --- /dev/null +++ b/phpmyadmin/content.md @@ -0,0 +1,154 @@ +# What is phpMyAdmin? + +phpMyAdmin is a free software tool written in PHP, intended to handle the administration of MySQL over the Web. phpMyAdmin supports a wide range of operations on MySQL and MariaDB. Frequently used operations (managing databases, tables, columns, relations, indexes, users, permissions, etc) can be performed via the user interface, while you still have the ability to directly execute any SQL statement. + +Run phpMyAdmin with Alpine, Apache and PHP FPM. + +%%LOGO%% + +# How to use this image + +All of the following examples will bring you phpMyAdmin on `http://localhost:8080` where you can enjoy your happy MySQL administration. + +## Credentials + +phpMyAdmin connects using your MySQL server credentials. Please check your corresponding database server image for information on the default username and password or how to specify your own custom credentials during installation. + +The official MySQL and MariaDB images use the following environment variables to define these: + +- `MYSQL_ROOT_PASSWORD` - This variable is mandatory and specifies the password that will be set for the `root` superuser account. +- `MYSQL_USER`, `MYSQL_PASSWORD` - These variables are optional, used in conjunction to create a new user and to set that user's password. + +## Supported Docker Hub tags + +The following tags are available: + +- `latest`, `fpm`, and `fpm-alpine` are always the most recent released version +- Major versions, such as `5`, `5-fpm`, and `5-fpm-alpine` +- Specific minor versions, such as `5.0`, `5.0-fpm`, and `5-fpm-alpine` +- Specific patch versions, such as `5.0.0`, `5.0.0-fpm`, and `5.0.0-fpm-alpine`. Note that, on rare occasion, there may be an intermediary "docker-only" release, such as 4.9.2-1 + +A complete list of tags is [available at Docker Hub](https://hub.docker.com/_/phpmyadmin?tab=tags) + +## Image variants + +We provide three variations: + +- "apache" includes a full Apache webserver with PHP and includes everything needed to work out of the box. This is the default when only a version number is requested. +- "fpm" only starts a PHP FPM container. Use this variant if you already have a separate webserver. This includes more tools and is therefore a larger image than the "fpm-alpine" variation. +- "fpm-alpine" has a very small footprint. It is based on Alpine Linux and only starts a PHP FPM process. Use this variant if you already have a separate webserver. If you need more tools that are not available on Alpine Linux, use the fpm image instead. + +## Usage with linked server + +First you need to run a MySQL or MariaDB server in Docker, and the phpMyAdmin image needs to be linked to the running database container: + +```sh +docker run --name phpmyadmin -d --link mysql_db_server:db -p 8080:80 %%IMAGE%% +``` + +## Usage with external server + +You can specify a MySQL host in the `PMA_HOST` environment variable. You can also use `PMA_PORT` to specify the port of the server in case it's not the default one: + +```sh +docker run --name phpmyadmin -d -e PMA_HOST=dbhost -p 8080:80 %%IMAGE%% +``` + +## Usage with arbitrary server + +You can use arbitrary servers by adding the environment variable `PMA_ARBITRARY=1` to the startup command: + +```sh +docker run --name phpmyadmin -d -e PMA_ARBITRARY=1 -p 8080:80 %%IMAGE%% +``` + +## Usage with docker-compose and arbitrary server + +This will run phpMyAdmin with the arbitrary server option - allowing you to specify any MySQL/MariaDB server on the login page. + +%%STACK%% + +## Adding Custom Configuration + +You can add your own custom config.inc.php settings (such as Configuration Storage setup) by creating a file named `config.user.inc.php` with the various user defined settings in it, and then linking it into the container using: + +```sh +-v /some/local/directory/config.user.inc.php:/etc/phpmyadmin/config.user.inc.php +``` + +On the `docker run` line like this: + +```sh +docker run --name phpmyadmin -d --link mysql_db_server:db -p 8080:80 -v /some/local/directory/config.user.inc.php:/etc/phpmyadmin/config.user.inc.php %%IMAGE%% +``` + +Be sure to have `2}DQE-lBH*zkzy|C(!D$@u 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 F|9^}TPAvcc literal 0 HcmV?d00001 diff --git a/phpmyadmin/maintainer.md b/phpmyadmin/maintainer.md new file mode 100644 index 000000000000..b487e3510d30 --- /dev/null +++ b/phpmyadmin/maintainer.md @@ -0,0 +1 @@ +[phpMyAdmin](%%GITHUB-REPO%%) diff --git a/phpmyadmin/stack.yml b/phpmyadmin/stack.yml new file mode 100644 index 000000000000..4912da59794e --- /dev/null +++ b/phpmyadmin/stack.yml @@ -0,0 +1,16 @@ +version: '3.1' + +services: + db: + image: mariadb:10.6 + restart: always + environment: + MYSQL_ROOT_PASSWORD: notSecureChangeMe + + phpmyadmin: + image: phpmyadmin + restart: always + ports: + - 8080:80 + environment: + - PMA_ARBITRARY=1 diff --git a/plone/README.md b/plone/README.md index 618aca9bd030..5fe968d6d2de 100644 --- a/plone/README.md +++ b/plone/README.md @@ -20,13 +20,12 @@ WARNING: [Plone Community](https://github.com/plone/plone.docker) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`5.2.1`, `5.2`, `5`, `latest`](https://github.com/plone/plone.docker/blob/a346627b8e694036693d03f95d4986a3d6cb3111/5.2/5.2.1/debian/Dockerfile) -- [`5.2.1-alpine`, `5.2-alpine`, `5-alpine`, `alpine`](https://github.com/plone/plone.docker/blob/a346627b8e694036693d03f95d4986a3d6cb3111/5.2/5.2.1/alpine/Dockerfile) -- [`5.2.1-python2`, `5.2-python2`, `5-python2`, `python2`](https://github.com/plone/plone.docker/blob/5a3ed2cf8f0206bf710935c6daa527eb0e1056a4/5.2/5.2.1/python2/Dockerfile) +- [`5.2.9-python38`, `5.2-python38`, `5-python38`, `python38`, `5.2.9`, `5.2`, `5`, `latest`](https://github.com/plone/plone.docker/blob/dfb126db2d9c956d84ff381e7b1ee9f642edf716/5.2/5.2.9/debian/Dockerfile) +- [`5.2.8-python38`, `5.2.8`](https://github.com/plone/plone.docker/blob/dfb126db2d9c956d84ff381e7b1ee9f642edf716/5.2/5.2.8/debian/Dockerfile) # Quick reference (cont.) @@ -34,14 +33,14 @@ WARNING: [https://github.com/plone/plone.docker/issues](https://github.com/plone/plone.docker/issues) - **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) - [`amd64`](https://hub.docker.com/r/amd64/plone/), [`arm32v5`](https://hub.docker.com/r/arm32v5/plone/), [`arm32v6`](https://hub.docker.com/r/arm32v6/plone/), [`arm32v7`](https://hub.docker.com/r/arm32v7/plone/), [`arm64v8`](https://hub.docker.com/r/arm64v8/plone/), [`i386`](https://hub.docker.com/r/i386/plone/), [`ppc64le`](https://hub.docker.com/r/ppc64le/plone/), [`s390x`](https://hub.docker.com/r/s390x/plone/) + [`amd64`](https://hub.docker.com/r/amd64/plone/), [`arm64v8`](https://hub.docker.com/r/arm64v8/plone/) - **Published image artifact details**: [repo-info repo's `repos/plone/` directory](https://github.com/docker-library/repo-info/blob/master/repos/plone) ([history](https://github.com/docker-library/repo-info/commits/master/repos/plone)) (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/plone`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fplone) + [official-images repo's `library/plone` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fplone) [official-images repo's `library/plone` file](https://github.com/docker-library/official-images/blob/master/library/plone) ([history](https://github.com/docker-library/official-images/commits/master/library/plone)) - **Source of this description**: @@ -58,6 +57,8 @@ WARNING: - Images for Plone 5.x and Plone 4.x - Enable add-ons via environment variables - Choose between [Debian](https://www.debian.org/) or [Alpine](http://www.alpinelinux.org/) based images. +- Built-in RelStorage support, configurable via environment variables (requires Plone 5.2.4+) +- Built-in LDAP/AD support via pas.plugins.ldap (requires Plone 5.2.4+) ## Usage @@ -170,31 +171,22 @@ $ curl -H 'Accept: application/json' http://localhost:8080/plone - `CORS_ALLOW_HEADERS` - A comma separated list of request headers allowed to be sent by the client, e.g. `X-My-Header`. Defaults to `Accept,Authorization,Content-Type,X-Custom-Header` - `CORS_MAX_AGE` - Indicates how long the results of a preflight request can be cached. Defaults to `3600` -## Documentation - -Full documentation for end users can be found online at [docs.plone.org](https://docs.plone.org/manage/docker/docs/usage/index.html) - -## Credits - -This docker image was originally financed by the [European Environment Agency](http://eea.europa.eu), an agency of the European Union. +**RELSTORAGE:** -Thanks to [Antonio De Marinis](https://github.com/demarant), [Sven Strack](https://github.com/svx) and [Alin Voinea](https://github.com/avoinea) for their preliminary work. +- `RELSTORAGE_ADAPTER_OPTIONS` - A comma separated list of RelStorage adapter options to set for the plone instance (using [plone.recipe.zope2instance](https://relstorage.readthedocs.io/en/latest/configure-application.html#configuring-plone)). This is required in order to use RelStorage. -# Image Variants +All other available environment variables match exactly with RelStorage settings, according to the [settings specification available on the docs](https://relstorage.readthedocs.io/en/latest/relstorage-options.html). -The `plone` images come in many flavors, each designed for a specific use case. +- `RELSTORAGE_NAME` - **name** - The name of the storage. +- `RELSTORAGE_READ_ONLY` - **read-only** - If true, only reads may be executed against the storage. +- `RELSTORAGE_KEEP_HISTORY` - **keep-history** - If this option is set to true (the default), the adapter will create and use a history-preserving database schema (like FileStorage). +- `RELSTORAGE_BLOB_DIR` - **blob-dir** - If supplied, the storage will provide ZODB blob support; this option specifies the name of the directory to hold blob data. The directory will be created if it does not exist. If no value (or an empty value) is provided, then no blob support will be provided. Default: `/plone/instance/var/blobstorage` -## `plone:` + [See more](https://relstorage.readthedocs.io/en/latest/relstorage-options.html) -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. - -## `plone:-alpine` - -This image is based on the popular [Alpine Linux project](http://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. - -This variant is highly recommended when final image size being as small as possible is desired. The main caveat to note is that it does use [musl libc](http://www.musl-libc.org) instead of [glibc and friends](http://www.etalabs.net/compare_libcs.html), so certain software might run into issues depending on the depth of their libc requirements. However, most software doesn't have an issue with this, so this variant is usually a very safe choice. 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. +## Documentation -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). +Full documentation for end users can be found online at [docs.plone.org](https://docs.plone.org/manage/docker/docs/usage/index.html) # License diff --git a/plone/content.md b/plone/content.md index 569ba8b49e2c..730d861443bb 100644 --- a/plone/content.md +++ b/plone/content.md @@ -9,6 +9,8 @@ - Images for Plone 5.x and Plone 4.x - Enable add-ons via environment variables - Choose between [Debian](https://www.debian.org/) or [Alpine](http://www.alpinelinux.org/) based images. +- Built-in RelStorage support, configurable via environment variables (requires Plone 5.2.4+) +- Built-in LDAP/AD support via pas.plugins.ldap (requires Plone 5.2.4+) ## Usage @@ -121,12 +123,19 @@ $ curl -H 'Accept: application/json' http://localhost:8080/plone - `CORS_ALLOW_HEADERS` - A comma separated list of request headers allowed to be sent by the client, e.g. `X-My-Header`. Defaults to `Accept,Authorization,Content-Type,X-Custom-Header` - `CORS_MAX_AGE` - Indicates how long the results of a preflight request can be cached. Defaults to `3600` -## Documentation +**RELSTORAGE:** -Full documentation for end users can be found online at [docs.plone.org](https://docs.plone.org/manage/docker/docs/usage/index.html) +- `RELSTORAGE_ADAPTER_OPTIONS` - A comma separated list of RelStorage adapter options to set for the plone instance (using [plone.recipe.zope2instance](https://relstorage.readthedocs.io/en/latest/configure-application.html#configuring-plone)). This is required in order to use RelStorage. + +All other available environment variables match exactly with RelStorage settings, according to the [settings specification available on the docs](https://relstorage.readthedocs.io/en/latest/relstorage-options.html). -## Credits +- `RELSTORAGE_NAME` - **name** - The name of the storage. +- `RELSTORAGE_READ_ONLY` - **read-only** - If true, only reads may be executed against the storage. +- `RELSTORAGE_KEEP_HISTORY` - **keep-history** - If this option is set to true (the default), the adapter will create and use a history-preserving database schema (like FileStorage). +- `RELSTORAGE_BLOB_DIR` - **blob-dir** - If supplied, the storage will provide ZODB blob support; this option specifies the name of the directory to hold blob data. The directory will be created if it does not exist. If no value (or an empty value) is provided, then no blob support will be provided. Default: `/plone/instance/var/blobstorage` -This docker image was originally financed by the [European Environment Agency](http://eea.europa.eu), an agency of the European Union. + [See more](https://relstorage.readthedocs.io/en/latest/relstorage-options.html) -Thanks to [Antonio De Marinis](https://github.com/demarant), [Sven Strack](https://github.com/svx) and [Alin Voinea](https://github.com/avoinea) for their preliminary work. +## Documentation + +Full documentation for end users can be found online at [docs.plone.org](https://docs.plone.org/manage/docker/docs/usage/index.html) diff --git a/postfixadmin/README.md b/postfixadmin/README.md index 050c17a398e2..31f14465af21 100644 --- a/postfixadmin/README.md +++ b/postfixadmin/README.md @@ -20,13 +20,13 @@ WARNING: [Postfix Admin](https://github.com/postfixadmin/docker) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`3.2.4-apache`, `3.2-apache`, `3-apache`, `apache`, `3.2.4`, `3.2`, `3`, `latest`](https://github.com/postfixadmin/docker/blob/b1ffcf48cd23b4ba779dc5c1a8c6f78c6ef45077/apache/Dockerfile) -- [`3.2.4-fpm`, `3.2-fpm`, `3-fpm`, `fpm`](https://github.com/postfixadmin/docker/blob/b1ffcf48cd23b4ba779dc5c1a8c6f78c6ef45077/fpm/Dockerfile) -- [`3.2.4-fpm-alpine`, `3.2-fpm-alpine`, `3-fpm-alpine`, `fpm-alpine`](https://github.com/postfixadmin/docker/blob/b1ffcf48cd23b4ba779dc5c1a8c6f78c6ef45077/fpm-alpine/Dockerfile) +- [`3.3.13-apache`, `3.3-apache`, `3-apache`, `apache`, `3.3.13`, `3.3`, `3`, `latest`](https://github.com/postfixadmin/docker/blob/b4307d956cb1cfe64df1402cf6d68a1369ba56de/apache/Dockerfile) +- [`3.3.13-fpm`, `3.3-fpm`, `3-fpm`, `fpm`](https://github.com/postfixadmin/docker/blob/b4307d956cb1cfe64df1402cf6d68a1369ba56de/fpm/Dockerfile) +- [`3.3.13-fpm-alpine`, `3.3-fpm-alpine`, `3-fpm-alpine`, `fpm-alpine`](https://github.com/postfixadmin/docker/blob/b4307d956cb1cfe64df1402cf6d68a1369ba56de/fpm-alpine/Dockerfile) # Quick reference (cont.) @@ -41,7 +41,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/postfixadmin`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fpostfixadmin) + [official-images repo's `library/postfixadmin` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fpostfixadmin) [official-images repo's `library/postfixadmin` file](https://github.com/docker-library/official-images/blob/master/library/postfixadmin) ([history](https://github.com/docker-library/official-images/commits/master/library/postfixadmin)) - **Source of this description**: @@ -97,26 +97,12 @@ Then, access it via `http://localhost:8080` or `http://host-ip:8080` in a browse ## Existing config.local.php ```console -$ docker run --name some-postfixadmin -p 8080:80 %%image%% -$ docker run --name some-postfixadmin -v /local/path/to/config.local.php:/var/www/html/config.local.php -p 8080:80 postfixadmin +$ docker run -v /local/path/to/config.local.php:/var/www/html/config.local.php \ + --name some-postfixadmin \ + -p 8080:80 \ + postfixadmin ``` -## Image Variants - -The following variants are currently provided: - -### apache - -This starts an Apache webserver with PHP, so you can use `postfixadmin` out of the box. - -### fpm-alpine - -This image has a very small footprint. It is based on Alpine Linux and starts only a PHP FPM process. Use this variant if you already have a seperate webserver. If you need more tools, that are not available on Alpine Linux, use the `fpm` image instead. - -### fpm - -This image starts only a PHP FPM container. Use this variant if you already have a seperate webserver. - ... via [`docker stack deploy`](https://docs.docker.com/engine/reference/commandline/stack_deploy/) or [`docker-compose`](https://github.com/docker/compose) Example `stack.yml` for `postfixadmin`: @@ -129,7 +115,7 @@ services: image: mysql:5.7 restart: always environment: - MYSQL_ROOT_PASSWORD: notSecureChangeMe + MYSQL_RANDOM_ROOT_PASSWORD: 1 MYSQL_DATABASE: postfixadmin MYSQL_USER: postfixadmin MYSQL_PASSWORD: example @@ -149,7 +135,7 @@ services: POSTFIXADMIN_DB_PASSWORD: example ``` -[![Try in PWD](https://github.com/play-with-docker/stacks/raw/cff22438cb4195ace27f9b15784bbb497047afa7/assets/images/button.png)](http://play-with-docker.com?stack=https://raw.githubusercontent.com/docker-library/docs/be39946abe91fb116d24d8b797c9adacfd15a851/postfixadmin/stack.yml) +[![Try in PWD](https://github.com/play-with-docker/stacks/raw/cff22438cb4195ace27f9b15784bbb497047afa7/assets/images/button.png)](http://play-with-docker.com?stack=https://raw.githubusercontent.com/docker-library/docs/c011eff7d5385665f43db2e0330716da4ab68e75/postfixadmin/stack.yml) Run docker stack deploy -c stack.yml postfixadmin (or docker-compose -f stack.yml up), wait for it to initialize completely, and visit http://swarm-ip:8080, http://localhost:8080, or http://host-ip:8080 (as appropriate). @@ -161,13 +147,17 @@ The `postfixadmin` images come in many flavors, each designed for a specific use 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. -## `postfixadmin:-alpine` +### apache + +This starts an Apache webserver with PHP, so you can use `postfixadmin` out of the box. + +### fpm -This image is based on the popular [Alpine Linux project](http://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. +This image starts only a PHP FPM container. Use this variant if you already have a seperate webserver. -This variant is highly recommended when final image size being as small as possible is desired. The main caveat to note is that it does use [musl libc](http://www.musl-libc.org) instead of [glibc and friends](http://www.etalabs.net/compare_libcs.html), so certain software might run into issues depending on the depth of their libc requirements. However, most software doesn't have an issue with this, so this variant is usually a very safe choice. 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. +### fpm-alpine -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). +This image has a very small footprint. It is based on Alpine Linux and starts only a PHP FPM process. Use this variant if you already have a seperate webserver. If you need more tools, that are not available on Alpine Linux, use the `fpm` image instead. # License diff --git a/postfixadmin/content.md b/postfixadmin/content.md index 910bc4bdc5b3..883d589a83b5 100644 --- a/postfixadmin/content.md +++ b/postfixadmin/content.md @@ -48,26 +48,12 @@ Then, access it via `http://localhost:8080` or `http://host-ip:8080` in a browse ## Existing config.local.php ```console -$ docker run --name some-%%REPO%% -p 8080:80 %%image%% -$ docker run --name some-%%REPO%% -v /local/path/to/config.local.php:/var/www/html/config.local.php -p 8080:80 %%IMAGE%% +$ docker run -v /local/path/to/config.local.php:/var/www/html/config.local.php \ + --name some-%%REPO%% \ + -p 8080:80 \ + %%IMAGE%% ``` -## Image Variants - -The following variants are currently provided: - -### apache - -This starts an Apache webserver with PHP, so you can use `postfixadmin` out of the box. - -### fpm-alpine - -This image has a very small footprint. It is based on Alpine Linux and starts only a PHP FPM process. Use this variant if you already have a seperate webserver. If you need more tools, that are not available on Alpine Linux, use the `fpm` image instead. - -### fpm - -This image starts only a PHP FPM container. Use this variant if you already have a seperate webserver. - %%STACK%% Run docker stack deploy -c stack.yml %%REPO%% (or docker-compose -f stack.yml up), wait for it to initialize completely, and visit http://swarm-ip:8080, http://localhost:8080, or http://host-ip:8080 (as appropriate). diff --git a/postfixadmin/stack.yml b/postfixadmin/stack.yml index d3cd8ec3a8c1..b40e6c5b1abc 100644 --- a/postfixadmin/stack.yml +++ b/postfixadmin/stack.yml @@ -5,7 +5,7 @@ services: image: mysql:5.7 restart: always environment: - MYSQL_ROOT_PASSWORD: notSecureChangeMe + MYSQL_RANDOM_ROOT_PASSWORD: 1 MYSQL_DATABASE: postfixadmin MYSQL_USER: postfixadmin MYSQL_PASSWORD: example diff --git a/postfixadmin/variant-apache.md b/postfixadmin/variant-apache.md new file mode 100644 index 000000000000..b9666ea37e13 --- /dev/null +++ b/postfixadmin/variant-apache.md @@ -0,0 +1,3 @@ +### apache + +This starts an Apache webserver with PHP, so you can use `postfixadmin` out of the box. diff --git a/postfixadmin/variant-fpm-alpine.md b/postfixadmin/variant-fpm-alpine.md new file mode 100644 index 000000000000..1aaa0208a27d --- /dev/null +++ b/postfixadmin/variant-fpm-alpine.md @@ -0,0 +1,3 @@ +### fpm-alpine + +This image has a very small footprint. It is based on Alpine Linux and starts only a PHP FPM process. Use this variant if you already have a seperate webserver. If you need more tools, that are not available on Alpine Linux, use the `fpm` image instead. diff --git a/postfixadmin/variant-fpm.md b/postfixadmin/variant-fpm.md new file mode 100644 index 000000000000..621d254ff7ac --- /dev/null +++ b/postfixadmin/variant-fpm.md @@ -0,0 +1,3 @@ +### fpm + +This image starts only a PHP FPM container. Use this variant if you already have a seperate webserver. diff --git a/postgres/README.md b/postgres/README.md index 6363098c47bf..7071521969c1 100644 --- a/postgres/README.md +++ b/postgres/README.md @@ -20,20 +20,20 @@ WARNING: [the PostgreSQL Docker Community](https://github.com/docker-library/postgres) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`12.3`, `12`, `latest`](https://github.com/docker-library/postgres/blob/88173efa530f1a174a7ea311c5b6ee5e383f68bd/12/Dockerfile) -- [`12.3-alpine`, `12-alpine`, `alpine`](https://github.com/docker-library/postgres/blob/4edbda205c684c861e6fbf964de5d00845864d42/12/alpine/Dockerfile) -- [`11.8`, `11`](https://github.com/docker-library/postgres/blob/aa4f329a17fd82077536602da12f4264fa195b20/11/Dockerfile) -- [`11.8-alpine`, `11-alpine`](https://github.com/docker-library/postgres/blob/0de8bbbcdcdd7783acb7ce2678c85d5aab977c55/11/alpine/Dockerfile) -- [`10.13`, `10`](https://github.com/docker-library/postgres/blob/f1e039c4ebd8e4691af65dfd6cf280df126039aa/10/Dockerfile) -- [`10.13-alpine`, `10-alpine`](https://github.com/docker-library/postgres/blob/245058ccb66fd6cb34fc512323f20ed676f1af15/10/alpine/Dockerfile) -- [`9.6.18`, `9.6`, `9`](https://github.com/docker-library/postgres/blob/95f4307ac7547094b5392d2a2a5aa7471301ffcb/9.6/Dockerfile) -- [`9.6.18-alpine`, `9.6-alpine`, `9-alpine`](https://github.com/docker-library/postgres/blob/7675803cba8dbf4aca2c1064b044b03cd0db6c2d/9.6/alpine/Dockerfile) -- [`9.5.22`, `9.5`](https://github.com/docker-library/postgres/blob/fa4482cec89b300589c30fc5590995a31f569a06/9.5/Dockerfile) -- [`9.5.22-alpine`, `9.5-alpine`](https://github.com/docker-library/postgres/blob/5104b38a3a159aad42014d69b3ba1a0c4d22ca4d/9.5/alpine/Dockerfile) +- [`15.1`, `15`, `latest`, `15.1-bullseye`, `15-bullseye`, `bullseye`](https://github.com/docker-library/postgres/blob/41bd7bf3f487e6dc0036fd73efaff6ccb6fbbacd/15/bullseye/Dockerfile) +- [`15.1-alpine`, `15-alpine`, `alpine`, `15.1-alpine3.17`, `15-alpine3.17`, `alpine3.17`](https://github.com/docker-library/postgres/blob/6ee0f2865b23484fefb785ba70b9d404f2bb0cd4/15/alpine/Dockerfile) +- [`14.6`, `14`, `14.6-bullseye`, `14-bullseye`](https://github.com/docker-library/postgres/blob/41bd7bf3f487e6dc0036fd73efaff6ccb6fbbacd/14/bullseye/Dockerfile) +- [`14.6-alpine`, `14-alpine`, `14.6-alpine3.17`, `14-alpine3.17`](https://github.com/docker-library/postgres/blob/6ee0f2865b23484fefb785ba70b9d404f2bb0cd4/14/alpine/Dockerfile) +- [`13.9`, `13`, `13.9-bullseye`, `13-bullseye`](https://github.com/docker-library/postgres/blob/41bd7bf3f487e6dc0036fd73efaff6ccb6fbbacd/13/bullseye/Dockerfile) +- [`13.9-alpine`, `13-alpine`, `13.9-alpine3.17`, `13-alpine3.17`](https://github.com/docker-library/postgres/blob/6ee0f2865b23484fefb785ba70b9d404f2bb0cd4/13/alpine/Dockerfile) +- [`12.13`, `12`, `12.13-bullseye`, `12-bullseye`](https://github.com/docker-library/postgres/blob/41bd7bf3f487e6dc0036fd73efaff6ccb6fbbacd/12/bullseye/Dockerfile) +- [`12.13-alpine`, `12-alpine`, `12.13-alpine3.17`, `12-alpine3.17`](https://github.com/docker-library/postgres/blob/6ee0f2865b23484fefb785ba70b9d404f2bb0cd4/12/alpine/Dockerfile) +- [`11.18-bullseye`, `11-bullseye`](https://github.com/docker-library/postgres/blob/41bd7bf3f487e6dc0036fd73efaff6ccb6fbbacd/11/bullseye/Dockerfile) +- [`11.18-alpine`, `11-alpine`, `11.18-alpine3.17`, `11-alpine3.17`](https://github.com/docker-library/postgres/blob/6ee0f2865b23484fefb785ba70b9d404f2bb0cd4/11/alpine/Dockerfile) # Quick reference (cont.) @@ -48,7 +48,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/postgres`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fpostgres) + [official-images repo's `library/postgres` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fpostgres) [official-images repo's `library/postgres` file](https://github.com/docker-library/official-images/blob/master/library/postgres) ([history](https://github.com/docker-library/official-images/commits/master/library/postgres)) - **Source of this description**: @@ -76,13 +76,13 @@ The default `postgres` user and database are created in the entrypoint with `ini > The postgres database is a default database meant for use by users, utilities and third party applications. > -> [postgresql.org/docs](http://www.postgresql.org/docs/9.5/interactive/app-initdb.html) +> [postgresql.org/docs](https://www.postgresql.org/docs/14/app-initdb.html) ## ... or via `psql` ```console $ docker run -it --rm --network some-network postgres psql -h some-postgres -U postgres -psql (9.5.0) +psql (14.3) Type "help" for help. postgres=# SELECT 1; @@ -90,7 +90,6 @@ postgres=# SELECT 1; ---------- 1 (1 row) - ``` ## ... via [`docker stack deploy`](https://docs.docker.com/engine/reference/commandline/stack_deploy/) or [`docker-compose`](https://github.com/docker/compose) @@ -126,7 +125,7 @@ There are many ways to extend the `postgres` image. Without trying to support ev ## Environment Variables -The PostgreSQL image uses several environment variables which are easy to miss. While none of the variables are required, they may significantly aid you in using the image. +The PostgreSQL image uses several environment variables which are easy to miss. The only variable required is `POSTGRES_PASSWORD`, the rest are optional. **Warning**: the Docker specific variables will only have an effect if you start the container with a data directory that is empty; any pre-existing database will be left untouched on container startup. @@ -136,7 +135,7 @@ This environment variable is required for you to use the PostgreSQL image. It mu **Note 1:** The PostgreSQL image sets up `trust` authentication locally so you may notice a password is not required when connecting from `localhost` (inside the same container). However, a password will be required if connecting from a different host/container. -**Note 2:** This variable defines the superuser password in the PostgreSQL instance, as set by the `initdb` script during initial container startup. It has no effect on the `PGPASSWORD` environment variable that may be used by the `psql` client at runtime, as described at [https://www.postgresql.org/docs/10/static/libpq-envars.html](https://www.postgresql.org/docs/10/static/libpq-envars.html). `PGPASSWORD`, if used, will be specified as a separate environment variable. +**Note 2:** This variable defines the superuser password in the PostgreSQL instance, as set by the `initdb` script during initial container startup. It has no effect on the `PGPASSWORD` environment variable that may be used by the `psql` client at runtime, as described at [https://www.postgresql.org/docs/14/libpq-envars.html](https://www.postgresql.org/docs/14/libpq-envars.html). `PGPASSWORD`, if used, will be specified as a separate environment variable. ### `POSTGRES_USER` @@ -160,18 +159,20 @@ This optional environment variable can be used to define another location for th ### `POSTGRES_HOST_AUTH_METHOD` -This optional variable can be used to control the `auth-method` for `host` connections for `all` databases, `all` users, and `all` addresses. If unspecified then [`md5` password authentication](https://www.postgresql.org/docs/current/auth-password.html) is used. On an uninitialized database, this will populate `pg_hba.conf` via this approximate line: +This optional variable can be used to control the `auth-method` for `host` connections for `all` databases, `all` users, and `all` addresses. If unspecified then [`scram-sha-256` password authentication](https://www.postgresql.org/docs/14/auth-password.html) is used (in 14+; `md5` in older releases). On an uninitialized database, this will populate `pg_hba.conf` via this approximate line: ```console echo "host all all all $POSTGRES_HOST_AUTH_METHOD" >> pg_hba.conf ``` -See the PostgreSQL documentation on [`pg_hba.conf`](https://www.postgresql.org/docs/current/auth-pg-hba-conf.html) for more information about possible values and their meanings. +See the PostgreSQL documentation on [`pg_hba.conf`](https://www.postgresql.org/docs/14/auth-pg-hba-conf.html) for more information about possible values and their meanings. -**Note 1:** It is not recommended to use [`trust`](https://www.postgresql.org/docs/current/auth-trust.html) since it allows anyone to connect without a password, even if one is set (like via `POSTGRES_PASSWORD`). For more information see the PostgreSQL documentation on [*Trust Authentication*](https://www.postgresql.org/docs/current/auth-trust.html). +**Note 1:** It is not recommended to use `trust` since it allows anyone to connect without a password, even if one is set (like via `POSTGRES_PASSWORD`). For more information see the PostgreSQL documentation on [*Trust Authentication*](https://www.postgresql.org/docs/14/auth-trust.html). **Note 2:** If you set `POSTGRES_HOST_AUTH_METHOD` to `trust`, then `POSTGRES_PASSWORD` is not required. +**Note 3:** If you set this to an alternative value (such as `scram-sha-256`), you might need additional `POSTGRES_INITDB_ARGS` for the database to initialize correctly (such as `POSTGRES_INITDB_ARGS=--auth-host=scram-sha-256`). + ### `PGDATA` This optional variable can be used to define another location - like a subdirectory - for the database files. The default is `/var/lib/postgresql/data`. If the data volume you're using is a filesystem mountpoint (like with GCE persistent disks) or remote folder that cannot be chowned to the `postgres` user (like some NFS mounts), Postgres `initdb` recommends a subdirectory be created to contain the data. @@ -187,7 +188,7 @@ $ docker run -d \ postgres ``` -This is an environment variable that is not Docker specific. Because the variable is used by the `postgres` server binary (see the [PostgreSQL docs](https://www.postgresql.org/docs/11/app-postgres.html#id-1.9.5.14.7)), the entrypoint script takes it into account. +This is an environment variable that is not Docker specific. Because the variable is used by the `postgres` server binary (see the [PostgreSQL docs](https://www.postgresql.org/docs/14/app-postgres.html#id-1.9.5.14.7)), the entrypoint script takes it into account. ## Docker Secrets @@ -224,7 +225,7 @@ Additionally, as of [docker-library/postgres#253](https://github.com/docker-libr ## Database Configuration -There are many ways to set PostgreSQL server configuration. For information on what is available to configure, see the postgresql.org [docs](https://www.postgresql.org/docs/current/static/runtime-config.html) for the specific version of PostgreSQL that you are running. Here are a few options for setting configuration: +There are many ways to set PostgreSQL server configuration. For information on what is available to configure, see the [PostgreSQL docs](https://www.postgresql.org/docs/14/runtime-config.html) for the specific version of PostgreSQL that you are running. Here are a few options for setting configuration: - Use a custom config file. Create a config file and get it into the container. If you need a starting place for your config file you can use the sample provided by PostgreSQL which is available in the container at `/usr/share/postgresql/postgresql.conf.sample` (`/usr/local/share/postgresql/postgresql.conf.sample` in Alpine variants). @@ -240,33 +241,41 @@ There are many ways to set PostgreSQL server configuration. For information on w $ docker run -d --name some-postgres -v "$PWD/my-postgres.conf":/etc/postgresql/postgresql.conf -e POSTGRES_PASSWORD=mysecretpassword postgres -c 'config_file=/etc/postgresql/postgresql.conf' ``` -- Set options directly on the run line. The entrypoint script is made so that any options passed to the docker command will be passed along to the `postgres` server daemon. From the [docs](https://www.postgresql.org/docs/current/static/app-postgres.html) we see that any option available in a `.conf` file can be set via `-c`. +- Set options directly on the run line. The entrypoint script is made so that any options passed to the docker command will be passed along to the `postgres` server daemon. From the [PostgreSQL docs](https://www.postgresql.org/docs/14/app-postgres.html#id-1.9.5.14.6.3) we see that any option available in a `.conf` file can be set via `-c`. ```console - $ docker run -d --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword postgres -c 'shared_buffers=256MB' -c 'max_connections=200' + $ docker run -d --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword postgres -c shared_buffers=256MB -c max_connections=200 ``` ## Locale Customization -You can extend the image with a simple `Dockerfile` to set a different locale. The following example will set the default locale to `de_DE.utf8`: +You can extend the Debian-based images with a simple `Dockerfile` to set a different locale. The following example will set the default locale to `de_DE.utf8`: ```dockerfile -FROM postgres:9.4 +FROM postgres:14.3 RUN localedef -i de_DE -c -f UTF-8 -A /usr/share/locale/locale.alias de_DE.UTF-8 ENV LANG de_DE.utf8 ``` Since database initialization only happens on container startup, this allows us to set the language before it is created. +Also of note, Alpine-based variants starting with Postgres 15 support [ICU locales](https://www.postgresql.org/docs/15/locale.html#id-1.6.11.3.7). Previous Postgres versions based on alpine do *not* support locales; see ["Character sets and locale" in the musl documentation](https://wiki.musl-libc.org/functional-differences-from-glibc.html#Character-sets-and-locale) for more details. + +You can set locales in the Alpine-based images with `POSTGRES_INITDB_ARGS` to set a different locale. The following example will set the default locale for a newly initialized database to `de_DE.utf8`: + +```console +$ docker run -d -e LANG=de_DE.utf8 -e POSTGRES_INITDB_ARGS="--locale-provider=icu --icu-locale=de-DE" -e POSTGRES_PASSWORD=mysecretpassword postgres:15-alpine +``` + ## Additional Extensions -When using the default (Debian-based) variants, installing additional extensions (such as PostGIS) should be as simple as installing the relevant packages (see [github.com/postgis/docker-postgis](https://github.com/postgis/docker-postgis/blob/4eb614133d6aa87bfc5c952d24b7eb1f499e5c7c/12-3.0/Dockerfile) for a concrete example). +When using the default (Debian-based) variants, installing additional extensions (such as PostGIS) should be as simple as installing the relevant packages (see [github.com/postgis/docker-postgis](https://github.com/postgis/docker-postgis/blob/81a0b55/14-3.2/Dockerfile) for a concrete example). -When using the Alpine variants, any postgres extension not listed in [postgres-contrib](https://www.postgresql.org/docs/10/static/contrib.html) will need to be compiled in your own image (again, see [github.com/postgis/docker-postgis](https://github.com/postgis/docker-postgis/blob/4eb614133d6aa87bfc5c952d24b7eb1f499e5c7c/12-3.0/alpine/Dockerfile) for a concrete example). +When using the Alpine variants, any postgres extension not listed in [postgres-contrib](https://www.postgresql.org/docs/14/contrib.html) will need to be compiled in your own image (again, see [github.com/postgis/docker-postgis](https://github.com/postgis/docker-postgis/blob/81a0b55/14-3.2/alpine/Dockerfile) for a concrete example). # Arbitrary `--user` Notes -As of [docker-library/postgres#253](https://github.com/docker-library/postgres/pull/253), this image supports running as a (mostly) arbitrary user via `--user` on `docker run`. +As of [docker-library/postgres#253](https://github.com/docker-library/postgres/pull/253), this image supports running as a (mostly) arbitrary user via `--user` on `docker run`. As of [docker-library/postgres#1018](https://github.com/docker-library/postgres/pull/1018), this is also the case for the Alpine variants. The main caveat to note is that `postgres` doesn't care what UID it runs as (as long as the owner of `/var/lib/postgresql/data` matches), but `initdb` *does* care (and needs the user to exist in `/etc/passwd`): @@ -281,7 +290,7 @@ initdb: could not look up effective user ID 1000: user does not exist The three easiest ways to get around this: -1. use the Debian variants (not the Alpine variants) and thus allow the image to use [the `nss_wrapper` library](https://cwrap.org/nss_wrapper.html) to "fake" `/etc/passwd` contents for you (see [docker-library/postgres#448](https://github.com/docker-library/postgres/pull/448) for more details) +1. allow the image to use [the `nss_wrapper` library](https://cwrap.org/nss_wrapper.html) to "fake" `/etc/passwd` contents for you (see [docker-library/postgres#448](https://github.com/docker-library/postgres/pull/448) for more details) 2. bind-mount `/etc/passwd` read-only from the host (if the UID you desire is a valid user on your host): @@ -311,16 +320,14 @@ The three easiest ways to get around this: If there is no database when `postgres` starts in a container, then `postgres` will create the default database for you. While this is the expected behavior of `postgres`, this means that it will not accept incoming connections during that time. This may cause issues when using automation tools, such as `docker-compose`, that start several containers simultaneously. -Also note that the default `/dev/shm` size for containers is 64MB. If the shared memory is exhausted you will encounter `ERROR: could not resize shared memory segment . . . : No space left on device`. You will want to pass [`--shm-size=256MB`](https://docs.docker.com/engine/reference/run/#runtime-constraints-on-resources) for example to `docker run`, or alternatively in [`docker-compose`](https://docs.docker.com/compose/compose-file/#domainname-hostname-ipc-mac_address-privileged-read_only-shm_size-stdin_open-tty-user-working_dir) - -See ["IPVS connection timeout issue" in the Docker Success Center](https://success.docker.com/article/ipvs-connection-timeout-issue) for details about IPVS connection timeouts which will affect long-running idle connections to PostgreSQL in Swarm Mode using overlay networks. +Also note that the default `/dev/shm` size for containers is 64MB. If the shared memory is exhausted you will encounter `ERROR: could not resize shared memory segment . . . : No space left on device`. You will want to pass [`--shm-size=256MB`](https://docs.docker.com/engine/reference/run/#runtime-constraints-on-resources) for example to `docker run`, or alternatively in [`docker-compose`](https://docs.docker.com/compose/compose-file/#shm_size). ## Where to Store Data **Important note:** There are several ways to store data used by applications that run in Docker containers. We encourage users of the `postgres` images to familiarize themselves with the options available, including: -- Let Docker manage the storage of your database data [by writing the database files to disk on the host system using its own internal volume management](https://docs.docker.com/engine/tutorials/dockervolumes/#adding-a-data-volume). This is the default and is easy and fairly transparent to the user. The downside is that the files may be hard to locate for tools and applications that run directly on the host system, i.e. outside containers. -- Create a data directory on the host system (outside the container) and [mount this to a directory visible from inside the container](https://docs.docker.com/engine/tutorials/dockervolumes/#mount-a-host-directory-as-a-data-volume). This places the database files in a known location on the host system, and makes it easy for tools and applications on the host system to access the files. The downside is that the user needs to make sure that the directory exists, and that e.g. directory permissions and other security mechanisms on the host system are set up correctly. +- Let Docker manage the storage of your database data [by writing the database files to disk on the host system using its own internal volume management](https://docs.docker.com/storage/volumes/). This is the default and is easy and fairly transparent to the user. The downside is that the files may be hard to locate for tools and applications that run directly on the host system, i.e. outside containers. +- Create a data directory on the host system (outside the container) and [mount this to a directory visible from inside the container](https://docs.docker.com/storage/bind-mounts/). This places the database files in a known location on the host system, and makes it easy for tools and applications on the host system to access the files. The downside is that the user needs to make sure that the directory exists, and that e.g. directory permissions and other security mechanisms on the host system are set up correctly. The Docker documentation is a good starting point for understanding the different storage options and variations, and there are multiple blogs and forum postings that discuss and give advice in this area. We will simply show the basic procedure here for the latter option above: @@ -341,11 +348,13 @@ The `postgres` images come in many flavors, each designed for a specific use cas 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. +Some of these tags may have names like 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. + ## `postgres:-alpine` -This image is based on the popular [Alpine Linux project](http://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. +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. -This variant is highly recommended when final image size being as small as possible is desired. The main caveat to note is that it does use [musl libc](http://www.musl-libc.org) instead of [glibc and friends](http://www.etalabs.net/compare_libcs.html), so certain software might run into issues depending on the depth of their libc requirements. However, most software doesn't have an issue with this, so this variant is usually a very safe choice. 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. +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. 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). diff --git a/postgres/content.md b/postgres/content.md index 9992457b0cb6..1d2baf71a870 100644 --- a/postgres/content.md +++ b/postgres/content.md @@ -20,13 +20,13 @@ The default `postgres` user and database are created in the entrypoint with `ini > The postgres database is a default database meant for use by users, utilities and third party applications. > -> [postgresql.org/docs](http://www.postgresql.org/docs/9.5/interactive/app-initdb.html) +> [postgresql.org/docs](https://www.postgresql.org/docs/14/app-initdb.html) ## ... or via `psql` ```console $ docker run -it --rm --network some-network %%IMAGE%% psql -h some-postgres -U postgres -psql (9.5.0) +psql (14.3) Type "help" for help. postgres=# SELECT 1; @@ -34,7 +34,6 @@ postgres=# SELECT 1; ---------- 1 (1 row) - ``` ## %%STACK%% @@ -47,7 +46,7 @@ There are many ways to extend the `%%REPO%%` image. Without trying to support ev ## Environment Variables -The PostgreSQL image uses several environment variables which are easy to miss. While none of the variables are required, they may significantly aid you in using the image. +The PostgreSQL image uses several environment variables which are easy to miss. The only variable required is `POSTGRES_PASSWORD`, the rest are optional. **Warning**: the Docker specific variables will only have an effect if you start the container with a data directory that is empty; any pre-existing database will be left untouched on container startup. @@ -57,7 +56,7 @@ This environment variable is required for you to use the PostgreSQL image. It mu **Note 1:** The PostgreSQL image sets up `trust` authentication locally so you may notice a password is not required when connecting from `localhost` (inside the same container). However, a password will be required if connecting from a different host/container. -**Note 2:** This variable defines the superuser password in the PostgreSQL instance, as set by the `initdb` script during initial container startup. It has no effect on the `PGPASSWORD` environment variable that may be used by the `psql` client at runtime, as described at [https://www.postgresql.org/docs/10/static/libpq-envars.html](https://www.postgresql.org/docs/10/static/libpq-envars.html). `PGPASSWORD`, if used, will be specified as a separate environment variable. +**Note 2:** This variable defines the superuser password in the PostgreSQL instance, as set by the `initdb` script during initial container startup. It has no effect on the `PGPASSWORD` environment variable that may be used by the `psql` client at runtime, as described at [https://www.postgresql.org/docs/14/libpq-envars.html](https://www.postgresql.org/docs/14/libpq-envars.html). `PGPASSWORD`, if used, will be specified as a separate environment variable. ### `POSTGRES_USER` @@ -81,18 +80,20 @@ This optional environment variable can be used to define another location for th ### `POSTGRES_HOST_AUTH_METHOD` -This optional variable can be used to control the `auth-method` for `host` connections for `all` databases, `all` users, and `all` addresses. If unspecified then [`md5` password authentication](https://www.postgresql.org/docs/current/auth-password.html) is used. On an uninitialized database, this will populate `pg_hba.conf` via this approximate line: +This optional variable can be used to control the `auth-method` for `host` connections for `all` databases, `all` users, and `all` addresses. If unspecified then [`scram-sha-256` password authentication](https://www.postgresql.org/docs/14/auth-password.html) is used (in 14+; `md5` in older releases). On an uninitialized database, this will populate `pg_hba.conf` via this approximate line: ```console echo "host all all all $POSTGRES_HOST_AUTH_METHOD" >> pg_hba.conf ``` -See the PostgreSQL documentation on [`pg_hba.conf`](https://www.postgresql.org/docs/current/auth-pg-hba-conf.html) for more information about possible values and their meanings. +See the PostgreSQL documentation on [`pg_hba.conf`](https://www.postgresql.org/docs/14/auth-pg-hba-conf.html) for more information about possible values and their meanings. -**Note 1:** It is not recommended to use [`trust`](https://www.postgresql.org/docs/current/auth-trust.html) since it allows anyone to connect without a password, even if one is set (like via `POSTGRES_PASSWORD`). For more information see the PostgreSQL documentation on [*Trust Authentication*](https://www.postgresql.org/docs/current/auth-trust.html). +**Note 1:** It is not recommended to use `trust` since it allows anyone to connect without a password, even if one is set (like via `POSTGRES_PASSWORD`). For more information see the PostgreSQL documentation on [*Trust Authentication*](https://www.postgresql.org/docs/14/auth-trust.html). **Note 2:** If you set `POSTGRES_HOST_AUTH_METHOD` to `trust`, then `POSTGRES_PASSWORD` is not required. +**Note 3:** If you set this to an alternative value (such as `scram-sha-256`), you might need additional `POSTGRES_INITDB_ARGS` for the database to initialize correctly (such as `POSTGRES_INITDB_ARGS=--auth-host=scram-sha-256`). + ### `PGDATA` This optional variable can be used to define another location - like a subdirectory - for the database files. The default is `/var/lib/postgresql/data`. If the data volume you're using is a filesystem mountpoint (like with GCE persistent disks) or remote folder that cannot be chowned to the `postgres` user (like some NFS mounts), Postgres `initdb` recommends a subdirectory be created to contain the data. @@ -108,7 +109,7 @@ $ docker run -d \ %%IMAGE%% ``` -This is an environment variable that is not Docker specific. Because the variable is used by the `postgres` server binary (see the [PostgreSQL docs](https://www.postgresql.org/docs/11/app-postgres.html#id-1.9.5.14.7)), the entrypoint script takes it into account. +This is an environment variable that is not Docker specific. Because the variable is used by the `postgres` server binary (see the [PostgreSQL docs](https://www.postgresql.org/docs/14/app-postgres.html#id-1.9.5.14.7)), the entrypoint script takes it into account. ## Docker Secrets @@ -145,7 +146,7 @@ Additionally, as of [docker-library/postgres#253](https://github.com/docker-libr ## Database Configuration -There are many ways to set PostgreSQL server configuration. For information on what is available to configure, see the postgresql.org [docs](https://www.postgresql.org/docs/current/static/runtime-config.html) for the specific version of PostgreSQL that you are running. Here are a few options for setting configuration: +There are many ways to set PostgreSQL server configuration. For information on what is available to configure, see the [PostgreSQL docs](https://www.postgresql.org/docs/14/runtime-config.html) for the specific version of PostgreSQL that you are running. Here are a few options for setting configuration: - Use a custom config file. Create a config file and get it into the container. If you need a starting place for your config file you can use the sample provided by PostgreSQL which is available in the container at `/usr/share/postgresql/postgresql.conf.sample` (`/usr/local/share/postgresql/postgresql.conf.sample` in Alpine variants). @@ -161,33 +162,41 @@ There are many ways to set PostgreSQL server configuration. For information on w $ docker run -d --name some-postgres -v "$PWD/my-postgres.conf":/etc/postgresql/postgresql.conf -e POSTGRES_PASSWORD=mysecretpassword %%IMAGE%% -c 'config_file=/etc/postgresql/postgresql.conf' ``` -- Set options directly on the run line. The entrypoint script is made so that any options passed to the docker command will be passed along to the `postgres` server daemon. From the [docs](https://www.postgresql.org/docs/current/static/app-postgres.html) we see that any option available in a `.conf` file can be set via `-c`. +- Set options directly on the run line. The entrypoint script is made so that any options passed to the docker command will be passed along to the `postgres` server daemon. From the [PostgreSQL docs](https://www.postgresql.org/docs/14/app-postgres.html#id-1.9.5.14.6.3) we see that any option available in a `.conf` file can be set via `-c`. ```console - $ docker run -d --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword %%IMAGE%% -c 'shared_buffers=256MB' -c 'max_connections=200' + $ docker run -d --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword %%IMAGE%% -c shared_buffers=256MB -c max_connections=200 ``` ## Locale Customization -You can extend the image with a simple `Dockerfile` to set a different locale. The following example will set the default locale to `de_DE.utf8`: +You can extend the Debian-based images with a simple `Dockerfile` to set a different locale. The following example will set the default locale to `de_DE.utf8`: ```dockerfile -FROM %%IMAGE%%:9.4 +FROM %%IMAGE%%:14.3 RUN localedef -i de_DE -c -f UTF-8 -A /usr/share/locale/locale.alias de_DE.UTF-8 ENV LANG de_DE.utf8 ``` Since database initialization only happens on container startup, this allows us to set the language before it is created. +Also of note, Alpine-based variants starting with Postgres 15 support [ICU locales](https://www.postgresql.org/docs/15/locale.html#id-1.6.11.3.7). Previous Postgres versions based on alpine do *not* support locales; see ["Character sets and locale" in the musl documentation](https://wiki.musl-libc.org/functional-differences-from-glibc.html#Character-sets-and-locale) for more details. + +You can set locales in the Alpine-based images with `POSTGRES_INITDB_ARGS` to set a different locale. The following example will set the default locale for a newly initialized database to `de_DE.utf8`: + +```console +$ docker run -d -e LANG=de_DE.utf8 -e POSTGRES_INITDB_ARGS="--locale-provider=icu --icu-locale=de-DE" -e POSTGRES_PASSWORD=mysecretpassword %%IMAGE%%:15-alpine +``` + ## Additional Extensions -When using the default (Debian-based) variants, installing additional extensions (such as PostGIS) should be as simple as installing the relevant packages (see [github.com/postgis/docker-postgis](https://github.com/postgis/docker-postgis/blob/4eb614133d6aa87bfc5c952d24b7eb1f499e5c7c/12-3.0/Dockerfile) for a concrete example). +When using the default (Debian-based) variants, installing additional extensions (such as PostGIS) should be as simple as installing the relevant packages (see [github.com/postgis/docker-postgis](https://github.com/postgis/docker-postgis/blob/81a0b55/14-3.2/Dockerfile) for a concrete example). -When using the Alpine variants, any postgres extension not listed in [postgres-contrib](https://www.postgresql.org/docs/10/static/contrib.html) will need to be compiled in your own image (again, see [github.com/postgis/docker-postgis](https://github.com/postgis/docker-postgis/blob/4eb614133d6aa87bfc5c952d24b7eb1f499e5c7c/12-3.0/alpine/Dockerfile) for a concrete example). +When using the Alpine variants, any postgres extension not listed in [postgres-contrib](https://www.postgresql.org/docs/14/contrib.html) will need to be compiled in your own image (again, see [github.com/postgis/docker-postgis](https://github.com/postgis/docker-postgis/blob/81a0b55/14-3.2/alpine/Dockerfile) for a concrete example). # Arbitrary `--user` Notes -As of [docker-library/postgres#253](https://github.com/docker-library/postgres/pull/253), this image supports running as a (mostly) arbitrary user via `--user` on `docker run`. +As of [docker-library/postgres#253](https://github.com/docker-library/postgres/pull/253), this image supports running as a (mostly) arbitrary user via `--user` on `docker run`. As of [docker-library/postgres#1018](https://github.com/docker-library/postgres/pull/1018), this is also the case for the Alpine variants. The main caveat to note is that `postgres` doesn't care what UID it runs as (as long as the owner of `/var/lib/postgresql/data` matches), but `initdb` *does* care (and needs the user to exist in `/etc/passwd`): @@ -202,7 +211,7 @@ initdb: could not look up effective user ID 1000: user does not exist The three easiest ways to get around this: -1. use the Debian variants (not the Alpine variants) and thus allow the image to use [the `nss_wrapper` library](https://cwrap.org/nss_wrapper.html) to "fake" `/etc/passwd` contents for you (see [docker-library/postgres#448](https://github.com/docker-library/postgres/pull/448) for more details) +1. allow the image to use [the `nss_wrapper` library](https://cwrap.org/nss_wrapper.html) to "fake" `/etc/passwd` contents for you (see [docker-library/postgres#448](https://github.com/docker-library/postgres/pull/448) for more details) 2. bind-mount `/etc/passwd` read-only from the host (if the UID you desire is a valid user on your host): @@ -232,16 +241,14 @@ The three easiest ways to get around this: If there is no database when `postgres` starts in a container, then `postgres` will create the default database for you. While this is the expected behavior of `postgres`, this means that it will not accept incoming connections during that time. This may cause issues when using automation tools, such as `docker-compose`, that start several containers simultaneously. -Also note that the default `/dev/shm` size for containers is 64MB. If the shared memory is exhausted you will encounter `ERROR: could not resize shared memory segment . . . : No space left on device`. You will want to pass [`--shm-size=256MB`](https://docs.docker.com/engine/reference/run/#runtime-constraints-on-resources) for example to `docker run`, or alternatively in [`docker-compose`](https://docs.docker.com/compose/compose-file/#domainname-hostname-ipc-mac_address-privileged-read_only-shm_size-stdin_open-tty-user-working_dir) - -See ["IPVS connection timeout issue" in the Docker Success Center](https://success.docker.com/article/ipvs-connection-timeout-issue) for details about IPVS connection timeouts which will affect long-running idle connections to PostgreSQL in Swarm Mode using overlay networks. +Also note that the default `/dev/shm` size for containers is 64MB. If the shared memory is exhausted you will encounter `ERROR: could not resize shared memory segment . . . : No space left on device`. You will want to pass [`--shm-size=256MB`](https://docs.docker.com/engine/reference/run/#runtime-constraints-on-resources) for example to `docker run`, or alternatively in [`docker-compose`](https://docs.docker.com/compose/compose-file/#shm_size). ## Where to Store Data **Important note:** There are several ways to store data used by applications that run in Docker containers. We encourage users of the `%%IMAGE%%` images to familiarize themselves with the options available, including: -- Let Docker manage the storage of your database data [by writing the database files to disk on the host system using its own internal volume management](https://docs.docker.com/engine/tutorials/dockervolumes/#adding-a-data-volume). This is the default and is easy and fairly transparent to the user. The downside is that the files may be hard to locate for tools and applications that run directly on the host system, i.e. outside containers. -- Create a data directory on the host system (outside the container) and [mount this to a directory visible from inside the container](https://docs.docker.com/engine/tutorials/dockervolumes/#mount-a-host-directory-as-a-data-volume). This places the database files in a known location on the host system, and makes it easy for tools and applications on the host system to access the files. The downside is that the user needs to make sure that the directory exists, and that e.g. directory permissions and other security mechanisms on the host system are set up correctly. +- Let Docker manage the storage of your database data [by writing the database files to disk on the host system using its own internal volume management](https://docs.docker.com/storage/volumes/). This is the default and is easy and fairly transparent to the user. The downside is that the files may be hard to locate for tools and applications that run directly on the host system, i.e. outside containers. +- Create a data directory on the host system (outside the container) and [mount this to a directory visible from inside the container](https://docs.docker.com/storage/bind-mounts/). This places the database files in a known location on the host system, and makes it easy for tools and applications on the host system to access the files. The downside is that the user needs to make sure that the directory exists, and that e.g. directory permissions and other security mechanisms on the host system are set up correctly. The Docker documentation is a good starting point for understanding the different storage options and variations, and there are multiple blogs and forum postings that discuss and give advice in this area. We will simply show the basic procedure here for the latter option above: diff --git a/push.pl b/push.pl index 0586df29119d..6f45a3f4b42e 100755 --- a/push.pl +++ b/push.pl @@ -69,32 +69,56 @@ die 'user failed' unless $userData->res->is_success; $userData = $userData->res->json; +my $supportedTagsRegex = qr%^(# Supported tags and respective `Dockerfile` links\n\n)(.*?\n)(?=# |\[)%ms; + sub prompt_for_edit { my $currentText = shift; my $proposedFile = shift; my $lengthLimit = shift // 0; - my $proposedText = Mojo::File->new($proposedFile)->slurp or warn 'missing ' . $proposedFile; + my $proposedText = Mojo::File->new($proposedFile)->slurp // '** FILE MISSING! **'; $proposedText = trim(decode('UTF-8', $proposedText)); # remove our warning about generated files (Hub doesn't support HTML comments in Markdown) $proposedText =~ s% ^ \s* %%sx; + # extract/re-inject sponsored links + my $sponsoredLinks = ''; + if ($currentText =~ m{ ( ^ [#] \Q Sponsored Resources\E \n .*? \n --- \n ) }smx) { + $sponsoredLinks = $1 . "\n"; + $proposedText =~ s%$supportedTagsRegex%$sponsoredLinks$1$2%; + } + if ($lengthLimit > 0 && length($proposedText) > $lengthLimit) { # TODO https://github.com/docker/hub-beta-feedback/issues/238 my $fullUrl = "$githubBase/$proposedFile"; - my $tagsNote = "**Note:** the description for this image is longer than the Hub length limit of $lengthLimit, so the \"Supported tags\" list has been trimmed to compensate. The full list can be found at [$fullUrl]($fullUrl#supported-tags-and-respective-dockerfile-links). See [docker/hub-beta-feedback#238](https://github.com/docker/hub-beta-feedback/issues/238) for more information.\n\n"; - my $genericNote = "**Note:** the description for this image is longer than the Hub length limit of $lengthLimit, so has been trimmed. The full description can be found at [$fullUrl]($fullUrl). See [docker/hub-beta-feedback#238](https://github.com/docker/hub-beta-feedback/issues/238) for more information.\n\n"; + my $shortTags = "-\tSee [\"Supported tags and respective \`Dockerfile\` links\" at $fullUrl]($fullUrl#supported-tags-and-respective-dockerfile-links)\n\n"; + my $tagsNote = "**Note:** the description for this image is longer than the Hub length limit of $lengthLimit, so the \"Supported tags\" list has been trimmed to compensate. See [docker/hub-beta-feedback#238](https://github.com/docker/hub-beta-feedback/issues/238) for more information.\n\n" . $shortTags; + my $genericNote = "**Note:** the description for this image is longer than the Hub length limit of $lengthLimit, so has been trimmed. The full description can be found at [$fullUrl]($fullUrl). See [docker/hub-beta-feedback#238](https://github.com/docker/hub-beta-feedback/issues/238) for more information."; + my $startingNote = $genericNote . "\n\n"; + my $endingNote = "\n\n...\n\n" . $genericNote; my $trimmedText = $proposedText; # if our text is too long for the Hub length limit, let's first try removing the "Supported tags" list and add $tagsNote and see if that's enough to let us put the full image documentation - $trimmedText =~ s%^(# Supported tags and respective `Dockerfile` links\n\n).*?\n(?=# |\[)%$1$tagsNote%ms; + $trimmedText =~ s%$supportedTagsRegex%$sponsoredLinks$1$tagsNote%ms; # (we scrape until the next "h1" or a line starting with a link which is likely a build status badge for an architecture-namespace) if (length($trimmedText) > $lengthLimit) { # ... if that doesn't do the trick, then do our older naïve description trimming - $trimmedText = $genericNote . substr $proposedText, 0, ($lengthLimit - length($genericNote)); + $trimmedText = $startingNote . substr $proposedText, 0, ($lengthLimit - length($startingNote . $endingNote)); + + # adding the "ending note" (https://github.com/docker/hub-feedback/issues/2220) is a bit more complicated as we have to deal with cutting off markdown ~cleanly so it renders correctly + # TODO deal with "```foo" appropriately (so we don't drop our note in the middle of a code block) - the Hub's current markdown rendering (2022-04-07) does not auto-close a dangling block like this, so this isn't urgent + if ($trimmedText =~ m/\n$/) { + # if we already end with a newline, we should be fine to just trim newlines and add our ending note + $trimmedText =~ s/\n+$//; + } + else { + # otherwise, we need to get a little bit more creative and trim back to the last fully blank line (which we can reasonably assume is safe thanks to our markdownfmt) + $trimmedText =~ s/\n\n(.\n?)*$//; + } + $trimmedText .= $endingNote; } $proposedText = $trimmedText; @@ -170,7 +194,7 @@ sub prompt_for_edit { qw( convert -background none -density 1200 -strip -resize 120x120> -gravity center -extent 120x120 ), $logoToConvert, $repoLogo120, - ) == 0 or die "failed to convert $repoLogoPng into $repoLogo120"; + ) == 0 or die "failed to convert $logoToConvert into $repoLogo120"; } } if (-f $repoLogo120) { diff --git a/pypy/README.md b/pypy/README.md index 90fa33576e18..c20f4cffdca8 100644 --- a/pypy/README.md +++ b/pypy/README.md @@ -20,14 +20,56 @@ WARNING: [the Docker Community](https://github.com/docker-library/pypy) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`2.7-7.3.0`, `2.7-7.3`, `2.7-7`, `2.7`, `2-7.3.0`, `2-7.3`, `2-7`, `2`, `2.7-7.3.0-buster`, `2.7-7.3-buster`, `2.7-7-buster`, `2.7-buster`, `2-7.3.0-buster`, `2-7.3-buster`, `2-7-buster`, `2-buster`](https://github.com/docker-library/pypy/blob/30385f19542aa8bdcca7fb2f7a9a18786e9e8f17/2.7/Dockerfile) -- [`2.7-7.3.0-slim`, `2.7-7.3-slim`, `2.7-7-slim`, `2.7-slim`, `2-7.3.0-slim`, `2-7.3-slim`, `2-7-slim`, `2-slim`, `2.7-7.3.0-slim-buster`, `2.7-7.3-slim-buster`, `2.7-7-slim-buster`, `2.7-slim-buster`, `2-7.3.0-slim-buster`, `2-7.3-slim-buster`, `2-7-slim-buster`, `2-slim-buster`](https://github.com/docker-library/pypy/blob/30385f19542aa8bdcca7fb2f7a9a18786e9e8f17/2.7/slim/Dockerfile) -- [`3.6-7.3.0`, `3.6-7.3`, `3.6-7`, `3.6`, `3-7.3.0`, `3-7.3`, `3-7`, `3`, `latest`, `3.6-7.3.0-buster`, `3.6-7.3-buster`, `3.6-7-buster`, `3.6-buster`, `3-7.3.0-buster`, `3-7.3-buster`, `3-7-buster`, `3-buster`, `buster`](https://github.com/docker-library/pypy/blob/30385f19542aa8bdcca7fb2f7a9a18786e9e8f17/3.6/Dockerfile) -- [`3.6-7.3.0-slim`, `3.6-7.3-slim`, `3.6-7-slim`, `3.6-slim`, `3-7.3.0-slim`, `3-7.3-slim`, `3-7-slim`, `3-slim`, `slim`, `3.6-7.3.0-slim-buster`, `3.6-7.3-slim-buster`, `3.6-7-slim-buster`, `3.6-slim-buster`, `3-7.3.0-slim-buster`, `3-7.3-slim-buster`, `3-7-slim-buster`, `3-slim-buster`, `slim-buster`](https://github.com/docker-library/pypy/blob/30385f19542aa8bdcca7fb2f7a9a18786e9e8f17/3.6/slim/Dockerfile) +(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).) + +## Simple Tags + +- [`3.9-7.3.11-bullseye`, `3.9-7.3-bullseye`, `3.9-7-bullseye`, `3.9-bullseye`, `3-7.3.11-bullseye`, `3-7.3-bullseye`, `3-7-bullseye`, `3-bullseye`, `bullseye`](https://github.com/docker-library/pypy/blob/f297f09255e5a53036355e2e4135c75542099641/3.9/bullseye/Dockerfile) +- [`3.9-7.3.11-slim`, `3.9-7.3-slim`, `3.9-7-slim`, `3.9-slim`, `3-7.3.11-slim`, `3-7.3-slim`, `3-7-slim`, `3-slim`, `slim`, `3.9-7.3.11-slim-bullseye`, `3.9-7.3-slim-bullseye`, `3.9-7-slim-bullseye`, `3.9-slim-bullseye`, `3-7.3.11-slim-bullseye`, `3-7.3-slim-bullseye`, `3-7-slim-bullseye`, `3-slim-bullseye`, `slim-bullseye`](https://github.com/docker-library/pypy/blob/f297f09255e5a53036355e2e4135c75542099641/3.9/slim-bullseye/Dockerfile) +- [`3.9-7.3.11-buster`, `3.9-7.3-buster`, `3.9-7-buster`, `3.9-buster`, `3-7.3.11-buster`, `3-7.3-buster`, `3-7-buster`, `3-buster`, `buster`](https://github.com/docker-library/pypy/blob/f297f09255e5a53036355e2e4135c75542099641/3.9/buster/Dockerfile) +- [`3.9-7.3.11-slim-buster`, `3.9-7.3-slim-buster`, `3.9-7-slim-buster`, `3.9-slim-buster`, `3-7.3.11-slim-buster`, `3-7.3-slim-buster`, `3-7-slim-buster`, `3-slim-buster`, `slim-buster`](https://github.com/docker-library/pypy/blob/f297f09255e5a53036355e2e4135c75542099641/3.9/slim-buster/Dockerfile) +- [`3.9-7.3.11-windowsservercore-ltsc2022`, `3.9-7.3-windowsservercore-ltsc2022`, `3.9-7-windowsservercore-ltsc2022`, `3.9-windowsservercore-ltsc2022`, `3-7.3.11-windowsservercore-ltsc2022`, `3-7.3-windowsservercore-ltsc2022`, `3-7-windowsservercore-ltsc2022`, `3-windowsservercore-ltsc2022`, `windowsservercore-ltsc2022`](https://github.com/docker-library/pypy/blob/f297f09255e5a53036355e2e4135c75542099641/3.9/windows/windowsservercore-ltsc2022/Dockerfile) +- [`3.9-7.3.11-windowsservercore-1809`, `3.9-7.3-windowsservercore-1809`, `3.9-7-windowsservercore-1809`, `3.9-windowsservercore-1809`, `3-7.3.11-windowsservercore-1809`, `3-7.3-windowsservercore-1809`, `3-7-windowsservercore-1809`, `3-windowsservercore-1809`, `windowsservercore-1809`](https://github.com/docker-library/pypy/blob/f297f09255e5a53036355e2e4135c75542099641/3.9/windows/windowsservercore-1809/Dockerfile) +- [`3.8-7.3.11-bullseye`, `3.8-7.3-bullseye`, `3.8-7-bullseye`, `3.8-bullseye`](https://github.com/docker-library/pypy/blob/86944b577ee5ad8fe08db64900a9151abd5a8e3b/3.8/bullseye/Dockerfile) +- [`3.8-7.3.11-slim`, `3.8-7.3-slim`, `3.8-7-slim`, `3.8-slim`, `3.8-7.3.11-slim-bullseye`, `3.8-7.3-slim-bullseye`, `3.8-7-slim-bullseye`, `3.8-slim-bullseye`](https://github.com/docker-library/pypy/blob/86944b577ee5ad8fe08db64900a9151abd5a8e3b/3.8/slim-bullseye/Dockerfile) +- [`3.8-7.3.11-buster`, `3.8-7.3-buster`, `3.8-7-buster`, `3.8-buster`](https://github.com/docker-library/pypy/blob/86944b577ee5ad8fe08db64900a9151abd5a8e3b/3.8/buster/Dockerfile) +- [`3.8-7.3.11-slim-buster`, `3.8-7.3-slim-buster`, `3.8-7-slim-buster`, `3.8-slim-buster`](https://github.com/docker-library/pypy/blob/86944b577ee5ad8fe08db64900a9151abd5a8e3b/3.8/slim-buster/Dockerfile) +- [`3.8-7.3.11-windowsservercore-ltsc2022`, `3.8-7.3-windowsservercore-ltsc2022`, `3.8-7-windowsservercore-ltsc2022`, `3.8-windowsservercore-ltsc2022`](https://github.com/docker-library/pypy/blob/86944b577ee5ad8fe08db64900a9151abd5a8e3b/3.8/windows/windowsservercore-ltsc2022/Dockerfile) +- [`3.8-7.3.11-windowsservercore-1809`, `3.8-7.3-windowsservercore-1809`, `3.8-7-windowsservercore-1809`, `3.8-windowsservercore-1809`](https://github.com/docker-library/pypy/blob/86944b577ee5ad8fe08db64900a9151abd5a8e3b/3.8/windows/windowsservercore-1809/Dockerfile) +- [`2.7-7.3.11-bullseye`, `2.7-7.3-bullseye`, `2.7-7-bullseye`, `2.7-bullseye`, `2-7.3.11-bullseye`, `2-7.3-bullseye`, `2-7-bullseye`, `2-bullseye`](https://github.com/docker-library/pypy/blob/6984fd15d26f75e4078da3380ba405c41f585f98/2.7/bullseye/Dockerfile) +- [`2.7-7.3.11-slim`, `2.7-7.3-slim`, `2.7-7-slim`, `2.7-slim`, `2-7.3.11-slim`, `2-7.3-slim`, `2-7-slim`, `2-slim`, `2.7-7.3.11-slim-bullseye`, `2.7-7.3-slim-bullseye`, `2.7-7-slim-bullseye`, `2.7-slim-bullseye`, `2-7.3.11-slim-bullseye`, `2-7.3-slim-bullseye`, `2-7-slim-bullseye`, `2-slim-bullseye`](https://github.com/docker-library/pypy/blob/6984fd15d26f75e4078da3380ba405c41f585f98/2.7/slim-bullseye/Dockerfile) +- [`2.7-7.3.11-buster`, `2.7-7.3-buster`, `2.7-7-buster`, `2.7-buster`, `2-7.3.11-buster`, `2-7.3-buster`, `2-7-buster`, `2-buster`](https://github.com/docker-library/pypy/blob/6984fd15d26f75e4078da3380ba405c41f585f98/2.7/buster/Dockerfile) +- [`2.7-7.3.11-slim-buster`, `2.7-7.3-slim-buster`, `2.7-7-slim-buster`, `2.7-slim-buster`, `2-7.3.11-slim-buster`, `2-7.3-slim-buster`, `2-7-slim-buster`, `2-slim-buster`](https://github.com/docker-library/pypy/blob/6984fd15d26f75e4078da3380ba405c41f585f98/2.7/slim-buster/Dockerfile) +- [`2.7-7.3.11-windowsservercore-ltsc2022`, `2.7-7.3-windowsservercore-ltsc2022`, `2.7-7-windowsservercore-ltsc2022`, `2.7-windowsservercore-ltsc2022`, `2-7.3.11-windowsservercore-ltsc2022`, `2-7.3-windowsservercore-ltsc2022`, `2-7-windowsservercore-ltsc2022`, `2-windowsservercore-ltsc2022`](https://github.com/docker-library/pypy/blob/6984fd15d26f75e4078da3380ba405c41f585f98/2.7/windows/windowsservercore-ltsc2022/Dockerfile) +- [`2.7-7.3.11-windowsservercore-1809`, `2.7-7.3-windowsservercore-1809`, `2.7-7-windowsservercore-1809`, `2.7-windowsservercore-1809`, `2-7.3.11-windowsservercore-1809`, `2-7.3-windowsservercore-1809`, `2-7-windowsservercore-1809`, `2-windowsservercore-1809`](https://github.com/docker-library/pypy/blob/6984fd15d26f75e4078da3380ba405c41f585f98/2.7/windows/windowsservercore-1809/Dockerfile) + +## Shared Tags + +- `3.9-7.3.11`, `3.9-7.3`, `3.9-7`, `3.9`, `3-7.3.11`, `3-7.3`, `3-7`, `3`, `latest`: + - [`3.9-7.3.11-bullseye`](https://github.com/docker-library/pypy/blob/f297f09255e5a53036355e2e4135c75542099641/3.9/bullseye/Dockerfile) + - [`3.9-7.3.11-windowsservercore-ltsc2022`](https://github.com/docker-library/pypy/blob/f297f09255e5a53036355e2e4135c75542099641/3.9/windows/windowsservercore-ltsc2022/Dockerfile) + - [`3.9-7.3.11-windowsservercore-1809`](https://github.com/docker-library/pypy/blob/f297f09255e5a53036355e2e4135c75542099641/3.9/windows/windowsservercore-1809/Dockerfile) +- `3.9-7.3.11-windowsservercore`, `3.9-7.3-windowsservercore`, `3.9-7-windowsservercore`, `3.9-windowsservercore`, `3-7.3.11-windowsservercore`, `3-7.3-windowsservercore`, `3-7-windowsservercore`, `3-windowsservercore`, `windowsservercore`: + - [`3.9-7.3.11-windowsservercore-ltsc2022`](https://github.com/docker-library/pypy/blob/f297f09255e5a53036355e2e4135c75542099641/3.9/windows/windowsservercore-ltsc2022/Dockerfile) + - [`3.9-7.3.11-windowsservercore-1809`](https://github.com/docker-library/pypy/blob/f297f09255e5a53036355e2e4135c75542099641/3.9/windows/windowsservercore-1809/Dockerfile) +- `3.8-7.3.11`, `3.8-7.3`, `3.8-7`, `3.8`: + - [`3.8-7.3.11-bullseye`](https://github.com/docker-library/pypy/blob/86944b577ee5ad8fe08db64900a9151abd5a8e3b/3.8/bullseye/Dockerfile) + - [`3.8-7.3.11-windowsservercore-ltsc2022`](https://github.com/docker-library/pypy/blob/86944b577ee5ad8fe08db64900a9151abd5a8e3b/3.8/windows/windowsservercore-ltsc2022/Dockerfile) + - [`3.8-7.3.11-windowsservercore-1809`](https://github.com/docker-library/pypy/blob/86944b577ee5ad8fe08db64900a9151abd5a8e3b/3.8/windows/windowsservercore-1809/Dockerfile) +- `3.8-7.3.11-windowsservercore`, `3.8-7.3-windowsservercore`, `3.8-7-windowsservercore`, `3.8-windowsservercore`: + - [`3.8-7.3.11-windowsservercore-ltsc2022`](https://github.com/docker-library/pypy/blob/86944b577ee5ad8fe08db64900a9151abd5a8e3b/3.8/windows/windowsservercore-ltsc2022/Dockerfile) + - [`3.8-7.3.11-windowsservercore-1809`](https://github.com/docker-library/pypy/blob/86944b577ee5ad8fe08db64900a9151abd5a8e3b/3.8/windows/windowsservercore-1809/Dockerfile) +- `2.7-7.3.11`, `2.7-7.3`, `2.7-7`, `2.7`, `2-7.3.11`, `2-7.3`, `2-7`, `2`: + - [`2.7-7.3.11-bullseye`](https://github.com/docker-library/pypy/blob/6984fd15d26f75e4078da3380ba405c41f585f98/2.7/bullseye/Dockerfile) + - [`2.7-7.3.11-windowsservercore-ltsc2022`](https://github.com/docker-library/pypy/blob/6984fd15d26f75e4078da3380ba405c41f585f98/2.7/windows/windowsservercore-ltsc2022/Dockerfile) + - [`2.7-7.3.11-windowsservercore-1809`](https://github.com/docker-library/pypy/blob/6984fd15d26f75e4078da3380ba405c41f585f98/2.7/windows/windowsservercore-1809/Dockerfile) +- `2.7-7.3.11-windowsservercore`, `2.7-7.3-windowsservercore`, `2.7-7-windowsservercore`, `2.7-windowsservercore`, `2-7.3.11-windowsservercore`, `2-7.3-windowsservercore`, `2-7-windowsservercore`, `2-windowsservercore`: + - [`2.7-7.3.11-windowsservercore-ltsc2022`](https://github.com/docker-library/pypy/blob/6984fd15d26f75e4078da3380ba405c41f585f98/2.7/windows/windowsservercore-ltsc2022/Dockerfile) + - [`2.7-7.3.11-windowsservercore-1809`](https://github.com/docker-library/pypy/blob/6984fd15d26f75e4078da3380ba405c41f585f98/2.7/windows/windowsservercore-1809/Dockerfile) # Quick reference (cont.) @@ -35,14 +77,14 @@ WARNING: [https://github.com/docker-library/pypy/issues](https://github.com/docker-library/pypy/issues) - **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) - [`amd64`](https://hub.docker.com/r/amd64/pypy/), [`arm64v8`](https://hub.docker.com/r/arm64v8/pypy/), [`i386`](https://hub.docker.com/r/i386/pypy/), [`ppc64le`](https://hub.docker.com/r/ppc64le/pypy/), [`s390x`](https://hub.docker.com/r/s390x/pypy/) + [`amd64`](https://hub.docker.com/r/amd64/pypy/), [`arm64v8`](https://hub.docker.com/r/arm64v8/pypy/), [`i386`](https://hub.docker.com/r/i386/pypy/), [`windows-amd64`](https://hub.docker.com/r/winamd64/pypy/) - **Published image artifact details**: [repo-info repo's `repos/pypy/` directory](https://github.com/docker-library/repo-info/blob/master/repos/pypy) ([history](https://github.com/docker-library/repo-info/commits/master/repos/pypy)) (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/pypy`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fpypy) + [official-images repo's `library/pypy` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fpypy) [official-images repo's `library/pypy` file](https://github.com/docker-library/official-images/blob/master/library/pypy) ([history](https://github.com/docker-library/official-images/commits/master/library/pypy)) - **Source of this description**: @@ -119,7 +161,7 @@ The `pypy` images come in many flavors, each designed for a specific use case. 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. -Some of these tags may have names like buster 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. +Some of these tags may have names like bullseye or buster 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. 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. @@ -127,6 +169,15 @@ This tag is based off of [`buildpack-deps`](https://hub.docker.com/_/buildpack-d This image does not contain the common packages contained in the default tag and only contains the minimal packages needed to run `pypy`. Unless you are working in an environment where *only* the `pypy` image will be deployed and you have space constraints, we highly recommend using the default image of this repository. +## `pypy:-windowsservercore` + +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. + +For information about how to get Docker running on Windows, please see the relevant "Quick Start" guide provided by Microsoft: + +- [Windows Server Quick Start](https://msdn.microsoft.com/en-us/virtualization/windowscontainers/quick_start/quick_start_windows_server) +- [Windows 10 Quick Start](https://msdn.microsoft.com/en-us/virtualization/windowscontainers/quick_start/quick_start_windows_10) + # License View [license information](https://bitbucket.org/pypy/pypy/src/c3ff0dd6252b6ba0d230f3624dbb4aab8973a1d0/LICENSE?at=default) for software contained in this image. diff --git a/python/README.md b/python/README.md index 5e68df8305b7..32c3c09499fa 100644 --- a/python/README.md +++ b/python/README.md @@ -20,7 +20,7 @@ WARNING: [the Docker Community](https://github.com/docker-library/python) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links @@ -28,64 +28,78 @@ WARNING: ## Simple Tags -- [`3.9.0a6-buster`, `3.9-rc-buster`, `rc-buster`](https://github.com/docker-library/python/blob/06d7952f07eae237666f2fd0ccf6189a5d8ee83c/3.9-rc/buster/Dockerfile) -- [`3.9.0a6-alpine3.11`, `3.9-rc-alpine3.11`, `rc-alpine3.11`, `3.9.0a6-alpine`, `3.9-rc-alpine`, `rc-alpine`](https://github.com/docker-library/python/blob/06d7952f07eae237666f2fd0ccf6189a5d8ee83c/3.9-rc/alpine3.11/Dockerfile) -- [`3.9.0a6-windowsservercore-ltsc2016`, `3.9-rc-windowsservercore-ltsc2016`, `rc-windowsservercore-ltsc2016`](https://github.com/docker-library/python/blob/06d7952f07eae237666f2fd0ccf6189a5d8ee83c/3.9-rc/windows/windowsservercore-ltsc2016/Dockerfile) -- [`3.9.0a6-windowsservercore-1809`, `3.9-rc-windowsservercore-1809`, `rc-windowsservercore-1809`](https://github.com/docker-library/python/blob/06d7952f07eae237666f2fd0ccf6189a5d8ee83c/3.9-rc/windows/windowsservercore-1809/Dockerfile) -- [`3.8.3-buster`, `3.8-buster`, `3-buster`, `buster`](https://github.com/docker-library/python/blob/3ebdcfdf001fb2a5b6c4d283379371f7d0537436/3.8/buster/Dockerfile) -- [`3.8.3-slim-buster`, `3.8-slim-buster`, `3-slim-buster`, `slim-buster`, `3.8.3-slim`, `3.8-slim`, `3-slim`, `slim`](https://github.com/docker-library/python/blob/3ebdcfdf001fb2a5b6c4d283379371f7d0537436/3.8/buster/slim/Dockerfile) -- [`3.8.3-alpine3.11`, `3.8-alpine3.11`, `3-alpine3.11`, `alpine3.11`, `3.8.3-alpine`, `3.8-alpine`, `3-alpine`, `alpine`](https://github.com/docker-library/python/blob/3ebdcfdf001fb2a5b6c4d283379371f7d0537436/3.8/alpine3.11/Dockerfile) -- [`3.8.3-alpine3.10`, `3.8-alpine3.10`, `3-alpine3.10`, `alpine3.10`](https://github.com/docker-library/python/blob/3ebdcfdf001fb2a5b6c4d283379371f7d0537436/3.8/alpine3.10/Dockerfile) -- [`3.8.3-windowsservercore-ltsc2016`, `3.8-windowsservercore-ltsc2016`, `3-windowsservercore-ltsc2016`, `windowsservercore-ltsc2016`](https://github.com/docker-library/python/blob/3ebdcfdf001fb2a5b6c4d283379371f7d0537436/3.8/windows/windowsservercore-ltsc2016/Dockerfile) -- [`3.8.3-windowsservercore-1809`, `3.8-windowsservercore-1809`, `3-windowsservercore-1809`, `windowsservercore-1809`](https://github.com/docker-library/python/blob/3ebdcfdf001fb2a5b6c4d283379371f7d0537436/3.8/windows/windowsservercore-1809/Dockerfile) -- [`3.7.7-buster`, `3.7-buster`](https://github.com/docker-library/python/blob/b818e9441c088295165edf79a791503f1fe7f6f7/3.7/buster/Dockerfile) -- [`3.7.7-slim-buster`, `3.7-slim-buster`, `3.7.7-slim`, `3.7-slim`](https://github.com/docker-library/python/blob/b818e9441c088295165edf79a791503f1fe7f6f7/3.7/buster/slim/Dockerfile) -- [`3.7.7-stretch`, `3.7-stretch`](https://github.com/docker-library/python/blob/b818e9441c088295165edf79a791503f1fe7f6f7/3.7/stretch/Dockerfile) -- [`3.7.7-slim-stretch`, `3.7-slim-stretch`](https://github.com/docker-library/python/blob/b818e9441c088295165edf79a791503f1fe7f6f7/3.7/stretch/slim/Dockerfile) -- [`3.7.7-alpine3.11`, `3.7-alpine3.11`, `3.7.7-alpine`, `3.7-alpine`](https://github.com/docker-library/python/blob/b818e9441c088295165edf79a791503f1fe7f6f7/3.7/alpine3.11/Dockerfile) -- [`3.7.7-alpine3.10`, `3.7-alpine3.10`](https://github.com/docker-library/python/blob/b818e9441c088295165edf79a791503f1fe7f6f7/3.7/alpine3.10/Dockerfile) -- [`3.7.7-windowsservercore-ltsc2016`, `3.7-windowsservercore-ltsc2016`](https://github.com/docker-library/python/blob/b818e9441c088295165edf79a791503f1fe7f6f7/3.7/windows/windowsservercore-ltsc2016/Dockerfile) -- [`3.7.7-windowsservercore-1809`, `3.7-windowsservercore-1809`](https://github.com/docker-library/python/blob/b818e9441c088295165edf79a791503f1fe7f6f7/3.7/windows/windowsservercore-1809/Dockerfile) -- [`3.6.10-buster`, `3.6-buster`](https://github.com/docker-library/python/blob/bbb44b3ab29fb1d60dbe59c5a7ea4af868657ff2/3.6/buster/Dockerfile) -- [`3.6.10-slim-buster`, `3.6-slim-buster`, `3.6.10-slim`, `3.6-slim`](https://github.com/docker-library/python/blob/bbb44b3ab29fb1d60dbe59c5a7ea4af868657ff2/3.6/buster/slim/Dockerfile) -- [`3.6.10-stretch`, `3.6-stretch`](https://github.com/docker-library/python/blob/bbb44b3ab29fb1d60dbe59c5a7ea4af868657ff2/3.6/stretch/Dockerfile) -- [`3.6.10-slim-stretch`, `3.6-slim-stretch`](https://github.com/docker-library/python/blob/bbb44b3ab29fb1d60dbe59c5a7ea4af868657ff2/3.6/stretch/slim/Dockerfile) -- [`3.6.10-alpine3.11`, `3.6-alpine3.11`, `3.6.10-alpine`, `3.6-alpine`](https://github.com/docker-library/python/blob/bbb44b3ab29fb1d60dbe59c5a7ea4af868657ff2/3.6/alpine3.11/Dockerfile) -- [`3.6.10-alpine3.10`, `3.6-alpine3.10`](https://github.com/docker-library/python/blob/bbb44b3ab29fb1d60dbe59c5a7ea4af868657ff2/3.6/alpine3.10/Dockerfile) -- [`3.5.9-buster`, `3.5-buster`](https://github.com/docker-library/python/blob/37be883220593e283fc8f9298e0804a063e29c44/3.5/buster/Dockerfile) -- [`3.5.9-slim-buster`, `3.5-slim-buster`, `3.5.9-slim`, `3.5-slim`](https://github.com/docker-library/python/blob/37be883220593e283fc8f9298e0804a063e29c44/3.5/buster/slim/Dockerfile) -- [`3.5.9-stretch`, `3.5-stretch`](https://github.com/docker-library/python/blob/37be883220593e283fc8f9298e0804a063e29c44/3.5/stretch/Dockerfile) -- [`3.5.9-slim-stretch`, `3.5-slim-stretch`](https://github.com/docker-library/python/blob/37be883220593e283fc8f9298e0804a063e29c44/3.5/stretch/slim/Dockerfile) -- [`3.5.9-alpine3.11`, `3.5-alpine3.11`, `3.5.9-alpine`, `3.5-alpine`](https://github.com/docker-library/python/blob/37be883220593e283fc8f9298e0804a063e29c44/3.5/alpine3.11/Dockerfile) -- [`3.5.9-alpine3.10`, `3.5-alpine3.10`](https://github.com/docker-library/python/blob/37be883220593e283fc8f9298e0804a063e29c44/3.5/alpine3.10/Dockerfile) +- [`3.12.0a4-bullseye`, `3.12-rc-bullseye`](https://github.com/docker-library/python/blob/bff32fbfdbd737838c16c6b01ac910fb889e0767/3.12-rc/bullseye/Dockerfile) +- [`3.12.0a4-slim-bullseye`, `3.12-rc-slim-bullseye`, `3.12.0a4-slim`, `3.12-rc-slim`](https://github.com/docker-library/python/blob/bff32fbfdbd737838c16c6b01ac910fb889e0767/3.12-rc/slim-bullseye/Dockerfile) +- [`3.12.0a4-buster`, `3.12-rc-buster`](https://github.com/docker-library/python/blob/bff32fbfdbd737838c16c6b01ac910fb889e0767/3.12-rc/buster/Dockerfile) +- [`3.12.0a4-slim-buster`, `3.12-rc-slim-buster`](https://github.com/docker-library/python/blob/bff32fbfdbd737838c16c6b01ac910fb889e0767/3.12-rc/slim-buster/Dockerfile) +- [`3.12.0a4-alpine3.17`, `3.12-rc-alpine3.17`, `3.12.0a4-alpine`, `3.12-rc-alpine`](https://github.com/docker-library/python/blob/bff32fbfdbd737838c16c6b01ac910fb889e0767/3.12-rc/alpine3.17/Dockerfile) +- [`3.12.0a4-alpine3.16`, `3.12-rc-alpine3.16`](https://github.com/docker-library/python/blob/bff32fbfdbd737838c16c6b01ac910fb889e0767/3.12-rc/alpine3.16/Dockerfile) +- [`3.12.0a4-windowsservercore-ltsc2022`, `3.12-rc-windowsservercore-ltsc2022`](https://github.com/docker-library/python/blob/bff32fbfdbd737838c16c6b01ac910fb889e0767/3.12-rc/windows/windowsservercore-ltsc2022/Dockerfile) +- [`3.12.0a4-windowsservercore-1809`, `3.12-rc-windowsservercore-1809`](https://github.com/docker-library/python/blob/bff32fbfdbd737838c16c6b01ac910fb889e0767/3.12-rc/windows/windowsservercore-1809/Dockerfile) +- [`3.11.1-bullseye`, `3.11-bullseye`, `3-bullseye`, `bullseye`](https://github.com/docker-library/python/blob/046374fd6a8186a58ef8099e8b5f43946487f5fa/3.11/bullseye/Dockerfile) +- [`3.11.1-slim-bullseye`, `3.11-slim-bullseye`, `3-slim-bullseye`, `slim-bullseye`, `3.11.1-slim`, `3.11-slim`, `3-slim`, `slim`](https://github.com/docker-library/python/blob/046374fd6a8186a58ef8099e8b5f43946487f5fa/3.11/slim-bullseye/Dockerfile) +- [`3.11.1-buster`, `3.11-buster`, `3-buster`, `buster`](https://github.com/docker-library/python/blob/046374fd6a8186a58ef8099e8b5f43946487f5fa/3.11/buster/Dockerfile) +- [`3.11.1-slim-buster`, `3.11-slim-buster`, `3-slim-buster`, `slim-buster`](https://github.com/docker-library/python/blob/046374fd6a8186a58ef8099e8b5f43946487f5fa/3.11/slim-buster/Dockerfile) +- [`3.11.1-alpine3.17`, `3.11-alpine3.17`, `3-alpine3.17`, `alpine3.17`, `3.11.1-alpine`, `3.11-alpine`, `3-alpine`, `alpine`](https://github.com/docker-library/python/blob/046374fd6a8186a58ef8099e8b5f43946487f5fa/3.11/alpine3.17/Dockerfile) +- [`3.11.1-alpine3.16`, `3.11-alpine3.16`, `3-alpine3.16`, `alpine3.16`](https://github.com/docker-library/python/blob/046374fd6a8186a58ef8099e8b5f43946487f5fa/3.11/alpine3.16/Dockerfile) +- [`3.11.1-windowsservercore-ltsc2022`, `3.11-windowsservercore-ltsc2022`, `3-windowsservercore-ltsc2022`, `windowsservercore-ltsc2022`](https://github.com/docker-library/python/blob/046374fd6a8186a58ef8099e8b5f43946487f5fa/3.11/windows/windowsservercore-ltsc2022/Dockerfile) +- [`3.11.1-windowsservercore-1809`, `3.11-windowsservercore-1809`, `3-windowsservercore-1809`, `windowsservercore-1809`](https://github.com/docker-library/python/blob/046374fd6a8186a58ef8099e8b5f43946487f5fa/3.11/windows/windowsservercore-1809/Dockerfile) +- [`3.10.9-bullseye`, `3.10-bullseye`](https://github.com/docker-library/python/blob/046374fd6a8186a58ef8099e8b5f43946487f5fa/3.10/bullseye/Dockerfile) +- [`3.10.9-slim-bullseye`, `3.10-slim-bullseye`, `3.10.9-slim`, `3.10-slim`](https://github.com/docker-library/python/blob/046374fd6a8186a58ef8099e8b5f43946487f5fa/3.10/slim-bullseye/Dockerfile) +- [`3.10.9-buster`, `3.10-buster`](https://github.com/docker-library/python/blob/046374fd6a8186a58ef8099e8b5f43946487f5fa/3.10/buster/Dockerfile) +- [`3.10.9-slim-buster`, `3.10-slim-buster`](https://github.com/docker-library/python/blob/046374fd6a8186a58ef8099e8b5f43946487f5fa/3.10/slim-buster/Dockerfile) +- [`3.10.9-alpine3.17`, `3.10-alpine3.17`, `3.10.9-alpine`, `3.10-alpine`](https://github.com/docker-library/python/blob/046374fd6a8186a58ef8099e8b5f43946487f5fa/3.10/alpine3.17/Dockerfile) +- [`3.10.9-alpine3.16`, `3.10-alpine3.16`](https://github.com/docker-library/python/blob/046374fd6a8186a58ef8099e8b5f43946487f5fa/3.10/alpine3.16/Dockerfile) +- [`3.10.9-windowsservercore-ltsc2022`, `3.10-windowsservercore-ltsc2022`](https://github.com/docker-library/python/blob/046374fd6a8186a58ef8099e8b5f43946487f5fa/3.10/windows/windowsservercore-ltsc2022/Dockerfile) +- [`3.10.9-windowsservercore-1809`, `3.10-windowsservercore-1809`](https://github.com/docker-library/python/blob/046374fd6a8186a58ef8099e8b5f43946487f5fa/3.10/windows/windowsservercore-1809/Dockerfile) +- [`3.9.16-bullseye`, `3.9-bullseye`](https://github.com/docker-library/python/blob/c65e0664a7a18ca566a744c6921eb66539337b0c/3.9/bullseye/Dockerfile) +- [`3.9.16-slim-bullseye`, `3.9-slim-bullseye`, `3.9.16-slim`, `3.9-slim`](https://github.com/docker-library/python/blob/c65e0664a7a18ca566a744c6921eb66539337b0c/3.9/slim-bullseye/Dockerfile) +- [`3.9.16-buster`, `3.9-buster`](https://github.com/docker-library/python/blob/c65e0664a7a18ca566a744c6921eb66539337b0c/3.9/buster/Dockerfile) +- [`3.9.16-slim-buster`, `3.9-slim-buster`](https://github.com/docker-library/python/blob/c65e0664a7a18ca566a744c6921eb66539337b0c/3.9/slim-buster/Dockerfile) +- [`3.9.16-alpine3.17`, `3.9-alpine3.17`, `3.9.16-alpine`, `3.9-alpine`](https://github.com/docker-library/python/blob/c65e0664a7a18ca566a744c6921eb66539337b0c/3.9/alpine3.17/Dockerfile) +- [`3.9.16-alpine3.16`, `3.9-alpine3.16`](https://github.com/docker-library/python/blob/c65e0664a7a18ca566a744c6921eb66539337b0c/3.9/alpine3.16/Dockerfile) +- [`3.8.16-bullseye`, `3.8-bullseye`](https://github.com/docker-library/python/blob/f5b7b5a332bd4d2c1518325ab9647b09bf07412f/3.8/bullseye/Dockerfile) +- [`3.8.16-slim-bullseye`, `3.8-slim-bullseye`, `3.8.16-slim`, `3.8-slim`](https://github.com/docker-library/python/blob/f5b7b5a332bd4d2c1518325ab9647b09bf07412f/3.8/slim-bullseye/Dockerfile) +- [`3.8.16-buster`, `3.8-buster`](https://github.com/docker-library/python/blob/f5b7b5a332bd4d2c1518325ab9647b09bf07412f/3.8/buster/Dockerfile) +- [`3.8.16-slim-buster`, `3.8-slim-buster`](https://github.com/docker-library/python/blob/f5b7b5a332bd4d2c1518325ab9647b09bf07412f/3.8/slim-buster/Dockerfile) +- [`3.8.16-alpine3.17`, `3.8-alpine3.17`, `3.8.16-alpine`, `3.8-alpine`](https://github.com/docker-library/python/blob/f5b7b5a332bd4d2c1518325ab9647b09bf07412f/3.8/alpine3.17/Dockerfile) +- [`3.8.16-alpine3.16`, `3.8-alpine3.16`](https://github.com/docker-library/python/blob/f5b7b5a332bd4d2c1518325ab9647b09bf07412f/3.8/alpine3.16/Dockerfile) +- [`3.7.16-bullseye`, `3.7-bullseye`](https://github.com/docker-library/python/blob/9dacd07bff4576c2ae58c8d9302c6a43560f723d/3.7/bullseye/Dockerfile) +- [`3.7.16-slim-bullseye`, `3.7-slim-bullseye`, `3.7.16-slim`, `3.7-slim`](https://github.com/docker-library/python/blob/9dacd07bff4576c2ae58c8d9302c6a43560f723d/3.7/slim-bullseye/Dockerfile) +- [`3.7.16-buster`, `3.7-buster`](https://github.com/docker-library/python/blob/9dacd07bff4576c2ae58c8d9302c6a43560f723d/3.7/buster/Dockerfile) +- [`3.7.16-slim-buster`, `3.7-slim-buster`](https://github.com/docker-library/python/blob/9dacd07bff4576c2ae58c8d9302c6a43560f723d/3.7/slim-buster/Dockerfile) +- [`3.7.16-alpine3.17`, `3.7-alpine3.17`, `3.7.16-alpine`, `3.7-alpine`](https://github.com/docker-library/python/blob/9dacd07bff4576c2ae58c8d9302c6a43560f723d/3.7/alpine3.17/Dockerfile) +- [`3.7.16-alpine3.16`, `3.7-alpine3.16`](https://github.com/docker-library/python/blob/9dacd07bff4576c2ae58c8d9302c6a43560f723d/3.7/alpine3.16/Dockerfile) ## Shared Tags -- `3.9.0a6`, `3.9-rc`, `rc`: - - [`3.9.0a6-buster`](https://github.com/docker-library/python/blob/06d7952f07eae237666f2fd0ccf6189a5d8ee83c/3.9-rc/buster/Dockerfile) - - [`3.9.0a6-windowsservercore-ltsc2016`](https://github.com/docker-library/python/blob/06d7952f07eae237666f2fd0ccf6189a5d8ee83c/3.9-rc/windows/windowsservercore-ltsc2016/Dockerfile) - - [`3.9.0a6-windowsservercore-1809`](https://github.com/docker-library/python/blob/06d7952f07eae237666f2fd0ccf6189a5d8ee83c/3.9-rc/windows/windowsservercore-1809/Dockerfile) -- `3.9.0a6-windowsservercore`, `3.9-rc-windowsservercore`, `rc-windowsservercore`: - - [`3.9.0a6-windowsservercore-ltsc2016`](https://github.com/docker-library/python/blob/06d7952f07eae237666f2fd0ccf6189a5d8ee83c/3.9-rc/windows/windowsservercore-ltsc2016/Dockerfile) - - [`3.9.0a6-windowsservercore-1809`](https://github.com/docker-library/python/blob/06d7952f07eae237666f2fd0ccf6189a5d8ee83c/3.9-rc/windows/windowsservercore-1809/Dockerfile) -- `3.8.3`, `3.8`, `3`, `latest`: - - [`3.8.3-buster`](https://github.com/docker-library/python/blob/3ebdcfdf001fb2a5b6c4d283379371f7d0537436/3.8/buster/Dockerfile) - - [`3.8.3-windowsservercore-ltsc2016`](https://github.com/docker-library/python/blob/3ebdcfdf001fb2a5b6c4d283379371f7d0537436/3.8/windows/windowsservercore-ltsc2016/Dockerfile) - - [`3.8.3-windowsservercore-1809`](https://github.com/docker-library/python/blob/3ebdcfdf001fb2a5b6c4d283379371f7d0537436/3.8/windows/windowsservercore-1809/Dockerfile) -- `3.8.3-windowsservercore`, `3.8-windowsservercore`, `3-windowsservercore`, `windowsservercore`: - - [`3.8.3-windowsservercore-ltsc2016`](https://github.com/docker-library/python/blob/3ebdcfdf001fb2a5b6c4d283379371f7d0537436/3.8/windows/windowsservercore-ltsc2016/Dockerfile) - - [`3.8.3-windowsservercore-1809`](https://github.com/docker-library/python/blob/3ebdcfdf001fb2a5b6c4d283379371f7d0537436/3.8/windows/windowsservercore-1809/Dockerfile) -- `3.7.7`, `3.7`: - - [`3.7.7-buster`](https://github.com/docker-library/python/blob/b818e9441c088295165edf79a791503f1fe7f6f7/3.7/buster/Dockerfile) - - [`3.7.7-windowsservercore-ltsc2016`](https://github.com/docker-library/python/blob/b818e9441c088295165edf79a791503f1fe7f6f7/3.7/windows/windowsservercore-ltsc2016/Dockerfile) - - [`3.7.7-windowsservercore-1809`](https://github.com/docker-library/python/blob/b818e9441c088295165edf79a791503f1fe7f6f7/3.7/windows/windowsservercore-1809/Dockerfile) -- `3.7.7-windowsservercore`, `3.7-windowsservercore`: - - [`3.7.7-windowsservercore-ltsc2016`](https://github.com/docker-library/python/blob/b818e9441c088295165edf79a791503f1fe7f6f7/3.7/windows/windowsservercore-ltsc2016/Dockerfile) - - [`3.7.7-windowsservercore-1809`](https://github.com/docker-library/python/blob/b818e9441c088295165edf79a791503f1fe7f6f7/3.7/windows/windowsservercore-1809/Dockerfile) -- `3.6.10`, `3.6`: - - [`3.6.10-buster`](https://github.com/docker-library/python/blob/bbb44b3ab29fb1d60dbe59c5a7ea4af868657ff2/3.6/buster/Dockerfile) -- `3.5.9`, `3.5`: - - [`3.5.9-buster`](https://github.com/docker-library/python/blob/37be883220593e283fc8f9298e0804a063e29c44/3.5/buster/Dockerfile) +- `3.12.0a4`, `3.12-rc`: + - [`3.12.0a4-bullseye`](https://github.com/docker-library/python/blob/bff32fbfdbd737838c16c6b01ac910fb889e0767/3.12-rc/bullseye/Dockerfile) + - [`3.12.0a4-windowsservercore-ltsc2022`](https://github.com/docker-library/python/blob/bff32fbfdbd737838c16c6b01ac910fb889e0767/3.12-rc/windows/windowsservercore-ltsc2022/Dockerfile) + - [`3.12.0a4-windowsservercore-1809`](https://github.com/docker-library/python/blob/bff32fbfdbd737838c16c6b01ac910fb889e0767/3.12-rc/windows/windowsservercore-1809/Dockerfile) +- `3.12.0a4-windowsservercore`, `3.12-rc-windowsservercore`: + - [`3.12.0a4-windowsservercore-ltsc2022`](https://github.com/docker-library/python/blob/bff32fbfdbd737838c16c6b01ac910fb889e0767/3.12-rc/windows/windowsservercore-ltsc2022/Dockerfile) + - [`3.12.0a4-windowsservercore-1809`](https://github.com/docker-library/python/blob/bff32fbfdbd737838c16c6b01ac910fb889e0767/3.12-rc/windows/windowsservercore-1809/Dockerfile) +- `3.11.1`, `3.11`, `3`, `latest`: + - [`3.11.1-bullseye`](https://github.com/docker-library/python/blob/046374fd6a8186a58ef8099e8b5f43946487f5fa/3.11/bullseye/Dockerfile) + - [`3.11.1-windowsservercore-ltsc2022`](https://github.com/docker-library/python/blob/046374fd6a8186a58ef8099e8b5f43946487f5fa/3.11/windows/windowsservercore-ltsc2022/Dockerfile) + - [`3.11.1-windowsservercore-1809`](https://github.com/docker-library/python/blob/046374fd6a8186a58ef8099e8b5f43946487f5fa/3.11/windows/windowsservercore-1809/Dockerfile) +- `3.11.1-windowsservercore`, `3.11-windowsservercore`, `3-windowsservercore`, `windowsservercore`: + - [`3.11.1-windowsservercore-ltsc2022`](https://github.com/docker-library/python/blob/046374fd6a8186a58ef8099e8b5f43946487f5fa/3.11/windows/windowsservercore-ltsc2022/Dockerfile) + - [`3.11.1-windowsservercore-1809`](https://github.com/docker-library/python/blob/046374fd6a8186a58ef8099e8b5f43946487f5fa/3.11/windows/windowsservercore-1809/Dockerfile) +- `3.10.9`, `3.10`: + - [`3.10.9-bullseye`](https://github.com/docker-library/python/blob/046374fd6a8186a58ef8099e8b5f43946487f5fa/3.10/bullseye/Dockerfile) + - [`3.10.9-windowsservercore-ltsc2022`](https://github.com/docker-library/python/blob/046374fd6a8186a58ef8099e8b5f43946487f5fa/3.10/windows/windowsservercore-ltsc2022/Dockerfile) + - [`3.10.9-windowsservercore-1809`](https://github.com/docker-library/python/blob/046374fd6a8186a58ef8099e8b5f43946487f5fa/3.10/windows/windowsservercore-1809/Dockerfile) +- `3.10.9-windowsservercore`, `3.10-windowsservercore`: + - [`3.10.9-windowsservercore-ltsc2022`](https://github.com/docker-library/python/blob/046374fd6a8186a58ef8099e8b5f43946487f5fa/3.10/windows/windowsservercore-ltsc2022/Dockerfile) + - [`3.10.9-windowsservercore-1809`](https://github.com/docker-library/python/blob/046374fd6a8186a58ef8099e8b5f43946487f5fa/3.10/windows/windowsservercore-1809/Dockerfile) +- `3.9.16`, `3.9`: + - [`3.9.16-bullseye`](https://github.com/docker-library/python/blob/c65e0664a7a18ca566a744c6921eb66539337b0c/3.9/bullseye/Dockerfile) +- `3.8.16`, `3.8`: + - [`3.8.16-bullseye`](https://github.com/docker-library/python/blob/f5b7b5a332bd4d2c1518325ab9647b09bf07412f/3.8/bullseye/Dockerfile) +- `3.7.16`, `3.7`: + - [`3.7.16-bullseye`](https://github.com/docker-library/python/blob/9dacd07bff4576c2ae58c8d9302c6a43560f723d/3.7/bullseye/Dockerfile) # Quick reference (cont.) @@ -100,7 +114,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/python`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fpython) + [official-images repo's `library/python` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fpython) [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)) - **Source of this description**: @@ -167,6 +181,10 @@ or (again, if you need to use Python 2): $ 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 ``` +## Multiple Python versions in the image + +In the non `python:slim` variants there will be an additional older `python` executable at `/usr/bin/python` while the desired newer `/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 + # Image Variants The `python` images come in many flavors, each designed for a specific use case. @@ -175,15 +193,19 @@ The `python` images come in many flavors, each designed for a specific use case. 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. -Some of these tags may have names like buster or stretch 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. +Some of these tags may have names like bullseye or buster 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. 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. +## `python:-slim` + +This image does not contain the common packages contained in the default tag and only contains the minimal 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. + ## `python:-alpine` -This image is based on the popular [Alpine Linux project](http://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. +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. -This variant is highly recommended when final image size being as small as possible is desired. The main caveat to note is that it does use [musl libc](http://www.musl-libc.org) instead of [glibc and friends](http://www.etalabs.net/compare_libcs.html), so certain software might run into issues depending on the depth of their libc requirements. However, most software doesn't have an issue with this, so this variant is usually a very safe choice. 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. +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. 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). @@ -196,10 +218,6 @@ For information about how to get Docker running on Windows, please see the relev - [Windows Server Quick Start](https://msdn.microsoft.com/en-us/virtualization/windowscontainers/quick_start/quick_start_windows_server) - [Windows 10 Quick Start](https://msdn.microsoft.com/en-us/virtualization/windowscontainers/quick_start/quick_start_windows_10) -## `python:-slim` - -This image does not contain the common packages contained in the default tag and only contains the minimal 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. - # License View license information for [Python 2](https://docs.python.org/2/license.html) and [Python 3](https://docs.python.org/3/license.html). diff --git a/python/content.md b/python/content.md index 512f4099e724..7a8abeda0b13 100644 --- a/python/content.md +++ b/python/content.md @@ -58,3 +58,7 @@ or (again, if you need to use Python 2): ```console $ docker run -it --rm --name my-running-script -v "$PWD":/usr/src/myapp -w /usr/src/myapp %%IMAGE%%:2 python your-daemon-or-script.py ``` + +## Multiple Python versions in the image + +In the non `python:slim` variants there will be an additional older `python` executable at `/usr/bin/python` while the desired newer `/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 diff --git a/r-base/README.md b/r-base/README.md index 830a5b8e3b63..396db1c9e598 100644 --- a/r-base/README.md +++ b/r-base/README.md @@ -20,11 +20,11 @@ WARNING: [the Rocker Community](https://github.com/rocker-org/rocker) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`4.0.0`, `latest`](https://github.com/rocker-org/rocker/blob/1286d1fa0165a06b93ea9c4cebd94a54cbf86227/r-base/latest/Dockerfile) +- [`4.2.2`, `latest`](https://github.com/rocker-org/rocker/blob/2f92c6c8b8da7b3e61aabc44cacc0439bf267d31/r-base/4.2.2/Dockerfile) # Quick reference (cont.) @@ -32,14 +32,14 @@ WARNING: [GitHub](https://github.com/rocker-org/rocker/issues) or [Email](mailto:rocker-maintainers@eddelbuettel.com) - **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) - [`amd64`](https://hub.docker.com/r/amd64/r-base/) + [`amd64`](https://hub.docker.com/r/amd64/r-base/), [`arm64v8`](https://hub.docker.com/r/arm64v8/r-base/), [`ppc64le`](https://hub.docker.com/r/ppc64le/r-base/), [`s390x`](https://hub.docker.com/r/s390x/r-base/) - **Published image artifact details**: [repo-info repo's `repos/r-base/` directory](https://github.com/docker-library/repo-info/blob/master/repos/r-base) ([history](https://github.com/docker-library/repo-info/commits/master/repos/r-base)) (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/r-base`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fr-base) + [official-images repo's `library/r-base` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fr-base) [official-images repo's `library/r-base` file](https://github.com/docker-library/official-images/blob/master/library/r-base) ([history](https://github.com/docker-library/official-images/commits/master/library/r-base)) - **Source of this description**: diff --git a/rabbitmq/README.md b/rabbitmq/README.md index 0f49f31492f7..961c858707be 100644 --- a/rabbitmq/README.md +++ b/rabbitmq/README.md @@ -20,18 +20,22 @@ WARNING: [the Docker Community](https://github.com/docker-library/rabbitmq) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`3.8.3`, `3.8`, `3`, `latest`](https://github.com/docker-library/rabbitmq/blob/91be7cf597c069c9a038ae2619adac1a85e68d4d/3.8/ubuntu/Dockerfile) -- [`3.8.3-management`, `3.8-management`, `3-management`, `management`](https://github.com/docker-library/rabbitmq/blob/af5f6ff9a3916d89be6d190d562d247ae12ffa73/3.8/ubuntu/management/Dockerfile) -- [`3.8.3-alpine`, `3.8-alpine`, `3-alpine`, `alpine`](https://github.com/docker-library/rabbitmq/blob/91be7cf597c069c9a038ae2619adac1a85e68d4d/3.8/alpine/Dockerfile) -- [`3.8.3-management-alpine`, `3.8-management-alpine`, `3-management-alpine`, `management-alpine`](https://github.com/docker-library/rabbitmq/blob/af5f6ff9a3916d89be6d190d562d247ae12ffa73/3.8/alpine/management/Dockerfile) -- [`3.7.26`, `3.7`](https://github.com/docker-library/rabbitmq/blob/c24b3b15b1128272e64cba8d1dba37603c2b1d68/3.7/ubuntu/Dockerfile) -- [`3.7.26-management`, `3.7-management`](https://github.com/docker-library/rabbitmq/blob/bf2c73df6ee8475ac30c9773a8128852450ea518/3.7/ubuntu/management/Dockerfile) -- [`3.7.26-alpine`, `3.7-alpine`](https://github.com/docker-library/rabbitmq/blob/c24b3b15b1128272e64cba8d1dba37603c2b1d68/3.7/alpine/Dockerfile) -- [`3.7.26-management-alpine`, `3.7-management-alpine`](https://github.com/docker-library/rabbitmq/blob/bf2c73df6ee8475ac30c9773a8128852450ea518/3.7/alpine/management/Dockerfile) +- [`3.11.6`, `3.11`, `3`, `latest`](https://github.com/docker-library/rabbitmq/blob/a74a786356f12d59b2b19cfe0b1c9d1c78bb6f9c/3.11/ubuntu/Dockerfile) +- [`3.11.6-management`, `3.11-management`, `3-management`, `management`](https://github.com/docker-library/rabbitmq/blob/65eb19295b7975c4614d6071fb3fc6a1b86282a1/3.11/ubuntu/management/Dockerfile) +- [`3.11.6-alpine`, `3.11-alpine`, `3-alpine`, `alpine`](https://github.com/docker-library/rabbitmq/blob/a74a786356f12d59b2b19cfe0b1c9d1c78bb6f9c/3.11/alpine/Dockerfile) +- [`3.11.6-management-alpine`, `3.11-management-alpine`, `3-management-alpine`, `management-alpine`](https://github.com/docker-library/rabbitmq/blob/65eb19295b7975c4614d6071fb3fc6a1b86282a1/3.11/alpine/management/Dockerfile) +- [`3.10.13`, `3.10`](https://github.com/docker-library/rabbitmq/blob/5d66324218c46b8e2f80487086972d24ccfae9bb/3.10/ubuntu/Dockerfile) +- [`3.10.13-management`, `3.10-management`](https://github.com/docker-library/rabbitmq/blob/6e226fe8e99702c8726d5e7d5c5864e69548048d/3.10/ubuntu/management/Dockerfile) +- [`3.10.13-alpine`, `3.10-alpine`](https://github.com/docker-library/rabbitmq/blob/5d66324218c46b8e2f80487086972d24ccfae9bb/3.10/alpine/Dockerfile) +- [`3.10.13-management-alpine`, `3.10-management-alpine`](https://github.com/docker-library/rabbitmq/blob/6e226fe8e99702c8726d5e7d5c5864e69548048d/3.10/alpine/management/Dockerfile) +- [`3.9.27`, `3.9`](https://github.com/docker-library/rabbitmq/blob/878cc31eaf717b98193d8a45113720ecd667a486/3.9/ubuntu/Dockerfile) +- [`3.9.27-management`, `3.9-management`](https://github.com/docker-library/rabbitmq/blob/b07819f873e5a68b2bb54e01f0caa41c26b277f3/3.9/ubuntu/management/Dockerfile) +- [`3.9.27-alpine`, `3.9-alpine`](https://github.com/docker-library/rabbitmq/blob/878cc31eaf717b98193d8a45113720ecd667a486/3.9/alpine/Dockerfile) +- [`3.9.27-management-alpine`, `3.9-management-alpine`](https://github.com/docker-library/rabbitmq/blob/b07819f873e5a68b2bb54e01f0caa41c26b277f3/3.9/alpine/management/Dockerfile) # Quick reference (cont.) @@ -39,14 +43,14 @@ WARNING: [https://github.com/docker-library/rabbitmq/issues](https://github.com/docker-library/rabbitmq/issues) - **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) - [`amd64`](https://hub.docker.com/r/amd64/rabbitmq/), [`arm32v6`](https://hub.docker.com/r/arm32v6/rabbitmq/), [`arm32v7`](https://hub.docker.com/r/arm32v7/rabbitmq/), [`arm64v8`](https://hub.docker.com/r/arm64v8/rabbitmq/), [`i386`](https://hub.docker.com/r/i386/rabbitmq/), [`ppc64le`](https://hub.docker.com/r/ppc64le/rabbitmq/), [`s390x`](https://hub.docker.com/r/s390x/rabbitmq/) + [`amd64`](https://hub.docker.com/r/amd64/rabbitmq/), [`arm32v6`](https://hub.docker.com/r/arm32v6/rabbitmq/), [`arm32v7`](https://hub.docker.com/r/arm32v7/rabbitmq/), [`arm64v8`](https://hub.docker.com/r/arm64v8/rabbitmq/), [`i386`](https://hub.docker.com/r/i386/rabbitmq/), [`ppc64le`](https://hub.docker.com/r/ppc64le/rabbitmq/), [`riscv64`](https://hub.docker.com/r/riscv64/rabbitmq/), [`s390x`](https://hub.docker.com/r/s390x/rabbitmq/) - **Published image artifact details**: [repo-info repo's `repos/rabbitmq/` directory](https://github.com/docker-library/repo-info/blob/master/repos/rabbitmq) ([history](https://github.com/docker-library/repo-info/commits/master/repos/rabbitmq)) (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/rabbitmq`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Frabbitmq) + [official-images repo's `library/rabbitmq` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Frabbitmq) [official-images repo's `library/rabbitmq` file](https://github.com/docker-library/official-images/blob/master/library/rabbitmq) ([history](https://github.com/docker-library/official-images/commits/master/library/rabbitmq)) - **Source of this description**: @@ -83,50 +87,60 @@ This will start a RabbitMQ container listening on the default port of 5672. If y Note the `database dir` there, especially that it has my "Node Name" appended to the end for the file storage. This image makes all of `/var/lib/rabbitmq` a volume by default. -### Memory Limits +### Environment Variables -RabbitMQ contains functionality which explicitly tracks and manages memory usage, and thus needs to be made aware of cgroup-imposed limits. +For a list of environment variables supported by RabbitMQ itself, see the [Environment Variables section of rabbitmq.com/configure](https://www.rabbitmq.com/configure.html#supported-environment-variables) -The upstream configuration setting for this is `vm_memory_high_watermark`, and it is described under ["Memory Alarms"](https://www.rabbitmq.com/memory.html) in the documentation. +**WARNING:** As of RabbitMQ 3.9, all of the docker-specific variables listed below are deprecated and no longer used. Please use a configuration file instead; visit [rabbitmq.com/configure](https://www.rabbitmq.com/configure.html) to learn more about the configuration file. For a starting point, the 3.8 images will print out the config file it generated from supplied environment variables. -In this image, this value is set via `RABBITMQ_VM_MEMORY_HIGH_WATERMARK`. The value of this environment variable is interpreted as follows: +```bash +# Unavailable in 3.9 and up +RABBITMQ_DEFAULT_PASS_FILE +RABBITMQ_DEFAULT_USER_FILE +RABBITMQ_MANAGEMENT_SSL_CACERTFILE +RABBITMQ_MANAGEMENT_SSL_CERTFILE +RABBITMQ_MANAGEMENT_SSL_DEPTH +RABBITMQ_MANAGEMENT_SSL_FAIL_IF_NO_PEER_CERT +RABBITMQ_MANAGEMENT_SSL_KEYFILE +RABBITMQ_MANAGEMENT_SSL_VERIFY +RABBITMQ_SSL_CACERTFILE +RABBITMQ_SSL_CERTFILE +RABBITMQ_SSL_DEPTH +RABBITMQ_SSL_FAIL_IF_NO_PEER_CERT +RABBITMQ_SSL_KEYFILE +RABBITMQ_SSL_VERIFY +RABBITMQ_VM_MEMORY_HIGH_WATERMARK +``` -- `0.49` is treated as `49%`, just like upstream (`{ vm_memory_high_watermark, 0.49 }`) -- `56%` is treated as `56%` (`0.56`; `{ vm_memory_high_watermark, 0.56 }`) -- `1073741824` is treated as an absolute number of bytes (`{ vm_memory_high_watermark, { absolute, 1073741824 } }`) -- `1024MiB` is treated as an absolute number of bytes with a unit (`{ vm_memory_high_watermark, { absolute, "1024MiB" } }`) +### Setting default user and password -The main behavioral difference is in how percentages are handled. If the current container has a memory limit (`--memory`/`-m`), a percentage value will be calculated to an absolute byte value based on the memory limit, rather than being passed to RabbitMQ as-is. For example, a container run with `--memory 2048m` (and the implied upstream-default `RABBITMQ_VM_MEMORY_HIGH_WATERMARK` of `40%`) will set the effective limit to `819MB` (which is `40%` of `2048MB`). +If you wish to change the default username and password of `guest` / `guest`, you can do so with the `RABBITMQ_DEFAULT_USER` and `RABBITMQ_DEFAULT_PASS` environmental variables. These variables were available previously in the docker-specific entrypoint shell script but are now available in RabbitMQ directly. -### Erlang Cookie +```console +$ docker run -d --hostname my-rabbit --name some-rabbit -e RABBITMQ_DEFAULT_USER=user -e RABBITMQ_DEFAULT_PASS=password rabbitmq:3-management +``` -See the [RabbitMQ "Clustering Guide"](https://www.rabbitmq.com/clustering.html#erlang-cookie) for more information about cookies and why they're necessary. +You can then go to `http://localhost:8080` or `http://host-ip:8080` in a browser and use `user`/`password` to gain access to the management console -For setting a consistent cookie (especially useful for clustering but also for remote/cross-container administration via `rabbitmqctl`), use `RABBITMQ_ERLANG_COOKIE`: +### Setting default vhost + +If you wish to change the default vhost, you can do so with the `RABBITMQ_DEFAULT_VHOST` environmental variables: ```console -$ docker run -d --hostname some-rabbit --name some-rabbit --network some-network -e RABBITMQ_ERLANG_COOKIE='secret cookie here' rabbitmq:3 +$ docker run -d --hostname my-rabbit --name some-rabbit -e RABBITMQ_DEFAULT_VHOST=my_vhost rabbitmq:3-management ``` -This can then be used from a separate instance to connect: +### Memory Limits -```console -$ docker run -it --rm --network some-network -e RABBITMQ_ERLANG_COOKIE='secret cookie here' rabbitmq:3 bash -root@f2a2d3d27c75:/# rabbitmqctl -n rabbit@some-rabbit list_users -Listing users ... -guest [administrator] -``` +RabbitMQ contains functionality which explicitly tracks and manages memory usage, and thus needs to be made aware of cgroup-imposed limits (e.g. [`docker run --memory=..`](https://docs.docker.com/config/containers/resource_constraints/#limit-a-containers-access-to-memory)). -Alternatively, one can also use `RABBITMQ_NODENAME` to make repeated `rabbitmqctl` invocations simpler: +The upstream configuration setting for this is `vm_memory_high_watermark` in `rabbitmq.conf`, and it is described under ["Memory Alarms"](https://www.rabbitmq.com/memory.html) in the documentation. If you set a relative limit via `vm_memory_high_watermark.relative`, then RabbitMQ will calculate its limits based on the host's total memory and not the limit set by the contianer runtime. -```console -$ docker run -it --rm --network some-network -e RABBITMQ_ERLANG_COOKIE='secret cookie here' -e RABBITMQ_NODENAME=rabbit@some-rabbit rabbitmq:3 bash -root@f2a2d3d27c75:/# rabbitmqctl list_users -Listing users ... -guest [administrator] -``` +### Erlang Cookie + +See the [RabbitMQ "Clustering Guide"](https://www.rabbitmq.com/clustering.html#erlang-cookie) for more information about cookies and why they're necessary. For setting a consistent cookie (especially useful for clustering but also for remote/cross-container administration via `rabbitmqctl`), provide a cookie file (default location of `/var/lib/rabbitmq/.erlang.cookie`). -If you wish to provide the cookie via a file (such as with [Docker Secrets](https://docs.docker.com/engine/swarm/secrets/)), it needs to be mounted at `/var/lib/rabbitmq/.erlang.cookie`: +For example, you can provide the cookie via a file (such as with [Docker Secrets](https://docs.docker.com/engine/swarm/secrets/)): ```console docker service create ... --secret source=my-erlang-cookie,target=/var/lib/rabbitmq/.erlang.cookie ... rabbitmq @@ -150,70 +164,12 @@ $ docker run -d --hostname my-rabbit --name some-rabbit -p 8080:15672 rabbitmq:3 You can then go to `http://localhost:8080` or `http://host-ip:8080` in a browser. -### Environment Variables - -A small selection of the possible environment variables are defined in the Dockerfile to be passed through the docker engine (listed below). For a list of environment variables supported by RabbitMQ itself, see: https://www.rabbitmq.com/configure.html - -For SSL configuration without the management plugin: - -```bash -RABBITMQ_SSL_CACERTFILE -RABBITMQ_SSL_CERTFILE -RABBITMQ_SSL_DEPTH -RABBITMQ_SSL_FAIL_IF_NO_PEER_CERT -RABBITMQ_SSL_KEYFILE -RABBITMQ_SSL_VERIFY -``` - -For SSL configuration using the management plugin: - -```bash -RABBITMQ_MANAGEMENT_SSL_CACERTFILE -RABBITMQ_MANAGEMENT_SSL_CERTFILE -RABBITMQ_MANAGEMENT_SSL_DEPTH -RABBITMQ_MANAGEMENT_SSL_FAIL_IF_NO_PEER_CERT -RABBITMQ_MANAGEMENT_SSL_KEYFILE -RABBITMQ_MANAGEMENT_SSL_VERIFY -``` - -### Setting default user and password - -If you wish to change the default username and password of `guest` / `guest`, you can do so with the `RABBITMQ_DEFAULT_USER` and `RABBITMQ_DEFAULT_PASS` environmental variables: - -```console -$ docker run -d --hostname my-rabbit --name some-rabbit -e RABBITMQ_DEFAULT_USER=user -e RABBITMQ_DEFAULT_PASS=password rabbitmq:3-management -``` - -You can then go to `http://localhost:8080` or `http://host-ip:8080` in a browser and use `user`/`password` to gain access to the management console - -To source the username and password from files instead of environment variables, add a `_FILE` suffix to the environment variable names (for example, `RABBITMQ_DEFAULT_USER_FILE=/run/secrets/xxx` to use [Docker Secrets](https://docs.docker.com/engine/swarm/secrets/)). - -### Setting default vhost - -If you wish to change the default vhost, you can do so with the `RABBITMQ_DEFAULT_VHOST` environmental variables: - -```console -$ docker run -d --hostname my-rabbit --name some-rabbit -e RABBITMQ_DEFAULT_VHOST=my_vhost rabbitmq:3-management -``` - -### Enabling HiPE (deprecated) - -**Note**: HiPE is disabled since version 3.7.15 of rabbimq images (https://github.com/docker-library/rabbitmq/pull/340) - -See the [RabbitMQ "Configuration"](http://www.rabbitmq.com/configure.html#config-items) for more information about various configuration options. - -For enabling the HiPE compiler on startup use `RABBITMQ_HIPE_COMPILE` set to `1`. Accroding to the official documentation: - -> Set to true to precompile parts of RabbitMQ with HiPE, a just-in-time compiler for Erlang. This will increase server throughput at the cost of increased startup time. You might see 20-50% better performance at the cost of a few minutes delay at startup. - -It is therefore important to take that startup delay into consideration when configuring health checks, automated clustering etc. - ### Enabling Plugins Creating a Dockerfile will have them enabled at runtime. To see the full list of plugins present on the image `rabbitmq-plugins list` ```Dockerfile -FROM rabbitmq:3.7-management +FROM rabbitmq:3.8-management RUN rabbitmq-plugins enable --offline rabbitmq_mqtt rabbitmq_federation_management rabbitmq_stomp ``` @@ -227,12 +183,10 @@ Example `enabled_plugins` ### Additional Configuration -If additional configuration is required, it is recommended to supply an appropriate `/etc/rabbitmq/rabbitmq.conf` file (see [the "Configuration File(s)" section of the RabbitMQ documentation for more details](https://www.rabbitmq.com/configure.html#configuration-files)), for example via bind-mount, [Docker Configs](https://docs.docker.com/engine/swarm/configs/), or a short `Dockerfile` with a `COPY` instruction. +If configuration is required, it is recommended to supply an appropriate `/etc/rabbitmq/rabbitmq.conf` file (see [the "Configuration File(s)" section of the RabbitMQ documentation for more details](https://www.rabbitmq.com/configure.html#configuration-files)), for example via bind-mount, [Docker Configs](https://docs.docker.com/engine/swarm/configs/), or a short `Dockerfile` with a `COPY` instruction. Alternatively, it is possible to use the `RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS` environment variable, whose syntax is described [in section 7.8 ("Configuring an Application") of the Erlang OTP Design Principles User's Guide](http://erlang.org/doc/design_principles/applications.html#id81887) (the appropriate value for `-ApplName` is `-rabbit`), this method requires a slightly different reproduction of its equivalent entry in `rabbitmq.conf`. For example, configuring [`channel_max`](https://www.rabbitmq.com/configure.html#config-items) would look something like `-e RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS="-rabbit channel_max 4007"`. Where the space between the variable `channel_max` and its value `4007` correctly becomes a comma when translated in the environment. -Additional configuration keys would be specified as a list. For example, configuring both [`channel_max`](https://www.rabbitmq.com/configure.html#config-items) and [`auth_backends`](https://www.rabbitmq.com/ldap.html#overview) would look something like `-e RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS="-rabbit channel_max 4007 auth_backends [rabbit_auth_backend_ldap,rabbit_auth_backend_internal]"`. Note that some variables such as for `auth_backends` require their value(s) to be enclosed in brackets, and for multiple values explicitly including the comma as a delimiter. - ### Health/Liveness/Readiness Checking See [the "Official Images" FAQ](https://github.com/docker-library/faq#healthcheck) and [the discussion on docker-library/rabbitmq#174 (especially the large comment by Michael Klishin from RabbitMQ upstream)](https://github.com/docker-library/rabbitmq/pull/174#issuecomment-452002696) for a detailed explanation of why this image does not come with a default `HEALTHCHECK` defined, and for suggestions for implementing your own health/liveness/readiness checks. @@ -247,9 +201,9 @@ This is the defacto image. If you are unsure about what your needs are, you prob ## `rabbitmq:-alpine` -This image is based on the popular [Alpine Linux project](http://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. +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. -This variant is highly recommended when final image size being as small as possible is desired. The main caveat to note is that it does use [musl libc](http://www.musl-libc.org) instead of [glibc and friends](http://www.etalabs.net/compare_libcs.html), so certain software might run into issues depending on the depth of their libc requirements. However, most software doesn't have an issue with this, so this variant is usually a very safe choice. 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. +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. 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). diff --git a/rabbitmq/content.md b/rabbitmq/content.md index 4b62b0a86268..268b74529d12 100644 --- a/rabbitmq/content.md +++ b/rabbitmq/content.md @@ -29,50 +29,60 @@ This will start a RabbitMQ container listening on the default port of 5672. If y Note the `database dir` there, especially that it has my "Node Name" appended to the end for the file storage. This image makes all of `/var/lib/rabbitmq` a volume by default. -### Memory Limits +### Environment Variables -RabbitMQ contains functionality which explicitly tracks and manages memory usage, and thus needs to be made aware of cgroup-imposed limits. +For a list of environment variables supported by RabbitMQ itself, see the [Environment Variables section of rabbitmq.com/configure](https://www.rabbitmq.com/configure.html#supported-environment-variables) -The upstream configuration setting for this is `vm_memory_high_watermark`, and it is described under ["Memory Alarms"](https://www.rabbitmq.com/memory.html) in the documentation. +**WARNING:** As of RabbitMQ 3.9, all of the docker-specific variables listed below are deprecated and no longer used. Please use a configuration file instead; visit [rabbitmq.com/configure](https://www.rabbitmq.com/configure.html) to learn more about the configuration file. For a starting point, the 3.8 images will print out the config file it generated from supplied environment variables. -In this image, this value is set via `RABBITMQ_VM_MEMORY_HIGH_WATERMARK`. The value of this environment variable is interpreted as follows: +```bash +# Unavailable in 3.9 and up +RABBITMQ_DEFAULT_PASS_FILE +RABBITMQ_DEFAULT_USER_FILE +RABBITMQ_MANAGEMENT_SSL_CACERTFILE +RABBITMQ_MANAGEMENT_SSL_CERTFILE +RABBITMQ_MANAGEMENT_SSL_DEPTH +RABBITMQ_MANAGEMENT_SSL_FAIL_IF_NO_PEER_CERT +RABBITMQ_MANAGEMENT_SSL_KEYFILE +RABBITMQ_MANAGEMENT_SSL_VERIFY +RABBITMQ_SSL_CACERTFILE +RABBITMQ_SSL_CERTFILE +RABBITMQ_SSL_DEPTH +RABBITMQ_SSL_FAIL_IF_NO_PEER_CERT +RABBITMQ_SSL_KEYFILE +RABBITMQ_SSL_VERIFY +RABBITMQ_VM_MEMORY_HIGH_WATERMARK +``` -- `0.49` is treated as `49%`, just like upstream (`{ vm_memory_high_watermark, 0.49 }`) -- `56%` is treated as `56%` (`0.56`; `{ vm_memory_high_watermark, 0.56 }`) -- `1073741824` is treated as an absolute number of bytes (`{ vm_memory_high_watermark, { absolute, 1073741824 } }`) -- `1024MiB` is treated as an absolute number of bytes with a unit (`{ vm_memory_high_watermark, { absolute, "1024MiB" } }`) +### Setting default user and password -The main behavioral difference is in how percentages are handled. If the current container has a memory limit (`--memory`/`-m`), a percentage value will be calculated to an absolute byte value based on the memory limit, rather than being passed to RabbitMQ as-is. For example, a container run with `--memory 2048m` (and the implied upstream-default `RABBITMQ_VM_MEMORY_HIGH_WATERMARK` of `40%`) will set the effective limit to `819MB` (which is `40%` of `2048MB`). +If you wish to change the default username and password of `guest` / `guest`, you can do so with the `RABBITMQ_DEFAULT_USER` and `RABBITMQ_DEFAULT_PASS` environmental variables. These variables were available previously in the docker-specific entrypoint shell script but are now available in RabbitMQ directly. -### Erlang Cookie +```console +$ docker run -d --hostname my-rabbit --name some-rabbit -e RABBITMQ_DEFAULT_USER=user -e RABBITMQ_DEFAULT_PASS=password %%IMAGE%%:3-management +``` -See the [RabbitMQ "Clustering Guide"](https://www.rabbitmq.com/clustering.html#erlang-cookie) for more information about cookies and why they're necessary. +You can then go to `http://localhost:8080` or `http://host-ip:8080` in a browser and use `user`/`password` to gain access to the management console -For setting a consistent cookie (especially useful for clustering but also for remote/cross-container administration via `rabbitmqctl`), use `RABBITMQ_ERLANG_COOKIE`: +### Setting default vhost + +If you wish to change the default vhost, you can do so with the `RABBITMQ_DEFAULT_VHOST` environmental variables: ```console -$ docker run -d --hostname some-rabbit --name some-rabbit --network some-network -e RABBITMQ_ERLANG_COOKIE='secret cookie here' %%IMAGE%%:3 +$ docker run -d --hostname my-rabbit --name some-rabbit -e RABBITMQ_DEFAULT_VHOST=my_vhost %%IMAGE%%:3-management ``` -This can then be used from a separate instance to connect: +### Memory Limits -```console -$ docker run -it --rm --network some-network -e RABBITMQ_ERLANG_COOKIE='secret cookie here' %%IMAGE%%:3 bash -root@f2a2d3d27c75:/# rabbitmqctl -n rabbit@some-rabbit list_users -Listing users ... -guest [administrator] -``` +RabbitMQ contains functionality which explicitly tracks and manages memory usage, and thus needs to be made aware of cgroup-imposed limits (e.g. [`docker run --memory=..`](https://docs.docker.com/config/containers/resource_constraints/#limit-a-containers-access-to-memory)). -Alternatively, one can also use `RABBITMQ_NODENAME` to make repeated `rabbitmqctl` invocations simpler: +The upstream configuration setting for this is `vm_memory_high_watermark` in `rabbitmq.conf`, and it is described under ["Memory Alarms"](https://www.rabbitmq.com/memory.html) in the documentation. If you set a relative limit via `vm_memory_high_watermark.relative`, then RabbitMQ will calculate its limits based on the host's total memory and not the limit set by the contianer runtime. -```console -$ docker run -it --rm --network some-network -e RABBITMQ_ERLANG_COOKIE='secret cookie here' -e RABBITMQ_NODENAME=rabbit@some-rabbit %%IMAGE%%:3 bash -root@f2a2d3d27c75:/# rabbitmqctl list_users -Listing users ... -guest [administrator] -``` +### Erlang Cookie + +See the [RabbitMQ "Clustering Guide"](https://www.rabbitmq.com/clustering.html#erlang-cookie) for more information about cookies and why they're necessary. For setting a consistent cookie (especially useful for clustering but also for remote/cross-container administration via `rabbitmqctl`), provide a cookie file (default location of `/var/lib/rabbitmq/.erlang.cookie`). -If you wish to provide the cookie via a file (such as with [Docker Secrets](https://docs.docker.com/engine/swarm/secrets/)), it needs to be mounted at `/var/lib/rabbitmq/.erlang.cookie`: +For example, you can provide the cookie via a file (such as with [Docker Secrets](https://docs.docker.com/engine/swarm/secrets/)): ```console docker service create ... --secret source=my-erlang-cookie,target=/var/lib/rabbitmq/.erlang.cookie ... %%IMAGE%% @@ -96,70 +106,12 @@ $ docker run -d --hostname my-rabbit --name some-rabbit -p 8080:15672 %%IMAGE%%: You can then go to `http://localhost:8080` or `http://host-ip:8080` in a browser. -### Environment Variables - -A small selection of the possible environment variables are defined in the Dockerfile to be passed through the docker engine (listed below). For a list of environment variables supported by RabbitMQ itself, see: https://www.rabbitmq.com/configure.html - -For SSL configuration without the management plugin: - -```bash -RABBITMQ_SSL_CACERTFILE -RABBITMQ_SSL_CERTFILE -RABBITMQ_SSL_DEPTH -RABBITMQ_SSL_FAIL_IF_NO_PEER_CERT -RABBITMQ_SSL_KEYFILE -RABBITMQ_SSL_VERIFY -``` - -For SSL configuration using the management plugin: - -```bash -RABBITMQ_MANAGEMENT_SSL_CACERTFILE -RABBITMQ_MANAGEMENT_SSL_CERTFILE -RABBITMQ_MANAGEMENT_SSL_DEPTH -RABBITMQ_MANAGEMENT_SSL_FAIL_IF_NO_PEER_CERT -RABBITMQ_MANAGEMENT_SSL_KEYFILE -RABBITMQ_MANAGEMENT_SSL_VERIFY -``` - -### Setting default user and password - -If you wish to change the default username and password of `guest` / `guest`, you can do so with the `RABBITMQ_DEFAULT_USER` and `RABBITMQ_DEFAULT_PASS` environmental variables: - -```console -$ docker run -d --hostname my-rabbit --name some-rabbit -e RABBITMQ_DEFAULT_USER=user -e RABBITMQ_DEFAULT_PASS=password %%IMAGE%%:3-management -``` - -You can then go to `http://localhost:8080` or `http://host-ip:8080` in a browser and use `user`/`password` to gain access to the management console - -To source the username and password from files instead of environment variables, add a `_FILE` suffix to the environment variable names (for example, `RABBITMQ_DEFAULT_USER_FILE=/run/secrets/xxx` to use [Docker Secrets](https://docs.docker.com/engine/swarm/secrets/)). - -### Setting default vhost - -If you wish to change the default vhost, you can do so with the `RABBITMQ_DEFAULT_VHOST` environmental variables: - -```console -$ docker run -d --hostname my-rabbit --name some-rabbit -e RABBITMQ_DEFAULT_VHOST=my_vhost %%IMAGE%%:3-management -``` - -### Enabling HiPE (deprecated) - -**Note**: HiPE is disabled since version 3.7.15 of rabbimq images (https://github.com/docker-library/rabbitmq/pull/340) - -See the [RabbitMQ "Configuration"](http://www.rabbitmq.com/configure.html#config-items) for more information about various configuration options. - -For enabling the HiPE compiler on startup use `RABBITMQ_HIPE_COMPILE` set to `1`. Accroding to the official documentation: - -> Set to true to precompile parts of RabbitMQ with HiPE, a just-in-time compiler for Erlang. This will increase server throughput at the cost of increased startup time. You might see 20-50% better performance at the cost of a few minutes delay at startup. - -It is therefore important to take that startup delay into consideration when configuring health checks, automated clustering etc. - ### Enabling Plugins Creating a Dockerfile will have them enabled at runtime. To see the full list of plugins present on the image `rabbitmq-plugins list` ```Dockerfile -FROM rabbitmq:3.7-management +FROM rabbitmq:3.8-management RUN rabbitmq-plugins enable --offline rabbitmq_mqtt rabbitmq_federation_management rabbitmq_stomp ``` @@ -173,12 +125,10 @@ Example `enabled_plugins` ### Additional Configuration -If additional configuration is required, it is recommended to supply an appropriate `/etc/rabbitmq/rabbitmq.conf` file (see [the "Configuration File(s)" section of the RabbitMQ documentation for more details](https://www.rabbitmq.com/configure.html#configuration-files)), for example via bind-mount, [Docker Configs](https://docs.docker.com/engine/swarm/configs/), or a short `Dockerfile` with a `COPY` instruction. +If configuration is required, it is recommended to supply an appropriate `/etc/rabbitmq/rabbitmq.conf` file (see [the "Configuration File(s)" section of the RabbitMQ documentation for more details](https://www.rabbitmq.com/configure.html#configuration-files)), for example via bind-mount, [Docker Configs](https://docs.docker.com/engine/swarm/configs/), or a short `Dockerfile` with a `COPY` instruction. Alternatively, it is possible to use the `RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS` environment variable, whose syntax is described [in section 7.8 ("Configuring an Application") of the Erlang OTP Design Principles User's Guide](http://erlang.org/doc/design_principles/applications.html#id81887) (the appropriate value for `-ApplName` is `-rabbit`), this method requires a slightly different reproduction of its equivalent entry in `rabbitmq.conf`. For example, configuring [`channel_max`](https://www.rabbitmq.com/configure.html#config-items) would look something like `-e RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS="-rabbit channel_max 4007"`. Where the space between the variable `channel_max` and its value `4007` correctly becomes a comma when translated in the environment. -Additional configuration keys would be specified as a list. For example, configuring both [`channel_max`](https://www.rabbitmq.com/configure.html#config-items) and [`auth_backends`](https://www.rabbitmq.com/ldap.html#overview) would look something like `-e RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS="-rabbit channel_max 4007 auth_backends [rabbit_auth_backend_ldap,rabbit_auth_backend_internal]"`. Note that some variables such as for `auth_backends` require their value(s) to be enclosed in brackets, and for multiple values explicitly including the comma as a delimiter. - ### Health/Liveness/Readiness Checking See [the "Official Images" FAQ](https://github.com/docker-library/faq#healthcheck) and [the discussion on docker-library/rabbitmq#174 (especially the large comment by Michael Klishin from RabbitMQ upstream)](https://github.com/docker-library/rabbitmq/pull/174#issuecomment-452002696) for a detailed explanation of why this image does not come with a default `HEALTHCHECK` defined, and for suggestions for implementing your own health/liveness/readiness checks. diff --git a/rakudo-star/README.md b/rakudo-star/README.md index c6d8bb4d9956..093be35449dd 100644 --- a/rakudo-star/README.md +++ b/rakudo-star/README.md @@ -17,20 +17,20 @@ WARNING: # Quick reference - **Maintained by**: - [the Perl 6 Community](https://github.com/perl6/docker) + [the Raku Community](https://github.com/Raku/docker) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`latest`, `2020.01`](https://github.com/raku/docker/blob/d893fa621e755045c80fb4d0615c2810812d98f7/Dockerfile) -- [`alpine`, `2020.01-alpine`](https://github.com/raku/docker/blob/d893fa621e755045c80fb4d0615c2810812d98f7/alpine/Dockerfile) +- [`latest`, `2022.12`](https://github.com/Raku/docker/blob/65c49addd32f616805979c6d3572f846f303a505/2022.12/bullseye/Dockerfile) +- [`alpine`, `2022.12-alpine`](https://github.com/Raku/docker/blob/65c49addd32f616805979c6d3572f846f303a505/2022.12/alpine3.17/Dockerfile) # Quick reference (cont.) - **Where to file issues**: - [https://github.com/perl6/docker/issues](https://github.com/perl6/docker/issues) + [https://github.com/Raku/docker/issues](https://github.com/Raku/docker/issues) - **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) [`amd64`](https://hub.docker.com/r/amd64/rakudo-star/), [`arm64v8`](https://hub.docker.com/r/arm64v8/rakudo-star/) @@ -40,7 +40,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/rakudo-star`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Frakudo-star) + [official-images repo's `library/rakudo-star` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Frakudo-star) [official-images repo's `library/rakudo-star` file](https://github.com/docker-library/official-images/blob/master/library/rakudo-star) ([history](https://github.com/docker-library/official-images/commits/master/library/rakudo-star)) - **Source of this description**: @@ -50,13 +50,11 @@ WARNING: Rakudo Star is a Raku (formerly known as Perl 6) distribution designed for use by early adopters of the language. It includes a virtual machine (the JVM or MoarVM), the Rakudo compiler, and a suite of modules that users may find useful. This image includes the MoarVM backend for the compiler. -Project homepage: [http://rakudo.org](http://rakudo.org) +- Project homepage: https://rakudo.org/ +- Raku Language Specification: https://github.com/Raku/roast +- Raku Language Documentation: https://docs.raku.org/ -GitHub repository: [https://github.com/rakudo/star](https://github.com/rakudo/star) - -The Dockerfile responsible: [http://github.com/raku/docker/tree/master/Dockerfile](http://github.com/raku/docker/tree/master/Dockerfile) - -Raku Language Documentation: [http://docs.raku.org/](http://docs.raku.org/) +> [wikipedia.org/wiki/Rakudo](https://en.wikipedia.org/wiki/Rakudo) ![logo](https://raw.githubusercontent.com/docker-library/docs/48ac05ac94903844bfbdea1fb361676a904f9d85/rakudo-star/logo.png) @@ -78,9 +76,9 @@ $ docker run -it rakudo-star raku -e 'say "Hello!"' # Contributing/Getting Help -Many Raku developers are present on #raku on Freenode. +Many Raku developers are present on [#raku on Libera.Chat](https://kiwiirc.com/client/irc.libera.chat/#raku) -Issues for Rakudo are tracked in [on GitHub](https://github.com/rakudo/rakudo/issues/). +Issues for Rakudo are tracked in [on GitHub](https://github.com/rakudo/rakudo/issues). # Image Variants @@ -92,9 +90,9 @@ This is the defacto image. If you are unsure about what your needs are, you prob ## `rakudo-star:-alpine` -This image is based on the popular [Alpine Linux project](http://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. +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. -This variant is highly recommended when final image size being as small as possible is desired. The main caveat to note is that it does use [musl libc](http://www.musl-libc.org) instead of [glibc and friends](http://www.etalabs.net/compare_libcs.html), so certain software might run into issues depending on the depth of their libc requirements. However, most software doesn't have an issue with this, so this variant is usually a very safe choice. 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. +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. 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). diff --git a/rakudo-star/content.md b/rakudo-star/content.md index 59045d10a389..0926231a358a 100644 --- a/rakudo-star/content.md +++ b/rakudo-star/content.md @@ -2,13 +2,11 @@ Rakudo Star is a Raku (formerly known as Perl 6) distribution designed for use by early adopters of the language. It includes a virtual machine (the JVM or MoarVM), the Rakudo compiler, and a suite of modules that users may find useful. This image includes the MoarVM backend for the compiler. -Project homepage: [http://rakudo.org](http://rakudo.org) +- Project homepage: https://rakudo.org/ +- Raku Language Specification: https://github.com/Raku/roast +- Raku Language Documentation: https://docs.raku.org/ -GitHub repository: [https://github.com/rakudo/star](https://github.com/rakudo/star) - -The Dockerfile responsible: [http://github.com/raku/docker/tree/master/Dockerfile](http://github.com/raku/docker/tree/master/Dockerfile) - -Raku Language Documentation: [http://docs.raku.org/](http://docs.raku.org/) +> [wikipedia.org/wiki/Rakudo](https://en.wikipedia.org/wiki/Rakudo) %%LOGO%% @@ -30,6 +28,6 @@ $ docker run -it %%IMAGE%% raku -e 'say "Hello!"' # Contributing/Getting Help -Many Raku developers are present on #raku on Freenode. +Many Raku developers are present on [#raku on Libera.Chat](https://kiwiirc.com/client/irc.libera.chat/#raku) -Issues for Rakudo are tracked in [on GitHub](https://github.com/rakudo/rakudo/issues/). +Issues for Rakudo are tracked in [on GitHub](https://github.com/rakudo/rakudo/issues). diff --git a/rakudo-star/github-repo b/rakudo-star/github-repo index 8bead6a48453..a39597f12744 100644 --- a/rakudo-star/github-repo +++ b/rakudo-star/github-repo @@ -1 +1 @@ -https://github.com/perl6/docker +https://github.com/Raku/docker diff --git a/rakudo-star/maintainer.md b/rakudo-star/maintainer.md index d5a3c22c7d49..690389e6bdfa 100644 --- a/rakudo-star/maintainer.md +++ b/rakudo-star/maintainer.md @@ -1 +1 @@ -[the Perl 6 Community](%%GITHUB-REPO%%) +[the Raku Community](%%GITHUB-REPO%%) diff --git a/rapidoid/README-short.txt b/rapidoid/README-short.txt deleted file mode 100644 index c3c94fb2a1f7..000000000000 --- a/rapidoid/README-short.txt +++ /dev/null @@ -1 +0,0 @@ -Rapidoid is a high-performance HTTP server and modern Java web framework / application container. \ No newline at end of file diff --git a/rapidoid/README.md b/rapidoid/README.md deleted file mode 100644 index f89409d96c64..000000000000 --- a/rapidoid/README.md +++ /dev/null @@ -1,199 +0,0 @@ - - -# **DEPRECATION NOTICE** - -This image is deprecated due to inactivity (last updated Aug 2018; [docker-library/official-images#4667](https://github.com/docker-library/official-images/pull/4667)). - -As noted in [docker-library/official-images#4667 (comment)](https://github.com/docker-library/official-images/pull/4667#issuecomment-565220107), it will likely see updates again when Rapidoid 6 is released. - -# Quick reference - -- **Maintained by**: - [Rapidoid](https://github.com/rapidoid/docker-rapidoid) - -- **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) - -# Supported tags and respective `Dockerfile` links - -- [`5.4.6`, `5.4`, `5`, `latest`](https://github.com/rapidoid/docker-rapidoid/blob/8fbb45c706fec5b0a015a37c24862127180ae9e9/Dockerfile) - -# Quick reference (cont.) - -- **Where to file issues**: - [https://github.com/rapidoid/docker-rapidoid/issues](https://github.com/rapidoid/docker-rapidoid/issues) - -- **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) - [`amd64`](https://hub.docker.com/r/amd64/rapidoid/), [`arm64v8`](https://hub.docker.com/r/arm64v8/rapidoid/) - -- **Published image artifact details**: - [repo-info repo's `repos/rapidoid/` directory](https://github.com/docker-library/repo-info/blob/master/repos/rapidoid) ([history](https://github.com/docker-library/repo-info/commits/master/repos/rapidoid)) - (image metadata, transfer size, etc) - -- **Image updates**: - [official-images PRs with label `library/rapidoid`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Frapidoid) - [official-images repo's `library/rapidoid` file](https://github.com/docker-library/official-images/blob/master/library/rapidoid) ([history](https://github.com/docker-library/official-images/commits/master/library/rapidoid)) - -- **Source of this description**: - [docs repo's `rapidoid/` directory](https://github.com/docker-library/docs/tree/master/rapidoid) ([history](https://github.com/docker-library/docs/commits/master/rapidoid)) - -# What is Rapidoid? - -Rapidoid is an extremely fast HTTP server and modern Java web framework / application container, with a strong focus on high productivity and high performance. - -> [www.rapidoid.org](http://www.rapidoid.org) - -![logo](https://raw.githubusercontent.com/docker-library/docs/7fc38a6e22991477a231ce556a7f2860623afb67/rapidoid/logo.png) - -# How to use this image - -To quickly start Rapidoid and display some basic usage help, run: - -```console -$ docker run --rm rapidoid --help -``` - -Rapidoid can be used in different ways: - -- as a web tool, to quickly prototype RESTful web services from the command line -- as a HTTP server, to serve static resources -- as a Java web application framework/container, to deploy a web application JAR - -## Quickly prototyping SQL-powered RESTful web services - -To quickly prototype SQL-powered RESTful web services from the command line, you need to link the database container to the Rapidoid container. The MySQL containers should be linked under name `mysql`, and PostgreSQL containers under name `postgres`. - -This example starts a new MySQL container and links it under name `mysql` in the Rapidoid container, where a RESTful service is defined by specifying SQL query for the route `GET /users`. The service returns the result (a list of MySQL users) in JSON format. - -```console -docker run -d --name some-mysql -e MYSQL_ROOT_PASSWORD=db-pass mysql - -docker run -it --rm \ - -p 8888:8888 \ - --link some-mysql:mysql \ - rapidoid \ - profiles=mysql \ - jdbc.host=mysql \ - jdbc.password=db-pass \ - '/users <= SELECT user FROM mysql.user' -``` - -**Note:** Please wait for several seconds for the MySQL database to initialize, and then you can visit [http://localhost:8888/users](http://localhost:8888/users) (or `http://your-host:8888/users`) in your web browser. - -**Syntax for the service prototyping arguments**: - -```console -'[GET|POST|PUT|DELETE|PATCH] <= ' -``` - -## Serving static files - -Rapidoid will automatically serve static files from the folders: `/app/static`. To serve the contents of the `/your-www-root` directory, please mount it as `/app/static`: - -```console -$ docker run -it --rm \ - -p 8888:8888 \ - -v /your-www-root:/app/static \ - rapidoid -``` - -## Configuration - -Rapidoid will try to read the configuration from `/app/config.yml`. The configuration can also be specified with command-line arguments or environment variables. - -To configure a custom port (by default `8888`) for the default and the Admin server, run the following command. If `rapidoid-admin.port` is not configured, the default server is also used as Admin server, so only one port will be opened (`rapidoid.port`). - -```console -$ docker run -it --rm \ - -p 4444:4444 \ - -p 9999:9999 \ - rapidoid \ - rapidoid.port=4444 \ - rapidoid-admin.port=9999 \ - app.services=ping \ - admin.services=status -``` - -Then you can visit [http://localhost:4444/\_ping](http://localhost:4444/_ping) (or `http://your-host:4444/_ping`) and [http://localhost:9999/\_status](http://localhost:9999/_status) (or `http://your-host:9999/_status`) in your web browser. - -The same setup can be configured with environment variables: - -```console -$ docker run -it --rm \ - -p 4444:4444 \ - -p 9999:9999 \ - -e RAPIDOID_PORT=4444 \ - -e RAPIDOID-ADMIN_PORT=9999 \ - rapidoid \ - app.services=ping \ - admin.services=status -``` - -For more details, please see the [full list of configuration options and their default values](http://www.rapidoid.org/the-default-configuration.html). - -## Security - -Rapidoid's HMAC-based security token mechanism requires all containers to share the same secret key when scaling out a web application: - -```console -$ docker run -it --rm \ - -p 8888:8888 \ - -e SECRET=your-secret-key \ - rapidoid -``` - -While this is an easy way to get started, for security reasons it is recommended to store the secret key in the `/app/config.yml` file, with proper permissions. - -**Note:** For production use, you must replace `your-secret-key` with a real, private secret key. - -**Note:** If no secret key is specified, a random secret key will be generated, which is acceptable when deploying a single container. - -## Full bootstrap of Rapidoid's Admin Center - -To bootstrap a full-blown Admin Center in Rapidoid, you will also need to configure a password for the built-in `admin` user: - -```console -$ docker run -d \ - --restart=always \ - -p 8888:8888 \ - -e SECRET=your-secret-key \ - -e USERS_ADMIN_PASSWORD=admin-pass \ - rapidoid \ - admin.services=center -``` - -Please replace `admin-pass` with a real password for the `admin` user. Then you can login to the Admin Center by visiting [http://localhost:8888/\_](http://localhost:8888/_) (or `http://your-host:8888/_`) in your web browser. - -**Note:** For production use, you must replace `your-secret-key` with a real, private secret key (please see the `Security` section). - -# How to extend this image (application JAR deployment) - -To use this image as base image for your web application, simply add your application JAR as `/app/app.jar`: - -```dockerfile -COPY /app/app.jar -``` - -# License - -View [license information](https://www.apache.org/licenses/LICENSE-2.0) for the software contained in this image. - -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). - -Some additional license information which was able to be auto-detected might be found in [the `repo-info` repository's `rapidoid/` directory](https://github.com/docker-library/repo-info/tree/master/repos/rapidoid). - -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. diff --git a/rapidoid/content.md b/rapidoid/content.md deleted file mode 100644 index b56f978fe5dc..000000000000 --- a/rapidoid/content.md +++ /dev/null @@ -1,136 +0,0 @@ -# What is Rapidoid? - -Rapidoid is an extremely fast HTTP server and modern Java web framework / application container, with a strong focus on high productivity and high performance. - -> [www.rapidoid.org](http://www.rapidoid.org) - -%%LOGO%% - -# How to use this image - -To quickly start Rapidoid and display some basic usage help, run: - -```console -$ docker run --rm %%IMAGE%% --help -``` - -Rapidoid can be used in different ways: - -- as a web tool, to quickly prototype RESTful web services from the command line -- as a HTTP server, to serve static resources -- as a Java web application framework/container, to deploy a web application JAR - -## Quickly prototyping SQL-powered RESTful web services - -To quickly prototype SQL-powered RESTful web services from the command line, you need to link the database container to the Rapidoid container. The MySQL containers should be linked under name `mysql`, and PostgreSQL containers under name `postgres`. - -This example starts a new MySQL container and links it under name `mysql` in the Rapidoid container, where a RESTful service is defined by specifying SQL query for the route `GET /users`. The service returns the result (a list of MySQL users) in JSON format. - -```console -docker run -d --name some-mysql -e MYSQL_ROOT_PASSWORD=db-pass mysql - -docker run -it --rm \ - -p 8888:8888 \ - --link some-mysql:mysql \ - %%REPO%% \ - profiles=mysql \ - jdbc.host=mysql \ - jdbc.password=db-pass \ - '/users <= SELECT user FROM mysql.user' -``` - -**Note:** Please wait for several seconds for the MySQL database to initialize, and then you can visit [http://localhost:8888/users](http://localhost:8888/users) (or `http://your-host:8888/users`) in your web browser. - -**Syntax for the service prototyping arguments**: - -```console -'[GET|POST|PUT|DELETE|PATCH] <= ' -``` - -## Serving static files - -Rapidoid will automatically serve static files from the folders: `/app/static`. To serve the contents of the `/your-www-root` directory, please mount it as `/app/static`: - -```console -$ docker run -it --rm \ - -p 8888:8888 \ - -v /your-www-root:/app/static \ - %%REPO%% -``` - -## Configuration - -Rapidoid will try to read the configuration from `/app/config.yml`. The configuration can also be specified with command-line arguments or environment variables. - -To configure a custom port (by default `8888`) for the default and the Admin server, run the following command. If `rapidoid-admin.port` is not configured, the default server is also used as Admin server, so only one port will be opened (`rapidoid.port`). - -```console -$ docker run -it --rm \ - -p 4444:4444 \ - -p 9999:9999 \ - %%REPO%% \ - rapidoid.port=4444 \ - rapidoid-admin.port=9999 \ - app.services=ping \ - admin.services=status -``` - -Then you can visit [http://localhost:4444/\_ping](http://localhost:4444/_ping) (or `http://your-host:4444/_ping`) and [http://localhost:9999/\_status](http://localhost:9999/_status) (or `http://your-host:9999/_status`) in your web browser. - -The same setup can be configured with environment variables: - -```console -$ docker run -it --rm \ - -p 4444:4444 \ - -p 9999:9999 \ - -e RAPIDOID_PORT=4444 \ - -e RAPIDOID-ADMIN_PORT=9999 \ - %%REPO%% \ - app.services=ping \ - admin.services=status -``` - -For more details, please see the [full list of configuration options and their default values](http://www.rapidoid.org/the-default-configuration.html). - -## Security - -Rapidoid's HMAC-based security token mechanism requires all containers to share the same secret key when scaling out a web application: - -```console -$ docker run -it --rm \ - -p 8888:8888 \ - -e SECRET=your-secret-key \ - %%REPO%% -``` - -While this is an easy way to get started, for security reasons it is recommended to store the secret key in the `/app/config.yml` file, with proper permissions. - -**Note:** For production use, you must replace `your-secret-key` with a real, private secret key. - -**Note:** If no secret key is specified, a random secret key will be generated, which is acceptable when deploying a single container. - -## Full bootstrap of Rapidoid's Admin Center - -To bootstrap a full-blown Admin Center in Rapidoid, you will also need to configure a password for the built-in `admin` user: - -```console -$ docker run -d \ - --restart=always \ - -p 8888:8888 \ - -e SECRET=your-secret-key \ - -e USERS_ADMIN_PASSWORD=admin-pass \ - %%REPO%% \ - admin.services=center -``` - -Please replace `admin-pass` with a real password for the `admin` user. Then you can login to the Admin Center by visiting [http://localhost:8888/\_](http://localhost:8888/_) (or `http://your-host:8888/_`) in your web browser. - -**Note:** For production use, you must replace `your-secret-key` with a real, private secret key (please see the `Security` section). - -# How to extend this image (application JAR deployment) - -To use this image as base image for your web application, simply add your application JAR as `/app/app.jar`: - -```dockerfile -COPY /app/app.jar -``` diff --git a/rapidoid/deprecated.md b/rapidoid/deprecated.md deleted file mode 100644 index 1f4b9697f87a..000000000000 --- a/rapidoid/deprecated.md +++ /dev/null @@ -1,3 +0,0 @@ -This image is deprecated due to inactivity (last updated Aug 2018; [docker-library/official-images#4667](https://github.com/docker-library/official-images/pull/4667)). - -As noted in [docker-library/official-images#4667 (comment)](https://github.com/docker-library/official-images/pull/4667#issuecomment-565220107), it will likely see updates again when Rapidoid 6 is released. diff --git a/rapidoid/github-repo b/rapidoid/github-repo deleted file mode 100644 index 5d641cbbfbc1..000000000000 --- a/rapidoid/github-repo +++ /dev/null @@ -1 +0,0 @@ -https://github.com/rapidoid/docker-rapidoid diff --git a/rapidoid/license.md b/rapidoid/license.md deleted file mode 100644 index 625f0d256ce7..000000000000 --- a/rapidoid/license.md +++ /dev/null @@ -1 +0,0 @@ -View [license information](https://www.apache.org/licenses/LICENSE-2.0) for the software contained in this image. diff --git a/rapidoid/logo.png b/rapidoid/logo.png deleted file mode 100644 index 9ca829262b18c84c5593612b44307c09f68c9ea6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17104 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 diff --git a/rapidoid/maintainer.md b/rapidoid/maintainer.md deleted file mode 100644 index 8843b6b77549..000000000000 --- a/rapidoid/maintainer.md +++ /dev/null @@ -1 +0,0 @@ -[Rapidoid](%%GITHUB-REPO%%) diff --git a/redis/README.md b/redis/README.md index 55d0005f4d66..b5511e0df734 100644 --- a/redis/README.md +++ b/redis/README.md @@ -20,15 +20,16 @@ WARNING: [the Docker Community](https://github.com/docker-library/redis) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`6.0.2`, `6.0`, `6`, `latest`, `6.0.2-buster`, `6.0-buster`, `6-buster`, `buster`](https://github.com/docker-library/redis/blob/3914a0256d549b8323c94c62854d8ca06107aec4/6.0/Dockerfile) -- [`6.0.2-alpine`, `6.0-alpine`, `6-alpine`, `alpine`, `6.0.2-alpine3.11`, `6.0-alpine3.11`, `6-alpine3.11`, `alpine3.11`](https://github.com/docker-library/redis/blob/3914a0256d549b8323c94c62854d8ca06107aec4/6.0/alpine/Dockerfile) -- [`5.0.9`, `5.0`, `5`, `5.0.9-buster`, `5.0-buster`, `5-buster`](https://github.com/docker-library/redis/blob/d3a0f3d95ac768db44dbcb87ecf88cfc436581d5/5.0/Dockerfile) -- [`5.0.9-32bit`, `5.0-32bit`, `5-32bit`, `5.0.9-32bit-buster`, `5.0-32bit-buster`, `5-32bit-buster`](https://github.com/docker-library/redis/blob/d3a0f3d95ac768db44dbcb87ecf88cfc436581d5/5.0/32bit/Dockerfile) -- [`5.0.9-alpine`, `5.0-alpine`, `5-alpine`, `5.0.9-alpine3.11`, `5.0-alpine3.11`, `5-alpine3.11`](https://github.com/docker-library/redis/blob/d3a0f3d95ac768db44dbcb87ecf88cfc436581d5/5.0/alpine/Dockerfile) +- [`7.0.7`, `7.0`, `7`, `latest`, `7.0.7-bullseye`, `7.0-bullseye`, `7-bullseye`, `bullseye`](https://github.com/docker-library/redis/blob/fba559d5d2ac21c7c07e0bfeba6c29cceb346689/7.0/Dockerfile) +- [`7.0.7-alpine`, `7.0-alpine`, `7-alpine`, `alpine`, `7.0.7-alpine3.17`, `7.0-alpine3.17`, `7-alpine3.17`, `alpine3.17`](https://github.com/docker-library/redis/blob/fba559d5d2ac21c7c07e0bfeba6c29cceb346689/7.0/alpine/Dockerfile) +- [`6.2.8`, `6.2`, `6`, `6.2.8-bullseye`, `6.2-bullseye`, `6-bullseye`](https://github.com/docker-library/redis/blob/e85942db00480a10a51be0971acd4b849223132d/6.2/Dockerfile) +- [`6.2.8-alpine`, `6.2-alpine`, `6-alpine`, `6.2.8-alpine3.17`, `6.2-alpine3.17`, `6-alpine3.17`](https://github.com/docker-library/redis/blob/e85942db00480a10a51be0971acd4b849223132d/6.2/alpine/Dockerfile) +- [`6.0.16`, `6.0`, `6.0.16-bullseye`, `6.0-bullseye`](https://github.com/docker-library/redis/blob/0f2bb676ab5153905089537230a732a77d26e438/6.0/Dockerfile) +- [`6.0.16-alpine`, `6.0-alpine`, `6.0.16-alpine3.17`, `6.0-alpine3.17`](https://github.com/docker-library/redis/blob/268eb1aee47ca9c7dc8913b4e8007a2c7391f5b6/6.0/alpine/Dockerfile) # Quick reference (cont.) @@ -43,7 +44,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/redis`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fredis) + [official-images repo's `library/redis` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fredis) [official-images repo's `library/redis` file](https://github.com/docker-library/official-images/blob/master/library/redis) ([history](https://github.com/docker-library/official-images/commits/master/library/redis)) - **Source of this description**: @@ -76,10 +77,10 @@ $ docker run --name some-redis -d redis ## start with persistent storage ```console -$ docker run --name some-redis -d redis redis-server --appendonly yes +$ docker run --name some-redis -d redis redis-server --save 60 1 --loglevel warning ``` -If persistence is enabled, data is stored in the `VOLUME /data`, which can be used with `--volumes-from some-volume-container` or `-v /docker/host/dir:/data` (see [docs.docker volumes](https://docs.docker.com/engine/tutorials/dockervolumes/)). +There are several different persistence strategies to choose from. This one will save a snapshot of the DB every 60 seconds if at least 1 write operation was performed (it will also lead to more logs, so the `loglevel` option may be desirable). If persistence is enabled, data is stored in the `VOLUME /data`, which can be used with `--volumes-from some-volume-container` or `-v /docker/host/dir:/data` (see [docs.docker volumes](https://docs.docker.com/engine/tutorials/dockervolumes/)). For more about Redis Persistence, see [http://redis.io/topics/persistence](http://redis.io/topics/persistence). @@ -102,11 +103,13 @@ CMD [ "redis-server", "/usr/local/etc/redis/redis.conf" ] Alternatively, you can specify something along the same lines with `docker run` options. ```console -$ docker run -v /myredis/conf/redis.conf:/usr/local/etc/redis/redis.conf --name myredis redis redis-server /usr/local/etc/redis/redis.conf +$ docker run -v /myredis/conf:/usr/local/etc/redis --name myredis redis redis-server /usr/local/etc/redis/redis.conf ``` Where `/myredis/conf/` is a local directory containing your `redis.conf` file. Using this method means that there is no need for you to have a Dockerfile for your redis container. +The mapped directory should be writable, as depending on the configuration and mode of operation, Redis may need to create additional configuration files or rewrite existing ones. + ## `32bit` variant This variant is *not* a 32bit image (and will not run on 32bit hardware), but includes Redis compiled as a 32bit binary, especially for users who need the decreased memory requirements associated with that. See ["Using 32 bit instances"](http://redis.io/topics/memory-optimization#using-32-bit-instances) in the Redis documentation for more information. @@ -127,13 +130,13 @@ The `redis` images come in many flavors, each designed for a specific use case. 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. -Some of these tags may have names like buster 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. +Some of these tags may have names like 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. ## `redis:-alpine` -This image is based on the popular [Alpine Linux project](http://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. +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. -This variant is highly recommended when final image size being as small as possible is desired. The main caveat to note is that it does use [musl libc](http://www.musl-libc.org) instead of [glibc and friends](http://www.etalabs.net/compare_libcs.html), so certain software might run into issues depending on the depth of their libc requirements. However, most software doesn't have an issue with this, so this variant is usually a very safe choice. 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. +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. 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). diff --git a/redis/content.md b/redis/content.md index 4f8a77389371..f251509ff5ee 100644 --- a/redis/content.md +++ b/redis/content.md @@ -25,10 +25,10 @@ $ docker run --name some-redis -d %%IMAGE%% ## start with persistent storage ```console -$ docker run --name some-redis -d %%IMAGE%% redis-server --appendonly yes +$ docker run --name some-redis -d %%IMAGE%% redis-server --save 60 1 --loglevel warning ``` -If persistence is enabled, data is stored in the `VOLUME /data`, which can be used with `--volumes-from some-volume-container` or `-v /docker/host/dir:/data` (see [docs.docker volumes](https://docs.docker.com/engine/tutorials/dockervolumes/)). +There are several different persistence strategies to choose from. This one will save a snapshot of the DB every 60 seconds if at least 1 write operation was performed (it will also lead to more logs, so the `loglevel` option may be desirable). If persistence is enabled, data is stored in the `VOLUME /data`, which can be used with `--volumes-from some-volume-container` or `-v /docker/host/dir:/data` (see [docs.docker volumes](https://docs.docker.com/engine/tutorials/dockervolumes/)). For more about Redis Persistence, see [http://redis.io/topics/persistence](http://redis.io/topics/persistence). @@ -51,11 +51,13 @@ CMD [ "redis-server", "/usr/local/etc/redis/redis.conf" ] Alternatively, you can specify something along the same lines with `docker run` options. ```console -$ docker run -v /myredis/conf/redis.conf:/usr/local/etc/redis/redis.conf --name myredis %%IMAGE%% redis-server /usr/local/etc/redis/redis.conf +$ docker run -v /myredis/conf:/usr/local/etc/redis --name myredis %%IMAGE%% redis-server /usr/local/etc/redis/redis.conf ``` Where `/myredis/conf/` is a local directory containing your `redis.conf` file. Using this method means that there is no need for you to have a Dockerfile for your redis container. +The mapped directory should be writable, as depending on the configuration and mode of operation, Redis may need to create additional configuration files or rewrite existing ones. + ## `32bit` variant This variant is *not* a 32bit image (and will not run on 32bit hardware), but includes Redis compiled as a 32bit binary, especially for users who need the decreased memory requirements associated with that. See ["Using 32 bit instances"](http://redis.io/topics/memory-optimization#using-32-bit-instances) in the Redis documentation for more information. diff --git a/redmine/README.md b/redmine/README.md index cbc8f51a2e30..de195e471616 100644 --- a/redmine/README.md +++ b/redmine/README.md @@ -20,16 +20,15 @@ WARNING: [the Docker Community](https://github.com/docker-library/redmine) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`4.1.1`, `4.1`, `4`, `latest`](https://github.com/docker-library/redmine/blob/f5895d1d4bff53a590b6048e294dc96b26206883/4.1/Dockerfile) -- [`4.1.1-passenger`, `4.1-passenger`, `4-passenger`, `passenger`](https://github.com/docker-library/redmine/blob/fe32a0b56f5eacae086030de5e0ca19ea026b51b/4.1/passenger/Dockerfile) -- [`4.1.1-alpine`, `4.1-alpine`, `4-alpine`, `alpine`](https://github.com/docker-library/redmine/blob/1dae7ff59aef57ec379bbada0fa01a193fadb847/4.1/alpine/Dockerfile) -- [`4.0.7`, `4.0`](https://github.com/docker-library/redmine/blob/f5895d1d4bff53a590b6048e294dc96b26206883/4.0/Dockerfile) -- [`4.0.7-passenger`, `4.0-passenger`](https://github.com/docker-library/redmine/blob/fd5541e76d7f2230484c19a784b8f9ee884559ce/4.0/passenger/Dockerfile) -- [`4.0.7-alpine`, `4.0-alpine`](https://github.com/docker-library/redmine/blob/1dae7ff59aef57ec379bbada0fa01a193fadb847/4.0/alpine/Dockerfile) +- [`5.0.4`, `5.0`, `5`, `latest`, `5.0.4-bullseye`, `5.0-bullseye`, `5-bullseye`, `bullseye`](https://github.com/docker-library/redmine/blob/8749011cf59188062efd880e64cd69e800e1d447/5.0/Dockerfile) +- [`5.0.4-alpine`, `5.0-alpine`, `5-alpine`, `alpine`, `5.0.4-alpine3.16`, `5.0-alpine3.16`, `5-alpine3.16`, `alpine3.16`](https://github.com/docker-library/redmine/blob/8749011cf59188062efd880e64cd69e800e1d447/5.0/alpine/Dockerfile) +- [`4.2.9`, `4.2`, `4`, `4.2.9-bullseye`, `4.2-bullseye`, `4-bullseye`](https://github.com/docker-library/redmine/blob/6ba68a3fdcc615faab7fa8e32e7b3bf8247a5fb8/4.2/Dockerfile) +- [`4.2.9-passenger`, `4.2-passenger`, `4-passenger`](https://github.com/docker-library/redmine/blob/79ca73df39c04878fb0d1e00401d3e790e1973b6/4.2/passenger/Dockerfile) +- [`4.2.9-alpine`, `4.2-alpine`, `4-alpine`, `4.2.9-alpine3.16`, `4.2-alpine3.16`, `4-alpine3.16`](https://github.com/docker-library/redmine/blob/6ba68a3fdcc615faab7fa8e32e7b3bf8247a5fb8/4.2/alpine/Dockerfile) # Quick reference (cont.) @@ -37,14 +36,14 @@ WARNING: [https://github.com/docker-library/redmine/issues](https://github.com/docker-library/redmine/issues) - **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) - [`amd64`](https://hub.docker.com/r/amd64/redmine/), [`arm32v5`](https://hub.docker.com/r/arm32v5/redmine/), [`arm32v7`](https://hub.docker.com/r/arm32v7/redmine/), [`arm64v8`](https://hub.docker.com/r/arm64v8/redmine/), [`i386`](https://hub.docker.com/r/i386/redmine/), [`mips64le`](https://hub.docker.com/r/mips64le/redmine/), [`ppc64le`](https://hub.docker.com/r/ppc64le/redmine/), [`s390x`](https://hub.docker.com/r/s390x/redmine/) + [`amd64`](https://hub.docker.com/r/amd64/redmine/), [`arm32v5`](https://hub.docker.com/r/arm32v5/redmine/), [`arm32v6`](https://hub.docker.com/r/arm32v6/redmine/), [`arm32v7`](https://hub.docker.com/r/arm32v7/redmine/), [`arm64v8`](https://hub.docker.com/r/arm64v8/redmine/), [`i386`](https://hub.docker.com/r/i386/redmine/), [`ppc64le`](https://hub.docker.com/r/ppc64le/redmine/), [`s390x`](https://hub.docker.com/r/s390x/redmine/) - **Published image artifact details**: [repo-info repo's `repos/redmine/` directory](https://github.com/docker-library/repo-info/blob/master/repos/redmine) ([history](https://github.com/docker-library/repo-info/commits/master/repos/redmine)) (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/redmine`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fredmine) + [official-images repo's `library/redmine` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fredmine) [official-images repo's `library/redmine` file](https://github.com/docker-library/official-images/blob/master/library/redmine) ([history](https://github.com/docker-library/official-images/commits/master/library/redmine)) - **Source of this description**: @@ -127,7 +126,7 @@ Run `docker stack deploy -c stack.yml redmine` (or `docker-compose -f stack.yml ## Alternative Web Server -The other tags in this repository, like those with `passenger`, use the same environment and `--links` as the default tags that use WEBrick (`rails s`) but instead give you the option of a different web and application server. `passenger` uses [Phusion Passenger](https://www.phusionpassenger.com/). [`tini`](https://github.com/krallin/tini) is used for reaping [zombies](https://en.wikipedia.org/wiki/Zombie_process). +The other tags in this repository, like those with `passenger`, use the same environment and `--links` as the default tags that use Puma (`rails server`) but instead give you the option of a different web and application server. `passenger` uses [Phusion Passenger](https://www.phusionpassenger.com/). [`tini`](https://github.com/krallin/tini) is used for reaping [zombies](https://en.wikipedia.org/wiki/Zombie_process). ## Accessing the Application @@ -159,9 +158,9 @@ If you'd like to be able to access the instance from the host without the contai When you start the `redmine` image, you can adjust the configuration of the instance by passing one or more environment variables on the `docker run` command line. -### `REDMINE_DB_MYSQL` or `REDMINE_DB_POSTGRES` +### `REDMINE_DB_MYSQL`, `REDMINE_DB_POSTGRES`, or `REDMINE_DB_SQLSERVER` -These two variables allow you to set the hostname or IP address of the MySQL or PostgreSQL host, respectively. These values are mutually exclusive so it is undefined behavior if both are set. If neither variable is set, the image will fall back to using SQLite. +These variables allow you to set the hostname or IP address of the MySQL, PostgreSQL, or Microsoft SQL host, respectively. These values are mutually exclusive so it is undefined behavior if any two are set. If no variable is set, the image will fall back to using SQLite. ### `REDMINE_DB_PORT` @@ -199,6 +198,22 @@ This variable allows you to control if `rake redmine:plugins:migrate` is run on This variable is required when using Docker Swarm replicas to maintain session connections when being loadbalanced between containers. It will create an initial `config/secrets.yml` and set the `secret_key_base` value, which is "used by Rails to encode cookies storing session data thus preventing their tampering. Generating a new secret token invalidates all existing sessions after restart" ([session store](https://www.redmine.org/projects/redmine/wiki/RedmineInstall#Step-5-Session-store-secret-generation)). If you do not set this variable or provide a `secrets.yml` one will be generated using `rake generate_secret_token`. +## Running as an arbitrary user + +For running Redmine without Phusion Passenger you can simply use the [`--user`](https://docs.docker.com/engine/reference/run/#user) flag to `docker run` and give it a `username:group` or `UID:GID`, the user doesn't need to exist in the container + +For running the `redmine:passenger` variant as an arbitrary user you will however need the user to exist in `/etc/passwd`. Here are a few examples for doing that: + +1. Create the user on your host and mount `/etc/passwd:/etc/passwd:ro` + +2. Create a Dockerfile `FROM redmine:passenger` and include something like [`RUN groupadd -r group && useradd --no-log-init -r -g group user`](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#user) + + ```dockerfile + FROM redmine:passenger + RUN groupadd -r group && useradd --no-log-init -r -g group user + USER user + ``` + ## Docker Secrets 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/` files. For example: @@ -217,11 +232,13 @@ The `redmine` images come in many flavors, each designed for a specific use case 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. +Some of these tags may have names like 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. + ## `redmine:-alpine` -This image is based on the popular [Alpine Linux project](http://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. +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. -This variant is highly recommended when final image size being as small as possible is desired. The main caveat to note is that it does use [musl libc](http://www.musl-libc.org) instead of [glibc and friends](http://www.etalabs.net/compare_libcs.html), so certain software might run into issues depending on the depth of their libc requirements. However, most software doesn't have an issue with this, so this variant is usually a very safe choice. 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. +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. 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). diff --git a/redmine/content.md b/redmine/content.md index dcc7cf5ba57b..feb4bb3f15c5 100644 --- a/redmine/content.md +++ b/redmine/content.md @@ -48,7 +48,7 @@ Run `docker stack deploy -c stack.yml %%REPO%%` (or `docker-compose -f stack.yml ## Alternative Web Server -The other tags in this repository, like those with `passenger`, use the same environment and `--links` as the default tags that use WEBrick (`rails s`) but instead give you the option of a different web and application server. `passenger` uses [Phusion Passenger](https://www.phusionpassenger.com/). [`tini`](https://github.com/krallin/tini) is used for reaping [zombies](https://en.wikipedia.org/wiki/Zombie_process). +The other tags in this repository, like those with `passenger`, use the same environment and `--links` as the default tags that use Puma (`rails server`) but instead give you the option of a different web and application server. `passenger` uses [Phusion Passenger](https://www.phusionpassenger.com/). [`tini`](https://github.com/krallin/tini) is used for reaping [zombies](https://en.wikipedia.org/wiki/Zombie_process). ## Accessing the Application @@ -80,9 +80,9 @@ If you'd like to be able to access the instance from the host without the contai When you start the `%%REPO%%` image, you can adjust the configuration of the instance by passing one or more environment variables on the `docker run` command line. -### `REDMINE_DB_MYSQL` or `REDMINE_DB_POSTGRES` +### `REDMINE_DB_MYSQL`, `REDMINE_DB_POSTGRES`, or `REDMINE_DB_SQLSERVER` -These two variables allow you to set the hostname or IP address of the MySQL or PostgreSQL host, respectively. These values are mutually exclusive so it is undefined behavior if both are set. If neither variable is set, the image will fall back to using SQLite. +These variables allow you to set the hostname or IP address of the MySQL, PostgreSQL, or Microsoft SQL host, respectively. These values are mutually exclusive so it is undefined behavior if any two are set. If no variable is set, the image will fall back to using SQLite. ### `REDMINE_DB_PORT` @@ -120,6 +120,22 @@ This variable allows you to control if `rake redmine:plugins:migrate` is run on This variable is required when using Docker Swarm replicas to maintain session connections when being loadbalanced between containers. It will create an initial `config/secrets.yml` and set the `secret_key_base` value, which is "used by Rails to encode cookies storing session data thus preventing their tampering. Generating a new secret token invalidates all existing sessions after restart" ([session store](https://www.redmine.org/projects/redmine/wiki/RedmineInstall#Step-5-Session-store-secret-generation)). If you do not set this variable or provide a `secrets.yml` one will be generated using `rake generate_secret_token`. +## Running as an arbitrary user + +For running Redmine without Phusion Passenger you can simply use the [`--user`](https://docs.docker.com/engine/reference/run/#user) flag to `docker run` and give it a `username:group` or `UID:GID`, the user doesn't need to exist in the container + +For running the `redmine:passenger` variant as an arbitrary user you will however need the user to exist in `/etc/passwd`. Here are a few examples for doing that: + +1. Create the user on your host and mount `/etc/passwd:/etc/passwd:ro` + +2. Create a Dockerfile `FROM redmine:passenger` and include something like [`RUN groupadd -r group && useradd --no-log-init -r -g group user`](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#user) + + ```dockerfile + FROM redmine:passenger + RUN groupadd -r group && useradd --no-log-init -r -g group user + USER user + ``` + ## Docker Secrets 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/` files. For example: diff --git a/registry/README.md b/registry/README.md index 5b13fe6df5e0..25202c865833 100644 --- a/registry/README.md +++ b/registry/README.md @@ -20,12 +20,13 @@ WARNING: [Docker, Inc.](https://github.com/docker/distribution-library-image) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [CNCF community slack](https://slack.cncf.io/), or [Stack Overflow](https://stackoverflow.com/questions/tagged/docker+registry) + +- **Need a free, secure hosted registry?** Try [Docker Hub](https://www.docker.com/pricing). # Supported tags and respective `Dockerfile` links -- [`2.7.1`, `2.7`, `2`, `latest`](https://github.com/docker/distribution-library-image/blob/0b6ea3ba50b65563600a717f07db4cfa6f18f957/amd64/Dockerfile) -- [`2.6.2`, `2.6`](https://github.com/docker/distribution-library-image/blob/fc40f1f1051bb4a42ee4661ccaa190c1bd6c6be9/amd64/Dockerfile) +- [`2.8.1`, `2.8`, `2`, `latest`](https://github.com/docker/distribution-library-image/blob/0be0d08b29d56bb1ef0fab93c751ca92d6976a19/Dockerfile) # Quick reference (cont.) @@ -33,22 +34,24 @@ WARNING: [https://github.com/docker/distribution-library-image/issues](https://github.com/docker/distribution-library-image/issues) - **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) - [`amd64`](https://hub.docker.com/r/amd64/registry/), [`arm32v6`](https://hub.docker.com/r/arm32v6/registry/), [`arm64v8`](https://hub.docker.com/r/arm64v8/registry/) + [`amd64`](https://hub.docker.com/r/amd64/registry/), [`arm32v6`](https://hub.docker.com/r/arm32v6/registry/), [`arm32v7`](https://hub.docker.com/r/arm32v7/registry/), [`arm64v8`](https://hub.docker.com/r/arm64v8/registry/), [`ppc64le`](https://hub.docker.com/r/ppc64le/registry/), [`s390x`](https://hub.docker.com/r/s390x/registry/) - **Published image artifact details**: [repo-info repo's `repos/registry/` directory](https://github.com/docker-library/repo-info/blob/master/repos/registry) ([history](https://github.com/docker-library/repo-info/commits/master/repos/registry)) (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/registry`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fregistry) + [official-images repo's `library/registry` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fregistry) [official-images repo's `library/registry` file](https://github.com/docker-library/official-images/blob/master/library/registry) ([history](https://github.com/docker-library/official-images/commits/master/library/registry)) - **Source of this description**: [docs repo's `registry/` directory](https://github.com/docker-library/docs/tree/master/registry) ([history](https://github.com/docker-library/docs/commits/master/registry)) -# Docker Registry +# Distribution Registry + +![logo](https://raw.githubusercontent.com/docker-library/docs/b09c592af0d6061629e02e4f674d22848f8236e8/registry/logo.png) -This image contains an implementation of the Docker Registry HTTP API V2 for use with Docker 1.6+. See [github.com/docker/distribution](https://github.com/docker/distribution) for more details about what it is. +This image contains an implementation of the Docker Registry HTTP API V2 for use with Docker 1.6+. See [github.com/distribution/distribution](https://github.com/distribution/distribution) for more details about what it is. ## Run a local registry: Quick Version @@ -70,10 +73,6 @@ The [documentation over at docs.docker.com](https://docs.docker.com/registry/) i Specifically, [the section regarding deployment](https://docs.docker.com/registry/deploying/) has pointers for more complex use cases than simply running a registry on localhost. -# Support - -If you are interested in commercial support, the [Docker Trusted Registry](https://www.docker.com/docker-trusted-registry) provides an image registry, LDAP/Active Directory integration, security certificates, and more in a solution that includes commercial support. - # License View [license information](https://github.com/docker/distribution/blob/master/LICENSE) for the software contained in this image. diff --git a/registry/content.md b/registry/content.md index 6571f2bb0dff..1e37ab63a262 100644 --- a/registry/content.md +++ b/registry/content.md @@ -1,6 +1,8 @@ -# Docker Registry +# Distribution Registry -This image contains an implementation of the Docker Registry HTTP API V2 for use with Docker 1.6+. See [github.com/docker/distribution](https://github.com/docker/distribution) for more details about what it is. +%%LOGO%% + +This image contains an implementation of the Docker Registry HTTP API V2 for use with Docker 1.6+. See [github.com/distribution/distribution](https://github.com/distribution/distribution) for more details about what it is. ## Run a local registry: Quick Version @@ -21,7 +23,3 @@ $ docker push localhost:5000/ubuntu The [documentation over at docs.docker.com](https://docs.docker.com/registry/) is a good place to learn more about what the registry is, how it works, and how to use it. Specifically, [the section regarding deployment](https://docs.docker.com/registry/deploying/) has pointers for more complex use cases than simply running a registry on localhost. - -# Support - -If you are interested in commercial support, the [Docker Trusted Registry](https://www.docker.com/docker-trusted-registry) provides an image registry, LDAP/Active Directory integration, security certificates, and more in a solution that includes commercial support. diff --git a/registry/get-help.md b/registry/get-help.md new file mode 100644 index 000000000000..4d954e7f170c --- /dev/null +++ b/registry/get-help.md @@ -0,0 +1,3 @@ +[CNCF community slack](https://slack.cncf.io/), or [Stack Overflow](https://stackoverflow.com/questions/tagged/docker+registry) + +- **Need a free, secure hosted registry?** Try [Docker Hub](https://www.docker.com/pricing). diff --git a/registry/logo.png b/registry/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..39418022e3363b38db53f6ed913ef9ec66099877 GIT binary patch literal 28962 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 + +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. + +Some of these tags may have names like 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. + +## `rethinkdb:-slim` + +This image does not contain the common packages contained in the default tag and only contains the minimal packages needed to run `rethinkdb`. Unless you are working in an environment where *only* the `rethinkdb` image will be deployed and you have space constraints, we highly recommend using the default image of this repository. + # License View [license information](https://raw.githubusercontent.com/rethinkdb/rethinkdb/next/LICENSE) for the software contained in this image. diff --git a/rocket.chat/README.md b/rocket.chat/README.md index b3af5a9cab6d..c63e25f4da12 100644 --- a/rocket.chat/README.md +++ b/rocket.chat/README.md @@ -20,12 +20,15 @@ WARNING: [Rocket.Chat](https://github.com/RocketChat/Docker.Official.Image) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`3.2.2`, `3.2`, `3`, `latest`](https://github.com/RocketChat/Docker.Official.Image/blob/9cc942405ca293ef01474e2c13a40894ee313851/3/Dockerfile) -- [`2.4.12`, `2.4`, `2`](https://github.com/RocketChat/Docker.Official.Image/blob/9cc942405ca293ef01474e2c13a40894ee313851/2/Dockerfile) +- [`5.4.0`, `5.4`, `5`, `latest`](https://github.com/RocketChat/Docker.Official.Image/blob/dbb5e8eb972d7a32f28e7bdc0b03d0d3c6f58d60/5.4/Dockerfile) +- [`5.3.5`, `5.3`](https://github.com/RocketChat/Docker.Official.Image/blob/dbb5e8eb972d7a32f28e7bdc0b03d0d3c6f58d60/5.3/Dockerfile) +- [`5.2.1`, `5.2`](https://github.com/RocketChat/Docker.Official.Image/blob/dbb5e8eb972d7a32f28e7bdc0b03d0d3c6f58d60/5.2/Dockerfile) +- [`5.1.5`, `5.1`](https://github.com/RocketChat/Docker.Official.Image/blob/dbb5e8eb972d7a32f28e7bdc0b03d0d3c6f58d60/5.1/Dockerfile) +- [`4.8.7`, `4.8`, `4`](https://github.com/RocketChat/Docker.Official.Image/blob/dbb5e8eb972d7a32f28e7bdc0b03d0d3c6f58d60/4.8/Dockerfile) # Quick reference (cont.) @@ -40,7 +43,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/rocket.chat`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Frocket.chat) + [official-images repo's `library/rocket.chat` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Frocket.chat) [official-images repo's `library/rocket.chat` file](https://github.com/docker-library/official-images/blob/master/library/rocket.chat) ([history](https://github.com/docker-library/official-images/commits/master/library/rocket.chat)) - **Source of this description**: diff --git a/rockylinux/README-short.txt b/rockylinux/README-short.txt new file mode 100644 index 000000000000..efbd1adbaeee --- /dev/null +++ b/rockylinux/README-short.txt @@ -0,0 +1 @@ +The official build of Rocky Linux. diff --git a/rockylinux/README.md b/rockylinux/README.md new file mode 100644 index 000000000000..f1c7ba21fc2e --- /dev/null +++ b/rockylinux/README.md @@ -0,0 +1,92 @@ + + +# Quick reference + +- **Maintained by**: + [The Rocky Enterprise Software Foundation](https://github.com/rocky-linux/sig-cloud-instance-images) + +- **Where to get help**: + [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) + +# Supported tags and respective `Dockerfile` links + +- [`9.1.20221221`, `9.1`, `9`](https://github.com/rocky-linux/sig-cloud-instance-images/blob/0c5e7578276e2bd1196e340ea98fee112d305bac/Dockerfile) +- [`9.1.20221221-minimal`, `9.1-minimal`, `9-minimal`](https://github.com/rocky-linux/sig-cloud-instance-images/blob/4925a4ada53dc186b27167d90dbe62c7d62942cc/Dockerfile) +- [`8.7.20221219`, `8.7`, `8`](https://github.com/rocky-linux/sig-cloud-instance-images/blob/15e9cb0790bed8b6cba7b5cb2ecf3ebab6a0e6ae/Dockerfile) +- [`8.7.20221219-minimal`, `8.7-minimal`, `8-minimal`](https://github.com/rocky-linux/sig-cloud-instance-images/blob/263f85f3cc1dfaa1824aeecfe3aee681adafe33f/Dockerfile) + +# Quick reference (cont.) + +- **Where to file issues**: + [https://bugs.rockylinux.org](https://bugs.rockylinux.org) or [GitHub](https://github.com/rocky-linux/sig-cloud-instance-images/issues) + +- **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) + [`amd64`](https://hub.docker.com/r/amd64/rockylinux/), [`arm64v8`](https://hub.docker.com/r/arm64v8/rockylinux/), [`ppc64le`](https://hub.docker.com/r/ppc64le/rockylinux/), [`s390x`](https://hub.docker.com/r/s390x/rockylinux/) + +- **Published image artifact details**: + [repo-info repo's `repos/rockylinux/` directory](https://github.com/docker-library/repo-info/blob/master/repos/rockylinux) ([history](https://github.com/docker-library/repo-info/commits/master/repos/rockylinux)) + (image metadata, transfer size, etc) + +- **Image updates**: + [official-images repo's `library/rockylinux` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Frockylinux) + [official-images repo's `library/rockylinux` file](https://github.com/docker-library/official-images/blob/master/library/rockylinux) ([history](https://github.com/docker-library/official-images/commits/master/library/rockylinux)) + +- **Source of this description**: + [docs repo's `rockylinux/` directory](https://github.com/docker-library/docs/tree/master/rockylinux) ([history](https://github.com/docker-library/docs/commits/master/rockylinux)) + +# Rocky Linux + +Rocky Linux is a community-supported distribution derived from sources freely provided to the public by [Red Hat](ftp://ftp.redhat.com/pub/redhat/linux/enterprise/) for Red Hat Enterprise Linux (RHEL). As such, Rocky Linux aims to be functionally compatible with RHEL. The Rocky Linux Project mainly changes packages to remove upstream vendor branding and artwork. Rocky Linux is no-cost and free to redistribute. Each Rocky Linux version is maintained for up to 10 years (by means of security updates -- the duration of the support interval by Red Hat has varied over time with respect to Sources released). A new Rocky Linux version is released approximately every 2 years and each Rocky Linux version is periodically updated (roughly every 6 months) to support newer hardware. This results in a secure, low-maintenance, reliable, predictable, and reproducible Linux environment. + +Thank you for using Rocky Linux! We appreciate your feedback and welcome you to the community! Please join us on IRC on Libera.chat in #rockylinux or on our Mattermost instance at https://chat.rockylinux.org + +- [docs.rockylinux.org](https://docs.rockylinux.org) +- [wiki.rockylinux.org](https://wiki.rockylinux.org) + +![logo](https://raw.githubusercontent.com/docker-library/docs/5e29cd0cdc96d579d91310cbcb772b26067182ad/rockylinux/logo.png) + +# Rocky Linux image documentation + +The `rockylinux:latest` tag is intentionally missing. Please choose a major version (currently 8 or 9) tag, or a more specific tag to ensure you are pulling the version of Rocky Linux you want: e.g. `rockylinux:8` or `rockylinux:9` + +## Minimal variant + +In addition to the Base container, a Minimal container with microdnf and a stripped down dependency set is available by using any of the `-minimal` tags e.g. `rockylinux:9-minimal` + +## Rolling builds + +Rocky Linux offers regularly updated images for all active releases. These images will be updated monthly or as needed for emergency fixes. These rolling updates are tagged with the major version number only. For example: `docker pull rockylinux:8`. + +## Minor tags + +Additionally, images with minor version tags that correspond to install media are also offered. **These images DO NOT receive updates** as they are intended to match installation iso contents. If you choose to use these images it is highly recommended that you include `RUN yum -y update && yum clean all` in your Dockerfile, or otherwise address any potential security concerns. To use these images, please specify the minor version tag: + +For example: `docker pull rockylinux:8.4` + +# Package documentation + +By default, the Rocky Linux containers are built using yum's `nodocs` option, which helps reduce the size of the image. If you install a package and discover files missing, please comment out the line `tsflags=nodocs` in `/etc/yum.conf` and reinstall your package. + +# License + +View [license information](https://www.rockylinux.org/legal/) for the software contained in this image. + +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). + +Some additional license information which was able to be auto-detected might be found in [the `repo-info` repository's `rockylinux/` directory](https://github.com/docker-library/repo-info/tree/master/repos/rockylinux). + +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. diff --git a/rockylinux/content.md b/rockylinux/content.md new file mode 100644 index 000000000000..d32aa776a920 --- /dev/null +++ b/rockylinux/content.md @@ -0,0 +1,32 @@ +# Rocky Linux + +Rocky Linux is a community-supported distribution derived from sources freely provided to the public by [Red Hat](ftp://ftp.redhat.com/pub/redhat/linux/enterprise/) for Red Hat Enterprise Linux (RHEL). As such, Rocky Linux aims to be functionally compatible with RHEL. The Rocky Linux Project mainly changes packages to remove upstream vendor branding and artwork. Rocky Linux is no-cost and free to redistribute. Each Rocky Linux version is maintained for up to 10 years (by means of security updates -- the duration of the support interval by Red Hat has varied over time with respect to Sources released). A new Rocky Linux version is released approximately every 2 years and each Rocky Linux version is periodically updated (roughly every 6 months) to support newer hardware. This results in a secure, low-maintenance, reliable, predictable, and reproducible Linux environment. + +Thank you for using Rocky Linux! We appreciate your feedback and welcome you to the community! Please join us on IRC on Libera.chat in #rockylinux or on our Mattermost instance at https://chat.rockylinux.org + +- [docs.rockylinux.org](https://docs.rockylinux.org) +- [wiki.rockylinux.org](https://wiki.rockylinux.org) + +%%LOGO%% + +# Rocky Linux image documentation + +The `%%IMAGE%%:latest` tag is intentionally missing. Please choose a major version (currently 8 or 9) tag, or a more specific tag to ensure you are pulling the version of Rocky Linux you want: e.g. `%%IMAGE%%:8` or `%%IMAGE%%:9` + +## Minimal variant + +In addition to the Base container, a Minimal container with microdnf and a stripped down dependency set is available by using any of the `-minimal` tags e.g. `%%IMAGE%%:9-minimal` + +## Rolling builds + +Rocky Linux offers regularly updated images for all active releases. These images will be updated monthly or as needed for emergency fixes. These rolling updates are tagged with the major version number only. For example: `docker pull %%IMAGE%%:8`. + +## Minor tags + +Additionally, images with minor version tags that correspond to install media are also offered. **These images DO NOT receive updates** as they are intended to match installation iso contents. If you choose to use these images it is highly recommended that you include `RUN yum -y update && yum clean all` in your Dockerfile, or otherwise address any potential security concerns. To use these images, please specify the minor version tag: + +For example: `docker pull %%IMAGE%%:8.4` + +# Package documentation + +By default, the Rocky Linux containers are built using yum's `nodocs` option, which helps reduce the size of the image. If you install a package and discover files missing, please comment out the line `tsflags=nodocs` in `/etc/yum.conf` and reinstall your package. diff --git a/rockylinux/github-repo b/rockylinux/github-repo new file mode 100644 index 000000000000..800b8dee15ae --- /dev/null +++ b/rockylinux/github-repo @@ -0,0 +1 @@ +https://github.com/rocky-linux/sig-cloud-instance-images diff --git a/rockylinux/issues.md b/rockylinux/issues.md new file mode 100644 index 000000000000..153fb45a6161 --- /dev/null +++ b/rockylinux/issues.md @@ -0,0 +1 @@ +[https://bugs.rockylinux.org](https://bugs.rockylinux.org) or [GitHub](%%GITHUB-REPO%%/issues) diff --git a/rockylinux/license.md b/rockylinux/license.md new file mode 100644 index 000000000000..e6231944187d --- /dev/null +++ b/rockylinux/license.md @@ -0,0 +1 @@ +View [license information](https://www.rockylinux.org/legal/) for the software contained in this image. diff --git a/rockylinux/logo.png b/rockylinux/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..da1d46911e95d5ca5d45fcdf9063ecc556f34f61 GIT binary patch literal 19946 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 [wikipedia.org/wiki/Robot_Operating_System](https://en.wikipedia.org/wiki/Robot_Operating_System) -[![logo](https://raw.githubusercontent.com/docker-library/docs/0074e9dac72a35e5058f356885121aa82572682f/ros/logo.png)](http://www.ros.org/) +[![logo](https://raw.githubusercontent.com/docker-library/docs/0074e9dac72a35e5058f356885121aa82572682f/ros/logo.png)](https://www.ros.org/) # How to use this image -## Create a `Dockerfile` in your ROS app project +## Creating a `Dockerfile` to install ROS packages + +To create your own ROS docker images and install custom packages, here's a simple example of installing the C++, Python client library demos using the official released Debian packages via apt-get. ```dockerfile -FROM ros:indigo -# place here your application's setup specifics -CMD [ "roslaunch", "my-ros-app my-ros-app.launch" ] +FROM ros:foxy + +# install ros package +RUN apt-get update && apt-get install -y \ + ros-${ROS_DISTRO}-demo-nodes-cpp \ + ros-${ROS_DISTRO}-demo-nodes-py && \ + rm -rf /var/lib/apt/lists/* + +# launch ros package +CMD ["ros2", "launch", "demo_nodes_cpp", "talker_listener.launch.py"] ``` -You can then build and run the Docker image: +Note: all ROS images include a default entrypoint that sources the ROS environment setup before executing the configured command, in this case the demo packages launch file. You can then build and run the Docker image like so: ```console -$ docker build -t my-ros-app . -$ docker run -it --rm --name my-running-app my-ros-app +$ docker build -t my/ros:app . +$ docker run -it --rm my/ros:app +[INFO] [launch]: process[talker-1]: started with pid [813] +[INFO] [launch]: process[listener-2]: started with pid [814] +[INFO] [talker]: Publishing: 'Hello World: 1' +[INFO] [listener]: I heard: [Hello World: 1] +[INFO] [talker]: Publishing: 'Hello World: 2' +[INFO] [listener]: I heard: [Hello World: 2] +... +``` + +## Creating a `Dockerfile` to build ROS packages + +To create your own ROS docker images and build custom packages, here's a simple example of installing a package's build dependencies, compiling it from source, and installing the resulting build artifacts into a final multi-stage image layer. + +```dockerfile +ARG FROM_IMAGE=ros:foxy +ARG OVERLAY_WS=/opt/ros/overlay_ws + +# multi-stage for caching +FROM $FROM_IMAGE AS cacher + +# clone overlay source +ARG OVERLAY_WS +WORKDIR $OVERLAY_WS/src +RUN echo "\ +repositories: \n\ + ros2/demos: \n\ + type: git \n\ + url: https://github.com/ros2/demos.git \n\ + version: ${ROS_DISTRO} \n\ +" > ../overlay.repos +RUN vcs import ./ < ../overlay.repos + +# copy manifests for caching +WORKDIR /opt +RUN mkdir -p /tmp/opt && \ + find ./ -name "package.xml" | \ + xargs cp --parents -t /tmp/opt && \ + find ./ -name "COLCON_IGNORE" | \ + xargs cp --parents -t /tmp/opt || true + +# multi-stage for building +FROM $FROM_IMAGE AS builder + +# install overlay dependencies +ARG OVERLAY_WS +WORKDIR $OVERLAY_WS +COPY --from=cacher /tmp/$OVERLAY_WS/src ./src +RUN . /opt/ros/$ROS_DISTRO/setup.sh && \ + apt-get update && rosdep install -y \ + --from-paths \ + src/ros2/demos/demo_nodes_cpp \ + src/ros2/demos/demo_nodes_py \ + --ignore-src \ + && rm -rf /var/lib/apt/lists/* + +# build overlay source +COPY --from=cacher $OVERLAY_WS/src ./src +ARG OVERLAY_MIXINS="release" +RUN . /opt/ros/$ROS_DISTRO/setup.sh && \ + colcon build \ + --packages-select \ + demo_nodes_cpp \ + demo_nodes_py \ + --mixin $OVERLAY_MIXINS + +# source entrypoint setup +ENV OVERLAY_WS $OVERLAY_WS +RUN sed --in-place --expression \ + '$isource "$OVERLAY_WS/install/setup.bash"' \ + /ros_entrypoint.sh + +# run launch file +CMD ["ros2", "launch", "demo_nodes_cpp", "talker_listener.launch.py"] ``` +The example above starts by using [`vcstool`](https://github.com/dirk-thomas/vcstool) to clone source repos of interest into the cacher stage. One could similarly `COPY` code from the local build context into the source directory as well. Package manifest files are then cached in a temporary directory where the following builder stage may copy from to install necessary dependencies with [`rosdep`](https://github.com/ros-infrastructure/rosdep). This is done prior to copying the rest of the source files to preserve the multi-stage build cache, given unaltered manifests do not alter declared dependencies, saving time and bandwidth. The overlay is then built using [`colcon`](https://colcon.readthedocs.io/en/released/), the entrypoint updated to source the workspace, and the default command set to launch the demo. + +Note: `--from-paths` and `--packages-select` are set here as so to only install the dependencies and build for the demo C++ and Python packages, among many in the demo git repo that was cloned. To install the dependencies and build all the packages in the source workspace, merely change the scope by setting `--from-paths src/` and dropping the `--packages-select` arguments. + +For more advance examples such as daisy chaining multiple overlay workspaces to improve caching of docker image build layers, using tools such as ccache to accelerate compilation with colcon, or using buildkit to save build time and bandwidth even when dependencies change, the project `Dockerfile`s in the ROS 2 [Navigation2](https://github.com/ros-planning/navigation2) repo are excellent resources. + ## Deployment use cases This dockerized image of ROS is intended to provide a simplified and consistent platform to build and deploy distributed robotic applications. Built from the [official Ubuntu image](https://hub.docker.com/_/ubuntu/) and ROS's official Debian packages, it includes recent supported releases for quick access and download. This provides roboticists in research and industry with an easy way to develop, reuse and ship software for autonomous actions and task planning, control dynamics, localization and mapping, swarm behavior, as well as general system integration. @@ -93,22 +186,25 @@ Developing such complex systems with cutting edge implementations of newly publi With the advancements and standardization of software containers, roboticists are primed to acquire a host of improved developer tooling for building and shipping software. To help alleviate the growing pains and technical challenges of adopting new practices, we have focused on providing an official resource for using ROS with these new technologies. +For a complete listing of supported architectures and base images for each ROS Distribution Release, please read the official REP on target platforms for either [ROS 1](https://www.ros.org/reps/rep-0003.html) or for [ROS 2](https://www.ros.org/reps/rep-2000.html). + ## Deployment suggestions The available tags include supported distros along with a hierarchy tags based off the most common meta-package dependencies, designed to have a small footprint and simple configuration: -- `ros-core`: barebone ROS install +- `ros-core`: minimal ROS install - `ros-base`: basic tools and libraries (also tagged with distro name with LTS version as `latest`) -- `robot`: basic install for robots -- `perception`: basic install for perception tasks +- `ros1-bridge`: tools and libraries to run hybrid ROS 1 - ROS 2 systems and bridge messages between them -The rest of the common meta-packages such as `desktop` and `desktop-full` are hosted on automatic build repos under OSRF's Docker Hub profile [here](https://hub.docker.com/r/osrf/ros/). These meta-packages include graphical dependencies and hook a host of other large packages such as X11, X server, etc. So in the interest of keep the official images lean and secure, the desktop packages are just be hosted with OSRF's profile. +In the interest of keeping `ros-core` tag minimal in image size, developer tools such as `rosdep`, `colcon` and `vcstools` are not shipped in `ros_core`, but in `ros-base` instead. + +The rest of the common meta-packages such as `desktop` are hosted on repos under OSRF's Docker Hub profile [here](https://hub.docker.com/r/osrf/ros/). These meta-packages include graphical dependencies and hook a host of other large packages such as X11, X server, etc. So in the interest of keeping the official images lean and secure, the desktop packages are just being hosted with OSRF's profile. For an extensive list of available variants, please read the official REP on target platforms for either [ROS 1](https://ros.org/reps/rep-0150.html) or for [ROS 2](https://www.ros.org/reps/rep-2001.html). ### Volumes ROS uses the `~/.ros/` directory for storing logs, and debugging info. If you wish to persist these files beyond the lifecycle of the containers which produced them, the `~/.ros/` folder can be mounted to an external volume on the host, or a derived image can specify volumes to be managed by the Docker engine. By default, the container runs as the `root` user, so `/root/.ros/` would be the full path to these files. -For example, if one wishes to use their own `.ros` folder that already resides in their local home directory, with a username of `ubuntu`, we can simple launch the container with an additional volume argument: +For example, if one wishes to use their own `.ros` folder that already resides in their local home directory, with a username of `ubuntu`, we can simply launch the container with an additional volume argument: ```console $ docker run -v "/home/ubuntu/.ros/:/root/.ros/" ros @@ -120,194 +216,122 @@ Some application may require device access for acquiring images from connected c ### Networks -The ROS runtime "graph" is a peer-to-peer network of processes (potentially distributed across machines) that are loosely coupled using the ROS communication infrastructure. ROS implements several different styles of communication, including synchronous RPC-style communication over services, asynchronous streaming of data over topics, and storage of data on a Parameter Server. To abide by the best practice of [one process per container](https://docs.docker.com/articles/dockerfile_best-practices/), Docker networks can be used to string together several running ROS processes. For further details about [ROS NetworkSetup](http://wiki.ros.org/ROS/NetworkSetup) wik article, or see the Deployment example below. - -## Deployment example - -If we want our all ROS nodes to easily talk to each other, we'll can use a virtual network to connect the separate containers. In this short example, we'll create a virtual network, spin up a new container running `roscore` advertised as the `master` service on the new network, then spawn a message publisher and subscriber process as services on the same network. - -### Build image - -> Build a ROS image that includes ROS tutorials using this `Dockerfile:` +ROS allows for peer-to-peer networking of processes (potentially distributed across machines) that are loosely coupled using the ROS communication infrastructure. ROS implements several different styles of communication, including synchronous RPC-style communication over services, asynchronous streaming of typed data over topics, combinations of both prior via request/reply and status/feedback over actions, and run-time settings via configuration over parameters. To abide by the best practice of [one process per container](https://docs.docker.com/articles/dockerfile_best-practices/), Docker networks can be used to string together several running ROS processes. For further details see the Deployment example further below. -```dockerfile -FROM ros:indigo-ros-base -# install ros tutorials packages -RUN apt-get update && apt-get install -y \ - ros-indigo-ros-tutorials \ - ros-indigo-common-tutorials \ - && rm -rf /var/lib/apt/lists/ -``` - -> Then to build the image from within the same directory: - -```console -$ docker build --tag ros:ros-tutorials . -``` +Alternatively, more permissive network settings can be used to share all host network interfaces with the container, such as [`host` network driver](https://docs.docker.com/network/host/), simplifying connectivity with external network participants. Be aware however that this removes the networking namespace separation between containers, and can affect the ability of DDS participants to communicate between containers, as documented [here](https://community.rti.com/kb/how-use-rti-connext-dds-communicate-across-docker-containers-using-host-driver). -#### Create network +## Deployment example -> To create a new network `foo`, we use the network command: +### Docker Compose - docker network create foo +In this example we'll demonstrate using [`docker-compose`](https://docs.docker.com/compose/) to spawn a pair of message publisher and subscriber nodes in separate containers connected through shared software defined network. -> Now that we have a network, we can create services. Services advertise there location on the network, making it easy to resolve the location/address of the service specific container. We'll use this make sure our ROS nodes can find and connect to our ROS `master`. +> Create the directory `~/ros_demos` and add the first `Dockerfile` example from above. In the same directory, also create file `docker-compose.yml` with the following that runs a C++ publisher with a Python subscriber: -#### Run services +```yaml +version: '3' -> To create a container for the ROS master and advertise it's service: +services: + talker: + build: ./ + command: ros2 run demo_nodes_cpp talker -```console -$ docker run -it --rm \ - --net foo \ - --name master \ - ros:ros-tutorials \ - roscore + listener: + build: ./ + environment: + - "PYTHONUNBUFFERED=1" + command: ros2 run demo_nodes_py listener ``` -> Now you can see that master is running and is ready manage our other ROS nodes. To add our `talker` node, we'll need to point the relevant environment variable to the master service: +> Use docker-compose inside the same directory to launch our ROS nodes. Given the containers created derive from the same docker compose project, they will coexist on shared project network: ```console -$ docker run -it --rm \ - --net foo \ - --name talker \ - --env ROS_HOSTNAME=talker \ - --env ROS_MASTER_URI=http://master:11311 \ - ros:ros-tutorials \ - rosrun roscpp_tutorials talker +$ docker-compose up -d ``` -> Then in another terminal, run the `listener` node similarly: +> Notice that a new network named `ros_demos_default` has been created, as can be shown further with: ```console -$ docker run -it --rm \ - --net foo \ - --name listener \ - --env ROS_HOSTNAME=listener \ - --env ROS_MASTER_URI=http://master:11311 \ - ros:ros-tutorials \ - rosrun roscpp_tutorials listener +$ docker network inspect ros_demos_default ``` -> Alright! You should see `listener` is now echoing each message the `talker` broadcasting. You can then list the containers and see something like this: +> We can monitor the logged output of each container, such as the listener node like so: ```console -$ docker service ls -SERVICE ID NAME NETWORK CONTAINER -67ce73355e67 listener foo a62019123321 -917ee622d295 master foo f6ab9155fdbe -7f5a4748fb8d talker foo e0da2ee7570a +$ docker-compose logs listener ``` -> And for the services: +> Finally, we can stop and remove all the relevant containers using docker-compose from the same directory: ```console -$ docker ps -CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES -a62019123321 ros:ros-tutorials "/ros_entrypoint.sh About a minute ago Up About a minute 11311/tcp listener -e0da2ee7570a ros:ros-tutorials "/ros_entrypoint.sh About a minute ago Up About a minute 11311/tcp talker -f6ab9155fdbe ros:ros-tutorials "/ros_entrypoint.sh About a minute ago Up About a minute 11311/tcp master +$ docker-compose stop +$ docker-compose rm ``` -#### Introspection - -> Ok, now that we see the two nodes are communicating, let get inside one of the containers and do some introspection what exactly the topics are: +> Note: the auto-generated network, `ros_demos_default`, will persist until you explicitly remove it using `docker-compose down`. -```console -$ docker exec -it master bash -$ source /ros_entrypoint.sh -``` - -> If we then use `rostopic` to list published message topics, we should see something like this: +### ROS 1 Bridge -```console -$ rostopic list -/chatter -/rosout -/rosout_agg -``` +To ease ROS 2 migration, [`ros1_bridge`](https://index.ros.org/p/ros1_bridge/github-ros2-ros1_bridge) is a ROS 2 package that provides bidirectional communication between ROS 1 and ROS 2. As a minimal example, given the ROS 2 Dockerfile above, we'll create the ROS 1 equivalent below, and name the Dockerfile appropriately. -#### Tear down +```dockerfile +FROM ros:noetic -> To tear down the structure we've made, we just need to stop the containers and the services. We can stop and remove the containers using `Ctrl^C` where we launched the containers or using the stop command with the names we gave them: +# install ros package +RUN apt-get update && apt-get install -y \ + ros-${ROS_DISTRO}-ros-tutorials \ + ros-${ROS_DISTRO}-common-tutorials && \ + rm -rf /var/lib/apt/lists/* -```console -$ docker stop master talker listener -$ docker rm master talker listener +# launch ros package +CMD ["roslaunch", "roscpp_tutorials", "talker_listener.launch"] ``` -### Compose - -Now that you have an appreciation for bootstrapping a distributed ROS example manually, lets try and automate it using [`docker-compose`](https://docs.docker.com/compose/). - -> Start by making a folder named `rostutorials` and moving the Dockerfile we used earlier inside this directory. Then create a yaml file named `docker-compose.yml` in the same directory and paste the following inside: +The compose file bellow spawns services for both talker listener demos while connecting the two via a dynamic bridge. You may then view the log output from both pairs of talker and listener nodes cross talking over the `/chatter` topic. ```yaml -version: '2' +version: '3' + services: - master: - build: . - container_name: master - command: - - roscore - - talker: - build: . - container_name: talker + ros1: + build: + context: ./ + dockerfile: ros1.Dockerfile + + ros2: + build: + context: ./ + dockerfile: ros2.Dockerfile + + bridge: + image: ros:foxy-ros1-bridge environment: - - "ROS_HOSTNAME=talker" - - "ROS_MASTER_URI=http://master:11311" - command: rosrun roscpp_tutorials talker - - listener: - build: . - container_name: listener - environment: - - "ROS_HOSTNAME=listener" - - "ROS_MASTER_URI=http://master:11311" - command: rosrun roscpp_tutorials listener -``` - -> Now from inside the same folder, use docker-copose to launch our ROS nodes and specify that they coexist on their own network: - -```console -$ docker-compose up -d + - "ROS_HOSTNAME=bridge" + - "ROS_MASTER_URI=http://ros1:11311" + command: ros2 run ros1_bridge dynamic_bridge ``` -> Notice that a new network named `rostutorials_default` has now been created, you can inspect it further with: - -```console -$ docker network inspect rostutorials_default -``` - -> We can monitor the logged output of each service, such as the listener node like so: - -```console -$ docker-compose logs listener -``` +# More Resources -> Finally, we can stop and remove all the relevant containers using docker-copose from the same directory: +[ROS.org](http://www.ros.org/): Main ROS website +[Q&A](https://answers.ros.org/questions/): Ask questions. Get answers +[Forums](https://discourse.ros.org/): Hear the latest discussions +[Blog](http://www.ros.org/news/): Stay up-to-date +[Packages](https://index.ros.org/packages/): Discover indexed packages +[OSRF](https://www.osrfoundation.org/): Open Source Robotics Foundation -```console -$ docker-compose stop -$ docker-compose rm -``` +## ROS 2 -> Note: the auto-generated network, `rostutorials_default`, will persist over the life of the docker engine or until you explicitly remove it using [`docker network rm`](https://docs.docker.com/engine/reference/commandline/network_rm/). +[Index](https://index.ros.org/doc/ros2/): ROS 2 Documentation +[Design](https://design.ros2.org/): ROS 2 Design Articles -# More Resources +## ROS 1 -[ROS.org](http://www.ros.org/): Main ROS website -[Wiki](http://wiki.ros.org/): Find tutorials and learn more -[ROS Answers](http://answers.ros.org/questions/): Ask questions. Get answers -[Blog](http://www.ros.org/news/): Stay up-to-date -[OSRF](http://www.osrfoundation.org/): Open Source Robotics Foundation +[Wiki](http://wiki.ros.org/Documentation): ROS 1 Documentation # License -The core of ROS is licensed under the standard three-clause BSD license. This is a very permissive open license that allows for reuse in commercial and closed source products. You can find more about the BSD license from the Opensource.org [BSD 3-Clause](http://opensource.org/licenses/BSD-3-Clause) page and Wikipedia's [BSD Licenses](http://en.wikipedia.org/wiki/BSD_licenses) entry. - -While the core parts of ROS are licensed under the BSD license, other licenses are commonly used in the community packages, such as the [Apache 2.0](http://opensource.org/licenses/Apache-2.0) license, the [GPL](http://opensource.org/licenses/gpl-license) license, the [MIT](http://opensource.org/licenses/MIT) license, and even proprietary licenses. Each package in the ROS ecosystem is required to specify a license, so that it is easy for you to quickly identify if a package will meet your licensing needs. +View [package index](https://index.ros.org/packages/) for license information on software contained in this image. 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). diff --git a/ros/content.md b/ros/content.md index 919879c207c2..2f14ee99e988 100644 --- a/ros/content.md +++ b/ros/content.md @@ -1,28 +1,116 @@ -# What is [ROS](http://www.ros.org/)? +# What is [ROS](https://www.ros.org/)? The Robot Operating System (ROS) is a set of software libraries and tools that help you build robot applications. From drivers to state-of-the-art algorithms, and with powerful developer tools, ROS has what you need for your next robotics project. And it's all open source. > [wikipedia.org/wiki/Robot_Operating_System](https://en.wikipedia.org/wiki/Robot_Operating_System) -[%%LOGO%%](http://www.ros.org/) +[%%LOGO%%](https://www.ros.org/) # How to use this image -## Create a `Dockerfile` in your ROS app project +## Creating a `Dockerfile` to install ROS packages + +To create your own ROS docker images and install custom packages, here's a simple example of installing the C++, Python client library demos using the official released Debian packages via apt-get. ```dockerfile -FROM %%IMAGE%%:indigo -# place here your application's setup specifics -CMD [ "roslaunch", "my-ros-app my-ros-app.launch" ] +FROM %%IMAGE%%:foxy + +# install ros package +RUN apt-get update && apt-get install -y \ + ros-${ROS_DISTRO}-demo-nodes-cpp \ + ros-${ROS_DISTRO}-demo-nodes-py && \ + rm -rf /var/lib/apt/lists/* + +# launch ros package +CMD ["ros2", "launch", "demo_nodes_cpp", "talker_listener.launch.py"] ``` -You can then build and run the Docker image: +Note: all ROS images include a default entrypoint that sources the ROS environment setup before executing the configured command, in this case the demo packages launch file. You can then build and run the Docker image like so: ```console -$ docker build -t my-ros-app . -$ docker run -it --rm --name my-running-app my-ros-app +$ docker build -t my/ros:app . +$ docker run -it --rm my/ros:app +[INFO] [launch]: process[talker-1]: started with pid [813] +[INFO] [launch]: process[listener-2]: started with pid [814] +[INFO] [talker]: Publishing: 'Hello World: 1' +[INFO] [listener]: I heard: [Hello World: 1] +[INFO] [talker]: Publishing: 'Hello World: 2' +[INFO] [listener]: I heard: [Hello World: 2] +... +``` + +## Creating a `Dockerfile` to build ROS packages + +To create your own ROS docker images and build custom packages, here's a simple example of installing a package's build dependencies, compiling it from source, and installing the resulting build artifacts into a final multi-stage image layer. + +```dockerfile +ARG FROM_IMAGE=%%IMAGE%%:foxy +ARG OVERLAY_WS=/opt/ros/overlay_ws + +# multi-stage for caching +FROM $FROM_IMAGE AS cacher + +# clone overlay source +ARG OVERLAY_WS +WORKDIR $OVERLAY_WS/src +RUN echo "\ +repositories: \n\ + ros2/demos: \n\ + type: git \n\ + url: https://github.com/ros2/demos.git \n\ + version: ${ROS_DISTRO} \n\ +" > ../overlay.repos +RUN vcs import ./ < ../overlay.repos + +# copy manifests for caching +WORKDIR /opt +RUN mkdir -p /tmp/opt && \ + find ./ -name "package.xml" | \ + xargs cp --parents -t /tmp/opt && \ + find ./ -name "COLCON_IGNORE" | \ + xargs cp --parents -t /tmp/opt || true + +# multi-stage for building +FROM $FROM_IMAGE AS builder + +# install overlay dependencies +ARG OVERLAY_WS +WORKDIR $OVERLAY_WS +COPY --from=cacher /tmp/$OVERLAY_WS/src ./src +RUN . /opt/ros/$ROS_DISTRO/setup.sh && \ + apt-get update && rosdep install -y \ + --from-paths \ + src/ros2/demos/demo_nodes_cpp \ + src/ros2/demos/demo_nodes_py \ + --ignore-src \ + && rm -rf /var/lib/apt/lists/* + +# build overlay source +COPY --from=cacher $OVERLAY_WS/src ./src +ARG OVERLAY_MIXINS="release" +RUN . /opt/ros/$ROS_DISTRO/setup.sh && \ + colcon build \ + --packages-select \ + demo_nodes_cpp \ + demo_nodes_py \ + --mixin $OVERLAY_MIXINS + +# source entrypoint setup +ENV OVERLAY_WS $OVERLAY_WS +RUN sed --in-place --expression \ + '$isource "$OVERLAY_WS/install/setup.bash"' \ + /ros_entrypoint.sh + +# run launch file +CMD ["ros2", "launch", "demo_nodes_cpp", "talker_listener.launch.py"] ``` +The example above starts by using [`vcstool`](https://github.com/dirk-thomas/vcstool) to clone source repos of interest into the cacher stage. One could similarly `COPY` code from the local build context into the source directory as well. Package manifest files are then cached in a temporary directory where the following builder stage may copy from to install necessary dependencies with [`rosdep`](https://github.com/ros-infrastructure/rosdep). This is done prior to copying the rest of the source files to preserve the multi-stage build cache, given unaltered manifests do not alter declared dependencies, saving time and bandwidth. The overlay is then built using [`colcon`](https://colcon.readthedocs.io/en/released/), the entrypoint updated to source the workspace, and the default command set to launch the demo. + +Note: `--from-paths` and `--packages-select` are set here as so to only install the dependencies and build for the demo C++ and Python packages, among many in the demo git repo that was cloned. To install the dependencies and build all the packages in the source workspace, merely change the scope by setting `--from-paths src/` and dropping the `--packages-select` arguments. + +For more advance examples such as daisy chaining multiple overlay workspaces to improve caching of docker image build layers, using tools such as ccache to accelerate compilation with colcon, or using buildkit to save build time and bandwidth even when dependencies change, the project `Dockerfile`s in the ROS 2 [Navigation2](https://github.com/ros-planning/navigation2) repo are excellent resources. + ## Deployment use cases This dockerized image of ROS is intended to provide a simplified and consistent platform to build and deploy distributed robotic applications. Built from the [official Ubuntu image](https://hub.docker.com/_/ubuntu/) and ROS's official Debian packages, it includes recent supported releases for quick access and download. This provides roboticists in research and industry with an easy way to develop, reuse and ship software for autonomous actions and task planning, control dynamics, localization and mapping, swarm behavior, as well as general system integration. @@ -31,22 +119,25 @@ Developing such complex systems with cutting edge implementations of newly publi With the advancements and standardization of software containers, roboticists are primed to acquire a host of improved developer tooling for building and shipping software. To help alleviate the growing pains and technical challenges of adopting new practices, we have focused on providing an official resource for using ROS with these new technologies. +For a complete listing of supported architectures and base images for each ROS Distribution Release, please read the official REP on target platforms for either [ROS 1](https://www.ros.org/reps/rep-0003.html) or for [ROS 2](https://www.ros.org/reps/rep-2000.html). + ## Deployment suggestions The available tags include supported distros along with a hierarchy tags based off the most common meta-package dependencies, designed to have a small footprint and simple configuration: -- `ros-core`: barebone ROS install +- `ros-core`: minimal ROS install - `ros-base`: basic tools and libraries (also tagged with distro name with LTS version as `latest`) -- `robot`: basic install for robots -- `perception`: basic install for perception tasks +- `ros1-bridge`: tools and libraries to run hybrid ROS 1 - ROS 2 systems and bridge messages between them -The rest of the common meta-packages such as `desktop` and `desktop-full` are hosted on automatic build repos under OSRF's Docker Hub profile [here](https://hub.docker.com/r/osrf/ros/). These meta-packages include graphical dependencies and hook a host of other large packages such as X11, X server, etc. So in the interest of keep the official images lean and secure, the desktop packages are just be hosted with OSRF's profile. +In the interest of keeping `ros-core` tag minimal in image size, developer tools such as `rosdep`, `colcon` and `vcstools` are not shipped in `ros_core`, but in `ros-base` instead. + +The rest of the common meta-packages such as `desktop` are hosted on repos under OSRF's Docker Hub profile [here](https://hub.docker.com/r/osrf/ros/). These meta-packages include graphical dependencies and hook a host of other large packages such as X11, X server, etc. So in the interest of keeping the official images lean and secure, the desktop packages are just being hosted with OSRF's profile. For an extensive list of available variants, please read the official REP on target platforms for either [ROS 1](https://ros.org/reps/rep-0150.html) or for [ROS 2](https://www.ros.org/reps/rep-2001.html). ### Volumes ROS uses the `~/.ros/` directory for storing logs, and debugging info. If you wish to persist these files beyond the lifecycle of the containers which produced them, the `~/.ros/` folder can be mounted to an external volume on the host, or a derived image can specify volumes to be managed by the Docker engine. By default, the container runs as the `root` user, so `/root/.ros/` would be the full path to these files. -For example, if one wishes to use their own `.ros` folder that already resides in their local home directory, with a username of `ubuntu`, we can simple launch the container with an additional volume argument: +For example, if one wishes to use their own `.ros` folder that already resides in their local home directory, with a username of `ubuntu`, we can simply launch the container with an additional volume argument: ```console $ docker run -v "/home/ubuntu/.ros/:/root/.ros/" %%IMAGE%% @@ -58,185 +149,115 @@ Some application may require device access for acquiring images from connected c ### Networks -The ROS runtime "graph" is a peer-to-peer network of processes (potentially distributed across machines) that are loosely coupled using the ROS communication infrastructure. ROS implements several different styles of communication, including synchronous RPC-style communication over services, asynchronous streaming of data over topics, and storage of data on a Parameter Server. To abide by the best practice of [one process per container](https://docs.docker.com/articles/dockerfile_best-practices/), Docker networks can be used to string together several running ROS processes. For further details about [ROS NetworkSetup](http://wiki.ros.org/ROS/NetworkSetup) wik article, or see the Deployment example below. +ROS allows for peer-to-peer networking of processes (potentially distributed across machines) that are loosely coupled using the ROS communication infrastructure. ROS implements several different styles of communication, including synchronous RPC-style communication over services, asynchronous streaming of typed data over topics, combinations of both prior via request/reply and status/feedback over actions, and run-time settings via configuration over parameters. To abide by the best practice of [one process per container](https://docs.docker.com/articles/dockerfile_best-practices/), Docker networks can be used to string together several running ROS processes. For further details see the Deployment example further below. + +Alternatively, more permissive network settings can be used to share all host network interfaces with the container, such as [`host` network driver](https://docs.docker.com/network/host/), simplifying connectivity with external network participants. Be aware however that this removes the networking namespace separation between containers, and can affect the ability of DDS participants to communicate between containers, as documented [here](https://community.rti.com/kb/how-use-rti-connext-dds-communicate-across-docker-containers-using-host-driver). ## Deployment example -If we want our all ROS nodes to easily talk to each other, we'll can use a virtual network to connect the separate containers. In this short example, we'll create a virtual network, spin up a new container running `roscore` advertised as the `master` service on the new network, then spawn a message publisher and subscriber process as services on the same network. +### Docker Compose -### Build image +In this example we'll demonstrate using [`docker-compose`](https://docs.docker.com/compose/) to spawn a pair of message publisher and subscriber nodes in separate containers connected through shared software defined network. -> Build a ROS image that includes ROS tutorials using this `Dockerfile:` +> Create the directory `~/ros_demos` and add the first `Dockerfile` example from above. In the same directory, also create file `docker-compose.yml` with the following that runs a C++ publisher with a Python subscriber: -```dockerfile -FROM %%IMAGE%%:indigo-ros-base -# install ros tutorials packages -RUN apt-get update && apt-get install -y \ - ros-indigo-ros-tutorials \ - ros-indigo-common-tutorials \ - && rm -rf /var/lib/apt/lists/ -``` +```yaml +version: '3' -> Then to build the image from within the same directory: +services: + talker: + build: ./ + command: ros2 run demo_nodes_cpp talker -```console -$ docker build --tag %%IMAGE%%:ros-tutorials . + listener: + build: ./ + environment: + - "PYTHONUNBUFFERED=1" + command: ros2 run demo_nodes_py listener ``` -#### Create network - -> To create a new network `foo`, we use the network command: - - docker network create foo - -> Now that we have a network, we can create services. Services advertise there location on the network, making it easy to resolve the location/address of the service specific container. We'll use this make sure our ROS nodes can find and connect to our ROS `master`. - -#### Run services - -> To create a container for the ROS master and advertise it's service: +> Use docker-compose inside the same directory to launch our ROS nodes. Given the containers created derive from the same docker compose project, they will coexist on shared project network: ```console -$ docker run -it --rm \ - --net foo \ - --name master \ - %%IMAGE%%:ros-tutorials \ - roscore +$ docker-compose up -d ``` -> Now you can see that master is running and is ready manage our other ROS nodes. To add our `talker` node, we'll need to point the relevant environment variable to the master service: +> Notice that a new network named `ros_demos_default` has been created, as can be shown further with: ```console -$ docker run -it --rm \ - --net foo \ - --name talker \ - --env ROS_HOSTNAME=talker \ - --env ROS_MASTER_URI=http://master:11311 \ - %%IMAGE%%:ros-tutorials \ - rosrun roscpp_tutorials talker +$ docker network inspect ros_demos_default ``` -> Then in another terminal, run the `listener` node similarly: +> We can monitor the logged output of each container, such as the listener node like so: ```console -$ docker run -it --rm \ - --net foo \ - --name listener \ - --env ROS_HOSTNAME=listener \ - --env ROS_MASTER_URI=http://master:11311 \ - %%IMAGE%%:ros-tutorials \ - rosrun roscpp_tutorials listener +$ docker-compose logs listener ``` -> Alright! You should see `listener` is now echoing each message the `talker` broadcasting. You can then list the containers and see something like this: +> Finally, we can stop and remove all the relevant containers using docker-compose from the same directory: ```console -$ docker service ls -SERVICE ID NAME NETWORK CONTAINER -67ce73355e67 listener foo a62019123321 -917ee622d295 master foo f6ab9155fdbe -7f5a4748fb8d talker foo e0da2ee7570a +$ docker-compose stop +$ docker-compose rm ``` -> And for the services: +> Note: the auto-generated network, `ros_demos_default`, will persist until you explicitly remove it using `docker-compose down`. -```console -$ docker ps -CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES -a62019123321 ros:ros-tutorials "/ros_entrypoint.sh About a minute ago Up About a minute 11311/tcp listener -e0da2ee7570a ros:ros-tutorials "/ros_entrypoint.sh About a minute ago Up About a minute 11311/tcp talker -f6ab9155fdbe ros:ros-tutorials "/ros_entrypoint.sh About a minute ago Up About a minute 11311/tcp master -``` - -#### Introspection +### ROS 1 Bridge -> Ok, now that we see the two nodes are communicating, let get inside one of the containers and do some introspection what exactly the topics are: +To ease ROS 2 migration, [`ros1_bridge`](https://index.ros.org/p/ros1_bridge/github-ros2-ros1_bridge) is a ROS 2 package that provides bidirectional communication between ROS 1 and ROS 2. As a minimal example, given the ROS 2 Dockerfile above, we'll create the ROS 1 equivalent below, and name the Dockerfile appropriately. -```console -$ docker exec -it master bash -$ source /ros_entrypoint.sh -``` - -> If we then use `rostopic` to list published message topics, we should see something like this: - -```console -$ rostopic list -/chatter -/rosout -/rosout_agg -``` - -#### Tear down +```dockerfile +FROM %%IMAGE%%:noetic -> To tear down the structure we've made, we just need to stop the containers and the services. We can stop and remove the containers using `Ctrl^C` where we launched the containers or using the stop command with the names we gave them: +# install ros package +RUN apt-get update && apt-get install -y \ + ros-${ROS_DISTRO}-ros-tutorials \ + ros-${ROS_DISTRO}-common-tutorials && \ + rm -rf /var/lib/apt/lists/* -```console -$ docker stop master talker listener -$ docker rm master talker listener +# launch ros package +CMD ["roslaunch", "roscpp_tutorials", "talker_listener.launch"] ``` -### Compose - -Now that you have an appreciation for bootstrapping a distributed ROS example manually, lets try and automate it using [`docker-compose`](https://docs.docker.com/compose/). - -> Start by making a folder named `rostutorials` and moving the Dockerfile we used earlier inside this directory. Then create a yaml file named `docker-compose.yml` in the same directory and paste the following inside: +The compose file bellow spawns services for both talker listener demos while connecting the two via a dynamic bridge. You may then view the log output from both pairs of talker and listener nodes cross talking over the `/chatter` topic. ```yaml -version: '2' +version: '3' + services: - master: - build: . - container_name: master - command: - - roscore - - talker: - build: . - container_name: talker + ros1: + build: + context: ./ + dockerfile: ros1.Dockerfile + + ros2: + build: + context: ./ + dockerfile: ros2.Dockerfile + + bridge: + image: ros:foxy-ros1-bridge environment: - - "ROS_HOSTNAME=talker" - - "ROS_MASTER_URI=http://master:11311" - command: rosrun roscpp_tutorials talker - - listener: - build: . - container_name: listener - environment: - - "ROS_HOSTNAME=listener" - - "ROS_MASTER_URI=http://master:11311" - command: rosrun roscpp_tutorials listener -``` - -> Now from inside the same folder, use docker-copose to launch our ROS nodes and specify that they coexist on their own network: - -```console -$ docker-compose up -d + - "ROS_HOSTNAME=bridge" + - "ROS_MASTER_URI=http://ros1:11311" + command: ros2 run ros1_bridge dynamic_bridge ``` -> Notice that a new network named `rostutorials_default` has now been created, you can inspect it further with: - -```console -$ docker network inspect rostutorials_default -``` - -> We can monitor the logged output of each service, such as the listener node like so: - -```console -$ docker-compose logs listener -``` +# More Resources -> Finally, we can stop and remove all the relevant containers using docker-copose from the same directory: +[ROS.org](http://www.ros.org/): Main ROS website +[Q&A](https://answers.ros.org/questions/): Ask questions. Get answers +[Forums](https://discourse.ros.org/): Hear the latest discussions +[Blog](http://www.ros.org/news/): Stay up-to-date +[Packages](https://index.ros.org/packages/): Discover indexed packages +[OSRF](https://www.osrfoundation.org/): Open Source Robotics Foundation -```console -$ docker-compose stop -$ docker-compose rm -``` +## ROS 2 -> Note: the auto-generated network, `rostutorials_default`, will persist over the life of the docker engine or until you explicitly remove it using [`docker network rm`](https://docs.docker.com/engine/reference/commandline/network_rm/). +[Index](https://index.ros.org/doc/ros2/): ROS 2 Documentation +[Design](https://design.ros2.org/): ROS 2 Design Articles -# More Resources +## ROS 1 -[ROS.org](http://www.ros.org/): Main ROS website -[Wiki](http://wiki.ros.org/): Find tutorials and learn more -[ROS Answers](http://answers.ros.org/questions/): Ask questions. Get answers -[Blog](http://www.ros.org/news/): Stay up-to-date -[OSRF](http://www.osrfoundation.org/): Open Source Robotics Foundation +[Wiki](http://wiki.ros.org/Documentation): ROS 1 Documentation diff --git a/ros/license.md b/ros/license.md index aa8b87126e6d..d15542ebd2c4 100644 --- a/ros/license.md +++ b/ros/license.md @@ -1,3 +1 @@ -The core of ROS is licensed under the standard three-clause BSD license. This is a very permissive open license that allows for reuse in commercial and closed source products. You can find more about the BSD license from the Opensource.org [BSD 3-Clause](http://opensource.org/licenses/BSD-3-Clause) page and Wikipedia's [BSD Licenses](http://en.wikipedia.org/wiki/BSD_licenses) entry. - -While the core parts of ROS are licensed under the BSD license, other licenses are commonly used in the community packages, such as the [Apache 2.0](http://opensource.org/licenses/Apache-2.0) license, the [GPL](http://opensource.org/licenses/gpl-license) license, the [MIT](http://opensource.org/licenses/MIT) license, and even proprietary licenses. Each package in the ROS ecosystem is required to specify a license, so that it is easy for you to quickly identify if a package will meet your licensing needs. +View [package index](https://index.ros.org/packages/) for license information on software contained in this image. diff --git a/ruby/README.md b/ruby/README.md index 801e46c8b204..1db0cd70ddb9 100644 --- a/ruby/README.md +++ b/ruby/README.md @@ -20,26 +20,32 @@ WARNING: [the Docker Community](https://github.com/docker-library/ruby) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`2.7.1-buster`, `2.7-buster`, `2-buster`, `buster`, `2.7.1`, `2.7`, `2`, `latest`](https://github.com/docker-library/ruby/blob/a564feaaee4c8647c299ab11d41498468bb9af7b/2.7/buster/Dockerfile) -- [`2.7.1-slim-buster`, `2.7-slim-buster`, `2-slim-buster`, `slim-buster`, `2.7.1-slim`, `2.7-slim`, `2-slim`, `slim`](https://github.com/docker-library/ruby/blob/a564feaaee4c8647c299ab11d41498468bb9af7b/2.7/buster/slim/Dockerfile) -- [`2.7.1-alpine3.11`, `2.7-alpine3.11`, `2-alpine3.11`, `alpine3.11`, `2.7.1-alpine`, `2.7-alpine`, `2-alpine`, `alpine`](https://github.com/docker-library/ruby/blob/a564feaaee4c8647c299ab11d41498468bb9af7b/2.7/alpine3.11/Dockerfile) -- [`2.7.1-alpine3.10`, `2.7-alpine3.10`, `2-alpine3.10`, `alpine3.10`](https://github.com/docker-library/ruby/blob/a564feaaee4c8647c299ab11d41498468bb9af7b/2.7/alpine3.10/Dockerfile) -- [`2.6.6-buster`, `2.6-buster`, `2.6.6`, `2.6`](https://github.com/docker-library/ruby/blob/a564feaaee4c8647c299ab11d41498468bb9af7b/2.6/buster/Dockerfile) -- [`2.6.6-slim-buster`, `2.6-slim-buster`, `2.6.6-slim`, `2.6-slim`](https://github.com/docker-library/ruby/blob/a564feaaee4c8647c299ab11d41498468bb9af7b/2.6/buster/slim/Dockerfile) -- [`2.6.6-stretch`, `2.6-stretch`](https://github.com/docker-library/ruby/blob/a564feaaee4c8647c299ab11d41498468bb9af7b/2.6/stretch/Dockerfile) -- [`2.6.6-slim-stretch`, `2.6-slim-stretch`](https://github.com/docker-library/ruby/blob/a564feaaee4c8647c299ab11d41498468bb9af7b/2.6/stretch/slim/Dockerfile) -- [`2.6.6-alpine3.11`, `2.6-alpine3.11`, `2.6.6-alpine`, `2.6-alpine`](https://github.com/docker-library/ruby/blob/a564feaaee4c8647c299ab11d41498468bb9af7b/2.6/alpine3.11/Dockerfile) -- [`2.6.6-alpine3.10`, `2.6-alpine3.10`](https://github.com/docker-library/ruby/blob/a564feaaee4c8647c299ab11d41498468bb9af7b/2.6/alpine3.10/Dockerfile) -- [`2.5.8-buster`, `2.5-buster`, `2.5.8`, `2.5`](https://github.com/docker-library/ruby/blob/a564feaaee4c8647c299ab11d41498468bb9af7b/2.5/buster/Dockerfile) -- [`2.5.8-slim-buster`, `2.5-slim-buster`, `2.5.8-slim`, `2.5-slim`](https://github.com/docker-library/ruby/blob/a564feaaee4c8647c299ab11d41498468bb9af7b/2.5/buster/slim/Dockerfile) -- [`2.5.8-stretch`, `2.5-stretch`](https://github.com/docker-library/ruby/blob/a564feaaee4c8647c299ab11d41498468bb9af7b/2.5/stretch/Dockerfile) -- [`2.5.8-slim-stretch`, `2.5-slim-stretch`](https://github.com/docker-library/ruby/blob/a564feaaee4c8647c299ab11d41498468bb9af7b/2.5/stretch/slim/Dockerfile) -- [`2.5.8-alpine3.11`, `2.5-alpine3.11`, `2.5.8-alpine`, `2.5-alpine`](https://github.com/docker-library/ruby/blob/a564feaaee4c8647c299ab11d41498468bb9af7b/2.5/alpine3.11/Dockerfile) -- [`2.5.8-alpine3.10`, `2.5-alpine3.10`](https://github.com/docker-library/ruby/blob/a564feaaee4c8647c299ab11d41498468bb9af7b/2.5/alpine3.10/Dockerfile) +- [`3.2.0-bullseye`, `3.2-bullseye`, `3-bullseye`, `bullseye`, `3.2.0`, `3.2`, `3`, `latest`](https://github.com/docker-library/ruby/blob/c756b06f8cc771fb54f629d51217aa1802ba6ec2/3.2/bullseye/Dockerfile) +- [`3.2.0-slim-bullseye`, `3.2-slim-bullseye`, `3-slim-bullseye`, `slim-bullseye`, `3.2.0-slim`, `3.2-slim`, `3-slim`, `slim`](https://github.com/docker-library/ruby/blob/c756b06f8cc771fb54f629d51217aa1802ba6ec2/3.2/slim-bullseye/Dockerfile) +- [`3.2.0-buster`, `3.2-buster`, `3-buster`, `buster`](https://github.com/docker-library/ruby/blob/c756b06f8cc771fb54f629d51217aa1802ba6ec2/3.2/buster/Dockerfile) +- [`3.2.0-slim-buster`, `3.2-slim-buster`, `3-slim-buster`, `slim-buster`](https://github.com/docker-library/ruby/blob/c756b06f8cc771fb54f629d51217aa1802ba6ec2/3.2/slim-buster/Dockerfile) +- [`3.2.0-alpine3.17`, `3.2-alpine3.17`, `3-alpine3.17`, `alpine3.17`, `3.2.0-alpine`, `3.2-alpine`, `3-alpine`, `alpine`](https://github.com/docker-library/ruby/blob/c756b06f8cc771fb54f629d51217aa1802ba6ec2/3.2/alpine3.17/Dockerfile) +- [`3.2.0-alpine3.16`, `3.2-alpine3.16`, `3-alpine3.16`, `alpine3.16`](https://github.com/docker-library/ruby/blob/c756b06f8cc771fb54f629d51217aa1802ba6ec2/3.2/alpine3.16/Dockerfile) +- [`3.1.3-bullseye`, `3.1-bullseye`, `3.1.3`, `3.1`](https://github.com/docker-library/ruby/blob/9fd589661dd0e12b082336e9c6f731196fe39ba8/3.1/bullseye/Dockerfile) +- [`3.1.3-slim-bullseye`, `3.1-slim-bullseye`, `3.1.3-slim`, `3.1-slim`](https://github.com/docker-library/ruby/blob/9fd589661dd0e12b082336e9c6f731196fe39ba8/3.1/slim-bullseye/Dockerfile) +- [`3.1.3-buster`, `3.1-buster`](https://github.com/docker-library/ruby/blob/9fd589661dd0e12b082336e9c6f731196fe39ba8/3.1/buster/Dockerfile) +- [`3.1.3-slim-buster`, `3.1-slim-buster`](https://github.com/docker-library/ruby/blob/9fd589661dd0e12b082336e9c6f731196fe39ba8/3.1/slim-buster/Dockerfile) +- [`3.1.3-alpine3.17`, `3.1-alpine3.17`, `3.1.3-alpine`, `3.1-alpine`](https://github.com/docker-library/ruby/blob/a51b7da07425cc2f5a35178ef83fd908b59beb5d/3.1/alpine3.17/Dockerfile) +- [`3.1.3-alpine3.16`, `3.1-alpine3.16`](https://github.com/docker-library/ruby/blob/9fd589661dd0e12b082336e9c6f731196fe39ba8/3.1/alpine3.16/Dockerfile) +- [`3.0.5-bullseye`, `3.0-bullseye`, `3.0.5`, `3.0`](https://github.com/docker-library/ruby/blob/ece6f45d6d00b803a4e1a33cd5a55895cf928357/3.0/bullseye/Dockerfile) +- [`3.0.5-slim-bullseye`, `3.0-slim-bullseye`, `3.0.5-slim`, `3.0-slim`](https://github.com/docker-library/ruby/blob/ece6f45d6d00b803a4e1a33cd5a55895cf928357/3.0/slim-bullseye/Dockerfile) +- [`3.0.5-buster`, `3.0-buster`](https://github.com/docker-library/ruby/blob/ece6f45d6d00b803a4e1a33cd5a55895cf928357/3.0/buster/Dockerfile) +- [`3.0.5-slim-buster`, `3.0-slim-buster`](https://github.com/docker-library/ruby/blob/ece6f45d6d00b803a4e1a33cd5a55895cf928357/3.0/slim-buster/Dockerfile) +- [`3.0.5-alpine3.16`, `3.0-alpine3.16`, `3.0.5-alpine`, `3.0-alpine`](https://github.com/docker-library/ruby/blob/ece6f45d6d00b803a4e1a33cd5a55895cf928357/3.0/alpine3.16/Dockerfile) +- [`2.7.7-bullseye`, `2.7-bullseye`, `2-bullseye`, `2.7.7`, `2.7`, `2`](https://github.com/docker-library/ruby/blob/cdac1ffbc959768a5b82014dbb8c8006fe6f7880/2.7/bullseye/Dockerfile) +- [`2.7.7-slim-bullseye`, `2.7-slim-bullseye`, `2-slim-bullseye`, `2.7.7-slim`, `2.7-slim`, `2-slim`](https://github.com/docker-library/ruby/blob/cdac1ffbc959768a5b82014dbb8c8006fe6f7880/2.7/slim-bullseye/Dockerfile) +- [`2.7.7-buster`, `2.7-buster`, `2-buster`](https://github.com/docker-library/ruby/blob/cdac1ffbc959768a5b82014dbb8c8006fe6f7880/2.7/buster/Dockerfile) +- [`2.7.7-slim-buster`, `2.7-slim-buster`, `2-slim-buster`](https://github.com/docker-library/ruby/blob/cdac1ffbc959768a5b82014dbb8c8006fe6f7880/2.7/slim-buster/Dockerfile) +- [`2.7.7-alpine3.16`, `2.7-alpine3.16`, `2-alpine3.16`, `2.7.7-alpine`, `2.7-alpine`, `2-alpine`](https://github.com/docker-library/ruby/blob/cdac1ffbc959768a5b82014dbb8c8006fe6f7880/2.7/alpine3.16/Dockerfile) # Quick reference (cont.) @@ -54,7 +60,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/ruby`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fruby) + [official-images repo's `library/ruby` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fruby) [official-images repo's `library/ruby` file](https://github.com/docker-library/official-images/blob/master/library/ruby) ([history](https://github.com/docker-library/official-images/commits/master/library/ruby)) - **Source of this description**: @@ -73,7 +79,7 @@ Ruby is a dynamic, reflective, object-oriented, general-purpose, open-source pro ## Create a `Dockerfile` in your Ruby app project ```dockerfile -FROM ruby:2.5 +FROM ruby:3.0 # throw errors if Gemfile has been modified since Gemfile.lock RUN bundle config --global frozen 1 @@ -102,7 +108,7 @@ $ docker run -it --name my-running-script my-ruby-app The above example `Dockerfile` expects a `Gemfile.lock` in your app directory. This `docker run` will help you generate one. Run it in the root of your app, next to the `Gemfile`: ```console -$ docker run --rm -v "$PWD":/usr/src/app -w /usr/src/app ruby:2.5 bundle install +$ docker run --rm -v "$PWD":/usr/src/app -w /usr/src/app ruby:3.0 bundle install ``` ## Run a single Ruby script @@ -110,7 +116,7 @@ $ docker run --rm -v "$PWD":/usr/src/app -w /usr/src/app ruby:2.5 bundle install For many simple, single file projects, you may find it inconvenient to write a complete `Dockerfile`. In such cases, you can run a Ruby script by using the Ruby Docker image directly: ```console -$ docker run -it --rm --name my-running-script -v "$PWD":/usr/src/myapp -w /usr/src/myapp ruby:2.5 ruby your-daemon-or-script.rb +$ docker run -it --rm --name my-running-script -v "$PWD":/usr/src/myapp -w /usr/src/myapp ruby:3.0 ruby your-daemon-or-script.rb ``` ## Encoding @@ -133,7 +139,7 @@ The `ruby` images come in many flavors, each designed for a specific use case. 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. -Some of these tags may have names like buster or stretch 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. +Some of these tags may have names like bullseye or buster 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. 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. @@ -143,9 +149,9 @@ This image does not contain the common packages contained in the default tag and ## `ruby:-alpine` -This image is based on the popular [Alpine Linux project](http://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. +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. -This variant is highly recommended when final image size being as small as possible is desired. The main caveat to note is that it does use [musl libc](http://www.musl-libc.org) instead of [glibc and friends](http://www.etalabs.net/compare_libcs.html), so certain software might run into issues depending on the depth of their libc requirements. However, most software doesn't have an issue with this, so this variant is usually a very safe choice. 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. +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. 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). diff --git a/ruby/content.md b/ruby/content.md index 4d6f1c744a05..5fddf48924b4 100644 --- a/ruby/content.md +++ b/ruby/content.md @@ -11,7 +11,7 @@ Ruby is a dynamic, reflective, object-oriented, general-purpose, open-source pro ## Create a `Dockerfile` in your Ruby app project ```dockerfile -FROM %%IMAGE%%:2.5 +FROM %%IMAGE%%:3.0 # throw errors if Gemfile has been modified since Gemfile.lock RUN bundle config --global frozen 1 @@ -40,7 +40,7 @@ $ docker run -it --name my-running-script my-ruby-app The above example `Dockerfile` expects a `Gemfile.lock` in your app directory. This `docker run` will help you generate one. Run it in the root of your app, next to the `Gemfile`: ```console -$ docker run --rm -v "$PWD":/usr/src/app -w /usr/src/app %%IMAGE%%:2.5 bundle install +$ docker run --rm -v "$PWD":/usr/src/app -w /usr/src/app %%IMAGE%%:3.0 bundle install ``` ## Run a single Ruby script @@ -48,7 +48,7 @@ $ docker run --rm -v "$PWD":/usr/src/app -w /usr/src/app %%IMAGE%%:2.5 bundle in For many simple, single file projects, you may find it inconvenient to write a complete `Dockerfile`. In such cases, you can run a Ruby script by using the Ruby Docker image directly: ```console -$ docker run -it --rm --name my-running-script -v "$PWD":/usr/src/myapp -w /usr/src/myapp %%IMAGE%%:2.5 ruby your-daemon-or-script.rb +$ docker run -it --rm --name my-running-script -v "$PWD":/usr/src/myapp -w /usr/src/myapp %%IMAGE%%:3.0 ruby your-daemon-or-script.rb ``` ## Encoding diff --git a/rust/README.md b/rust/README.md index bc09cecfd998..1409f19e4f48 100644 --- a/rust/README.md +++ b/rust/README.md @@ -20,16 +20,16 @@ WARNING: [the Rust Project developers](https://github.com/rust-lang/docker-rust) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`1-stretch`, `1.43-stretch`, `1.43.1-stretch`, `stretch`](https://github.com/rust-lang-nursery/docker-rust/blob/009cc0a821ff773d54875350312731ed490d5cce/1.43.1/stretch/Dockerfile) -- [`1-slim-stretch`, `1.43-slim-stretch`, `1.43.1-slim-stretch`, `slim-stretch`](https://github.com/rust-lang-nursery/docker-rust/blob/009cc0a821ff773d54875350312731ed490d5cce/1.43.1/stretch/slim/Dockerfile) -- [`1-buster`, `1.43-buster`, `1.43.1-buster`, `buster`, `1`, `1.43`, `1.43.1`, `latest`](https://github.com/rust-lang-nursery/docker-rust/blob/009cc0a821ff773d54875350312731ed490d5cce/1.43.1/buster/Dockerfile) -- [`1-slim-buster`, `1.43-slim-buster`, `1.43.1-slim-buster`, `slim-buster`, `1-slim`, `1.43-slim`, `1.43.1-slim`, `slim`](https://github.com/rust-lang-nursery/docker-rust/blob/009cc0a821ff773d54875350312731ed490d5cce/1.43.1/buster/slim/Dockerfile) -- [`1-alpine3.10`, `1.43-alpine3.10`, `1.43.1-alpine3.10`, `alpine3.10`](https://github.com/rust-lang-nursery/docker-rust/blob/009cc0a821ff773d54875350312731ed490d5cce/1.43.1/alpine3.10/Dockerfile) -- [`1-alpine3.11`, `1.43-alpine3.11`, `1.43.1-alpine3.11`, `alpine3.11`, `1-alpine`, `1.43-alpine`, `1.43.1-alpine`, `alpine`](https://github.com/rust-lang-nursery/docker-rust/blob/009cc0a821ff773d54875350312731ed490d5cce/1.43.1/alpine3.11/Dockerfile) +- [`1-buster`, `1.66-buster`, `1.66.1-buster`, `buster`](https://github.com/rust-lang/docker-rust/blob/86cc84d5a8559719aaee3cfbdaf828815ef675d8/1.66.1/buster/Dockerfile) +- [`1-slim-buster`, `1.66-slim-buster`, `1.66.1-slim-buster`, `slim-buster`](https://github.com/rust-lang/docker-rust/blob/86cc84d5a8559719aaee3cfbdaf828815ef675d8/1.66.1/buster/slim/Dockerfile) +- [`1-bullseye`, `1.66-bullseye`, `1.66.1-bullseye`, `bullseye`, `1`, `1.66`, `1.66.1`, `latest`](https://github.com/rust-lang/docker-rust/blob/86cc84d5a8559719aaee3cfbdaf828815ef675d8/1.66.1/bullseye/Dockerfile) +- [`1-slim-bullseye`, `1.66-slim-bullseye`, `1.66.1-slim-bullseye`, `slim-bullseye`, `1-slim`, `1.66-slim`, `1.66.1-slim`, `slim`](https://github.com/rust-lang/docker-rust/blob/86cc84d5a8559719aaee3cfbdaf828815ef675d8/1.66.1/bullseye/slim/Dockerfile) +- [`1-alpine3.16`, `1.66-alpine3.16`, `1.66.1-alpine3.16`, `alpine3.16`](https://github.com/rust-lang/docker-rust/blob/86cc84d5a8559719aaee3cfbdaf828815ef675d8/1.66.1/alpine3.16/Dockerfile) +- [`1-alpine3.17`, `1.66-alpine3.17`, `1.66.1-alpine3.17`, `alpine3.17`, `1-alpine`, `1.66-alpine`, `1.66.1-alpine`, `alpine`](https://github.com/rust-lang/docker-rust/blob/86cc84d5a8559719aaee3cfbdaf828815ef675d8/1.66.1/alpine3.17/Dockerfile) # Quick reference (cont.) @@ -44,7 +44,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/rust`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Frust) + [official-images repo's `library/rust` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Frust) [official-images repo's `library/rust` file](https://github.com/docker-library/official-images/blob/master/library/rust) ([history](https://github.com/docker-library/official-images/commits/master/library/rust)) - **Source of this description**: @@ -91,7 +91,7 @@ COPY . . RUN cargo install --path . FROM debian:buster-slim -RUN apt-get update && apt-get install -y extra-runtime-dependencies +RUN apt-get update && apt-get install -y extra-runtime-dependencies && rm -rf /var/lib/apt/lists/* COPY --from=builder /usr/local/cargo/bin/myapp /usr/local/bin/myapp CMD ["myapp"] ``` @@ -120,7 +120,7 @@ The `rust` images come in many flavors, each designed for a specific use case. 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. -Some of these tags may have names like buster or stretch 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. +Some of these tags may have names like bullseye or buster 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. 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. @@ -130,9 +130,9 @@ This image does not contain the common packages contained in the default tag and ## `rust:-alpine` -This image is based on the popular [Alpine Linux project](http://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. +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. -This variant is highly recommended when final image size being as small as possible is desired. The main caveat to note is that it does use [musl libc](http://www.musl-libc.org) instead of [glibc and friends](http://www.etalabs.net/compare_libcs.html), so certain software might run into issues depending on the depth of their libc requirements. However, most software doesn't have an issue with this, so this variant is usually a very safe choice. 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. +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. 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). diff --git a/rust/content.md b/rust/content.md index 56bbd2fa3de4..ce3595d6b517 100644 --- a/rust/content.md +++ b/rust/content.md @@ -39,7 +39,7 @@ COPY . . RUN cargo install --path . FROM debian:buster-slim -RUN apt-get update && apt-get install -y extra-runtime-dependencies +RUN apt-get update && apt-get install -y extra-runtime-dependencies && rm -rf /var/lib/apt/lists/* COPY --from=builder /usr/local/cargo/bin/myapp /usr/local/bin/myapp CMD ["myapp"] ``` diff --git a/sapmachine/README.md b/sapmachine/README.md index fdde14d8277a..bedcb849a74b 100644 --- a/sapmachine/README.md +++ b/sapmachine/README.md @@ -24,8 +24,9 @@ WARNING: # Supported tags and respective `Dockerfile` links -- [`11`, `11.0.7`, `lts`](https://github.com/SAP/SapMachine-infrastructure/blob/3d2d199e3c53a0de726491827ef0587c3c9b4f20/dockerfiles/official/lts/Dockerfile) -- [`14`, `14.0.1`, `latest`](https://github.com/SAP/SapMachine-infrastructure/blob/dddf6cf714e932b34e25d69f8cdb9c2381851199/dockerfiles/official/stable/Dockerfile) +- [`11`, `11.0.17`](https://github.com/SAP/SapMachine-infrastructure/blob/936dab0baa76e5db609e4c0dffc632dc4f42eca8/dockerfiles/official/11/Dockerfile) +- [`17`, `17.0.5`, `lts`](https://github.com/SAP/SapMachine-infrastructure/blob/fb4f1fe1d5cb453891a95bfdec43c0196a09e324/dockerfiles/official/17/Dockerfile) +- [`19`, `19.0.1`, `latest`](https://github.com/SAP/SapMachine-infrastructure/blob/e2320c79758f23b60d17726185c9ede2a5622f54/dockerfiles/official/19/Dockerfile) # Quick reference (cont.) @@ -33,14 +34,14 @@ WARNING: [GitHub](https://github.com/SAP/SapMachine/issues) For more information see the [SapMachine Wiki](https://github.com/SAP/SapMachine/wiki). - **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) - [`amd64`](https://hub.docker.com/r/amd64/sapmachine/) + [`amd64`](https://hub.docker.com/r/amd64/sapmachine/), [`arm64v8`](https://hub.docker.com/r/arm64v8/sapmachine/), [`ppc64le`](https://hub.docker.com/r/ppc64le/sapmachine/) - **Published image artifact details**: [repo-info repo's `repos/sapmachine/` directory](https://github.com/docker-library/repo-info/blob/master/repos/sapmachine) ([history](https://github.com/docker-library/repo-info/commits/master/repos/sapmachine)) (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/sapmachine`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fsapmachine) + [official-images repo's `library/sapmachine` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fsapmachine) [official-images repo's `library/sapmachine` file](https://github.com/docker-library/official-images/blob/master/library/sapmachine) ([history](https://github.com/docker-library/official-images/commits/master/library/sapmachine)) - **Source of this description**: diff --git a/satosa/README-short.txt b/satosa/README-short.txt new file mode 100644 index 000000000000..50d0e08f9866 --- /dev/null +++ b/satosa/README-short.txt @@ -0,0 +1 @@ +SATOSA translates between authentication protocols such as SAML2, OpenID Connect, and OAuth2. diff --git a/satosa/README.md b/satosa/README.md new file mode 100644 index 000000000000..67d99b5a6e57 --- /dev/null +++ b/satosa/README.md @@ -0,0 +1,158 @@ + + +# Quick reference + +- **Maintained by**: + [the Identity Python project](https://github.com/IdentityPython/satosa-docker) + +- **Where to get help**: + [the Identity Python mailing list](https://lists.sunet.se/listinfo/idpy-discuss) or [the Identity Python Slack workspace](https://identity-python.slack.com/) ([invitation](https://join.slack.com/t/identity-python/shared_invite/enQtNzEyNjU1NDI1MjUyLTM2MWI5ZGNhMTk1ZThiOTIxNWY2OTY1ODVmMWNjMzUzMTYxNTY5MzE5N2RlYjExZTIyM2MwYjBjZGE4MGVlMTM)) + +# Supported tags and respective `Dockerfile` links + +(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).) + +## Simple Tags + +- [`8.2.0-bullseye`, `8.2-bullseye`, `8-bullseye`, `bullseye`](https://github.com/IdentityPython/satosa-docker/blob/a4ef0077f546b7e9be444720b14f2cba14f8f2eb/8.2/bullseye/Dockerfile) +- [`8.2.0-alpine3.16`, `8.2-alpine3.16`, `8-alpine3.16`, `alpine3.16`, `8.2.0-alpine`, `8.2-alpine`, `8-alpine`, `alpine`](https://github.com/IdentityPython/satosa-docker/blob/24aabb5cd0330eab9c8baeddf4fc8fcf0d714d3b/8.2/alpine3.16/Dockerfile) + +## Shared Tags + +- `8.2.0`, `8.2`, `8`, `latest`: + - [`8.2.0-bullseye`](https://github.com/IdentityPython/satosa-docker/blob/a4ef0077f546b7e9be444720b14f2cba14f8f2eb/8.2/bullseye/Dockerfile) + +# Quick reference (cont.) + +- **Where to file issues**: + [https://github.com/IdentityPython/satosa-docker/issues](https://github.com/IdentityPython/satosa-docker/issues) + +- **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) + [`amd64`](https://hub.docker.com/r/amd64/satosa/), [`arm32v5`](https://hub.docker.com/r/arm32v5/satosa/), [`arm32v6`](https://hub.docker.com/r/arm32v6/satosa/), [`arm32v7`](https://hub.docker.com/r/arm32v7/satosa/), [`arm64v8`](https://hub.docker.com/r/arm64v8/satosa/), [`i386`](https://hub.docker.com/r/i386/satosa/), [`ppc64le`](https://hub.docker.com/r/ppc64le/satosa/), [`s390x`](https://hub.docker.com/r/s390x/satosa/) + +- **Published image artifact details**: + [repo-info repo's `repos/satosa/` directory](https://github.com/docker-library/repo-info/blob/master/repos/satosa) ([history](https://github.com/docker-library/repo-info/commits/master/repos/satosa)) + (image metadata, transfer size, etc) + +- **Image updates**: + [official-images repo's `library/satosa` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fsatosa) + [official-images repo's `library/satosa` file](https://github.com/docker-library/official-images/blob/master/library/satosa) ([history](https://github.com/docker-library/official-images/commits/master/library/satosa)) + +- **Source of this description**: + [docs repo's `satosa/` directory](https://github.com/docker-library/docs/tree/master/satosa) ([history](https://github.com/docker-library/docs/commits/master/satosa)) + +# What is SATOSA? + +SATOSA is a configurable proxy for translating between different authentication protocols such as SAML2, OpenID Connect, and OAuth2. + +![logo](https://raw.githubusercontent.com/docker-library/docs/8e1f8cd99d5ce31197d5452d6d04886f791ac9c7/satosa/logo.svg?sanitize=true) + +# How to use this image + +## To start a SATOSA instance + +The basic pattern for starting a `satosa` instance is: + +```sh +docker run --name some-satosa -d satosa +``` + +To access the instance from the host without the container's IP, use port mappings: + +```sh +docker run --name some-satosa -p 80:8080 -d satosa +``` + +The entrypoint script outputs SAML2 metadata to the container log at start time. This metadata refers to the instance's base URL, e.g., `https://example.com`. Browsers must be able to access the instance over HTTPS. + +# How to extend this image + +## Configuration files + +The `satosa` image stores its configuration in /etc/satosa. This configuration must persist among instances, particularly the SAML2 entity ID (derived from the proxy's base URL by default) and related keying material. [Use volumes, bind mounts, or custom images](https://docs.docker.com/storage/) to maintain this configuration. + +## Entrypoint script + +The `satosa` image's entrypoint script runs [Gunicorn](https://gunicorn.org/) by default if the first argument looks like a command-line flag. For example, the following will use a bind mount to provide an X.509 certificate and corresponding private key to the instance, and it will run Gunicorn with HTTPS enabled: + +```sh +docker run --name some-satosa -p 443:8443 \ + -v /etc/letsencrypt/live/some-satosa/fullchain.pem:/etc/https.crt \ + -v /etc/letsencrypt/live/some-satosa/privkey.pem:/etc/https.key \ + -d satosa \ + -b0.0.0.0:8443 --certfile /etc/https.crt --keyfile /etc/https.key satosa.wsgi:app +``` + +If the first argument looks like a command instead of a flag, the entrypoint script will run that instead of Gunicorn. For example, the following will start an interactive, unprivileged shell inside the container: + +```sh +docker run -it --name some-satosa satosa bash +``` + +## Environment variables + +The entrypoint script uses environment variables to generate the initial configuration, which sets SATOSA up as a SAML2 proxy between the free [SAMLtest.ID](https://samltest.id/) test service provider and test identity provider. All of the environment variables are optional. + +The environment variables' values can be read from [Docker secrets](https://docs.docker.com/engine/swarm/secrets/). Append `_FILE` to the variable name (e.g., `STATE_ENCRYPTION_KEY_FILE`), and set it to the pathname of the corresponding secret (e.g., `/run/secrets/state_encryption_key`). + +### `BASE_URL` + +SATOSA must be hosted at the root of the website. This environment variable optionally specifies the website's base URL, which defaults to `http://example.com`. If set, the base URL *must* be a method plus a hostname without any trailing slash or path components, e.g., `https://idproxy.example.com`, not `https://idproxy.example.com/` nor `https://idproxy.example.com/satosa`. + +### `STATE_ENCRYPTION_KEY` + +SATOSA uses encrypted cookies to track the progress of an authentication flow. This environment variable optionally sets the state cookies' encryption key. If set, the state encryption key *must* be an alphanumeric value, e.g., `12345SameAsMyLuggage`. If not specified, a new random 32-character key will be generated. + +### `SAML2_BACKEND_DISCO_SRV` + +When part of a SAML2 multilateral federation, SATOSA will ask the user to choose an identity provider using a SAML discovery service. This environment variable optionally sets the the discovery service URL, which defaults to [SeamlessAccess](https://seamlessaccess.org/). + +### `SAML2_BACKEND_CERT` and `SAML2_BACKEND_KEY` + +SATOSA's SAML2 backend acts like a service provider (relying party), requesting authentication by and attributes from the user's identity provider. It uses public key cryptography to sign authentication requests and decrypt responses. These optional environment variables hold the backend's paired public and private keys in [the PEM format](https://en.wikipedia.org/wiki/Privacy-Enhanced_Mail). If not specified, a new 2048-bit RSA key-pair will be generated using the hostname part of `BASE_URL`. + +### `SAML2_FRONTEND_CERT` and `SAML2_FRONTEND_KEY` + +SATOSA's SAML2 frontend acts like an identity provider (credential service provider), processing authentication requests from and returning user attributes to trusted websites. It uses public key cryptography to sign authentication responses. These optional environment variables hold the frontend's paired public and private keys, also in the PEM format. If not specified, a new 2048-bit RSA key-pair will be generated using the hostname part of `BASE_URL`. + +# Image Variants + +The `satosa` images come in many flavors, each designed for a specific use case. + +## `satosa:` + +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. + +Some of these tags may have names like 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. + +## `satosa:-alpine` + +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. + +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. + +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). + +# License + +View [license information](https://github.com/IdentityPython/SATOSA/blob/master/LICENSE) for the software contained in this image. + +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). + +Some additional license information which was able to be auto-detected might be found in [the `repo-info` repository's `satosa/` directory](https://github.com/docker-library/repo-info/tree/master/repos/satosa). + +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. diff --git a/satosa/content.md b/satosa/content.md new file mode 100644 index 000000000000..f00ab9e50c8b --- /dev/null +++ b/satosa/content.md @@ -0,0 +1,73 @@ +# What is SATOSA? + +SATOSA is a configurable proxy for translating between different authentication protocols such as SAML2, OpenID Connect, and OAuth2. + +%%LOGO%% + +# How to use this image + +## To start a SATOSA instance + +The basic pattern for starting a `%%REPO%%` instance is: + +```sh +docker run --name some-%%REPO%% -d %%IMAGE%% +``` + +To access the instance from the host without the container's IP, use port mappings: + +```sh +docker run --name some-%%REPO%% -p 80:8080 -d %%IMAGE%% +``` + +The entrypoint script outputs SAML2 metadata to the container log at start time. This metadata refers to the instance's base URL, e.g., `https://example.com`. Browsers must be able to access the instance over HTTPS. + +# How to extend this image + +## Configuration files + +The `%%REPO%%` image stores its configuration in /etc/satosa. This configuration must persist among instances, particularly the SAML2 entity ID (derived from the proxy's base URL by default) and related keying material. [Use volumes, bind mounts, or custom images](https://docs.docker.com/storage/) to maintain this configuration. + +## Entrypoint script + +The `%%REPO%%` image's entrypoint script runs [Gunicorn](https://gunicorn.org/) by default if the first argument looks like a command-line flag. For example, the following will use a bind mount to provide an X.509 certificate and corresponding private key to the instance, and it will run Gunicorn with HTTPS enabled: + +```sh +docker run --name some-%%REPO%% -p 443:8443 \ + -v /etc/letsencrypt/live/some-%%REPO%%/fullchain.pem:/etc/https.crt \ + -v /etc/letsencrypt/live/some-%%REPO%%/privkey.pem:/etc/https.key \ + -d %%IMAGE%% \ + -b0.0.0.0:8443 --certfile /etc/https.crt --keyfile /etc/https.key satosa.wsgi:app +``` + +If the first argument looks like a command instead of a flag, the entrypoint script will run that instead of Gunicorn. For example, the following will start an interactive, unprivileged shell inside the container: + +```sh +docker run -it --name some-%%REPO%% %%IMAGE%% bash +``` + +## Environment variables + +The entrypoint script uses environment variables to generate the initial configuration, which sets SATOSA up as a SAML2 proxy between the free [SAMLtest.ID](https://samltest.id/) test service provider and test identity provider. All of the environment variables are optional. + +The environment variables' values can be read from [Docker secrets](https://docs.docker.com/engine/swarm/secrets/). Append `_FILE` to the variable name (e.g., `STATE_ENCRYPTION_KEY_FILE`), and set it to the pathname of the corresponding secret (e.g., `/run/secrets/state_encryption_key`). + +### `BASE_URL` + +SATOSA must be hosted at the root of the website. This environment variable optionally specifies the website's base URL, which defaults to `http://example.com`. If set, the base URL *must* be a method plus a hostname without any trailing slash or path components, e.g., `https://idproxy.example.com`, not `https://idproxy.example.com/` nor `https://idproxy.example.com/satosa`. + +### `STATE_ENCRYPTION_KEY` + +SATOSA uses encrypted cookies to track the progress of an authentication flow. This environment variable optionally sets the state cookies' encryption key. If set, the state encryption key *must* be an alphanumeric value, e.g., `12345SameAsMyLuggage`. If not specified, a new random 32-character key will be generated. + +### `SAML2_BACKEND_DISCO_SRV` + +When part of a SAML2 multilateral federation, SATOSA will ask the user to choose an identity provider using a SAML discovery service. This environment variable optionally sets the the discovery service URL, which defaults to [SeamlessAccess](https://seamlessaccess.org/). + +### `SAML2_BACKEND_CERT` and `SAML2_BACKEND_KEY` + +SATOSA's SAML2 backend acts like a service provider (relying party), requesting authentication by and attributes from the user's identity provider. It uses public key cryptography to sign authentication requests and decrypt responses. These optional environment variables hold the backend's paired public and private keys in [the PEM format](https://en.wikipedia.org/wiki/Privacy-Enhanced_Mail). If not specified, a new 2048-bit RSA key-pair will be generated using the hostname part of `BASE_URL`. + +### `SAML2_FRONTEND_CERT` and `SAML2_FRONTEND_KEY` + +SATOSA's SAML2 frontend acts like an identity provider (credential service provider), processing authentication requests from and returning user attributes to trusted websites. It uses public key cryptography to sign authentication responses. These optional environment variables hold the frontend's paired public and private keys, also in the PEM format. If not specified, a new 2048-bit RSA key-pair will be generated using the hostname part of `BASE_URL`. diff --git a/satosa/get-help.md b/satosa/get-help.md new file mode 100644 index 000000000000..71d30aaa4f34 --- /dev/null +++ b/satosa/get-help.md @@ -0,0 +1 @@ +[the Identity Python mailing list](https://lists.sunet.se/listinfo/idpy-discuss) or [the Identity Python Slack workspace](https://identity-python.slack.com/) ([invitation](https://join.slack.com/t/identity-python/shared_invite/enQtNzEyNjU1NDI1MjUyLTM2MWI5ZGNhMTk1ZThiOTIxNWY2OTY1ODVmMWNjMzUzMTYxNTY5MzE5N2RlYjExZTIyM2MwYjBjZGE4MGVlMTM)) diff --git a/satosa/github-repo b/satosa/github-repo new file mode 100644 index 000000000000..77076cf18a3e --- /dev/null +++ b/satosa/github-repo @@ -0,0 +1 @@ +https://github.com/IdentityPython/satosa-docker diff --git a/satosa/license.md b/satosa/license.md new file mode 100644 index 000000000000..8122eaa98f50 --- /dev/null +++ b/satosa/license.md @@ -0,0 +1 @@ +View [license information](https://github.com/IdentityPython/SATOSA/blob/master/LICENSE) for the software contained in this image. diff --git a/satosa/logo.svg b/satosa/logo.svg new file mode 100644 index 000000000000..b9463555c546 --- /dev/null +++ b/satosa/logo.svg @@ -0,0 +1,2 @@ + +
IdentityPython
[Not supported by viewer]
\ No newline at end of file diff --git a/satosa/maintainer.md b/satosa/maintainer.md new file mode 100644 index 000000000000..2623e34b1866 --- /dev/null +++ b/satosa/maintainer.md @@ -0,0 +1 @@ +[the Identity Python project](%%GITHUB-REPO%%) diff --git a/sentry/README-short.txt b/sentry/README-short.txt deleted file mode 100644 index 0ef8af990697..000000000000 --- a/sentry/README-short.txt +++ /dev/null @@ -1 +0,0 @@ -Sentry is a realtime, platform-agnostic error logging and aggregation platform diff --git a/sentry/README.md b/sentry/README.md deleted file mode 100644 index 663c099c2144..000000000000 --- a/sentry/README.md +++ /dev/null @@ -1,184 +0,0 @@ - - -# Quick reference - -- **Maintained by**: - [Sentry](https://github.com/getsentry/docker-sentry) - -- **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) - -# Supported tags and respective `Dockerfile` links - -- [`9.1.2`, `9.1`, `9`, `latest`](https://github.com/getsentry/docker-sentry/blob/09a7761e841eee7fab758526b14d46ae56134952/9.1/Dockerfile) -- [`9.1.2-onbuild`, `9.1-onbuild`, `9-onbuild`, `onbuild`](https://github.com/getsentry/docker-sentry/blob/f58f91fe5dc31bfe77af277dae7002a5542326a9/9.1/onbuild/Dockerfile) - -# Quick reference (cont.) - -- **Where to file issues**: - [https://github.com/getsentry/docker-sentry/issues](https://github.com/getsentry/docker-sentry/issues) - -- **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) - [`amd64`](https://hub.docker.com/r/amd64/sentry/) - -- **Published image artifact details**: - [repo-info repo's `repos/sentry/` directory](https://github.com/docker-library/repo-info/blob/master/repos/sentry) ([history](https://github.com/docker-library/repo-info/commits/master/repos/sentry)) - (image metadata, transfer size, etc) - -- **Image updates**: - [official-images PRs with label `library/sentry`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fsentry) - [official-images repo's `library/sentry` file](https://github.com/docker-library/official-images/blob/master/library/sentry) ([history](https://github.com/docker-library/official-images/commits/master/library/sentry)) - -- **Source of this description**: - [docs repo's `sentry/` directory](https://github.com/docker-library/docs/tree/master/sentry) ([history](https://github.com/docker-library/docs/commits/master/sentry)) - -# What is Sentry? - -Sentry is a realtime event logging and aggregation platform. It specializes in monitoring errors and extracting all the information needed to do a proper post-mortem without any of the hassle of the standard user feedback loop. - -> [github.com/getsentry/sentry](https://github.com/getsentry/sentry) - -![logo](https://raw.githubusercontent.com/docker-library/docs/7d1c6fff37893bcefc186de7b978f5bdb2f801f6/sentry/logo.png) - -# How to use this image - -## How to setup a full Sentry instance - -1. Start a Redis container - - ```console - $ docker run -d --name sentry-redis redis - ``` - -2. Start a Postgres container - - ```console - $ docker run -d --name sentry-postgres -e POSTGRES_PASSWORD=secret -e POSTGRES_USER=sentry postgres - ``` - -3. Generate a new secret key to be shared by all `sentry` containers. This value will then be used as the `SENTRY_SECRET_KEY` environment variable. - - ```console - $ docker run --rm sentry config generate-secret-key - ``` - -4. If this is a new database, you'll need to run `upgrade` - - ```console - $ docker run -it --rm -e SENTRY_SECRET_KEY='' --link sentry-postgres:postgres --link sentry-redis:redis sentry upgrade - ``` - - **Note: the `-it` is important as the initial upgrade will prompt to create an initial user and will fail without it** - -5. Now start up Sentry server - - ```console - $ docker run -d --name my-sentry -e SENTRY_SECRET_KEY='' --link sentry-redis:redis --link sentry-postgres:postgres sentry - ``` - -6. The default config needs a celery beat and celery workers, start as many workers as you need (each with a unique name) - - ```console - $ docker run -d --name sentry-cron -e SENTRY_SECRET_KEY='' --link sentry-postgres:postgres --link sentry-redis:redis sentry run cron - $ docker run -d --name sentry-worker-1 -e SENTRY_SECRET_KEY='' --link sentry-postgres:postgres --link sentry-redis:redis sentry run worker - ``` - -### Port mapping - -If you'd like to be able to access the instance from the host without the container's IP, standard port mappings can be used. Just add `-p 8080:9000` to the `docker run` arguments and then access either `http://localhost:8080` or `http://host-ip:8080` in a browser. - -## Configuring the initial user - -If you did not create a superuser during `upgrade`, use the following to create one: - -```console -$ docker run -it --rm -e SENTRY_SECRET_KEY='' --link sentry-redis:redis --link sentry-postgres:postgres sentry createuser -``` - -## Environment variables - -When you start the `sentry` image, you can adjust the configuration of the Sentry instance by passing one or more environment variables on the `docker run` command line. Please note that these environment variables are provided as a jump start, and it's highly recommended to either mount in your own config file or utilize the `sentry:onbuild` variant. - -### `SENTRY_SECRET_KEY` - -A secret key used for cryptographic functions within Sentry. This key should be unique and consistent across all running instances. You can generate a new secret key doing something like: - -```console -$ docker run --rm sentry config generate-secret-key -``` - -### `SENTRY_POSTGRES_HOST`, `SENTRY_POSTGRES_PORT`, `SENTRY_DB_NAME`, `SENTRY_DB_USER`, `SENTRY_DB_PASSWORD` - -Database credentials for your Postgres server. These values aren't needed if a linked `postgres` container exists. - -### `SENTRY_REDIS_HOST`, `SENTRY_REDIS_PORT`, `SENTRY_REDIS_DB` - -Connection information for your Redis server. These values aren't needed if a linked `redis` container exists. - -### `SENTRY_MEMCACHED_HOST`, `SENTRY_MEMCACHED_PORT` - -Connection information for a Memcache server. These values aren't needed if a linked `memcached` container exists. - -### `SENTRY_FILESTORE_DIR` - -Directory where uploaded files will be stored. This defaults to `/var/lib/sentry/files` and is a `VOLUME` for persistent data. - -### `SENTRY_SERVER_EMAIL` - -The email address used for `From:` in outbound emails. Default: `root@localhost` - -### `SENTRY_EMAIL_HOST`, `SENTRY_EMAIL_PORT`, `SENTRY_EMAIL_USER`, `SENTRY_EMAIL_PASSWORD`, `SENTRY_EMAIL_USE_TLS` - -Connection information for an outbound smtp server. These values aren't needed if a linked `smtp` container exists. - -### `SENTRY_MAILGUN_API_KEY` - -If you're using Mailgun for inbound mail, set your API key and configure a route to forward to `/api/hooks/mailgun/inbound/`. - -# Image Variants - -The `sentry` images come in many flavors, each designed for a specific use case. - -## `sentry:` - -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. - -## `sentry:onbuild` - -This image makes it easy to custom build your own Sentry instance by copying in a custom `config.yml` and/or `sentry.conf.py` file and installing plugins from `requirements.txt`. - -It's also possible to develop custom extensions within your `onbuild` package. If the build directory contains a `setup.py` file, this will also get installed. - -See the [official Sentry documentation](https://docs.getsentry.com/on-premise/server/installation/) for more information. - -To create your custom `sentry:onbuild` package, simply do the following: - -1. Create a Dockerfile containing `FROM sentry:onbuild` -2. In the same directory, add your custom configuration files. -3. You can get copies of those files to use as templates from the [docker-sentry GitHub repo](https://github.com/getsentry/docker-sentry/). -4. Build your image: `docker build -t mysentry .` -5. Run your custom image using `mysentry` instead of `sentry`. - -# License - -View [license information](https://github.com/getsentry/sentry/blob/master/LICENSE) for the software contained in this image. - -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). - -Some additional license information which was able to be auto-detected might be found in [the `repo-info` repository's `sentry/` directory](https://github.com/docker-library/repo-info/tree/master/repos/sentry). - -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. diff --git a/sentry/content.md b/sentry/content.md deleted file mode 100644 index 6efc56d39620..000000000000 --- a/sentry/content.md +++ /dev/null @@ -1,102 +0,0 @@ -# What is Sentry? - -Sentry is a realtime event logging and aggregation platform. It specializes in monitoring errors and extracting all the information needed to do a proper post-mortem without any of the hassle of the standard user feedback loop. - -> [github.com/getsentry/sentry](https://github.com/getsentry/sentry) - -%%LOGO%% - -# How to use this image - -## How to setup a full Sentry instance - -1. Start a Redis container - - ```console - $ docker run -d --name sentry-redis redis - ``` - -2. Start a Postgres container - - ```console - $ docker run -d --name sentry-postgres -e POSTGRES_PASSWORD=secret -e POSTGRES_USER=sentry postgres - ``` - -3. Generate a new secret key to be shared by all `%%REPO%%` containers. This value will then be used as the `SENTRY_SECRET_KEY` environment variable. - - ```console - $ docker run --rm %%IMAGE%% config generate-secret-key - ``` - -4. If this is a new database, you'll need to run `upgrade` - - ```console - $ docker run -it --rm -e SENTRY_SECRET_KEY='' --link sentry-postgres:postgres --link sentry-redis:redis %%IMAGE%% upgrade - ``` - - **Note: the `-it` is important as the initial upgrade will prompt to create an initial user and will fail without it** - -5. Now start up Sentry server - - ```console - $ docker run -d --name my-sentry -e SENTRY_SECRET_KEY='' --link sentry-redis:redis --link sentry-postgres:postgres %%IMAGE%% - ``` - -6. The default config needs a celery beat and celery workers, start as many workers as you need (each with a unique name) - - ```console - $ docker run -d --name sentry-cron -e SENTRY_SECRET_KEY='' --link sentry-postgres:postgres --link sentry-redis:redis %%IMAGE%% run cron - $ docker run -d --name sentry-worker-1 -e SENTRY_SECRET_KEY='' --link sentry-postgres:postgres --link sentry-redis:redis %%IMAGE%% run worker - ``` - -### Port mapping - -If you'd like to be able to access the instance from the host without the container's IP, standard port mappings can be used. Just add `-p 8080:9000` to the `docker run` arguments and then access either `http://localhost:8080` or `http://host-ip:8080` in a browser. - -## Configuring the initial user - -If you did not create a superuser during `upgrade`, use the following to create one: - -```console -$ docker run -it --rm -e SENTRY_SECRET_KEY='' --link sentry-redis:redis --link sentry-postgres:postgres %%IMAGE%% createuser -``` - -## Environment variables - -When you start the `%%REPO%%` image, you can adjust the configuration of the Sentry instance by passing one or more environment variables on the `docker run` command line. Please note that these environment variables are provided as a jump start, and it's highly recommended to either mount in your own config file or utilize the `%%REPO%%:onbuild` variant. - -### `SENTRY_SECRET_KEY` - -A secret key used for cryptographic functions within Sentry. This key should be unique and consistent across all running instances. You can generate a new secret key doing something like: - -```console -$ docker run --rm %%IMAGE%% config generate-secret-key -``` - -### `SENTRY_POSTGRES_HOST`, `SENTRY_POSTGRES_PORT`, `SENTRY_DB_NAME`, `SENTRY_DB_USER`, `SENTRY_DB_PASSWORD` - -Database credentials for your Postgres server. These values aren't needed if a linked `postgres` container exists. - -### `SENTRY_REDIS_HOST`, `SENTRY_REDIS_PORT`, `SENTRY_REDIS_DB` - -Connection information for your Redis server. These values aren't needed if a linked `redis` container exists. - -### `SENTRY_MEMCACHED_HOST`, `SENTRY_MEMCACHED_PORT` - -Connection information for a Memcache server. These values aren't needed if a linked `memcached` container exists. - -### `SENTRY_FILESTORE_DIR` - -Directory where uploaded files will be stored. This defaults to `/var/lib/sentry/files` and is a `VOLUME` for persistent data. - -### `SENTRY_SERVER_EMAIL` - -The email address used for `From:` in outbound emails. Default: `root@localhost` - -### `SENTRY_EMAIL_HOST`, `SENTRY_EMAIL_PORT`, `SENTRY_EMAIL_USER`, `SENTRY_EMAIL_PASSWORD`, `SENTRY_EMAIL_USE_TLS` - -Connection information for an outbound smtp server. These values aren't needed if a linked `smtp` container exists. - -### `SENTRY_MAILGUN_API_KEY` - -If you're using Mailgun for inbound mail, set your API key and configure a route to forward to `/api/hooks/mailgun/inbound/`. diff --git a/sentry/github-repo b/sentry/github-repo deleted file mode 100644 index 65c146629195..000000000000 --- a/sentry/github-repo +++ /dev/null @@ -1 +0,0 @@ -https://github.com/getsentry/docker-sentry diff --git a/sentry/license.md b/sentry/license.md deleted file mode 100644 index 67736eeaf35a..000000000000 --- a/sentry/license.md +++ /dev/null @@ -1 +0,0 @@ -View [license information](https://github.com/getsentry/sentry/blob/master/LICENSE) for the software contained in this image. diff --git a/sentry/logo.png b/sentry/logo.png deleted file mode 100644 index 70d1e3d4979fb3b24f4bb7332ed77340beceb9f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6598 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 aFX5IW^IwAa>Dc5g0iXrfSFcvJiufPT{$@7- diff --git a/sentry/maintainer.md b/sentry/maintainer.md deleted file mode 100644 index 24fcafb6f94a..000000000000 --- a/sentry/maintainer.md +++ /dev/null @@ -1 +0,0 @@ -[Sentry](%%GITHUB-REPO%%) diff --git a/sentry/variant-onbuild.md b/sentry/variant-onbuild.md deleted file mode 100644 index f57800e973c3..000000000000 --- a/sentry/variant-onbuild.md +++ /dev/null @@ -1,15 +0,0 @@ -## `%%REPO%%:onbuild` - -This image makes it easy to custom build your own Sentry instance by copying in a custom `config.yml` and/or `sentry.conf.py` file and installing plugins from `requirements.txt`. - -It's also possible to develop custom extensions within your `onbuild` package. If the build directory contains a `setup.py` file, this will also get installed. - -See the [official Sentry documentation](https://docs.getsentry.com/on-premise/server/installation/) for more information. - -To create your custom `sentry:onbuild` package, simply do the following: - -1. Create a Dockerfile containing `FROM sentry:onbuild` -2. In the same directory, add your custom configuration files. -3. You can get copies of those files to use as templates from the [docker-sentry GitHub repo](https://github.com/getsentry/docker-sentry/). -4. Build your image: `docker build -t mysentry .` -5. Run your custom image using `mysentry` instead of `sentry`. diff --git a/silverpeas/README.md b/silverpeas/README.md index b605c8df385f..ac78f38b4ffa 100644 --- a/silverpeas/README.md +++ b/silverpeas/README.md @@ -24,7 +24,8 @@ WARNING: # Supported tags and respective `Dockerfile` links -- [`6.0.2`, `latest`](https://github.com/Silverpeas/docker-silverpeas-prod/blob/189a4f2db783d5052add54f2c07ca7a3b860c685/Dockerfile) +- [`6.3`, `latest`](https://github.com/Silverpeas/docker-silverpeas-prod/blob/cab21d1a3a25bf15d24f27a156d3df894123bb10/Dockerfile) +- [`6.2.3-b1`](https://github.com/Silverpeas/docker-silverpeas-prod/blob/9714dcc94eb558508f085835a329a44f5c3cb52e/Dockerfile) # Quick reference (cont.) @@ -39,7 +40,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/silverpeas`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fsilverpeas) + [official-images repo's `library/silverpeas` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fsilverpeas) [official-images repo's `library/silverpeas` file](https://github.com/docker-library/official-images/blob/master/library/silverpeas) ([history](https://github.com/docker-library/official-images/commits/master/library/silverpeas)) - **Source of this description**: @@ -85,12 +86,27 @@ In [Docker Hub](https://hub.docker.com/), no Docker images of Microsoft SQLServe $ docker run --name postgresql -d \ -e POSTGRES_PASSWORD="mysecretpassword" \ -v postgresql-data:/var/lib/postgresql/data \ - postgres:9.6 + postgres:12.3 ``` We recommend strongly to mount the directory with the database file on the host so the data won't be lost when upgrading PostgreSQL to a newer version (a Data Volume Container can be used instead). For any information how to start a PostgreSQL container, you can refer its [documentation](https://hub.docker.com/_/postgres/). -Once the database system is running, a database for Silverpeas has to be created and a user with administrative rights on this database (and only on this database) should be added; it is recommended for a security reason to create a dedicated user account in the database for each application and therefore for Silverpeas. In this document, and by default, a database `Silverpeas` and a user `silverpeas` for that database are created. +Once the database system is running, a database for Silverpeas has to be created and a user with administrative rights on this database (and only on this database) should be added; it is recommended for a security reason to create a dedicated user account in the database for each application and therefore for Silverpeas. In this document, and by default, a database `Silverpeas` and a user `silverpeas` for that database are created. For example: + +```console +$ docker exec -it postgresql psql -U postgres +psql (12.3 (Debian 12.3-1.pgdg100+1)) +Type "help" for help. + +postgres=# create database "Silverpeas"; +CREATE DATABASE +postgres=# create user silverpeas with password 'thesilverpeaspassword'; +CREATE ROLE +postgres=# grant all privileges on database "Silverpeas" to silverpeas; +GRANT +postgres=# \q +$ +``` ### Start a Silverpeas instance with the default configuration diff --git a/silverpeas/content.md b/silverpeas/content.md index 2c73b3ab3d70..1bbd0c8b5ef6 100644 --- a/silverpeas/content.md +++ b/silverpeas/content.md @@ -38,12 +38,27 @@ In [Docker Hub](https://hub.docker.com/), no Docker images of Microsoft SQLServe $ docker run --name postgresql -d \ -e POSTGRES_PASSWORD="mysecretpassword" \ -v postgresql-data:/var/lib/postgresql/data \ - postgres:9.6 + postgres:12.3 ``` We recommend strongly to mount the directory with the database file on the host so the data won't be lost when upgrading PostgreSQL to a newer version (a Data Volume Container can be used instead). For any information how to start a PostgreSQL container, you can refer its [documentation](https://hub.docker.com/_/postgres/). -Once the database system is running, a database for Silverpeas has to be created and a user with administrative rights on this database (and only on this database) should be added; it is recommended for a security reason to create a dedicated user account in the database for each application and therefore for Silverpeas. In this document, and by default, a database `Silverpeas` and a user `silverpeas` for that database are created. +Once the database system is running, a database for Silverpeas has to be created and a user with administrative rights on this database (and only on this database) should be added; it is recommended for a security reason to create a dedicated user account in the database for each application and therefore for Silverpeas. In this document, and by default, a database `Silverpeas` and a user `silverpeas` for that database are created. For example: + +```console +$ docker exec -it postgresql psql -U postgres +psql (12.3 (Debian 12.3-1.pgdg100+1)) +Type "help" for help. + +postgres=# create database "Silverpeas"; +CREATE DATABASE +postgres=# create user silverpeas with password 'thesilverpeaspassword'; +CREATE ROLE +postgres=# grant all privileges on database "Silverpeas" to silverpeas; +GRANT +postgres=# \q +$ +``` ### Start a Silverpeas instance with the default configuration diff --git a/sl/README.md b/sl/README.md index 21b586d1012a..981fa5d96c59 100644 --- a/sl/README.md +++ b/sl/README.md @@ -24,8 +24,7 @@ WARNING: # Supported tags and respective `Dockerfile` links -- [`7`, `latest`](https://github.com/scientificlinux/sl-docker/blob/88265b18997404f09ebbaec86bdfc87bca434963/sl7/Dockerfile) -- [`6`](https://github.com/scientificlinux/sl-docker/blob/b625310de0dbe2cd26e2bff681a9e012691d4b3e/sl6/Dockerfile) +- [`7`, `latest`](https://github.com/scientificlinux/sl-docker/blob/b2ec52ef8c9e9a11d1bb4ea5441552c21f0b523b/sl7/Dockerfile) # Quick reference (cont.) @@ -40,7 +39,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/sl`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fsl) + [official-images repo's `library/sl` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fsl) [official-images repo's `library/sl` file](https://github.com/docker-library/official-images/blob/master/library/sl) ([history](https://github.com/docker-library/official-images/commits/master/library/sl)) - **Source of this description**: diff --git a/solr/README-short.txt b/solr/README-short.txt index 3ae4ad4018df..257a196c62fd 100644 --- a/solr/README-short.txt +++ b/solr/README-short.txt @@ -1 +1 @@ -Solr is the popular, blazing-fast, open source enterprise search platform built on Apache Lucene™. +Apache Solr is the popular, blazing-fast, open source search platform built on Apache Lucene™. diff --git a/solr/README.md b/solr/README.md index 9db5dd828a3e..79751eae676f 100644 --- a/solr/README.md +++ b/solr/README.md @@ -17,46 +17,32 @@ WARNING: # Quick reference - **Maintained by**: - [the Apache Lucene/Solr project](https://github.com/docker-solr/docker-solr) + [the Apache Solr project](https://github.com/apache/solr) - **Where to get help**: - [the Solr Community](https://lucene.apache.org/solr/community.html) + [the Solr Community](https://solr.apache.org/community.html) # Supported tags and respective `Dockerfile` links -- [`8.5.1`, `8.5`, `8`, `latest`](https://github.com/docker-solr/docker-solr/blob/574d3d15742dce60957d423240337a3962f265f6/8.5/Dockerfile) -- [`8.5.1-slim`, `8.5-slim`, `8-slim`, `slim`](https://github.com/docker-solr/docker-solr/blob/574d3d15742dce60957d423240337a3962f265f6/8.5/slim/Dockerfile) -- [`8.4.1`, `8.4`](https://github.com/docker-solr/docker-solr/blob/574d3d15742dce60957d423240337a3962f265f6/8.4/Dockerfile) -- [`8.4.1-slim`, `8.4-slim`](https://github.com/docker-solr/docker-solr/blob/574d3d15742dce60957d423240337a3962f265f6/8.4/slim/Dockerfile) -- [`8.3.1`, `8.3`](https://github.com/docker-solr/docker-solr/blob/574d3d15742dce60957d423240337a3962f265f6/8.3/Dockerfile) -- [`8.3.1-slim`, `8.3-slim`](https://github.com/docker-solr/docker-solr/blob/574d3d15742dce60957d423240337a3962f265f6/8.3/slim/Dockerfile) -- [`8.2.0`, `8.2`](https://github.com/docker-solr/docker-solr/blob/574d3d15742dce60957d423240337a3962f265f6/8.2/Dockerfile) -- [`8.2.0-slim`, `8.2-slim`](https://github.com/docker-solr/docker-solr/blob/574d3d15742dce60957d423240337a3962f265f6/8.2/slim/Dockerfile) -- [`8.1.1`, `8.1`](https://github.com/docker-solr/docker-solr/blob/574d3d15742dce60957d423240337a3962f265f6/8.1/Dockerfile) -- [`8.1.1-slim`, `8.1-slim`](https://github.com/docker-solr/docker-solr/blob/574d3d15742dce60957d423240337a3962f265f6/8.1/slim/Dockerfile) -- [`8.0.0`, `8.0`](https://github.com/docker-solr/docker-solr/blob/574d3d15742dce60957d423240337a3962f265f6/8.0/Dockerfile) -- [`8.0.0-slim`, `8.0-slim`](https://github.com/docker-solr/docker-solr/blob/574d3d15742dce60957d423240337a3962f265f6/8.0/slim/Dockerfile) -- [`7.7.3`, `7.7`, `7`](https://github.com/docker-solr/docker-solr/blob/574d3d15742dce60957d423240337a3962f265f6/7.7/Dockerfile) -- [`7.7.3-slim`, `7.7-slim`, `7-slim`](https://github.com/docker-solr/docker-solr/blob/574d3d15742dce60957d423240337a3962f265f6/7.7/slim/Dockerfile) -- [`6.6.6`, `6.6`, `6`](https://github.com/docker-solr/docker-solr/blob/574d3d15742dce60957d423240337a3962f265f6/6.6/Dockerfile) -- [`6.6.6-slim`, `6.6-slim`, `6-slim`](https://github.com/docker-solr/docker-solr/blob/574d3d15742dce60957d423240337a3962f265f6/6.6/slim/Dockerfile) -- [`5.5.5`, `5.5`, `5`](https://github.com/docker-solr/docker-solr/blob/574d3d15742dce60957d423240337a3962f265f6/5.5/Dockerfile) -- [`5.5.5-slim`, `5.5-slim`, `5-slim`](https://github.com/docker-solr/docker-solr/blob/574d3d15742dce60957d423240337a3962f265f6/5.5/slim/Dockerfile) +- [`9.1.0`, `9.1`, `9`, `latest`](https://github.com/apache/solr-docker/blob/c07ee789c60dd4be20d63e8172180ac8a2bd919e/9.1/Dockerfile) +- [`9.0.0`, `9.0`](https://github.com/apache/solr-docker/blob/c07ee789c60dd4be20d63e8172180ac8a2bd919e/9.0/Dockerfile) +- [`8.11.2`, `8.11`, `8`](https://github.com/apache/solr-docker/blob/c07ee789c60dd4be20d63e8172180ac8a2bd919e/8.11/Dockerfile) +- [`8.11.2-slim`, `8.11-slim`, `8-slim`](https://github.com/apache/solr-docker/blob/c07ee789c60dd4be20d63e8172180ac8a2bd919e/8.11-slim/Dockerfile) # Quick reference (cont.) - **Where to file issues**: - [https://github.com/docker-solr/docker-solr/issues](https://github.com/docker-solr/docker-solr/issues) + [The Solr Users mailing list](https://solr.apache.org/community.html#mailing-lists-chat) - **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) - [`amd64`](https://hub.docker.com/r/amd64/solr/), [`arm64v8`](https://hub.docker.com/r/arm64v8/solr/) + [`amd64`](https://hub.docker.com/r/amd64/solr/), [`arm32v7`](https://hub.docker.com/r/arm32v7/solr/), [`arm64v8`](https://hub.docker.com/r/arm64v8/solr/), [`ppc64le`](https://hub.docker.com/r/ppc64le/solr/), [`s390x`](https://hub.docker.com/r/s390x/solr/) - **Published image artifact details**: [repo-info repo's `repos/solr/` directory](https://github.com/docker-library/repo-info/blob/master/repos/solr) ([history](https://github.com/docker-library/repo-info/commits/master/repos/solr)) (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/solr`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fsolr) + [official-images repo's `library/solr` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fsolr) [official-images repo's `library/solr` file](https://github.com/docker-library/official-images/blob/master/library/solr) ([history](https://github.com/docker-library/official-images/commits/master/library/solr)) - **Source of this description**: @@ -64,14 +50,16 @@ WARNING: # What is Solr? -Solr is highly reliable, scalable and fault tolerant, providing distributed indexing, replication and load-balanced querying, automated failover and recovery, centralized configuration and more. Solr powers the search and navigation features of many of the world's largest internet sites. +Solr is the popular, blazing fast, open source NoSQL search platform from the Apache Lucene project. Its major features include powerful full-text search, hit highlighting, faceted search, dynamic clustering, database integration, rich document handling, and geospatial search. Solr is highly scalable, providing fault tolerant distributed search and indexing, and powers the search and navigation features of many of the world's largest internet sites. -Learn more on [Apache Solr homepage](http://lucene.apache.org/solr/) and in the [Apache Solr Reference Guide](https://www.apache.org/dyn/closer.cgi/lucene/solr/ref-guide/). +Learn more on [Apache Solr homepage](http://solr.apache.org/) and in the [Apache Solr Reference Guide](https://solr.apache.org/guide/). ![logo](https://raw.githubusercontent.com/docker-library/docs/ddc9eb521da7c412b70229f1a600d0c63d55d0f7/solr/logo.png) # How to use this Docker image +Full documentation can be found in the [Solr Reference Guide's Docker section](https://solr.apache.org/guide/solr/latest/deployment-guide/solr-in-docker.html). + To run a single Solr server: ```console @@ -80,15 +68,25 @@ $ docker run -p 8983:8983 -t solr Then with a web browser go to http://localhost:8983/ to see the Solr Admin Console. -For more detailed instructions for using this image, see the [README](https://github.com/docker-solr/docker-solr/blob/master/README.md). - # About this repository -This repository is available on [github.com/docker-solr/docker-solr](https://github.com/docker-solr/docker-solr), and the official build is on the [Docker Hub](https://hub.docker.com/_/solr/). +This repository is available on [github.com/apache/solr-docker](https://github.com/apache/solr-docker), but the image is built and maintained in the official Solr repo [github.com/apache/solr](https://github.com/apache/solr). + +Please direct any usage questions to the [Solr users mailing list](https://solr.apache.org/community.html#mailing-lists-chat). # History -This project was started in 2015 by [Martijn Koster](https://github.com/makuk66). In 2019 maintainership and copyright was transferred to the Apache Lucene/Solr project. Many thanks to Martijn for all your contributions over the years! +This project was started in 2015 by [Martijn Koster](https://github.com/makuk66) in the [github.com/docker-solr/docker-solr](https://github.com/docker-solr/docker-solr) repository. In 2019, the maintainership and copyright was transferred to the Apache Solr project. Many thanks to Martijn for all your contributions over the years! + +# NOTE: Not vulnerable to Log4J 2 "Log4shell" + +Some Docker images *were* vulnerable to one of a pair of vulnerabilities in Log4J 2. But we have mitigated *[supported](https://hub.docker.com/_/solr?tab=tags)* images (and some others) and re-published them. You may need to re-pull the image you are using. For those images prior to 8.11.1, Solr is using a popular technique to mitigate the problem -- setting `log4j2.formatMsgNoLookups`. The Solr maintainers have deemed this adequate based specifically on how Solr uses logging; it won't be adequate for all projects that use Log4J. Scanning software might alert you to the presence of an older Log4J JAR file, however it can't know if your software (Solr) uses the artifacts in a vulnerable way. To validate the mitigation being in place, look for `-Dlog4j2.formatMsgNoLookups` in the Args section of Solr's front admin screen. As of Solr 8.11.1, Solr is using Log4J 2.16.0. + +References: + +- [CVE-2021-44228](https://nvd.nist.gov/vuln/detail/CVE-2021-44228): Solr *was* vulnerable to this. +- [CVE-2021-45046](https://nvd.nist.gov/vuln/detail/CVE-2021-45046): Solr *never was* vulnerable to this. +- [Solr security bulletin](https://solr.apache.org/security.html#apache-solr-affected-by-apache-log4j-cve-2021-44228) # Image Variants @@ -108,7 +106,7 @@ Solr is licensed under the [Apache License, Version 2.0](https://www.apache.org/ This repository is also licensed under the [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0). -Copyright 2015-2020 The Apache Software Foundation +Copyright 2015-2022 The Apache Software Foundation Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at diff --git a/solr/content.md b/solr/content.md index 97ead3d3a492..2bc885d95d65 100644 --- a/solr/content.md +++ b/solr/content.md @@ -1,13 +1,15 @@ # What is Solr? -Solr is highly reliable, scalable and fault tolerant, providing distributed indexing, replication and load-balanced querying, automated failover and recovery, centralized configuration and more. Solr powers the search and navigation features of many of the world's largest internet sites. +Solr is the popular, blazing fast, open source NoSQL search platform from the Apache Lucene project. Its major features include powerful full-text search, hit highlighting, faceted search, dynamic clustering, database integration, rich document handling, and geospatial search. Solr is highly scalable, providing fault tolerant distributed search and indexing, and powers the search and navigation features of many of the world's largest internet sites. -Learn more on [Apache Solr homepage](http://lucene.apache.org/solr/) and in the [Apache Solr Reference Guide](https://www.apache.org/dyn/closer.cgi/lucene/solr/ref-guide/). +Learn more on [Apache Solr homepage](http://solr.apache.org/) and in the [Apache Solr Reference Guide](https://solr.apache.org/guide/). %%LOGO%% # How to use this Docker image +Full documentation can be found in the [Solr Reference Guide's Docker section](https://solr.apache.org/guide/solr/latest/deployment-guide/solr-in-docker.html). + To run a single Solr server: ```console @@ -16,12 +18,22 @@ $ docker run -p 8983:8983 -t %%IMAGE%% Then with a web browser go to http://localhost:8983/ to see the Solr Admin Console. -For more detailed instructions for using this image, see the [README](https://github.com/docker-solr/docker-solr/blob/master/README.md). - # About this repository -This repository is available on [github.com/docker-solr/docker-solr](https://github.com/docker-solr/docker-solr), and the official build is on the [Docker Hub](https://hub.docker.com/_/solr/). +This repository is available on [github.com/apache/solr-docker](https://github.com/apache/solr-docker), but the image is built and maintained in the official Solr repo [github.com/apache/solr](https://github.com/apache/solr). + +Please direct any usage questions to the [Solr users mailing list](https://solr.apache.org/community.html#mailing-lists-chat). # History -This project was started in 2015 by [Martijn Koster](https://github.com/makuk66). In 2019 maintainership and copyright was transferred to the Apache Lucene/Solr project. Many thanks to Martijn for all your contributions over the years! +This project was started in 2015 by [Martijn Koster](https://github.com/makuk66) in the [github.com/docker-solr/docker-solr](https://github.com/docker-solr/docker-solr) repository. In 2019, the maintainership and copyright was transferred to the Apache Solr project. Many thanks to Martijn for all your contributions over the years! + +# NOTE: Not vulnerable to Log4J 2 "Log4shell" + +Some Docker images *were* vulnerable to one of a pair of vulnerabilities in Log4J 2. But we have mitigated *[supported](https://hub.docker.com/_/solr?tab=tags)* images (and some others) and re-published them. You may need to re-pull the image you are using. For those images prior to 8.11.1, Solr is using a popular technique to mitigate the problem -- setting `log4j2.formatMsgNoLookups`. The Solr maintainers have deemed this adequate based specifically on how Solr uses logging; it won't be adequate for all projects that use Log4J. Scanning software might alert you to the presence of an older Log4J JAR file, however it can't know if your software (Solr) uses the artifacts in a vulnerable way. To validate the mitigation being in place, look for `-Dlog4j2.formatMsgNoLookups` in the Args section of Solr's front admin screen. As of Solr 8.11.1, Solr is using Log4J 2.16.0. + +References: + +- [CVE-2021-44228](https://nvd.nist.gov/vuln/detail/CVE-2021-44228): Solr *was* vulnerable to this. +- [CVE-2021-45046](https://nvd.nist.gov/vuln/detail/CVE-2021-45046): Solr *never was* vulnerable to this. +- [Solr security bulletin](https://solr.apache.org/security.html#apache-solr-affected-by-apache-log4j-cve-2021-44228) diff --git a/solr/get-help.md b/solr/get-help.md index 31ab6716cf5d..2e19035bf5b5 100644 --- a/solr/get-help.md +++ b/solr/get-help.md @@ -1 +1 @@ -[the Solr Community](https://lucene.apache.org/solr/community.html) +[the Solr Community](https://solr.apache.org/community.html) diff --git a/solr/github-repo b/solr/github-repo index 307cafa2efdf..f77ba85345ff 100644 --- a/solr/github-repo +++ b/solr/github-repo @@ -1 +1 @@ -https://github.com/docker-solr/docker-solr +https://github.com/apache/solr diff --git a/solr/issues.md b/solr/issues.md new file mode 100644 index 000000000000..773a06b544d2 --- /dev/null +++ b/solr/issues.md @@ -0,0 +1 @@ +[The Solr Users mailing list](https://solr.apache.org/community.html#mailing-lists-chat) diff --git a/solr/license.md b/solr/license.md index 7f9d73d4b277..4432533f676e 100644 --- a/solr/license.md +++ b/solr/license.md @@ -2,7 +2,7 @@ Solr is licensed under the [Apache License, Version 2.0](https://www.apache.org/ This repository is also licensed under the [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0). -Copyright 2015-2020 The Apache Software Foundation +Copyright 2015-2022 The Apache Software Foundation Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at diff --git a/solr/maintainer.md b/solr/maintainer.md index 091c3b5ad823..c46a37a53d88 100644 --- a/solr/maintainer.md +++ b/solr/maintainer.md @@ -1 +1 @@ -[the Apache Lucene/Solr project](%%GITHUB-REPO%%) +[the Apache Solr project](%%GITHUB-REPO%%) diff --git a/sonarqube/README.md b/sonarqube/README.md index b08c24f8df6e..cf4d06ef3cb6 100644 --- a/sonarqube/README.md +++ b/sonarqube/README.md @@ -24,10 +24,16 @@ WARNING: # Supported tags and respective `Dockerfile` links -- [`7.9.3-community`, `7.9-community`, `lts`](https://github.com/SonarSource/docker-sonarqube/blob/2f7290e97a56f71603eff494db0d6b8d34ca426e/7/community/Dockerfile) -- [`8.3.1-community`, `8.3-community`, `8-community`, `community`, `latest`](https://github.com/SonarSource/docker-sonarqube/blob/2f7290e97a56f71603eff494db0d6b8d34ca426e/8/community/Dockerfile) -- [`8.3.1-developer`, `8.3-developer`, `8-developer`, `developer`](https://github.com/SonarSource/docker-sonarqube/blob/2f7290e97a56f71603eff494db0d6b8d34ca426e/8/developer/Dockerfile) -- [`8.3.1-enterprise`, `8.3-enterprise`, `8-enterprise`, `enterprise`](https://github.com/SonarSource/docker-sonarqube/blob/2f7290e97a56f71603eff494db0d6b8d34ca426e/8/enterprise/Dockerfile) +- [`8.9.10-community`, `8.9-community`, `8-community`, `lts`, `lts-community`](https://github.com/SonarSource/docker-sonarqube/blob/6e6bd428f38d5ba5b6169fd15d29ce8dbe00921f/8/community/Dockerfile) +- [`8.9.10-developer`, `8.9-developer`, `8-developer`, `lts-developer`](https://github.com/SonarSource/docker-sonarqube/blob/6e6bd428f38d5ba5b6169fd15d29ce8dbe00921f/8/developer/Dockerfile) +- [`8.9.10-enterprise`, `8.9-enterprise`, `8-enterprise`, `lts-enterprise`](https://github.com/SonarSource/docker-sonarqube/blob/6e6bd428f38d5ba5b6169fd15d29ce8dbe00921f/8/enterprise/Dockerfile) +- [`8.9.10-datacenter-app`, `8.9-datacenter-app`, `8-datacenter-app`, `lts-datacenter-app`](https://github.com/SonarSource/docker-sonarqube/blob/6e6bd428f38d5ba5b6169fd15d29ce8dbe00921f/8/datacenter/app/Dockerfile) +- [`8.9.10-datacenter-search`, `8.9-datacenter-search`, `8-datacenter-search`, `lts-datacenter-search`](https://github.com/SonarSource/docker-sonarqube/blob/6e6bd428f38d5ba5b6169fd15d29ce8dbe00921f/8/datacenter/search/Dockerfile) +- [`9.8.0-community`, `9.8-community`, `9-community`, `community`, `latest`](https://github.com/SonarSource/docker-sonarqube/blob/6e6bd428f38d5ba5b6169fd15d29ce8dbe00921f/9/community/Dockerfile) +- [`9.8.0-developer`, `9.8-developer`, `9-developer`, `developer`](https://github.com/SonarSource/docker-sonarqube/blob/6e6bd428f38d5ba5b6169fd15d29ce8dbe00921f/9/developer/Dockerfile) +- [`9.8.0-enterprise`, `9.8-enterprise`, `9-enterprise`, `enterprise`](https://github.com/SonarSource/docker-sonarqube/blob/6e6bd428f38d5ba5b6169fd15d29ce8dbe00921f/9/enterprise/Dockerfile) +- [`9.8.0-datacenter-app`, `9.8-datacenter-app`, `9-datacenter-app`, `datacenter-app`](https://github.com/SonarSource/docker-sonarqube/blob/6e6bd428f38d5ba5b6169fd15d29ce8dbe00921f/9/datacenter/app/Dockerfile) +- [`9.8.0-datacenter-search`, `9.8-datacenter-search`, `9-datacenter-search`, `datacenter-search`](https://github.com/SonarSource/docker-sonarqube/blob/6e6bd428f38d5ba5b6169fd15d29ce8dbe00921f/9/datacenter/search/Dockerfile) # Quick reference (cont.) @@ -42,7 +48,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/sonarqube`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fsonarqube) + [official-images repo's `library/sonarqube` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fsonarqube) [official-images repo's `library/sonarqube` file](https://github.com/docker-library/official-images/blob/master/library/sonarqube) ([history](https://github.com/docker-library/official-images/commits/master/library/sonarqube)) - **Source of this description**: @@ -50,13 +56,13 @@ WARNING: # What is SonarQube? -[SonarQube](https://www.sonarqube.org/) is an open source product for continuous inspection of code quality. +[SonarQube](https://www.sonarqube.org/) is the leading tool for continuously inspecting the Code Quality and Security of your codebases, and guiding development teams during Code Reviews. Covering 27 programming languages, while pairing-up with your existing software pipeline, SonarQube provides clear remediation guidance for developers to understand and fix issues, and for teams overall to deliver better and safer software. With over 225,000 deployments helping small development teams as well as global organizations, SonarQube provides the means for all teams and companies around the world to own and impact their Code Quality and Security. ![logo](https://raw.githubusercontent.com/docker-library/docs/84479f149eb7d748d5dc057665eb96f923e60dc1/sonarqube/logo.png) # How to use this image -Here you'll find the Docker images for the Community Edition, Developer Edition, and Enterprise Edition of SonarQube. +Here you'll find the Docker images for the Community Edition, Developer Edition, Enterprise Edition, and Data Center Edition of SonarQube. ## Docker Host Requirements @@ -65,15 +71,21 @@ Because SonarQube uses an embedded Elasticsearch, make sure that your Docker hos For example, on Linux, you can set the recommended values for the current session by running the following commands as root on the host: ```console -sysctl -w vm.max_map_count=262144 -sysctl -w fs.file-max=65536 -ulimit -n 65536 -ulimit -u 4096 +sysctl -w vm.max_map_count=524288 +sysctl -w fs.file-max=131072 +ulimit -n 131072 +ulimit -u 8192 ``` -## Get Started in Two Minutes Guide +## Try Out SonarQube -To quickly run a demo instance, see Using Docker on the [Get Started in Two Minutes Guide](https://docs.sonarqube.org/latest/setup/get-started-2-minutes/) page. When you are ready to move to a more sustainable setup, take some time to read the **Configuration** section below. +To quickly run a demo instance, see Using Docker on the [Try Out SonarQube](https://docs.sonarqube.org/latest/setup/get-started-2-minutes/) page. When you are ready to move to a more sustainable setup, take some time to read the **Installation** and **Configuration** sections below. + +## Installation + +For installation instructions, see Installing the Server from the Docker Image on the [Install the Server](https://docs.sonarqube.org/latest/setup/install-server/) page. + +To run a cluster with the Data Center Edition, please refer to Installing SonarQube from the Docker Image on the [Install the Server as a Cluster](https://docs.sonarqube.org/latest/setup/install-cluster/) page. ## Configuration @@ -81,7 +93,7 @@ To quickly run a demo instance, see Using Docker on the [Get Started in Two Minu By default, the image will use an embedded H2 database that is not suited for production. -> **Warning:** Only a single instance of SonarQube can connect to a database schema. If you're using a Docker Swarm or Kubernetes, make sure that multiple SonarQube instances are never running on the same database schema simultaneously. This will cause SonarQube to behave unpredictably and data will be corrupted. There is no safeguard until [SONAR-10362](https://jira.sonarsource.com/browse/SONAR-10362). +> **Warning:** Only a single instance of SonarQube can connect to a database schema. If you're using a Docker Swarm or Kubernetes, make sure that multiple SonarQube instances are never running on the same database schema simultaneously. This will cause SonarQube to behave unpredictably and data will be corrupted. There is no safeguard until [SONAR-10362](https://jira.sonarsource.com/browse/SONAR-10362). The Data Center Edition has the same limitation in that only one cluster can connect to one database schema at the same time. Set up a database by following the "Installing the Database" section of https://docs.sonarqube.org/latest/setup/install-server/. @@ -89,17 +101,12 @@ Set up a database by following the "Installing the Database" section of https:// We recommend creating volumes for the following directories: -- `/opt/sonarqube/conf`: **for Version 7.9.x only**, configuration files, such as `sonar.properties`. - `/opt/sonarqube/data`: data files, such as the embedded H2 database and Elasticsearch indexes - `/opt/sonarqube/logs`: contains SonarQube logs about access, web process, CE process, Elasticsearch logs -- `/opt/sonarqube/extensions`: plugins, such as language analyzers +- `/opt/sonarqube/extensions`: for 3rd party plugins > **Warning:** You cannot use the same volumes on multiple instances of SonarQube. -## First Installation - -For installation instructions, see Installing the Server from the Docker Image on the [Install the Server](https://docs.sonarqube.org/latest/setup/install-server/) page. - ## Upgrading For upgrade instructions, see Upgrading from the Docker Image on the [Upgrade the Server](https://docs.sonarqube.org/latest/setup/upgrading/) page. @@ -111,8 +118,8 @@ For upgrade instructions, see Upgrading from the Docker Image on the [Upgrade th In some environments, it may make more sense to prepare a custom image containing your configuration. A `Dockerfile` to achieve this may be as simple as: ```dockerfile -FROM sonarqube:8.2-community -COPY sonar.properties /opt/sonarqube/conf/ +FROM sonarqube:8.9-community +COPY sonar-custom-plugin-1.0.jar /opt/sonarqube/extensions/ ``` You could then build and try the image with something like: @@ -124,7 +131,7 @@ $ docker run -ti sonarqube-custom ### Avoid hard termination of SonarQube -Starting from SonarQube 7.8, SonarQube stops gracefully, waiting for any tasks in progress to finish. Waiting for in-progress tasks to finish can take a large amount of time which the docker does not expect by default when stopping. To avoid having the SonarQube instance killed by the Docker daemon after 10 seconds, it is best to configure a timeout to stop the container with `--stop-timeout`. For example: +A SonarQube instance will stop gracefully, waiting for any tasks in progress to finish. Waiting for in-progress tasks to finish can take a large amount of time which the docker does not expect by default when stopping. To avoid having the SonarQube instance killed by the Docker daemon after 10 seconds, it is best to configure a timeout to stop the container with `--stop-timeout`. For example: ```console docker run --stop-timeout 3600 sonarqube @@ -136,7 +143,7 @@ The administration guide can be found [here](https://redirect.sonarsource.com/do # License -View [license information](http://www.gnu.org/licenses/lgpl.txt) for the software contained in this image. +SonarQube Community Edition is licensed under [GNU Lesser General Public License, Version 3.0](http://www.gnu.org/licenses/lgpl.txt). SonarQube Developer, Enterprise, and Data Center Editions are licensed under [SonarSource Terms and Conditions](https://www.sonarsource.com/docs/sonarsource_terms_and_conditions.pdf). 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). diff --git a/sourcemage/README-short.txt b/sourcemage/README-short.txt deleted file mode 100644 index be7971d3555d..000000000000 --- a/sourcemage/README-short.txt +++ /dev/null @@ -1 +0,0 @@ -Source Mage is a source-based GNU/Linux distribution with maximum flexibility in customization. diff --git a/sourcemage/README.md b/sourcemage/README.md deleted file mode 100644 index 7cca2849ec6c..000000000000 --- a/sourcemage/README.md +++ /dev/null @@ -1,87 +0,0 @@ - - -# Quick reference - -- **Maintained by**: - [the Source Mage Community](https://github.com/vaygr/docker-sourcemage) - -- **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) - -# Supported tags and respective `Dockerfile` links - -- [`latest`, `0.62`](https://github.com/vaygr/docker-sourcemage/blob/a03bbe3ae7bbb839c3c69afd4504ca336f7b9cb9/stable/Dockerfile) - -# Quick reference (cont.) - -- **Where to file issues**: - [https://github.com/vaygr/docker-sourcemage/issues](https://github.com/vaygr/docker-sourcemage/issues) - -- **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) - [`amd64`](https://hub.docker.com/r/amd64/sourcemage/) - -- **Published image artifact details**: - [repo-info repo's `repos/sourcemage/` directory](https://github.com/docker-library/repo-info/blob/master/repos/sourcemage) ([history](https://github.com/docker-library/repo-info/commits/master/repos/sourcemage)) - (image metadata, transfer size, etc) - -- **Image updates**: - [official-images PRs with label `library/sourcemage`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fsourcemage) - [official-images repo's `library/sourcemage` file](https://github.com/docker-library/official-images/blob/master/library/sourcemage) ([history](https://github.com/docker-library/official-images/commits/master/library/sourcemage)) - -- **Source of this description**: - [docs repo's `sourcemage/` directory](https://github.com/docker-library/docs/tree/master/sourcemage) ([history](https://github.com/docker-library/docs/commits/master/sourcemage)) - -# Docker images for Source Mage GNU/Linux - -[Source Mage](https://sourcemage.org/) (or *SMGL* in abbreviated form) is a source-based *GNU/Linux* distribution based on a sorcery metaphor of "casting" and "dispelling" programs, which we refer to as "**spells**", and a package manager called "**Sorcery**". Our packages are designed to allow the user to customize the package any way they want (custom CFLAGS, LDFLAGS, `./configure` flags, etc.) as well as offering as many of the package options as possible to the user up-front (you will not need to know what options a package has or what optional dependencies it can use ahead of time). Source code is always downloaded from the publisher's website and rarely patched. SMGL also includes many advanced features such as self-healing and sub-dependencies. - -All of our scripts are [GPL](https://www.gnu.org/licenses/gpl.html)'d and our package manager and packages are written in [bash](https://www.gnu.org/software/bash/), so they are easy to learn and modify. Sorcery supports custom packages maintained by users, which can override default packages and will never be touched by updates. - -![logo](https://raw.githubusercontent.com/docker-library/docs/e8be1b5dd0b212fda27669b12bedad702c184423/sourcemage/logo.png) - -# Images - -These images are based on our [chroot images](https://sourcemage.org/Install/Chroot). To use them, simply do the following: - -```shell -$ docker run -it sourcemage -``` - -or - -```shell -$ docker run -it sourcemage:0.62 -``` - ---- - -# Notes - -- in order to get the full benefit of [castfs](https://sourcemage.org/castfs) you need additional flags (`--device /dev/fuse --cap-add SYS_ADMIN`) for access to `/dev/fuse` device within a container, but you've been warned because there are security implications to granting such capabilities/privileges to the container; otherwise [installwatch](https://sourcemage.org/installwatch) will be used -- `0.62` indicates the grimoire version this image is based on, otherwise `latest` will be pulled - -# License - -All contents released under the [GNU Free Documentation License](https://www.gnu.org/licenses/fdl.html). - -All Source Mage code released under the [GNU General Public License 2.0](https://www.gnu.org/licenses/gpl.html) or greater. - -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). - -Some additional license information which was able to be auto-detected might be found in [the `repo-info` repository's `sourcemage/` directory](https://github.com/docker-library/repo-info/tree/master/repos/sourcemage). - -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. diff --git a/sourcemage/content.md b/sourcemage/content.md deleted file mode 100644 index b3d9cc217fec..000000000000 --- a/sourcemage/content.md +++ /dev/null @@ -1,28 +0,0 @@ -# Docker images for Source Mage GNU/Linux - -[Source Mage](https://sourcemage.org/) (or *SMGL* in abbreviated form) is a source-based *GNU/Linux* distribution based on a sorcery metaphor of "casting" and "dispelling" programs, which we refer to as "**spells**", and a package manager called "**Sorcery**". Our packages are designed to allow the user to customize the package any way they want (custom CFLAGS, LDFLAGS, `./configure` flags, etc.) as well as offering as many of the package options as possible to the user up-front (you will not need to know what options a package has or what optional dependencies it can use ahead of time). Source code is always downloaded from the publisher's website and rarely patched. SMGL also includes many advanced features such as self-healing and sub-dependencies. - -All of our scripts are [GPL](https://www.gnu.org/licenses/gpl.html)'d and our package manager and packages are written in [bash](https://www.gnu.org/software/bash/), so they are easy to learn and modify. Sorcery supports custom packages maintained by users, which can override default packages and will never be touched by updates. - -%%LOGO%% - -# Images - -These images are based on our [chroot images](https://sourcemage.org/Install/Chroot). To use them, simply do the following: - -```shell -$ docker run -it %%IMAGE%% -``` - -or - -```shell -$ docker run -it %%IMAGE%%:0.62 -``` - ---- - -# Notes - -- in order to get the full benefit of [castfs](https://sourcemage.org/castfs) you need additional flags (`--device /dev/fuse --cap-add SYS_ADMIN`) for access to `/dev/fuse` device within a container, but you've been warned because there are security implications to granting such capabilities/privileges to the container; otherwise [installwatch](https://sourcemage.org/installwatch) will be used -- `0.62` indicates the grimoire version this image is based on, otherwise `latest` will be pulled diff --git a/sourcemage/github-repo b/sourcemage/github-repo deleted file mode 100644 index 96bd4d3c877d..000000000000 --- a/sourcemage/github-repo +++ /dev/null @@ -1 +0,0 @@ -https://github.com/vaygr/docker-sourcemage diff --git a/sourcemage/license.md b/sourcemage/license.md deleted file mode 100644 index 5495f219d150..000000000000 --- a/sourcemage/license.md +++ /dev/null @@ -1,3 +0,0 @@ -All contents released under the [GNU Free Documentation License](https://www.gnu.org/licenses/fdl.html). - -All Source Mage code released under the [GNU General Public License 2.0](https://www.gnu.org/licenses/gpl.html) or greater. diff --git a/sourcemage/logo.png b/sourcemage/logo.png deleted file mode 100644 index 966380785b8c11d7bfa7b97b19c646225e58d82f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21396 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 diff --git a/sourcemage/maintainer.md b/sourcemage/maintainer.md deleted file mode 100644 index ff8469c25b44..000000000000 --- a/sourcemage/maintainer.md +++ /dev/null @@ -1 +0,0 @@ -[the Source Mage Community](%%GITHUB-REPO%%) diff --git a/spiped/README.md b/spiped/README.md index 3921d25861e6..5aa0db6599ca 100644 --- a/spiped/README.md +++ b/spiped/README.md @@ -20,12 +20,12 @@ WARNING: [Tim Düsterhus (of the Docker Community)](https://github.com/TimWolla/docker-spiped), [with Colin's support (from spiped upstream)](https://github.com/docker-library/official-images/pull/1714#issuecomment-219556607) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`1.6.1`, `1.6`, `1`, `latest`](https://github.com/TimWolla/docker-spiped/blob/b3b3c26364bbbd775bfd8bca31b2d3d0be60d6c4/1.6/Dockerfile) -- [`1.6.1-alpine`, `1.6-alpine`, `1-alpine`, `alpine`](https://github.com/TimWolla/docker-spiped/blob/2e8d2fbe31f6f48ab34cde6e066471bf6ccb0fa9/1.6/alpine/Dockerfile) +- [`1.6.2`, `1.6`, `1`, `latest`](https://github.com/TimWolla/docker-spiped/blob/2673ea4c6a442d939ab23834aaf2a64c5d916139/1.6/Dockerfile) +- [`1.6.2-alpine`, `1.6-alpine`, `1-alpine`, `alpine`](https://github.com/TimWolla/docker-spiped/blob/32bffc38a1a3efcf0ce6817953230bf352bfb7a8/1.6/alpine/Dockerfile) # Quick reference (cont.) @@ -40,7 +40,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/spiped`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fspiped) + [official-images repo's `library/spiped` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fspiped) [official-images repo's `library/spiped` file](https://github.com/docker-library/official-images/blob/master/library/spiped) ([history](https://github.com/docker-library/official-images/commits/master/library/spiped)) - **Source of this description**: @@ -103,9 +103,9 @@ This is the defacto image. If you are unsure about what your needs are, you prob ## `spiped:-alpine` -This image is based on the popular [Alpine Linux project](http://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. +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. -This variant is highly recommended when final image size being as small as possible is desired. The main caveat to note is that it does use [musl libc](http://www.musl-libc.org) instead of [glibc and friends](http://www.etalabs.net/compare_libcs.html), so certain software might run into issues depending on the depth of their libc requirements. However, most software doesn't have an issue with this, so this variant is usually a very safe choice. 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. +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. 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). diff --git a/storm/README.md b/storm/README.md index 45bcef05017d..d121c280c7c3 100644 --- a/storm/README.md +++ b/storm/README.md @@ -20,13 +20,14 @@ WARNING: [the Docker Community](https://github.com/31z4/storm-docker) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`1.1.3`, `1.1`](https://github.com/31z4/storm-docker/blob/664a7f4730f58be00fd7fe0526d2c13180107c6f/1.1.3/Dockerfile) -- [`1.2.3`, `1.2`](https://github.com/31z4/storm-docker/blob/664a7f4730f58be00fd7fe0526d2c13180107c6f/1.2.3/Dockerfile) -- [`2.1.0`, `2.1`, `latest`](https://github.com/31z4/storm-docker/blob/664a7f4730f58be00fd7fe0526d2c13180107c6f/2.1.0/Dockerfile) +- [`1.2.4`, `1.2`](https://github.com/31z4/storm-docker/blob/f72658afa5e9c4ee4d4d5ef5cf9b32b226d0ed19/1.2.4/Dockerfile) +- [`1.2.4-temurin`, `1.2-temurin`](https://github.com/31z4/storm-docker/blob/14c749848c8ff7c955f2b29c57e327ae80fbbb7e/1.2.4/Dockerfile) +- [`2.4.0`, `2.4`](https://github.com/31z4/storm-docker/blob/f72658afa5e9c4ee4d4d5ef5cf9b32b226d0ed19/2.4.0/Dockerfile) +- [`2.4.0-temurin`, `2.4-temurin`, `latest`](https://github.com/31z4/storm-docker/blob/14c749848c8ff7c955f2b29c57e327ae80fbbb7e/2.4.0/Dockerfile) # Quick reference (cont.) @@ -41,7 +42,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/storm`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fstorm) + [official-images repo's `library/storm` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fstorm) [official-images repo's `library/storm` file](https://github.com/docker-library/official-images/blob/master/library/storm) ([history](https://github.com/docker-library/official-images/commits/master/library/storm)) - **Source of this description**: diff --git a/swarm/README-short.txt b/swarm/README-short.txt deleted file mode 100644 index 0e3c180d3f1d..000000000000 --- a/swarm/README-short.txt +++ /dev/null @@ -1 +0,0 @@ -Swarm: a Docker-native clustering system. diff --git a/swarm/README.md b/swarm/README.md deleted file mode 100644 index 1ccef109b502..000000000000 --- a/swarm/README.md +++ /dev/null @@ -1,111 +0,0 @@ - - -# Quick reference - -- **Maintained by**: - [Docker, Inc.](https://github.com/docker/swarm-library-image) - -- **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) - -# Supported tags and respective `Dockerfile` links - -- [`1.2.9`, `latest`](https://github.com/docker/swarm-library-image/blob/a2a08d733833327354b5d3336ffbd19e4f369a2d/Dockerfile) - -# Quick reference (cont.) - -- **Where to file issues**: - [https://github.com/docker/swarm-library-image/issues](https://github.com/docker/swarm-library-image/issues) - -- **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) - [`amd64`](https://hub.docker.com/r/amd64/swarm/) - -- **Published image artifact details**: - [repo-info repo's `repos/swarm/` directory](https://github.com/docker-library/repo-info/blob/master/repos/swarm) ([history](https://github.com/docker-library/repo-info/commits/master/repos/swarm)) - (image metadata, transfer size, etc) - -- **Image updates**: - [official-images PRs with label `library/swarm`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fswarm) - [official-images repo's `library/swarm` file](https://github.com/docker-library/official-images/blob/master/library/swarm) ([history](https://github.com/docker-library/official-images/commits/master/library/swarm)) - -- **Source of this description**: - [docs repo's `swarm/` directory](https://github.com/docker-library/docs/tree/master/swarm) ([history](https://github.com/docker-library/docs/commits/master/swarm)) - -# Swarm: a Docker-native clustering system - -![logo](https://raw.githubusercontent.com/docker-library/docs/471fa6e4cb58062ccbf91afc111980f9c7004981/swarm/logo.png) - -`swarm` is a simple tool which controls a cluster of Docker hosts and exposes it as a single "virtual" host. - -`swarm` uses the standard Docker API as its frontend, which means any tool which speaks Docker can control swarm transparently: dokku, docker-compose, krane, flynn, deis, docker-ui, shipyard, drone.io, Jenkins... and of course the Docker client itself. - -Like the other Docker projects, `swarm` follows the "batteries included but removable" principle. It ships with a simple scheduling backend out of the box, and as initial development settles, an API will develop to enable pluggable backends. The goal is to provide a smooth out-of-box experience for simple use cases, and allow swapping in more powerful backends, like `Mesos`, for large scale production deployments. - -# Example usage - -```bash -# create a cluster -$ docker run --rm swarm create -6856663cdefdec325839a4b7e1de38e8 # <- this is your unique - -# on each of your nodes, start the swarm agent -# doesn't have to be public (eg. 192.168.0.X), -# as long as the swarm manager can access it. -$ docker run -d swarm join --addr= token:// - -# start the manager on any machine or your laptop -$ docker run -t -p :2375 -t swarm manage token:// - -# use the regular docker cli -$ docker -H tcp:// info -$ docker -H tcp:// run ... -$ docker -H tcp:// ps -$ docker -H tcp:// logs ... -... - -# list nodes in your cluster -$ docker run --rm swarm list token:// - -``` - -See [here](https://github.com/docker/swarm/blob/master/discovery/README.md) for more information about other discovery services. - -## Advanced Scheduling - -See [filters](https://github.com/docker/swarm/blob/master/scheduler/filter/README.md) and [strategies](https://github.com/docker/swarm/blob/master/scheduler/strategy/README.md) to learn more about advanced scheduling. - -## TLS - -Swarm supports TLS authentication between the CLI and Swarm but also between Swarm and the Docker nodes. - -In order to enable TLS, the same command line options as Docker can be specified: - -`swarm manage --tlsverify --tlscacert= --tlscert= --tlskey= [...]` - -Please refer to the [Docker documentation](https://docs.docker.com/articles/https/) for more information on how to set up TLS authentication on Docker and generating the certificates. - -Note that Swarm certificates must be generated with `extendedKeyUsage = clientAuth,serverAuth`. - -# License - -View [license information](https://github.com/docker/swarm/blob/master/LICENSE.code) for the software contained in this image. - -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). - -Some additional license information which was able to be auto-detected might be found in [the `repo-info` repository's `swarm/` directory](https://github.com/docker-library/repo-info/tree/master/repos/swarm). - -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. diff --git a/swarm/content.md b/swarm/content.md deleted file mode 100644 index 5a2e334346b0..000000000000 --- a/swarm/content.md +++ /dev/null @@ -1,54 +0,0 @@ -# Swarm: a Docker-native clustering system - -%%LOGO%% - -`swarm` is a simple tool which controls a cluster of Docker hosts and exposes it as a single "virtual" host. - -`swarm` uses the standard Docker API as its frontend, which means any tool which speaks Docker can control swarm transparently: dokku, docker-compose, krane, flynn, deis, docker-ui, shipyard, drone.io, Jenkins... and of course the Docker client itself. - -Like the other Docker projects, `swarm` follows the "batteries included but removable" principle. It ships with a simple scheduling backend out of the box, and as initial development settles, an API will develop to enable pluggable backends. The goal is to provide a smooth out-of-box experience for simple use cases, and allow swapping in more powerful backends, like `Mesos`, for large scale production deployments. - -# Example usage - -```bash -# create a cluster -$ docker run --rm %%IMAGE%% create -6856663cdefdec325839a4b7e1de38e8 # <- this is your unique - -# on each of your nodes, start the swarm agent -# doesn't have to be public (eg. 192.168.0.X), -# as long as the swarm manager can access it. -$ docker run -d %%IMAGE%% join --addr= token:// - -# start the manager on any machine or your laptop -$ docker run -t -p :2375 -t %%IMAGE%% manage token:// - -# use the regular docker cli -$ docker -H tcp:// info -$ docker -H tcp:// run ... -$ docker -H tcp:// ps -$ docker -H tcp:// logs ... -... - -# list nodes in your cluster -$ docker run --rm %%IMAGE%% list token:// - -``` - -See [here](https://github.com/docker/swarm/blob/master/discovery/README.md) for more information about other discovery services. - -## Advanced Scheduling - -See [filters](https://github.com/docker/swarm/blob/master/scheduler/filter/README.md) and [strategies](https://github.com/docker/swarm/blob/master/scheduler/strategy/README.md) to learn more about advanced scheduling. - -## TLS - -Swarm supports TLS authentication between the CLI and Swarm but also between Swarm and the Docker nodes. - -In order to enable TLS, the same command line options as Docker can be specified: - -`swarm manage --tlsverify --tlscacert= --tlscert= --tlskey= [...]` - -Please refer to the [Docker documentation](https://docs.docker.com/articles/https/) for more information on how to set up TLS authentication on Docker and generating the certificates. - -Note that Swarm certificates must be generated with `extendedKeyUsage = clientAuth,serverAuth`. diff --git a/swarm/github-repo b/swarm/github-repo deleted file mode 100644 index 7b66f8a5b994..000000000000 --- a/swarm/github-repo +++ /dev/null @@ -1 +0,0 @@ -https://github.com/docker/swarm-library-image diff --git a/swarm/license.md b/swarm/license.md deleted file mode 100644 index 957e50e3a77c..000000000000 --- a/swarm/license.md +++ /dev/null @@ -1 +0,0 @@ -View [license information](https://github.com/docker/swarm/blob/master/LICENSE.code) for the software contained in this image. diff --git a/swarm/logo.png b/swarm/logo.png deleted file mode 100644 index e96af6ad52d7a764eaf71435ddb6e2410dae7515..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 123625 zcmd3N1yfvG(Cy%Z4-O&N;BEne!{F`?!669*9oz;dIDsI+-8I3TV1eL);BJGv%j4er zz4!jYS9PZLsUuTcdUvn2y3c2IRXJ>oR~P^Q09!#`S`z?3d^trZ1ERh(ek2daFAchr zyn!nKz(M=Z55cog+#LYGQ2QVyrLO+o5$fpr-qDF#K}w3+$;Hv;gS|BX;5nbEWvi_P zCl<_4HHm=Knvf_MVFCjS4LV3Mf+ly4NTVB1Mh2ODFed^jHWn65q``(2 zi7|_|Ns|{FoF5T6bid}4Z#UC+y*=_&|5t3M;ym;F7+Mz)D_NdbgAayP3ZcYX4Ib$2 zU)$u62*jXs0)T+ut!P{yX%PT7{vsl*;4ZWd0D|WfCJ@l2lHSGjI{X=T50Yk#01H9r zf+oCG0>TIZ65g?pB7lS}0xUC?K?{(B3@{tEwAcWsvjfZ+1Gc9Cu*{n@9|V9=5)BbT zP6B|Mz&b)2@Lm{DF{T?S1JLIJ5ZWm93Ib-?0bB}tHu8X)MnKmn2(u0V!~$?>M1(Q} zkbMAVgS51sfRHo*q3oHS$SG?TXouxxrqb#}n&|{(0*!#|&S-ji9F$C>3M8zA{N{+} z-y}GCywb>c0^i`Sp8o~_auSGMMtlC~If_#?I?5m0fMd$O*NOTJwy@ZE+8Qf&k^lhK zp#Bq2Y@FX;!Guv^pPusQkC5NL!_0BJj zh>`h_p5K#gk7<|Qqy4SF$iwyJYR5WVAdg9)9P-U-&+iN6!q;P8&_gU1x8vj<8Zn
SJ>{6#8&tKH6O(gd=l78Oe~SE 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%0A0$5@ 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 oNwMCLz~+JAQ4f*&8F)`&FJmthfj- z8P{=RV5+&ihw-UeYY&a}%rh=3-Q6)>f+0nFyFc10{siw|M-~n8$H#DobAYW@c5XFC z_qhwqu#C&S%5yt`;1z=RV#BRykS=QaNo+QVeR;$uWJJiK2Q)awU)zYY9n3hNE?jSW zp0o6C)pV%8ufh&SPc7K|3qNx3$3F0##o~z>=|u)zw7iJ^|3g;A8Mw*tNh8mC=NVmN z%{S}AitAY~zzuBBg}}Q0pL=4w8-n~Oncq^B1L~D;%7&7=Fb(fxF~1Wx z)%Z`f$s3^xDv=09&eSk_Y4Zd3(;DViLd(`bGR*-B={sSD=jKM0uK{-54|oXXeTGxt zRza70)^1=g3GR1odB-DhSyj+~6w#uqmPjDezY+ml8~+_)>qeNtiO3F?bhzW0?B68i zvltmNoZMlja_gw14(PXYP=&9*);3^7>sLMVCub?L&N5y27E={G)50HrIgcVH7DaAy zc1q~Ykjl_?Yp3+F@73A!3eZ$VYodJ86XN_AWngJN5yx!)ub%5IF$mcZVePa18{j}J zPRqaCmWaa`&%M-f{}wnUsYn4htf}SO06Sc#fXhMcgFZn?BMET?;lJ{_^GABQAI5xK zzC&CSwbJ#J#PpOj-lbSPkB_N}V^(KF2*0}JAMVm{$0-mX>;s~{v<#?y%>szn%@G$< z8uwPrDuN7_pOf*vycM;`G{I zxn$n016Q7(Uf5e~|8wqFXsQWAz};y-G=Q|RB_0t{uSRM19>mp*00(CKL>`YP{rbTD zgh&PlrH9OBeXJv_jEx-1wqLN2%?X3HE&esTnPi?D#h!80)TKRXBQqrlLC<$Ew|oaX zw1HGHp$KVjam9QyBDf)MXnzX^Ga!8N{WL-}d@D8np{~8GxKj#=#25u8#!?KSyk7g)xeRSI6Ba&d!ryEf1Y7twH;lc}HGAG2YP%mv0^cMdI1aEucT&PNU@2+?uAT?H zkkQx(h~$s@TVqxw{+Gf=;Z$fH(MtHGtWB1&UI!K4QhyV4%fdz3HN)@ivWS1)t{XTr z{p-IiWkU-aR&VNYsV57@;9c%NA}sN5VE3xAHz1%jksgjH-(Bs3qurLgCPaE;$3>Id zcAZ2SqQN>NlDHR5uV*jXucml-DLLQ!;g_JA?`YotM8pgtxeB`5JM&@(HE;YUe}8xg6z)7mY)eu|Z6Z$nD}p^kFu zfLG?E>4o(GH^TOdM&L<*HsNo&?`f3%wOocbqgq&RIUa4U!}93pYevT^mUZiSE_hXs z!gkZ8Lom47l(ck|o~j+B5HOr**(p&1;67^yU1ZVwK0LtBZp?x?+%CA85D}%PWzdm?=5*(g|sK4Ec&~iAK ze|c2}qpI6HAz;|yt^&=e84v$ZI;iDAT)Yya#n5}@hPcav=w^2q7v+b^boB>z4J=LY z*+!AoO!}6BL^liR!V_$jeW;w694o=i8r%r z?qQ*eV^Cd@-(lg*(A*tD!E&0QnQ?BxFMxp{mjjk)mH7WVrUAhM;%JEztHzB};x$Q_H z`l?~*pW>=$L5);rGv<%&2xwL@k}$1$ipUelxe>sc#xbRZ2Q}(Ekg+95J^iLld)DLw zMMYdHFql=)3Ca5!_q!H;<7T}}epDujD((q`C?&oAQ&(HiejS*i$y#?L(CzP(V*#s> z`rEs&9}K_sFny+Q#=E2n=IK>e%)io)K@+M3zK1UHAphl8m3kP#hjoCFByWpBaL`Fj zp7@9u2(o$tl)RwH>w*U&in(G$J;19Fa`Ew9OGWP=v`xfVi2GW63DJ;V-L)_wpdRl7 z6W*j}!Tq0_Hgys(MZY<=i?^~)+5X0s%I4xUc`;o#9u9N(g$8X-qfH+Tj$Q#JpiRH@ zAsh)+X7`O3k97Ck@`q@S$3dG)DKY2J^NN@La<&$pV!wc@(f|arZy6WAy+V9Ajm!vX zCuUEUxOH<_)7j1TjGinVs8bO`selKesP z$+6@GrRz4$5O;m=gQ%)%Ws#f<49#kW`RKKwBtR&i*}(2yg$?3=I9kk#nutnp$>)Hm zR#)wCEMAo0@2$woJBq4_N^#49Vuw}o9~I^xyc^55odF5c3#6PV43_5* zC4_`t04yGyJg*flndV}l=I!8%{N$s4a_=hb&h>!Y*0`e_l! z#(>}0B46)^Q?vFtrbY$vbsn6WU%eU5s2igeSSwozTzELuOfn^tI%mJ%rt`L)k>jEP z49ewqUnd>%6o1lS>WDK(BNr*&viv5fOdzjOT<3NAW0hAbO??`3(JZO!lfe;=M=SON zngoqbVxptp`U&8Ev<5%Eu+4Q%7hp5 zjOb6?7uUGUXIpj_)d5~;Q*Vj6w;KLQxRI4|H0Dzc)4x4@^~TE1>~*!G(u7U*47Myr z^gkX3ch#J)+G`X(4ec*=NOa?~$_FdD_#Q)Y=RY$2JBcW4q8WWom_SY;Nyt+0ytq81 zjo1FKoP&A;#u2nS5KP__bV@lG#bYc|T|p^%2ucd!cv`FrI?M{(K7XmUc#Hu(&0XRG zOeNuoJp09Ua7EfjGqBUS&t_+9pj)Bm`kOOzMR?>5i?E+03V+Ycb}TT*bS z?>$p?6dZRyMzdR+))fPx5jk#zE>_oSwcuYgo$ypcPOuc!ac<^lCM}y$OHff#amSWM zpO6O53rKCoe-%2ZvI-NA>eIi`HpVXhg_VhN6}Olz`AntvB!sv&tGQLN!M7nNzc#V9 zbjaokA%4kkO*n~3(mgZ%GME)_A(@sGwQG}wPG{=>5cPR$Nf~3v#iQg%*!ptUXgk6y zoR>3CSV^2BID@mGJGiIO{i*Bb(<1L1KSyrEs2Cs+eI%Y>ZXYnvKa}yWnVdz^er`Sr z(mS!%yr4d3txVd=F1r+F7)dWjrg{4{h&(>h23jB;dG5L*#)I;!k&=(C0?q?ET1rdp z!4`+|oV5r3PCt=^@v_G%L;oae_kBLb(Kr8RWX>$Hgj}s0rDTiQ;fc5$rZ3wGj**dp z#ja>ju=P_jaPD@oiEnRSiElak=#iKpeCd*KuS`>D6~*EacA(MMyRxjvNlp#=>u?}3 zccna|`2vh(4a9Bs%zF`fN#>Y1CW5@G2 zY{V+*wt*|VE?g4baaJ5bIJ-XfV-Zn15LP3t#Mcc98V5JNziLhExp3QAr%F<}Aq)Dy z_&C?x=nPfcfnisN!2@FF0N|^1#??+y;vvI0wa4r&?$NYNKaY|c6$F8vN6eL|_W8i? z-Cqh_eZAQR#~LgMfZ!b>7}A0BrjKcTK?aNx-MY-Y({|4pjMFC^Pvlq=xW^GvW9RlQ z-%<11RfEOz0ZL0v{h+}kCp;=7aP8FNt^iZm`;40`Gl|fvJ+J!-*%<^^r8sqI0>Frr zU4jLTk4p%&E0~}{bywpRL1QSkX(=22cbA)p7t5n8-#fw0Z#{)bjT04xkIVmkOyI-U zre1DN&+ki~sR9q9PQxsq6L}qQ>Znyp%v>R@uNr!Dh~`8_9|<>&>E!-jGZw8s&(#Z$ zmvIQIRLsLtogmHy55Zl-r+ovuR|O76mtwC3j%&wR!~GJa4@=1pOs_$4IppI`_^Nm^ zLOr|5Yi_X{V%;`>(pM(2RMp?A;mk9HA16x)uz+r`zSiTlms~s@j8RQ#(X7!MiYW(P z62@{QF+8be`^yGG2odLWg1NqAMpC<$8l|(DL#tPp@34VnmSO2?MMq=gbY{fP5TEfs z6Db+MEd`OxdqdluGXTO{NA#2N)6{xIJfj`~QwHPJ>SPCp#*fckIAEU{OLjn>aUcnx}x%#1BUU{s-MB0hOQ0&{5zS59#$)*kiQRrk%aE zfV2svz}&4{j@?o&K#TtV81(yzF3;KmsZ~4{@$L*?#RrOCtsv$Ad4B1;ESR0OEnwu~ z`RUhsdaYMkW}>e73m&?LZ490%uxR|JKZbJ^PPJ;)Nb4n3$WHP=j-I!B9vjlOKhPkgW~~;<%oeNWA7oAhrW})kZ0{F-3Gs5h;;!JzPSjfO1_yp_u!DFaO<>N8 zs@k09q3OTpU_27{n#U}AX18aR{Vi*C&1T=LbBaE@ZQgKcRWe`eu#Lp+e>KYN~F zG3gw7&@Gd-K>YFmelYn_S}K(wK=+7rfvQ~reVGMxfTmXO)HL!lyPcC$PfRPh z*lRX5B{{!1fX8Y8{=y9FUX@oSFPZ->Ah6|P<$^xf)->=WP5d?n{DU2r7BQB)xNz}* zhx}3me~g>*-)@2LCj}v^*Bu5?qLW-iW`)>k?2FEoxAPiym`N*%}5+%&Z__FcoQiKSL75K~){UdCo zJU(!z@QLszwZt02a5aC3B(eNA(E)ag*b!Wme*H_8C3(OQLnH*I^~Q8=THR(}Fvg&& zFzkS#T=wyOngXjX9j9?}5<|%$oHe|{f8+rJ%}jH7(`Gd`?^qJw`V{6Y!*iMeWvr%T z4tFH@&u;FDfP|bht@_)_{fncfADBSBWd_J}_Fs-dd!Ida;FP$E_ixn<4N4btpfjcO7uEl*Q&jo)_i!L1u-!C2_~fdr}iT#kh0j@}bu>AqmD#unLe$f;l$b|l)w zT7&YNTxLZ)f*-oj#Wa{z=$;D?MUu!DPJ#{CRb66H4#=x=s9T7iaZihQ$9i7B*$RE~ z^}JN}6!n(*WByHis63p6JNoOXKh7^NCNG`VD-d7$UsNb{=f^4Z1B%jSCR#f_6MDUK z#prF31^b2pPw(#3nKXPc6UsGV-0fzJN%uCghWD%3H3NFgD(LhG(vnwUI@@Q7{qH9` z2`0D>hLljS<3cvD;AJif)do$cYO0~^!X7U(6EQGHfck~c_pBiZlKy5irU`uO1-_LN zznKS*9>uI08Xjxy^U{>Zq zU7*{!A}-wf3%{cKp7gvL#6EL5ZL}GL{IYh-O8bPnSm<-Y8njdRV$;1d^uq3N4iqbe zF(v+KF((^&xRZK7aG?5S3YhiE!(LLQ%Ocy@z-VF|bN0dC#ilTrE z`&j85Ss>=iys1@xW?B68MOFKr+XaIl?_{$OW7C|J@C&@phoC2K0Lp|V3<`V68PVA5 zRy*rYe3-9Dal?1yh#gBRjzaiKlfSkq`|c1S3}PpE2=VaX%@%%|6aTZ(XD6yB=O?1|1NR*EK_4C>Y&L~Bm896HcHGAaWMI3U*6k||EBB6b%nj} zOLvwn5|Bn?K)eF+?gT`_k6cnZuc;twaIeE@T3H++LM_CFphsj%nIZ#|`rra~geplL zgg{BmBAsfe4h6ZhA*BJL2WRELqt4k^b4*b)TwN)B=$7-48Ld+z8_jw?cxG&}YB?+QG8PiJ9%0R=>(TnJOZo$^A`)NgdR8DSLbgce=Fz$C?! zYO-$8%@&&P;*N%GST$D(V73(hHZxV1P&1`z!+;j4h?1C)tLZe6 z*W=p5KcLSlIY=q+8VVN)d~gWLOM2-D8a!)u&_seG-A{VHf36EUQi9)~aY)#~Y*mq* z_wJB*Y1;03EU_QD@fkNBBu{MUK6+iXqb>5npuC-5@UVfh-mSN=tOYYdu-$be23F2w}GOlW%T` z8F@X-BM}navBY1|dinMtV+fJp@X^g_oHK=wD@h*Ao&tzP$5g31&b!`LAMbwYeT)Fs zW4*2wA2?iA8jcc6FS9?$VYOI!%WD*QOI%s@DsrpJ)#W+pf*1r|jLZ3(!Eyl+xIMd)UC)R{a*^aPGDy?Us0$mu0;z zQN_s=!~rY~CQEGw`ZV_u|{ymC9P*-l|1+F2ff-Jv0BcAE=@>gXf~bRh=lc-%ybF8dBIc9-8T0tZ zp;7*Ro*qKdD}*GlrhPenM~Q=d@%=t}^y1ZqdcuNHT?U8F-Dllc=6xq-7Y{tKP@u;& zHceJTxm#fJ3Hor?pRgs>-ZhFFPg7if3K1l3{{Qd><=zcUSx_8oG2Xny_}U&j*M9y* zno1k)PM0> z2aBkri!s{U=;Fk7xHC#Ah&N z!QjHZ*s7#B+#~4riI!H~;vnqYav|yc0>GvtC<{jlsFw{HOjRI+oIMY1Fja|=(q;PT zgmAFrGDazzMMW6vY_zbmML=OhuyV>}-E}Rx34X36-~yO`Qy7==3#F*0j@14C+57J> z%Z~HD6aQ4zNjG*5lLIiAK_Cbw5fqcCKm}8lOv$t@D_EA~)yivIj`DifL6(CYw6a$A zTK3wqWUnRpXGJR~$`VO|Vgx`Cc`$jVr*q$UQdRx_s5l`+kFJG$*n^EGlVGs|UtIWOvR#Cn0vQHF*dE(aZSK-!L4J$nt;TcX@#EqB_{o;S+tN#4o6yNgq z{yBr~F&7?KcP^1iz2F~b@if3-HSk$$=x=Y(+lFRmhWGq0|0`eezW>GkkAM4*_{AUn z`v-B>$KL_`_!q+QccTG#x<;VPvFn$d4*KxTPDXhB66WELV;;K?d+E^^`nx*o!m`*i zY1WW&e8a2yDWBe#AKEY-LtOpYe2!yOsQo`*FdKo2kjLigmzL4Zi0GaBNRhSoKVC`U z6$X0HqgXqK%{C}@dtCjYKaWjE%zf)Ws^NEwt*1b&aksV1Yr`7K+_~WyjUJC&h)!9e zv$3DveQ=M_ZW0#~J?x=wx|N{iC(&wR_RzRBZqkld4$-;kR&+Wh-`gT+b_iN+w`a$? z;$|%6uunPgCJNFOWRs_!$?oz4YVCT3D1=ds23Tt*!9dj%Ulx9sU%}wciBM;$W8hos zi?Vy)rpS@9;beARvWSonH5^BwiZl*F2gOrK{o?v}XDW0+OdggR#x@QPx5jwCgxuBn zICjm4kZvlkzON4(a)^NNiHO$S2I*{mZBaN+1?9|^FvdHoQm-~#V`3ay6Zi;ksjyCh zTlhBibLoVdt^sHoDW!Vm4S;3y%2nR>_20_Mv0K=>vPqVXTw3CbbYy(af9De?$Acah zKD|S;J1hR||M~a0{Vng}=YII_@$g6g=YPb>5C09HnHYJa0eE#6AL$N)-j@4hx4Wn> z`;(}5ejWO^e+K=*UwOexN_OGXQQ6Byd?3Ctl`H?hDQ0_}n&%zpUXefAla3SZ>x_N| zCt5vtdSavypxRxM$i6all1U4hv?me};W-B55$M849J`f5&}^aN2KnBOBNx=q zl{2A_Nw&r~G(&}E>eKeQ5P&{FqcbC`N&1=3REpN@0==y@wAMAh;^i^#DbhiYbD!Gd z*1O-%Klp{;`T_u(E7vBN$j4b;2;4Dyb*pg;J_msh7ON8>%U0@-QUl`t9_Gy|2A2VDx5j{s* z%rCDYq6XGmL<OR1w3z3)=|-bXmB`ciNDkB48ESWUnFwDok8y)7oc2_ zhDeA>@vaiJe4`+hvrI0H1{u`f$EgxZAN(WOC(rYZm8jy3t0tgA2X?RLIIG{NMj@+v z*=Rjk5oG~(*RP5qbB&XJ7S5_=p84A%UVa~2ArKgL)^|B{YL?;NHoy;8YmZko;C-XO zKbyNHAxp9AR}f1F3BKWbP+#$<5zB|4?<@BJQEpw0^Q-5PjW6{345F~;ts#16NO5I{ z;bRvmE^Q;Or-*^}yV@I9eTD^KMo#8vOBa$Q!ib{3OS*oAu;Zj|jf2OKQB1P9%FLP9 zGIQoGqPay>XNGv`070YWCR^&)C9L& z&FQj68!F;wwVM}GA>t-_utT}->Y>fX{=GWI!M@42g6C`W0=Lreg;-SGi6`|roqoQ* z@Oa*W;~?k>_n^^5G-o^lAolP0r{Q;NYt=y2z(|kin6gBdxt9_eOqP1SfO7W4+gB4{ z#uxXa)k~_ky@&9x{9lM>=P3<96gP;Q!LvdDJ{u(ea%cv$)^z6PIdF28|L1%ED!=jL z|Dp%{voDaN_Qv&WyG4Y+?yO^XH&E~VdcyDcyQp{n8N~d`bA8nt?Y5;S!1=v)G`C3S=G%$qmkAo}x`3Fn zK#xZb^4H#{zAP$lT+bJn%6|7jHq}nvN#@+wnkpJsg%i(zCF}QQv3~DgH7tQ++*|8h z?26nKPpBh=tHNw6=6U}2^98_HKObP)r1+O5vrEg&EVcQ!fAuf%JOAZh z0sMKMJ{ajn190PF0s|U@y>=d(=cu=QHQ{&t1Jpad4sqc4vwgK~phQS%P5J5swkutJ z>{I1pFSU#OK09>(jF0{;Qddx-X3I@8)$}FsaOsUlaNh?xhH~?=gXXLKxQBdAo>7hl z&ey-lk#XYp<9c!k8(k;ZxrtItn%!!$RKdQ2ENTLtMa?W%Sg(()b+yH@&haEP4@Vob z9|5RRKE1u0P|B13{BvVWE$4DlHZMgCqKW_VRD*8I+%x=@Q#T0dik=W&b{9Cx$4d?AOwqtPmar1C@{W12-r1b2TmNL(MtG{@A+o) zyZ`lHgWLQ6+!xBZaf1W!yiZ;Qd5YamA&gM(`UccHz7GAd_hat)4eZ`C@|8&4@4}Kk z_HpFby!F+0pF*HlP+UuqNl01dARPl*C?_j2rX*-IKnavo7*U{9NZ4pm<~iADfF6%% ztTb!y{2SM#!K$WQAp=kR@;G07L{G99`1Da6FRPC5rCooAS$@RP4=2xP6bpEL?K z8#;)*Y67IJ_u!_;Cp?IXi9ZdSS51uc4T4`=h#+(gKt*Z{LdUDnx^Ads7)~JYI=sPo z?N^9KtuXLzel943eLl@rYll?$M#bi1tZzJIYu2GDd0wjqCbNgE=UHnkG7RdUOLe+F zF4*{8e_6iv?N{Vu_hat+ z;1{bPEDoGF-O|M?Tc@nclJ3GXE5{o=^x=p2vA_0bx%luWC2ke_y3ksaeKwp)Kv`hdE5E71f8dpd4>ujzaenMr8sI}gke0~A{!2fnl2HvOvk7& zcDm>1f&jcCLl&Olj~0UVAu`q!*nEU&w!IW>KS?cU&k(e`4#M^x@(#B4#lc!k?lkJs z6Y8qz*PW$KMplvb>Vjqsda#AfQ$!Sb_+5BHTJE9u*iXu4!YvS$6wpE->esEMbRMQh zd9ySB3x7?=uK|;rGsee#$TU zyYA~%;4%cHLV7YNM*H8D!j>5(8~PPO!c4nOf6yaMb6TwiMjP_7Xar&KCHc7r0eJHt z|JLTxp~GxlyZWL*^e@K8(;7pwJIl;chu-#>d;Z6-@RR@GyV<#ZWfz$D#s6#kIs656 z-Dm(_w2@arHg=7G3f(^K=xNM>6PODRVITh#cGB&~xLusKx^N4|S8}nkt{@?&XV<3nkx!c>k1m@Gv`i7SL!V~TPLnl5WHTlEXA*9$^ovdqEqQCw^3 zMd%Xf?5K~`IYK6Gr(I3_m4VJ=6rHkuo%(OqP0*E#AI4$@u0iodwo2}-zGt;YsDg1& z3gHQT?)&(O*iV8rLC|Qdbw$*aIWmk;jkZe{^h84uHC!y*v^Lk1A)U{DIBAT^!tL23 zXW-)$2a~l2+W7D78j>o;w{|u(+L`|d;Z^{?nK8OV1ugJW!bFI_`&G0%?TcT_ESzx^tNV+S59{o zbG>?oCp-er==a4|NacO~^J?7kyaPZgw~O~zIT|>4Kcpt(Rph#A1yGUm>-ks+uTJoZ zcyR;S=wSMr$o8yDLMq182)U(}5>7+p&dx)4#e=S^j!;3(b+Eehd->44t}ZdXO>91P z!9mu!CrVGw6H-v@Zd1-I5O(J#1VlX{IMzsll+IZ(OR0WHTNL}Ph>ILM?jw^nqBT>; zJXVf|6JFM)iogzbiI%%|;T`WP$LG!l z!~ReRDXp1X5yOA?PhtByZ~U@9!O_z7D=hJJefyJ=hlP|VsR)D6`6x(< z3Pa*XM3g|0L6&N+J@KIZ^oM?1Y+t*`{eSRl=K6)ls*ZEU7yS1F{~K-v`vrO3XaHWy zMgWW5S$9u!yNmkDZ$g~B1O0nHTiUDVt^#k!&fRZq@l ziV_>)82PskO7T@~*N%JwP%_Xr1*2BIi@ zZ{eDY$~Z@MmnM+AQizh;;73SN+pxM|oU(2}YJPy%`&Wts>L461OAKPSy9T#vs2YXJ zZO@|%MwfLuUbPCS?1d-kPfl`Js~wCt%Mq%E;$>?VA%lJ1_jZaifKrGstl{|@g{apG z%6kxa8DACBgRL8m>i1yF98`cw2aZ%JgGmpjrbwM;qK2{F^r+f#Px&I&;XhI;_ojW5 zC6!wNR4WJ-Ml_Ee7eif!Ww$FDbF+k}ZWs9ne~aDs{{lh?zV!$GJ=wUdO_pBpV?$U1 z71Z}DjAMczM8y$OIo~hg%^dR#@~mXs+aVk5q05py9kRQA)jsj5kBCbT-$#FY-JbvS z$IBv1OI*-V^`?8kAK+|$f8z_iEZt}TJ}*U5z@Ud6_K|1aa7rGz`OU?@|NBSm_8Ou+ zqcFU(chv%96j11b@%0T<7$H?ikR;^!7;7|ft4lWQG4AhT%A7JA(_UPy57FlABD%;K z@9ki*BuN*O7Z_8bngS7cpM2px_&u^fW}X}4_W0FnN{8Lb_B=wKcVR$PK`nDk zIW@VK<)Ib%urYelV6t#n4z0%Se5r*{+UVGCZ8AWv(VHI^;RdT7+ zgnyv5BSHcqO3<4Zo$(MB*_cKE%86{!n0oC{p#e_XXP=Z^Z)*vt)s6>ZjrR7+2BhE7 zNsCAl3S-gZRH!VaaqFG*@A;o*{V%*%0OGrT@F!V1vdE=JE}~w*@E#dNG&@}yt(Y)| zbO?Ex)=|Fcu+Q~N=g39_loUle9@)){kIVHd7lP4XkIjpZlZ}Vg=u(UaJ#<-A-A@&9 z9Qyx(OZxj!;MakxH;T}W2H^AE1iT0MCcA#=Pl@?eDHac4x7Scf2a)i~X1N;(f*2h) z(6%555@Z-qmKi$F38Dxg6|MPY^3i}Y8xuD>SZyfMQSAx`5H;JB*_a|viQ*O##qiNJ ztOS9Z8iQ_|p!@U|%0hz4Eq0hu<|#6d2yBAQEhOUAg90e$15m91WZZUkvQ=UC1+emi zua~VtxS{$yAikdCQ`nQ&-(Z=YKbht-89;3^gGS9G9qr%wn1%l9Nn1MVSqIFKTvx_lKa#ak6 z$Y#vSJKv0oR869uo{Y<0PB9oF5TwIB+T93|8Eo<@@)Oq7DS2kJiy3UA+H=kVw#X;s zswr*%J_o$14Q#!)uc2{0F|+Y202u^M%2_$xdB;7lZsG*b`uEehPoS&dYB$kKY?TvW z^izsOO+GXRyfjcYI;gn=nEobucg_7fDV>o|y;5)!eO37ICOQbvc{VB5QzgV|=cp&b z*h%xe7r%&GuE3UA{R|sZx+3a*4(b9c6*5jHlEX^(FD6cY(n|*MO$xqIz)n&QDGL{> zWL=_R(CiSjXI%1M>HHByZSOmF_tP5_IaPw1ARHda5f!gPxOE9S_i>U29Yw61I!$=z zX)gZwPq6hjza2on?{EGKzV0vn4K6>nIrTev4)cI9gi*}=fn~B$!4voY5r6p0|Cw|5 ze~c@SKVXY2tqOS+0apDvd{UvGegi{XK+&2n@)vP?{d@g?|0H!#_l@gD1MvC3-Ua*s z@Yd>ZHDx(4X%?$S*QnV!SpvoSd33)(gyAb96i5U>4thI91kz3VHm59df}{!3QusqR zh#Tl4#~4izC2U`Qf-)bwMxZRoMvjZ4!VndN=&~S)5~4;M?UU2WJVUAg6-5|ph=Li4 ze2mF8s-d1T(F^4Y+GuB!_R=ac2pH~dk}!*Gb+F!}<&_Tq+Z^(%E~eTHT@s)xG66D9 zoMDXee)Q!eVXoG#PZD)%AAKQk)9#a5Sl0R!JTHwawNC*A5j7D}0#^IALNR$wt0%}q z?L5fDtjHJcNzs&^^`BvMfe1neX{W;}%iILAzHcl{JsCSMfhk?Ss+jtv%MqyZa>_|I zfVDn-FiLzQkh#KNuOqzfe@fS1h4@&{y06WLEEC;-wW2^Elcu-*cPMo&@0B@yZ$h)zux^FU6VZP-)H5&V4eL@jk=UY?OT9U=-ws-0T@HnYSY@j&gMV-FKqqD zKc*FT_{%@>JKXiQFJkTDCV4uVcq}~2so!YB;-Mq7X9Yk1BR|X^{mTExxle!MGfnV& zzKCDOxudp#OE|0a`+)0AG(0=N7+8N%3ggOQEP{hajxgV8(wJLtD=TAORYmDW1MuQs zZv*~0@RrF3*BCt-+o+N3MMn>J;=5koP0xLp!G|Gz;(m(F5z)b!&mGYDl2@9k{=9N~ zl`y_^9lJ9oXg0CJQjCTaMM@CI#LX@$N+`xdvcVqKXrgADeApu$?2@#)M2(j7E7uw+ zrB8u#{s1xv{6UAC^sMycs{mc(=rkjlpGPIZ)5`nY3R%(YE)X@_PVyy-$;veHM~ayM zj8Zv%!7C+|(Hdu?934J0DZ-5|w#>Z_e=_w8AH?H4|EJ7krXd|6YROn_y<9ogRZ={! z+Y&*H-o1|AbLX(?F1p>kE~he_sWtKyXoQrgDwbg3-0dgy6>|pKtflmOtz**p7Kh3}NN8927cdgbC#gnPH zf{6ta9le+4S)*%7UBzaf6y&Fw+q~4Znq-A{2^3RZSmpd^weie*S+m+Ja$WsrFV~yG zkUb(HJ?a#?$y}*@Z)O^z7M^V9o`JG{Z#qi}Tb;>nzV1kbQ%eLPCLjA)VmC zcf+zk#<2_7(WNWC9t~jHsb5*WJf$@raK+)-`F0Bd(jgXpWEKw z8q1M0N4WnFKFAOKxvwDe-VGc(V}mz;#YoI9WwyWjD|Tz`C+ww1vDYtQd)x402Mt6q zqR~biIF2}eDO5-GZ)r2HWi7l*WiaRfNV>ChFpyH_6am9Yv!}bg+ z43R1z8}>1}L@H-8qqQa<4+-K1DvT(`Lr{t!PCVzpV6xm1-a|K-S*DOz4dIN$wgdJa zJx@G4N79``6b0hi09&}btl|V2NKBzgH`gdkM)$S1ppw9;4PMSG0O?i$#oBpa{DOUi zJy&r3#On=wraK2y`0=Ll-j|hJV2b=!P1u$x*Op0vB#a>&Vbi|%A8;;&c*TK3ai$8A zXTgiQATp6B`gmYRwf7$VDs&kGQPWMw>A+3OD!}Gu;_qKs;CeMdWh!KJNf0NfC_xwb z)XIap2{J{2$w#QxEFz4sMee3@F{MUOY6?wJ^{T;zC|N{}TG@IJ?`)JO_kRMd*gCz> z>H@ue&7lshS%+v;jhAIA@4(4AT|BZuCJkg5?Y9K>J_=5a<2eal&4F*e%;p9BD~hl^ z&$s>K|HQk$@sG2+KH&PbEmZK_OG8Wp9Sg*_y_WE8@3D6EW|5aB z5>~H@r9=OTGjI4(^t*r14)z|Tzw3~ZCmz6VT*2;bVYjb4!=h(%Nr_lE0L`{*q?&ES z!YX3n0AgVk8f`>(9>U0lR~0!n9bwlmyWe$QU>kE-Z7{k-m&MaZG2cJ{Zd_B>Hv)eN zc*kV=)Va-a3lzzr1MTLilQKTAj43rH%bgpS@6^qp=k)Mvmnb$aAd_2OHpNBvQy3P0 z5)lX_`PChY-Vhlnv~fWrMdkutl2(T>Zji}AT~GqQhmM*p(qWH09eP_|$NYzew=Z=Q zYMH0b@>GQcVZ?BI-MxmdTVa%tjRq8>A&tf&mFi1G6GyQsu3Z-pw3=>O3j$1$la7a8 ziLin$GS)9WOrtYL5XT6iNap5|k$gq)1F9p*jJ=;pm^iJxC%{#~H`W+W2J;d@E2eB} z^_2bObfNNcGF{dMNJug9xL1M80RZW%EF4)4&r3ejFtH$z-P4QrhKcN zagY$mAV6nhr|Xa6n%pP-y{OEGWZ*m>9OUn73Qw|?J8w#at5Jwszz6Hde zCJ6okbIU&{gV1pDHYiJH`@FY_-CoBIcHMn1GH0#s(-TE|#_jA>=%)Lb1vk~tEkR|| z?D;8Z?bHut=|bA3ET8M==L_t*(EvQZYXSHRz}EtAsf|?16148ARx4D?OG$F*KolKZ z5kgADaD+7$B?MLqv;|w_gvW1od(lRhX!R!a_~lVqtOj+k>k6UvMZ;R+)h2p0Mvrn= z5Uc>{GTe1p5GF0Zb^#pLM- zJ?s-C4FE>HUCKOl>}@22hcA*2_pnwIwK}LMCQKR#3*+5g%s3;669mG$3vMBVpwXS9 zNJkXoAv(`Uq7KR8JdIPU&R#d?r422AE|+%E%JGpiHSBE1eMDz|sxS)gMmNId`J@RT zaD`#&(6>{KX$5ur(aM!;56L@InGl<&*lgsc#n)T6&-X+_rc8utsNPz1mevonHQEIQ`LC}M2`wO_7#YTt z*?1xytO<$2p-qJ&B-U#OCB4*udChg>+|d@ZH}ou*b_)2kxN+}-mmb(4MNd+@Z=&5ca)8x6p-yAt5EpYp#RxYNR- zH3lW6Mw_9|vbG2U(KvFb)wubDQk@PWQ0URvb)a&RpMhT2#FdkjMk)s9$BwP=`C)HxKGmTl7aIT2%QO$F(rAX zQ9_X)~_LiV)5WDPTtj2G)}Hy71-<*Q2cR93_XPO!UL0MYf2waMG&hBnbF=1 zMoy-3@0?d_(#tA!&#eP$$2?0-0CZ%*05jO}jYC1Wa0HpOCn53|47?Rl%=Z@JyaTT#*s| zWbEAu>s85Akr7eDujlM!lCGkOD?^`(6JT`h15n@hnq$F~{LnYNdFEn2REQmJyXh1r ztCLbVbD`?J)hiNJMIgCm#2Apy)F|xCOqz_^@z6&kS1627n6zKxJ;}_k^HG|XYi4GFh--4vO)^cI&zTq@}gOP@KL$@*tvw!2oVIx zC_0Wa>-i3>{Q<20MbeS6>F7q~xzPZ;WY?8fHT0|z*0q45`fftQ(4w)cIhEz-gOsjzKj}x zC#}A$c0oTffoNt1y*Z@FMnp*)!iXXrp~46uT8#U{J+I{EpaK3(_D&fT`qXSi(3VOd90lq0134ny}TbiG(`O8224Y&`cHy;)HxWz~lw0 z5z$y)a45LZ?qF;MG!~Z-UExCJULnQ58oO);<<50i;IrYRXjPL@)ovQ&C1H9J^Q%iA zBkL_?r{j42WV-hh59gSCN<7WT54+K$6)M!y;W2Dh^jvpa9+D2!- z#!L4}uog^OgB-7@hZ^DRWWjsn+sOoIeZGRIY=Hf)UDQA5#6!O-WYeU->d*TSS21;y zf~bDB9g}^M9$2pvn2P*W(rNL_vX1L5M*~crc~?8?aG@#?NXRPgcakC~JfRI+?%U7H zK-CV07Q0_jP)Yx)dsgKg7=s9%3cyaeN!ilF$Q2n9A1VBFFtV+11@Fl}^l+f`&5Obs!KqA^>Yq~xw|22pDuim4Fx9xI zxH(0leD0SD0`fu5J-_n{$UpO)wmCP?U}H^4r7*@)VNyy!I!=*N5-rRT%+I0+Los^% zTrj?J4Kq$XUn0B}A$|b(`@k>aWP;~`kKqh}J{x2aRk)?U6=Q3yu-2CHMaVL^(Ez;c za8ZHLdJ)SVGLV158heYd_KdU~w?-2P=^Uy;MV^;PDbU&wg#o(M&Ms6y7$_^GG}>5| z8>=HFWw5jmhwUb6c80Rk34%_GC=9WAfgTQ@{%|l(h83(j$w+ze35GxY@5w%K5BVoQ zJozgKik)jNPWP2?l|Ukh7U$60LpOmKOAt9f<04OMVpkA12$Lp36#IamCPFI4{T<3I z#pseoXO_myJlU}4B!C{4HeL&@YOi=bai~)QT{@E0xW7x0Idh@J7er$;d+V1mSwU-c zmGD3t>*LmiR}Sc&K?HJN#=tA)QCBVt!Li7#n~?pEzm~#P2fUCqbG%Y$2&phdQG3^m zAar~As;WsjVd@LJPq*)M<;5h@w#a>mjVIZK(d2cWB)h8>1wwk4I#E9>s@a}=y)hFM zs$zQrvNP}AM_%}8ymW=pdkeVt?MRDOJGFugBflrNbpv5_>0)$+bj<%MW*D&f*zMc> zs=)CCqRBKbrj(4)28QtM1YAdNjx7NwF>AOy11CJTbV2tiqtdMJWmJqUx3BE`>QxgW@H zGyt!Tt1E=~iZai?GZNyhLeLraMyMblZZ}b3NQq#k(`1z8SOkG`&4BUD;y4J9QHTvg zjMhRn5*0)dNffGf6e7EA(jY`Bg~$tRQK0kBpkFlxku*?8PGI|cjQ{7alYZ!T82|Fm z)L#+@5wH33ujQe8-p^=nmw0x?k(U~QT9oer)$8|!T_7=5a(x4a*DYBFxP6&bsBXtdLmRahE zmO<#gcibS`+Qk~n(#eAaEhtBz2RWuJ7+>3henE0zk?_b2ue2~GYd|$2SULjd?sxw1 zm1&O~%_ih7Yp_N66zFyW{W{W=isJoUkd%|S-I^F@>d>Ew>CaRyZ>2eB%IU6h{wssRtTDW<}J>|~EFyw`vyo4RB^KSfsv zfK*P|U`>4|tSP6~C+wT7nQ97jmb=#u!^ujdMpBH=D+ngehehsIAiA8WD2(>^#@z>< zj_QUCi;Hmfh=4KW#4Ew4K2|8)lg*uk3L$FvhAjo1`#b$S)3JnrGJ`0hG*+Z#xery4 zPueEd|7j~=IAnh&$@!`kaANq$5G>NgSM6E_-w zSL*KG+P`J8{9AQVEX2(w2ktn{P)gKrOxTDC+HGv0NP++xC}QtUrow=tD3PJtB`Qzy zG1Z|b9PBJCWY%Dc62>X|vki*6M0RJ9O9wE!Ta14GKhysoKaIZcBlVY@e$$t5``f;X zyTAHRa^lXD{FS$yVYs)09__udAm|ckf|_rku8z?~?jlu%@GfHR04lQ-V>D%+5=03_ zIwpt{+6ya=m7fKadFs3Xd_j^y=njTBAs-C@K{o6;*Ff(cXssoPVytise-(sS9QvSw zfG}%e~*MhK;9&Vq`P3DV(A832LFGe_{N8lZ|t z;rSI6ak4^erqcxllVrv^@vsV8nj#>IY2t>ML})vsC(jwsB~hz`c>zpEq?G8QAkDo= zlW$yvpyodDqz&6N55XEkF-m=;xFTL%CR|=75|H=$~UDT%P-P)gIawly4$+1crd=5R#W@2{+1-~1=KKlmpqP(O?1 zZwM(a2qUmJ8i1EO(k~)imj6dbzp_8?KHUEz-f|g={jm_EV?=< zaK;r{Crz4*J;r&d7U$nafhmN7IUSjZ*KT7ZCegdvua$U;tQ@r)-zm419 z_B9-T&Fe@K$j7j8X-s3r$+pJVo|vpyUnx(Z1!h86mnacnttL!bU<`RW!We^8g22P4 zrp!s&GpH~k9}j3Rte}g6-u265qrP_!Gz6g|r%9z~bmuU-WYqKUrEd<(JS7|T3B1O- zG^H~i^6qJawW~A_9Ax25r!hm99WHH*j3Y!Th&wZGVk3FM>0Jo7tqh4BB)WPaTyD~TL6>s|P$VX4BJj3|5~ z@AmH#7`pn5*L;AA0I5qv5KoyZ$%(U{M;V-Nk(?Ou1TI%WhJjN^)KWh;saE@Eqf2C* z)X~hc8@DfA{o}ee#)J9g@$P2xBxNN(gQ`LwWrwgP;8g_I~sqg16bc?d~t-o$vcDUi;3kVRpI8 zaL=%}c8wjsH=JKtVe!xj&fa@ZJ&C=d>VE;EA&CynW7dXPX}x(2gh{iu6_r6iBm{YC zF;-I!d+c7j;9LUZgfdUjWkJ%Oaoz!=L2Vio#)&KJLSm&mL{$)=q8L3YFlCAIT!YGB zs2GkBDxiDYae}s@REqAx5%>5MU{VJ)>v2K2GK0u1`FamI$_QqfZWUx+{vQQfT1-Ah zNl7@jTEpGbX>?wGj?ohsyGoHOM?8iFrovmuCCDccl=h zava>079o`Mn*mjqhW!AsC(o%V10SVoyIm2)^?|S2^Al!%Wwuj!aa0Wbph5$Te}AUt zj#P~KDm=(FjlrZ4)~R~c5bcY9?GfN7dXG3*Gm$;kP`sBpI^P3bGxkO8Ti^=0ExhqZ znPIabqS3C=nJR?FWGO+TStlh{3Whq!sNx*>=0-3H46=5@i$Ir@{cYbMDTkoE0J`HK zjObmz%2>e6{4$gU1`yBkOxw(|hqNpW9@qgGa$yhX3QI z+5I>F7}l?$fUo?H@8b<$@h3QW*PDqF*uJ*QUTGwvM5}gk{ zRO=yRU+82IA^pn1nv$}}DMrqNVEL_Ypt;f{-}5MPF*R*O(l;pz77~ZXmS9FXSow-^ z{qULgi1AJrDPB8>JE z5`0lJrCSvU9C@xB4Y9gkXBV(r>z{qvf2NJVlg>di^`W#= zzTbw4a!ZOy(sBiuWs9Fy8BXTMu43 zhbOHO%@)Ct6Xf@QjE#Tvz3}LRbX3T@zUzPIt?&CzPTYQy!7l8sUw6ClCufmYYxEM@ zb4$LEW=`AvN?Sl#hXgRMpomdB&izeHdC^z!r{fEyNENVn>=ty9vv>V+{ejPhdl;>2 znBN*hk&WHol?o|5qM!ou!r7==&pXJ+BhsyH8uJURzVl5a%PsQW)4@K}KL7iY{{*OJ z$n?r%&sGf3gz-5rnBd(binCqAZM1{$8UG7cJZtD1@8L< zK6EN4kS$D}`sTs~@5svaQ0tnAI{jf2o*;)c&Q`hNDp;lheLRWKrwh7>VF%MYW1fjR zpdty%%83vBN@J3PVDeFgqfbbSW#Qg;B~t`s+?YJOR@auz)}uYLa!eGmPCAq|`#0u|0`31^AO*%+ zVQ|esYP8hW5(p{!r9Ql!m-AbBkt{?((G^@2gWQYp>+h2O=YK;0eDz=WJG}eP|8*7*&NJLAx$w}XdiVI*Y&Hd;yl1uX=!KB4 zoJiV9aq&OTN`eR!a$xoqA0d@!980zxg$S z^Qw2g_m!)k5Y7fzcpG7>OUmnK9a41o_DM)iMZlA4AG_Zb{E*sKxF~AUo+yHh|9bt zCYmCj$PWGc4jL_|{|`d<@2y3}4fp=FbJz@;Em!PI7bcW#U8fxOT~Lt7f0Et(puVqvaymQ3s;noVKx{Y?k3UWU;gE9ef#$2&iKKNo%C3@#mH((-&ove z0AA!P%}Wj}%s30$s~eQv*7q#meC%({zTr+X8CbKkhq2X=_7YY9YS(}K6xsbBW%CFA z3Ox1@Z~vM<#n=6fALQ7r$Jx9(;>zQfs4R1z$yFB6op%U8diGw*9j8lw#Wesm76*1A z#3Tl>TR`a#e_>oUKoF4*T>w&%xk6v3QXd#qk(iLgD`WgGv4IYZTAcch6@~s}pK`T5G5L z@z1f*Ugj8tb;B^x*^B!AR(8muGE?$C4AvNQIzmP_8L0F!qaQ!(ca2 za&0kCA1ub>RozI$2X=>Fv|i}7H_UfF5DH<-S4k@1%eny=r5UYOga7r9zl(c6a{rmf z;^aqW-gpdd%7Dr&gH>6QG9S)c&hl-MXn3^ig;t=AeAB=>=HHF zE(&S{+8(nY?Jf-<3g#67Epdd5*Bc$po7Xx~Gmad*&vBwxk?*^yCYm z_)jzI0qkHKJ08>pv6{}UFOF3Z&!o@^N7V8SgwE4RF*eSIRs^AIvc1i&kjgg)6ZJvm z&+mTy?sp}F$i2oCdIJ^}C4PdP1o#N$_y(pZ2xpQ>%i*E$O7bRKa{%OLKSuJJcOk+E zW3;p3t-Sp!=Dh#89l9ZW!{VEiI<8n^N?ofD%8g5tdmF@c$dGFolv5peb%koRkx}B% zgi3v2G%}1FW8XRlMq5Su`gKT^bZEU?&y4%7{&yCfjMBLDO{+D<-ZuH(HhMT!(11$E#kB8rho+Zi1N5eP}J)J4s$QeJzU=FA*rk=KDn z&$*Dq4F+55?CfkJR}a^&hxU0q)6?g%eI5;hnNlDW#)@hinHwvVz?9Y{w8ZWn*pW8L zQ0pVc+CM)N28Xb=A0UEH><(Wq5Px|g4jvh6^Qt&nUe*nOwU#o=x%>8;=_QSSzm=Py zKTa`uA#7z+>K_vG0@N$z*|hdE!2Tji2#%a&ZWj-BU!I;J!u!pJe9gJy%M)1q_iD9M2Zf+pw`iajO|#uvin zi&-uA%g2~(i0Uj%T>Ol#C2&us$4aHhv(!1_g^>^Pu{FC~N{RK}@%4eM%euL!CtJVI zu6*n(xn1>_be7g~G?&3p)Cq6SCYUMT{>ju`oA>x8+}83x2`ZX``zI(t#mcXp`HUx$ zW+}GOa?o;-qk`tts=`SC9SLvhWT>Qn-jjb~STvDXR;E2-Dh$Y35DQeZgI&J{LJ+oR z9BEQYmxrJNtj^I}uIUI?ZgLI4I7I{zdSi|Lg~z~Xg3gRjakPY;S%P-g{a(We)#xDN zhT{lS!-p}Le2nRBqPMp&K5PhGVACN&NCw;M^tY~~!skZOP#y(T0 z=Ys&)sgJUKj;|vSNN0+Gv6esz+JP)ufy(-YP7*0mLfBMm#@eVv$~-f+xt*71=EC4t ztPrWds^hKXf4!1s>t}~!DTFY*3Q&NTa|6(51gbeGP5);fz4Xr?8)R>9gh3e@qcSPQ z^v!=Eiofu1(Pyl=))3ux7i-`D7b$+}r+MGs{|VmvUEjuFJLAHG7f?a)Jfk!n%voCC z+`W|B1;Jc|el-|WRyS1%?2Ll8LJu-Trckm;<}E)P-Fdmf#6L7 zdLo;gvaQv*i&zyEC*VmjwROR<2HBdKGNWPQ_6Mjq_65)H(JOM7Pw=x9giIb$Vocsh}q8IYc3M$^fYxDb;^ZA%wT$wG+vnkl1{@Z#O5T#EOa6 zfU_;8X75X1lq*(!(Cm=!?PAk0rpQS**C=+kutmn;{G;e}M7g;}c>I={FCZet6@}ET}ZSPKKJ#VALWX{@Gubsv8H(isIkI}p9=-vi;`-+nnmQQsn z)kW@YyPw}97&qbC`Ny!<62-9(qk7>U@8|Q8HucWlJ-4~B2&^(z$C)vKK%j&bskQ_P z(FxVHc@ga8){4^FMkvKcEka93A}I%*Km{vFWXxw87H>2F&;1u22tlGG##+@-viYgK z(ZQ=}@y$vK(y~<6I>NKI0`mgh{#rlk2`5i}*n}}Oj@`u8fBz2@|MmanJOAl_3_(YFC=AtGD?5lxc!OgeS8zEZgX#&ue9CPqkz$_8ON ziz!N^FEGv7fTYx@Fr>&vU?EwUXD$knu|zuibWGt`{N)#5*iXg&jj5mopo;d$en+(-Vd5g~sP<5bB z{kpoCL>L&iHc?5_@c?|RaWUwT?`%SmGrDq)e0Ph|lkCRVE?}|@nKTHxb8eTf6wMQ7 zh~^eB*%;ZLcRUOr>MlUsM9r=`>SB)j+^X6LH&^4EnkUdjgKYv&MUj((OO zhPc^gZsibp`aBL4Ay5K_TWju*3(H`2ZNz2#o>n~1+Q19+_XSWGBXfgPLSU?+1R^D9 zDV6sMy&Or=DlG?$C0R+r^HT8ml{EkUnNa<-vEt{?4boS|pz*S50F)5q#&Bhvu@HsD z#ZmUwOQUo=AB7)ZOY?WzDk#tJf))Q7LABQD$gxjBc4Qn=mL>iF<9qnhul#1d;jg}r zhwr(9_VDNnf|TbOouz}c7na$*c#hFWK1jMSi?AJJvx92S6CLp9x&hgCAu!dSt(ia} zHh1~(7+j`+coL@eGHC=V{}$N_ynCSgb3?@w7)Z`|ICb)KmN(+TpZW|->-Y2!beABA zU56y4W1ClIF#@+2_B--=A?g|P))<1$jJNBxQ&!k=9~xGh*;L7W6&v5nG%ZdeFQQ3- z-iO*1E{8!>@w?vBT~s@KFY|QGixWJsc^O-j55fg{LNo28uqFvIUQyG{d_bLSC zig}zMg21gLbm7R5`|6vs5SA)HkB9Ug`lL?yh3K-~9f zIs&F|Tuh!iv?faGwT2z+P+WWfy?Ft>aS_|wz+@xzXb-7EOn-BKy5Z-z7LK1G>uqC< zVP!A?;wMN%xyh2bE> z9J(^j|86%>|8pe{eEpns^X`TKeqNP=W&MGo)q8cq^YYrJjsLmqsv0D%kL|)M(l$*S*uGg-VJ+SE% z$=j1DZ28i{KDOB3m%JLN4=;5?B|;zwoe@$##+JDwr|GPAfva}>Do!SLx7aC1ze%RN z4C9)i?>ye0G+9>RJJw*weFyDVAvR(Xv0Ibxv~l4ze*f>(1Wwvp89P;49-|9y@n$E@ zYb9wEVv;;qIXcyL_kQ9J0#u_}|2v@qRMH@5v=CufYyYbNo$<9xq}MLFhNMb4+=sAO z(2l7eFRo%nePrAu=yVB^mTR)Y5TX1kB8+PyZ>8n6MTYKgV|PdB-8I*98BMu<4%6R4 zZ(IOiaPM!yy}vaXil#mfpRM4ixJ494L{Y?v*Swjy(c+G`eI-ZE+({TE=pv^*yGUnY znYa-WCXkIF9i@!+wtbS}Q->KT1kETS31bSa36WOc{)11+k7uFkXdM1*- z!N|0cu@p8Cf__=Hlo0LtC|KJo%CAbbu}7Nmw}(;~haBAC0KBkoMmi`dl2YWx-e#?x zmqLUVWK&69SSt&wQ7@9w&u7wi$|NEEX_Yf*ry!yi077Sa+?DHCUCeO5B+2(Ck1d{GNAIW>HYPihAaMcW59kW z-TV8ius!)eh)KF&WqDhX^<)qtf?#52tO7*j6$3`s&5QMhN3^=NJ+Dd{HL76C(jg6b zO18O%$x_Px9_65i9uKfZ&gj}jAFyMI=T{tL-P_#vvsNyANJ;zHDfd|lBH!pp?=O%! zVxckEy)E?a8fLhI-do2EcCcw5v$u{(hlqTPR0^&2=lu9QxfzaIT{`p296R$`PQ2z# zL`j3V(W1Ms!u;wHl2(V6<0nxHiX4nKltqdVlCsDd?(NXu)=x?_oHS2f>p&-I(2OFo zvShtK;E&FIn#a~I6NLd+cXznHyX~ZpW$B$I1>E^I!YE?+$Rn=N5(1MKj4xkBR>5jf zh>Bxmr;Q2}(QFr+Bm|u{VIx5c=|b7c5|bDEnt^Kif1yu*B?O@qwsbbZ03tJ%hLX&N z!Pasd{!(h}Xr%RPa%+~ajmsTlxv>Ixp|4C^w1q%`f!B?U`JP0|4}?N&SQq{z)Qjly z_ZeSVDHslrHlQqc*0BGRpOw$_eTKar$8UQbcYN`i8I9rmTF!;*V@A0lk{VlPXzet- z#dyGA>k8xTs}!Ri#i&RB+F5olJxDp~qldc`*RRmOerezL*m=?qtd=NU#ht1QCPH9NH|T52ewrX|UPU=l4dl@ZvqU z0qFjivbT-Ix?Q^```MadUm5mH7j<9bg3wQ3CHTArN5}9x{%Yc$LcJ!Dz+$4y2ZRj0 zX;8KI_hB?r5;WWU9tJx#ht;nqz!U{0&ue3!I=II-6P46ZG}^V^Tu4Q^yT#rk_hE_x z-P@rU_Q?0P5Gp_yIpz8l!p;n;(Lw|v$~bhAA@a z-X^-gh0R9TY=qvth~B-9Eem9`i{7|^?rnV5^T2#2_&aXVot?*8m^peID~FGA%bjna zGc!lKGec)#nfA;ai-(RAC9d`g1w{&ZmSM_*?X_!lI^kzzsz2!*tt^8(Ns}ZDxwO5- zub+FI2d`dcdz`Y---C4I2#c*YVdOFyq<7;i^VFp%78yaK;ZpjPB1&S%@9~@rZ49<7 zk-NK?yrg&W3Z*dwttQFr45HmawVH%;v#3t1c5N(+lAtWTx4(TxL!fx3TTg4rv=zpq z0B#XwQ9=~46vMTw_^Lxm^!FCy;6D_`?nT~2>(y|*tQvsdTi-!jNR+g|&y-f4v9PQy z-BD?RX?LfW^s*MlL$3LDWF!V|Fh-NZ#Kf?QgRC#J%Y2 zSJ2n5Fb(hyKKAQReq+ceK{dM0E55rxxOx-8`~kw11BCO(36>6lHmL3#B5o5MJWjYM z>jYR4PD+2BJ8Q8;lg-yiI5Ug<}Q;U zODTr~;>814DeGz9jP^Y8&_V;fkiu~4P%wXGDEf05}_6&HYXT#Fbo9WCgap?42NGa*eFLUzs@1WJ~ z((TS5!yM$TD`<*Id}v^BjnbwZuU{J82??WWBe;??3t=zyIjN z47S!?a~FmLaf0e}@!`@ADYC{XH;l#v3Mm3inWG0Ih(a*dne#-ULkp}WYBpS~ZyYky zZK2bgL_k)QjMq1bcXkWg#YnsIyzof4Zxsu@P6RJ9LlDW|FvK0e>T?o zloG;*LSlp#`laju>eMdF&S=2i)-GYvAWz3H>bERPLs1&SKyv2j3`?^Kk6hg4()y4n z$Vnna;mt#)VZ7Rn4NDNk%pJdzr894Ja4pUjRu=`uxW{Pw8u_S4HrQcs^$`b2mN~l@ z9w6&)(qB6VLQ(WK(c=MTJaFIW`US?1ed4qJ4B_%2qN8`9nltWwC2hi`!^8(q60Y8Y zYIg|c4?70&Y^OeR)f}kiq?Xv+uN=xrqhO0kAlnU8!QBtlY7x$@kY77X+23~iXgtZU z(#Ka(xMo`GBI?AtY1hBn$xYycfy`94ycbnjXNFQuE8M}zu$){ z5Xbon1m0mUb`4OTy7y@f`pTnjKfkw*9rv(#N^$O!b)z%<;7>nmv`+;Ajm{kN2aeF{ z&N07om@rN_dixugSv)|a-R02Dw~@3uG&^zq>nT!;H6?kLx%9uh&v8g?3`2JgbBu43hfxhg)T5UclO0WLZjIsDK+DZ zk7BIlrZ?TqiRC#;ZP*=*xNv=wMidbSiVGL6a^TPk!*Ry;m33$~Ac-iAMFomX8^UG- z38dH7o!L?p5jGR{IvpDACd;c!bQc%dEK1@i#8`_d3a2*lNY}GD7M^?;4VG9+JuXda zyC`KO1!JubjY|DB?Ld7H*u2pIya-q1^A;=MN(s>)l={S=)N_F#8(9;-+1mDvdPHugX60!JjAU!}Wz)RCm#^v7zLwamxpA|*^ZY(4%l?)kC5NblNN!lcE@ z?eD-^Lq2fJgx=N12;wFJ!C>oh{auRnD-`RW`5vjb1z`*r!sR1?Lot%mcM~5xfoja5 z=9UQ;RuM*^S~CQThrxnsHxNySDu`r)91yxygzhs@Mtp&+9;|ms1Q5-x+k=<6_XnWX z-6N!9qz9qjugi&s-s1);Y1VeMLI`9SPWJBBprV-ET1VOvAlvhGK~gizzNav?yIe8s zxkSHgNdMd;CP_`HJUU#QQgp%1!!$a2YaN09>d*Yvf6lwo)v8j zGmR$gq`{}JT;k_H@kcy->4GB-Bniz%ldLR=RD{Jc&c`(47Nrs7MM^8_Fw;0lr_rU8 zbXh!h2M_*-|D6lJ`5(FSJ@4gvzwJ*TbV*qh7-QJ(4+)hb2o#T;zryO`oNEl$HrX4E z8KyaL81VR&b+&o~(&5;_9ZEqXK?ABN;QBhd=Toxt7ilfblSUDA+L%ro)oBwn5=0bY zw1J|)7Ui=-WhydYD5M>gI!u%-=E5KVWGrP*3UO8n)~7)S{R$@nzTAv}rsE#OP@8WB zy1+QMHvW7Kd}i3E`I$cE^Aj8p-GjZ1D?XtcTh&MRh!c}o&)f+~gL{AJzwqww{9fjp1}G^3Y)V_-{=Es2_0g!Kz9p4Y?ULdXdb&=c)UHb!S-f>sA>4bsczrUQaR6uBh2 zAasoPA_HS7hP&ijYi=!2nFrOM15u{{8eNjC93q}ycA4{yCNhlOdcns8SAO~!?WT4a zU{P*;5jeYCTNY4ekf+#mNdEXoDXu=^V!^jA)BCl5jo!H6@(-S)cXr%pantL*n4`D8 zp5E4VR*&C8dv<~D!ZNGJ&oHyNLVI?OsNr~SQR2*}vT;r}8nAZmiu(*a^Dg}JQvBOV zLL7vA{_J3Mh3! zUgo4lii#Vg>*v|I`WOJ6L&qq!bt$eD8d$pM=cv(Ss9`i1A*5uKWk|pK3zR}h$?Yc& z@y64~(Zx>>h2Vsbs zouRon4{?Z^=@QM)A)*i&N8Vqe^lpmAMN2tvP zHOfpF+-Lw^@Z#@>wYE|}GQzYnW8YCavyab@@S-S@of$ZG6IUMo1ih_2!Z;yMUwTIx zAq1ti?DTV%W)t4^x>X){VwZ<6?4p#Q)tE50YvOlpV=j;a%BLYwxZ;0|G9B=%fBT(` zcdl{A*Z(!{{KoGi2xGR+e!>?NPbAYhLJ0EFUfp<vS%?i+zDnLaI=5Kl(Q4rH? z%pj#=H{D~cw?N)85>jx}eJqXD>!QvrgtBZ-j5n(bXlY(MBcC zPFBT9z3*3XQp3^3o|Ac%<00ABIvCAfI(DyD<|K9NzsUpV&q5dy%`c#}W|Wr%Dx}l}{lOMd+~)AoNzNR)orTVl zKLT?Kos*Z@{(BrmjCZb6_?2LDX0}!z7;9;?+srI45I14_>VUz{HqDt?20PoRAaEgH zek}no&Y(9OBLsv>adLH$(}!2R>#{*g!A^fff0U9H1&>_1&R{&|@}?tYUfI}Yr#GM+ z4Crre!+7i(-)ON+GTx`aw$!jPoXMk*&$6h&dBMHJSuotN!Uin|Xr;=hq7 z@t?}4*+1V{0lYXX0Aau?(6N-i*9_!vP>PoRym>EMM}J>b zRR0=TnXxh6W;gGHwP+zof&}))WXid&(cdDJEv$?fmAgbXMp!|K<1gU7;zeH6&4?ZK zo!(f0JaQ}ci+Hd$$ z!ULyJ%_gd~j8%g8$n8W2ju0+1oo7Pm*9pcME9okUP(NwK@FK1N%qX460Ubf zT;YqX2!dK;U**bY+Z&|o*U-Hk`j0&TLQ)QUt^+R|Y?>^tI1-*QsAkJ0%SnaFeI)I4 zI8NbR0aXY=?A8r&f(Q~&j+bBtJLukq)5Z5)NR8=jP_CbMM7+=7boaEZ`?y7*Byk+0 zRKV)VGu-v1Ur#pJDf5hcJY?&N%Z`32k-e8< z*B^%=AA0-|e(AoCbK%M*nlrNq3u#%Pq(Vu-c)W)S6OOK&;?(MCR%TZzwIAxdX^AeIK;i6z3j*i;ojs zc$8x890mIgS8S0{78&$5+4j)pzWWs>sCI|s%v*>L-$F3Igz6q3m|G%TJxOxn7Gw)l zgW3w$S>}55VB}GAJ%ye>pY~LP2m^#rb)2t|0hYX00obyj*xO;ecA0XpNB@b3oi9C3 z=dV@{xh#&PNxZn?0%*c$Vi4owe67}4ZM?Klf>NmY1I`K1I-6eES;UM7n7!)|M3~Jz z%C*Pc^lmi8<%iI_*PmTiq#|y6%a_w^B$Q>z^6^_Zbkl7_am?buV>D+L2%?zI+!C|P zZHf%a!hN>$bc8N)_SUcY^_X)3eEQSmmCqP;8g|Lj%q-(P=f{5UxA^db_c=Llqe)Sg z2q95Yp-o9%6fDjj&fEMcR~=A$2Vp9?8D{g$^ANx0`%e}yX# zKgb7u`ag5!;ZN`TTfh2${|o+?AO2_bw|Aa3ngOoZXN7AL`=itsWM@FN&~2lXbOdST zLansVfH2lDC|nTLqgOZB8;v>MYS<55xF)Xl24=CDl)4qGtkkBjRGvp+&xGw-V0D8lMIFh{K^a4w>F^^t$N`WwtB#}ZJi!pYhYOIbwYw4_>;G;kBH`#dP z!+g~b-Afp^h{xwSeP#(MCGAE)5-9>D>H}0)$!J1&^EW{|N$4aEc1I&VasE7ytY70} z7oOny&L#wkFi41_CfY~R7Df~J3;@@b7{=MK+OSdB97TW>5djg#YGRQfMZnk$C`i#1 zSPg*)D6J!-1u{SpV5;SQX%QksHfFGShP>%Dgm3sV?3J?wPdvzpc%IeSgN*xIY+ZYt zjVJCU-CaYfh^+rq#g8dc%uY&i&;OwRbUWo^r;yD>qSX@wa|$}ytD z2T_r04rGIxoM=n;&sC1YGj0y5ym?(95d@9SWLxG*eCgUH!r28x5Rj}MK}bn7w?NpL zMTRb2Nl4+7`V1H!zyk;sI)gqz&0GaxE1ewyAd{8P%!%jlhJsMZX6 zxc7_`o0^?jqNK^(>S0d5@g1Cc!`m3{Z4<{0Ui+@EC2F+LMM0Q^sK8C}Woan$45Kw= zo^kc;u8T1K4DhV2LMUE^SIzKmG&r}u#?O589v(RNI5b)WN)f8i<)~OomJJBP26vx& zJ4Y6e5y*gHHb5KwjBL(@R21U@JCA+@0d$v^x%anzmH+ftf0cYf>l zbN=^#mS6c-|D4x-)z@;{JKo0H+4IjiLjB1iL2vm{;6r^`>UafBM1UanxTgy%Haq-7*g!@D2F48{%~ScvfGD1 zRl<7+m3vIWfFO#HjRe(dBBUTbbO<%ug(%{o-}@CFf27aq>^%M6&P(nI{d6m5As{OZ zMPWF$+GcsK!F`W!^TgFYQV4=TB7|!Kq;$557Uv64W+@N;^1tEqJHCN0d-rR}ubgAH zyGrGEU22Qgma;T;EPBl=kdnnl2ZZ3#)+YB}x|fe%Jjdf#FZozjx33SC!uY*(Bx6cl zQ0kIWJ5hfSH)zEzqE^IGXBlk_W~^ujbM!`gs4{VrO#q=tC`hr=V65xJQ#+(rZXv9s zAf*&J+8QJZive4pvpob7MmctT5uLQquYU*Eqc*lV&n*k5cwI6_fBPysyVsCXlJ&RP zyYd)iKE|Ybq`Mnzo&OZ0-E~Znkv+{0I=k=~@EGHV?s+PD5I2cW-0t!lW><)h+(vx- z7Lt>%Lp3`f8^p)vU2_n#FQ37TK#x4{!2f%P;6ORFnBksh(?^bs=UMdaqc^+HMx$BB z-&$kA8cbO@4}2joCCEm{eZrLTUkj$c?Hun0yI>0POAlcN+ejfOH!tmrpe-)#pZ4_L zen-6K%mTK|ICRTvX)Uaxu-yFGH*@s%Hz0(hH8V%jauT|k#Ws~=ZK+{zeS`79rR>=q z{geVU9xefm6cqeYRWFYbA1C!UkJ=Raj5y$@|xLWr?HRwIFEhDs7CjD^D3 zFI`QdJtg?RdZq3Q;HGxcoC#I>@ZRVZy)SxMHULt2R(bek|+q*CrxYI)^P!iQ?BO|AAUb*EsWm#g3B@6?uZ||W3MV{uA zdjseVeA^f>zIq+mY@xpG@6h|;uk!!<#h>K8-}uek+?~N%!}f4UsXxCKc2z67Hz-IV z#hY$jq|*%f)Dt_%T+mFM>zb*eVXY-fT3mbZ!*rJp^5_26Kjc7=vD;3_vZwbccPax* zH*U~M931=MCm!Py=g;!V%a<7M?YMn&k|2a&w%MdKmQj`x1rb@9p|vxMNx}x*?h?y0 zE6g_MNuq?A#tfkf(Z*1g8mR<%dVsCXJ#=YE#|7GGf-*s&5YmO!w3%ZuJcvM%>Jf!a z8R|WHdJ}CmnH{1;_~s{Gx<#`55UF_o8)dg&a!ysZst$DiH*lT z%KLx(Kk${`{heHW^up5y5xtZHRXNo#W)?Dc`Wb(&J|>0usnXhCYAfZ!Os#DkOror% zZpZ*%lv<_)+oeV3#@sd1<~768G$d{h?3RrZ)o6f#ve#$)#05szHz_Y(fpH4mHqCB} zqbJYsniGdeqL5aSur%AQ4~wOlHidTkp+HGC_WBrO+1wj27^jT#g2yghW4Ax#%GC|@ z`Ub2XME;5I#b8|0ZH7oG9q9!Ko3pGx`Y}Q>W>*ihy*;2P%+q$!LI^ssgZa;GuJeIM zALQ}P4L&@~bfMIjbVL_$+_X^C07!6JppNX?Kv zv&l&B5{jfo?X0x~QX!)bLP*YTKFWpO6>ge6#_^dWthAOG^tUKX>7h!2Q~^=5P28Sk z?&xiPKQ54gi=Q2=pJ%Xsk#ujJ;l?E_hT+B~2J7buo3m^^{xQNv+vUY?Uqk09IvY}j z+73SXy8z|xZ~jL~ZJ-P?PKZz3L45Qyn1JZ$8It3-60RI2x#?6*UaOe$B565iJQdan zdS=|mjCzi2H}0XguTZRCz-o=u8Tpk*p3+d(h2|-6eV5kE0k=gck}#n++C}Svn^sSA>cFimwC5RSL$We`)`h=bb#)iH_KDvn z>rZz1QKQ8h|F{2#qi=s7LMevp7Z{hhlinFaJkw?QjxT2Wv5)fG|L>3TrQiM?1W|&1 zhAX1aLvJv&FsH431Mo}6vv&k+6~;1qLk9R_bhLPV=uuX?U6hn;4+m)T;xq!acgtsK0!m})j|)y5Y}0LpeB_}`wtE>1Gci&+#=Z(8 zbT(jXV}sp|b!L|iP~_=Tihny!XvQ(y!vP;Vf0m#6$R9H7?>Uxzk`T7r1X7}nbspim zKnh83G(<|t@#PaNcUR~nU6#5l-f$$R&;^6E|FjK9^?NFPfe=E_nMqtw%3O=_IA=7- z81z!oan5j*5`_*G(565LNyBz%s19?%Djhw~SoPV{n~ZG_X%*Vj{|p9UElE5}u5%u_ z{wW^cKF94#r@4LUG)>W@m-TB+z4naze7HMhpdiB z2!@-NIQPN-&cna@Z^#Ba`_}n0$Ll<~tKWBl;Po{E~ax|m_l z7yb^aJx6}|8fLJI8TZj!m$B)9a_ch2+unXoB(60_dv=~qr%Ss#OB5#@Jaq>%3(Fih zc`HjtP7)?f+B5UC=Q@P3BP8Z2q@xj12JBpO^0_)7=*IPe!P?868HRbvfBWzU`HhDj zU~h9B)#d(r6GRjhZ}GPy9)PcAT&| z=<}PO{0P7O>H8V=gsfWnlFit+yEX|K$Uq$ zI_#5fJWl`mdB^S-!o|97TtNG{+uh5Ll5Ss^K$s7GfQ`rRhhpz@-qSFOiCSF_-gF!D z%LkE3i*~z1qupWo=*=9zAKZhItY9{@KZb~O!d`py=?Idiz6i`QhZ!W z`5n5`iH8@jF#Onku({3R@;qPi-goo%yUsA%YS3;b496LRamxBm4`ZjZOP>3qRg{_n zO_~?%j8b0n`rEj3Ddywv|L+`MK0)V8-p3;ke}J*To288S#G?=LiHlG0+9St!-O&@g z<)&L$PP*)lhK%xjU##j&vQGg9nj-c zEHjNJ%{b=qwQJmW`2zP}y1?1%SDoyu(Ig52v@sOgd7u~GD?U^a2j>oRX#Ow@?L|6` zE_ssC{()1`UAg5lRo{OO?vB>*?8a{E??S1#ZAhxM8yg7t4BC? z<}O-uOROBfg-&;dg~KOl&MdHa_#~~CqVQ>#QQ{(I)8Uvb9W(6h0+zjv@^f^h7AXVQ z7z${H5rI;U)M+hgQ7|rYlxOK1V+d8i_HalejEKX)kyfQ5@db)Ro^Nz$HU=E!Xf)-Lj~U-<>T<}dwCl2)5+ zG<@0I?x_Q+1U}%4{~zZ@8sJNFNgy}&tsABJj%{tsg?m0OId_4Z7G}8nOWw`9-f#!A ztpV zNg+tfoFXr2w`RFz^$Z8+4wFO;LKTt~DZSC&lnm#^`B@z@;0jZBwuuz3ahsWMv9Z>p zzdI(1l~X@h(6*$cAe1qS@(>0?M9hv}XQ+2ELK7k}ej05=T{4sM#O5Ph8?1BJ@@*WO zIYc5N2HEH-Xn?hb_R>*;W|y`5e~(9h`^UL(&(GIia_o!V!_l|?NfvLpo96rhl+C$* z`67E8Yam^?Q>Y|SC|T}ANa3W8LI|2k!18Q@^^>&LDc$Z0?Jxdr8V%=XU<{0RGuAJi zrOZZH1X0qYyRb}W&bhLAb3U?Bi7s=}y)A~@r6-5-tl)Yf1kETS2_xblU}rdFFC7y| z$s=o5IlI2bFwbelvD09$uQAH9x=9bDBncxH+ili+Jp!d@#W4%5Hb>?cm}|Ca$1w+I z=ZI8*l8Qo?WM#>?$Y0eBfw7iQDptB3gb;lA>|^}K1NZXS6OTd^5w~2LpA?EvMrc!F zt>yUA3CunPRl5qZ{b4Tre_9AY|f}qi6<@N98 z%13{L^>b&r@TpI7`#Zn%<&Ix^(Fk8cxoPOz|alI!>XA;0m_CwS<>IX?Kv1N64H5v>+MyNhK% zmtj2G1r>5={wS-n2UzSZGuN7| z9FuF8ER@VH)0{iV^-uo+XMg{vc_#Cp)!tn9+2yjwY^;)T6>KCc+5jlspVAyC7Ee7IlXd_a)q$~w zCn@^si8AbH7lu?#Z8uNm31wPXOE`(rpuFZH1AG>IH z|Ihpb9>4l&%RO>@-2KM_BHn zgkh$Yki^cUX`vg}_Q{nok};ON)cbDf=j-EYt)&^oG~<{^DYCNUlNZnPz~u|LMki3PHCQ0QXplrPuRnT%rA~)t6r+tHD+|)1cvcNTb*pP$=S#Qp^xw~t1R=}a z8FoiQ{^;zZ+;{a7AAjT_C!=V#2!jBDV5T{XwU*7DE2uE$33Bclet_T6`q?zuSScm1PZW9jy{GTOTOxz`7+E_rX8-}$~TBi&u+%fIt`_|6~w zH(Wn=`Q;L(WP!eK0)7j4Kd=RSaO%I;*I&Nv$PEPGg}CnW61@ug3Z%FYOZk0!+WbrQ z2GY82Mf)!8^HODWSrWJ4%v)UpknXOt@l$`5(e>};@H^f|!;T>zbNi7yIktR)N3K4^ zc7Kb#@h&ousM$HRHhkpM_w$iQKF#kQI?CH`xs5Zc2UzNKNy3nRnlj9?7krK34&Z?K zRts$<*LL=J=-PRH^S)29e)0^Qycsbb5p-t&fi@*dDq3-y!ElE#O8Eb?ciwSw)m0n+ z-a36|d*5WU>6MyL5_<1QQ?V;5FDkww`dYvOC?a-6#e#|j1x1?l5<&@qgpiP4HrxB| z^mg0t{o~%1ChqU^S$3K1%-p?m@9#Y4InQ}cLwOUEtEbUW-iUA<@_0o%RyD;9r!;BA!Ncz89_OQUka0O`Y1^0Q6Zrw zyRLaYUxb2H;N|X@*_P|)(3&}9ZvPp}?*AbG^>Y_;__?2C!r`Y=R#k~s7{n>|5Qu3+ zgQc#>%@(8014XZ$@ol%HeXtAaib6>+gkRHX9~xkDe=mKh1gpB*S=+YF&F(b~e11ay z0G8r{sF91;vMm%zLQ_?ufgm6#nkI&2p)2l4V#~3RB!TV?B^oI)DYAl$7#L8wWqg4pukS%82TK^up00lw%z88J5O8Q@Y#tr_GM5v;UV09BlHnmgF zcT5v47)93IS>4-KE@!a42VWpSF}KfHcER>e*8&g%rUO%fZ9t3nSZ2Hgu%|Zc9S_W{ zMV4hPyA@~y7L6uq`!LE#l0>{K!O0)Hf+c_Y9f`gkF1+{xbfuN=egBgj|Jk1st7;(K zvkjjX;NYgikdRp2zLNEAD_tsAR?tdHupOJ0t~OeFx`~9t95Qhdhj>}c$^w2F#IB|28l>nKp{*O*zCJ zHextABxGW0C1FuYzqJipEg}%)jU1}1xk5Qr#Zgt_`C*<|^-oxO2eq>f|OV_`WE@rOwla^#I7vaDd+Ho}M_=|TK@5LvQugupNh z;8IA;EV5U7DL zLmQuWhkf~V>gS(Iu(FZ-P}fergoEl25vrO< zufA^@M}Ox5rW}4W$&RgTUoX%a(OWW{w99QkE|px|UtC5=+49z_A2etOInOi@6U{m24j z1gd3V`$Nc=T}P;*fsWc~#5#JYiA2a04T`3NB#rHJCP@-LRVAeRP!)yN!2$lU;srMJ zbkRD{2iXh+f~bKYK~2N*2LKtzu~8%y#~aRMSO!KR1B!;KYWTDOVPBY7u!OKb;H1NnVK$xmp6BpT??cs=`sGR@c%{T1LblU_x0XiVT+HU|23Qkuz*` zMcU!q?7odhRTPAPkggNZeVC5TW9wd}D>2Nbz8<=JxSHveI3fUpF zK$Q8Dk7Q!SBzJy>k;fMH?yvQ~*>$377?}h;FFy%@kuOp*^$1kIr!3u>_jfF0)ranP zKl|aX4zkHOvFaK~r}pJ-pzJ{Z=Ye&A4+ye@2f#Q0*gJ_xjaPTs<>u=)wU;7qW)8gCzw~(%PeTjvi_!ee1L3XecP4m-G+DLi0 zg2~m>*wnLumhQFKNXVMsZIzPTkE1u0WLsM+=o)1urOc?V<&cTZuKL+>s0fFsjK=V* z3WjBZkWghA({b>rK8j|MRUK_~#p5Ijc{+v$=}pB+4h@0?N+^Oq7{V4{+ZLu}q02J1 z=LugKtEMtiL49ch(Lf2ZBr%*BI$*3;g%FsgjX$VS-&Bt7Q|aqU;K;6KU)n5aTlA@7Hr-yzqx8O5+rA|)sQg$&!;*0W{Ji!?Meamp>(5y5rpprU%G-V`?4S8g)6e9gBeON0wyQ8$TSub_AAfBg+zfsRSLvL#*rR zBA?ALp{ABe!6oQ(DEK3-cXz7C;o}1ZD%}z`ei&2V(FaivVEcL+Al61Xcpy@u-(0fXN;h*tbeE zNh01e$YE!lO5L;>bgWy$(r2EcoB!jQ>u=)VMJIB}>8I27?0uZ~gNLb@HjhN>W)hhp zG|fjWSi*wIM^P3kqjR{O!OS3*kpo%95DtGK0iIlVUqcr+g4-QuKGFc z2pb0rNl4U{&nFe%!n*su0#j!pCLM%f72SX)$w)Z(qG39R2e{*z4wkiS;FxJMIBY@_ zwb2qXMuAj5zsH51Z@2uKMl29Sl@&VULo8nRDq9Bn=tw3Q%%rii8Kgjva78tFqloP| zD6$){i>B+6E*ytqE`c71Qe9q4X{e0qSS>!yN7Ns4gR`))9S7U7Q6!0MF*C|Gycvr$ zGRIApWrPEUWl$b2r#e>S4tz561btzq*UcndNE6QtF_<2}aU9Zx6soLZSSFUo-v@M^ z(qM?eOwyefFN9mRK_L5lv=0r^-q{X5KactS1XPW(P?+jy3Dat7iTV7*LJ>l`hAPXH z1VaQg%^kV?Ik(C{76ikDmY=&$y4oE1$AZjp7 z(K65#7c9vLY{w>3NE7mfsI8txO-UVfrS&+%c};um-UQD6SOx3ux*5mJ15iEx9LlE5 zA+dF>J8FGrYjQx<+!NUJz^#Bg1435z`5t3>v85DP>&2a^xV8TSa*Z_rFtRITfS0^d zK#BK(gn$S;SN7iH%drg<1r9swd^*;xVfhQsapN`D^R*kU<(Sh>WAVC8eCC4Fx%UGT zIOH?8GV83%u!?!IeQj8liK=Q$shLhwRWrSb9{N*#3?%!A=i&&ffPwDS{baOY*xhhs z8Dv4hD6p-&!#xwSCs$TAS0OC~Xd0nF2sspS9S8xx9`w}z7Pf6s$fv=v(EU-GtEbRB z{U{1AJ;u|WEzZUVexWp;{C6Fx za#c0iLV-j+hh^`%^Xpz7u3tky(+TQ2w&M=2TGqXZO#^+rxNQsZ!2vgW({+#)WUswX zLcy>3$s0LLvxuxH=&FzESS@AYaui7>5{OY5tsKp|P1_`0NWEhqd8Z608xLG`qBnW%OsUgU^zCHZPGQ|iD?@oa&Z#rBt;{S=?ElAMpqOUm^cvj`>|}B zf-K?Jd>FPxBAX$RO3>2R&C)IFL6V3BLg=cBrYJO(S5OuTqbn-q;fPziwq5N)!Lsmq z=0~Y~oZo|P$sF;Xf z3m|(S$`Q^!xhGX$klbJo-OC;r1!|GHshF9}&IkV;S-67RRVT|5>ER(Hd7sCgk=YyN zKni#PScNM*_w9gD#{s~ePEv5i7)`)Az&xOe?LC_6Sco2}fgHzu@G^1#55FUsnGC=B z-nY2q!yl!jw3LZcr}D4$TlvBNeSsf+_mjMO->*37s-IIia{>8yKZQg;wkPgsD4RfC zX#=Tzk}bU(N#+tH^GR&SreI_}>QzD4{5ZnFvQ2b7;Hjr2RK=?i`T_{yU<=ndO_pR= zHy|9hb`RK=f!`NoV%5uX#XauxFL^=3uuX(*VVDJE#T8@5f~Bakf-M|sO6oAIA~_>RA~Q^H zvX^urMZw6sZK^^b%L>_|I|N5jRBYk85$cMDBOD55(WCHXSAd%}K|pU`&-SB{B~VpQ zVQRjH9duQM!X1pD>7b~no>)-`fg-zh(?!ej_5g{ZZKBEw0w@cW(Ofl!Xt0EeNF}Ca zP}rfZZ(oRRg>VQ~G|;o+Q4(#g{jV=lN@?>!ScP2|#tX+mR#a3~cIT0praPi~-vs`V z+s48zHOFu}0cvnN0G98NaLOD&V!*Kq0Lp>my}FC$A+L6i0g%VaL8ga?Xq+`soPNdU z_}5QvmW*PNA76JZzrFo7Uf$42X?ZDMyXj^YoO~u%o_`9DeD(;YT=Zq;o_9Ir)8>%w z>cGq<$vCz<($*j5kfy^iER$3|NirX&d$@~aF5%W%g-dN}iiT;MSdImbjic(GNYFhs zmSt?;h=lMag82ygLQE*1K)GkyBg+bwZIUbIFcQ6lY9|q_sF!ntU4?9a8>LeY)rzUX zu{fk-PgHd%7EE-XM$@z^wr%bwpEdCL-CIPBRFYixD2a8CbJDjTLJ5~LwCz<&B9#QK zBFD@)o`F<9YdTh8J8o8(GjfD|GLo!NFmg21OvG|5{`K5q9xJb6YE?A{H#RY?x|Z@# zh{{ORb1HNNT?Nx1Zy4JTknQzlA%r{IT~W{#H$(NQ+GvfsI}vA7Uk|T#b+EO!o1uK3 zRN9*jAS=k457ieOCDc?!LswmY_L16hz!#t_RL7+1Db&Pjy_&X0(NpK|n>KYq<+cyfk8Q1`j4hvo)vM{J*8AR!3(BdCf(wwQJO_hrTPKM)QD z%Wx;)ITq+aV!;@V8~%e*pxy#o^4x15m>WaCBoo1iRQjwDH>atSJ<)r5Q@G*$OD zaG8J}7!CSjhili&r73BiMdP9i*m%!R>07?Zre&Y7Nb5^%A|^FCYDza&|T)CIufI{r1Ul0V$pJ~UUgMP zk|2@G(Vt5Z&t-^bvvdp(k+%$52M6dH9&{;Z%LJbv#pgrvSRqHab$!crvrxk0lnn2KP&oylmP0?^18%x*(^&pPpkT;4bvf>#U$@nxM!pLFSCW@q>dmzja zj^{m)!?s5DtcIlJb1}$I8-z5pn~av^?^A z_y0A8+WBXog-S;K0Cx3Wi?^&E)!GE3G2V76^qwP@MuNBl=w9-f0p9P?{||YL!0TNA z4+uBFu{_MU1IXeEGj!lAFZl0MAAr|i#KS#(Oq@GOI`0eD@Q-hQ4IuD9Dt=_i-7@ELjR z%m5Qle>ak>xaxCB9?ixx`4p<6F}Zpgre#o9+CX2Thu&llhE+shGmsuamShw~BVEWN zD+-FHk;&)Sm`<~?qYX5TfbPe%O~QUZQz~olX|4!OmLwEeCXvfx+75~=(VI+?Eab== z22LUG275^cpASh%5)$R1a%5RS0vgIE;0TAI)BwGy9v4&_IlANBmRVU() zlFAN&B%{b0MXLaggK1j?JYQzpb_J!TV`5wGwUM#Yg#00F$0DRhs4J}}=nLXg{gi}C zi3MY>cEWKmZF5v4IdZIH<{UaU{?ZzHRy;Bq_X@U7(MR7a)zLfRX6SiIXq; zAMwyFKag|D1W*6#K7MrbPr2#~pJDBmJc=rlN+ehlPcVJn9RBdY!#woR<9zEgA7#nc z&jDWZi0j;p?w zkSJP3gxL9;DnHai?O~@9tY{Fq!A?2R`YQDc7Lgn3LRK{XTb3k2vFMcprdH9mbqFJ$ z$INH2iv=93I6C8e`*UP$$0l7!AxkpVu^K|Y5RvZmuWE+=DoC4@va%ksnquq`*JBk)I}6!Li}2; zY}gg5DY9ptDI9#NpQ4o~;*ZkQcrdl4bwqp-G*!oPEQ)4vpQz0D20I`So@Mp+Kr2f! zHKlb_m(=128^bb~Ts@6sHjbwG&{d7iJsT+vmEj17yqR}v*s?+@pK$y7ePJ(vOZYS$ z35n`h4Y6Pec_UBQA0ZZuy#|oyjs3$@LkmPG#QWIrkMDbPF`(|SQwi5iA>FxYmv>{; zA12e=Lb7!Y0JT%5QPnhgUk?M4Jf?XNS8ui!w;ga5t}ft!$@=#v003?sChKMYDsDYy zOwq=vfdSDlYa(ZV_KV`q>%JlZ-1x;SIsWw1nL1-C?X6uXisJS$w|CR4sGM@f$sD=5 zjeBmtm2Y45Dc1by8}^2We<#g-*OhYR%mq}=UW8*A6ykkYg{&(!l3aUU`z;bO`#~*l4PbklcE+B!l8r zwrpIdK}pwLup!)xvuK*Ax{mDkqbVwuW1~v008W-S+uN zj+%CiE3owdo9zLtypeUC43Ws2c@#-;!ItC#F-JI*g)3Y^uUXjdOtggK5UQQPn!nu0 zaLcPm9tAsL(YtVLbJwo}A<%*mQk@$ZVHW+7D2k?H6!QD(&otOR0yym@oMpJ0v#tYq zpBw7{K*lxyndp5;m24l^IA+9vNRpiBNsCiI`DyXUFMlE>`+E_T;FGlOU9J zC<~57uD?T=xr`*s%G)a6CCOFQn~qx>mL-|V)zg?z(L`Ue7t_lCTl%+Pc+3Efg{lQm zWM#DP-n32pnjcHJ0Y&ra*tX>cEhCSFL?{>}YvjnAd2-&AMpe<=%(kSOGOxxQ&;$6j z0J`dP^$u3?HMH}t1@r^&8W_>USdQf~As$m8A(3~i(O74ChFJhUEr4xXSO|30=e~+J z%_(o>_wy4XP<#P|C1`*4pQ8^)Cm&43>|@Cfb?^FKAj`;_PUq75UG80$X+Gp|q7@N( zwW$XJ@!ZJY+NXsjuwtd;o2$qORA6*6~`)iq?EIJPKPAnm_T+yE8SV%}Xj!nTT63~JK^Z=1iDGg;4m{irw6t({GFbBL}hIM&2h%k zh5D0q9j|{V23!VI00-l`GSzw?(3p!9vZ^}`(`%e-jz2|N`}E_I9*!V84u5`RF^d)* z&iaj=sG9nwG^7xM((-buN_`9_4etBfA6fduquh7ro!~OULWxwW&5O7V$YUD?9LxB($7%{8C~2C>Q`ep=x?Z^7IDFx;%J2X77xjBzyOzJK zh;!2CeoA?5J;{!Z2+y_fzX1irCeCE#@2+L-9XB{9edlqhZ0ey>A>Q|&?K+Z-U-RP# zF`9qoidlxzgXGP;=k4y6c7nbTsayiXGO!$*STIJ!AH}c@49lP*T;T?J)vZ4(vg*~d z-GMygYkckM(t@t((tRJ9hGXO@Z)hMJAL7s}e^0}aXOSD|*yZ~uP*y{tVJyJj!=3F|rpb%XKFxXW`!Jz!gj_E7hWhG=Z+Nj#U~njfBuN~9 z{85~B@x?4W;EM_WM&mMFLW=m&Dk(tq;z z?_GlutzyE0lduf~yO=|g4{#9RnZo#^rEGclHhhs%CMZ2@NMrE{`ifAQep)x8Wm6V3cs3~!UYSpo7s-iVSgE7j&WmH9L+#Y@jx3Aix>e*RhGzPiEsiKci>GBgl$IHkqLDn2VWn={00~xBXkM>no{Y%Y8p$aLp1l zpPw^7^LZAWcP7JKefwH;DtWv-VKKlAh>57O1%W_kc=guc?%V3cV66hf5~D4TXT(S~XGOKZ@A5dtMONSAr0Te3yXg58~Js_kL(H)$@+$tcP^63ml zF1xR_MTQsX6S$>-K3oUDYjGz7zNPWc{>%W3RT1Fpr*A$4%)lK6BzeJqOsbGnO|`o> z^+=7gXUoTZ;A1TL({1=dA@0B9c7C|<7(Vr>%UHXm_Z^Sk)e8uEyL#vmf^am-k;g6M z*pnC1*4j@hKCHd+(lYhYd;achS-(c=Xl*T8xzy0`=9eSGn_u>KJb#bC6||rRqh_RT ziY6TMspSXfhMT2zZyU!DMy!S=U`qAT5OrJ}#qYW#c8Fgtp(3WG{sCp1t)r~~! zt7aiJ7?M@pEw}8=t$94~kFPzR{X2wf8d?2^Z@R%>*U=O~p-?1JJDF@>%PzBi0`QeY zY5DbUDP~-z_s}!W#~<>M?C;;#!QaGf0nFp-%uHPUS;71HO#}adu=W=Qzz2LD_z^FdRnH z+!pcpaGbWSo9ySGe8TByZDG@z)$-~UFO7gGne9`qRPWryz3)+6eSwABUMb_MUq{Ab znxkM#lC&q+wounlPdK76Je1pl*ee}uB|*dr7f=o!eeY3&-~Lj!~( zFVh>sPt9j-bmw2>S2lH1TUWzh7eC9-zIDBF!!=){_5NRT^#A>eNyl7-Z5w2J zwjmG)j!00r#xIQv&-ZmNf7q9g_o4>EZ|MgxzQ))7y28~}Jaglh$@F)k`E(RvP&Vr* zrk;5jxq;4I4*q(m1T_$3#V@YJ@j7QNzV>=bsw1?oX+>7{X|gaP{)^zY|JlGy+}Sfv zz6n@3pw|8Z0D@j7y4uTDXOHn?cO+Ssx;J%5Cw=S#W-gWC4_9BIO0rCMZx0t9w}^Y6 zdy$&@dV0INQT~k^U<3@3dn`d9804V&N8s~;ZNu@W9)k>I^2qsY9)BR9 z7xHe2ti-MVAMgs=vEBtR zvZmuw{|c@zKr>^z4B#q8h2!KirgGF-$0=P~JEXQ%FT3*t`g_^3VI!A*@Dfyim{cN( ztn8jlS&}3y%OaP}kWOaEq%$Pq8RGE_g@Wrumdj-k!l9z7ns6j4MPem1PMkiupVPLuu+KHgd@)K2B9- zCCl#mrC9sGZ=K=JtyD}oSgM>k2ZWAQ$RHeNzs{B=31rLe~5|bKUu5`rExxSS-X%s)*cK(tGwEJ>Kg)md zIRFkn=UrTW>n|AW7{)3V_SJr{V;CJ3$8pP{@3{8oE`a?70I0wrxOJIR z_ZQ|uk|fD8in8g*EI9WfY5lWLGuXBbNs`&RVJ%NR_9SOrdj>Y$ zwk#a)dm*2vSa83xnGCsXmV7QpA)lj=&y&k$D9S!&&6~#`e|Za*Wzx~wQixSf&`&w( zXlY@L!KV9vZYKK&h3@mqWm6AB3xqIpY4%qe zS=%U3(lndl%`22t=SHWbX%5x%j+ctb!T+kMiR0@)%>EssjZI|S?6=bum4OTTO=Eg?`!IRWLaLO@5h}t z(+w=fb)e0%6Fva@GXU6M3bft8GTZ?Tef!b*m1IRBH83m*A-L*}d(E23Q=O6C>=n;H z!zITrqIFvrGp09S+xFNxcu68LJWOLl1($#E+7Z-T@~x{sC2wx+qqd>Wor0#wSfx87%_ySEalpGu^D8d@mknicI&igqE8 zHJNDROaP~M)l-hOisv*EUm#_wID| z?^q_G>Lx(qkIHPF9H!sk8xr{mI*ImI1)) zxu&>B$LP3qn*HlUD++@hZCb3VQv2-f{}9uTT!dw~!$$hLJ2`jJQ9St26U>@igU{#3 zamI%JM3N+i2Ztz&2KdI0exZ8TOwZzn9%#AyPj`t~^`$tDc+Kz2vP4&V59_z~a@=Vr z^85QA(Eh&o`Od^xs7bi!mhm;H-@HA_bO`|~-2>LV_o zq;VofCcaZ8E@4{)D(cZAW!(R%qZ!(;l=pt~Mn3t=pO8zYNe>Q=71|%~h8>wOYXOhp zw*S@Oww*WbX9@DZhk(Yg2H^EqoQ+%m58_%hR*&&>D_;M1$g(V@hvI}vN;ve)bEH?F zdYoi`FS4SN&!qV0pKm7+E9ackjzjoDq>?Fjdf>hWFS1M`S>UK6=CbnT)wFEd0FZCl zxIQrNn3J^T>61tdC0}!_u45e}6KUd!9J3Cd!CCKqx4h_-vq>isB>Or=&xV(swk3C( z8z1|VlkM4}SoySsEEAhB6MtDXdbk8(S=&$L7yt#1X%MZS!r+EwO0sR8Z03^Al+!<| z6q7^a(PSUrZbE>n`w5iS;V-Ge7cFa zT!sev4S)&FQ`9HdZJ+`4sii)D@NQ&zI ztobRO9A)FZ5AgIi-(~8-m^l5XFY3XHdQzR6#>)ZwB#_xCdVo-6BZbre{i~OdAMVB~ zLa6=_f$~}&yZQtM);)(L$*8JCN%J8b z@%h^cRW*?9Z-2*gBy5Xl{Z!)J?L2ecc^q-vL44pxzhg#)pKUqUZCqB}J5*A@Ho-Op zX0bpalg2WPeOdP0>IMD)a1X8@fQ4&3H<|ojGbg5Xn z_(|vP+kY#!w{8<2@|FQr3X~|N4O4Vqtb$nMbSkDFL9l89zGwxKBBO^&@kPrKj*YM_ z*JwnN5SEE!yDpxRtl-!dj!{4e2SxY0o0=rKGYq`rl~o-@)7{O;E5VqB3`TkwtB}LU zXE0NPqTyiCLAw#CG{l5~l3CE#y@+@BZ+5fWPpFe)h zzn%2mC#gB;1QOd`eTQ=+5ROC1q}dE?c$sIveg+fj16=TpAF*xqDmFax6p}2X`TeN6 z53^V#T3yeyqfa1MQbw$@imK)*M9QPc3glBJ>7hYv%h($RVm8}d01e<3;9=ZZ02_hl z*hvk*H~`o?03Zxp1svuDi1)okfE~*~fE}qM+p(X$R z3CMi*+OKoThd;u!=0@6jQe-pff6F*%_aqIjv)`=dYOc8K3jX@rUpPPq5c%$J{#f$S zkG)@Bx22bzty(yagRc9is4ge$gO2V5ovqt=>A9y_`NC51;*uweLxY1OAaA5zrywgL zSXL`ZiYf=nYOU&d$I8L-1_=qeXcSX}IA#&Y zcEwJPZ6O>RBRwRF>A0l&L!>%3I7TMn+g32Xjx13fQ4_Ljdsefl&Wx$kc7xc#@> z^n;(0h|c1S8~#RV-6T?-n~;?M9uOdGi)iBv2G>8&qn|$xMO6rwmXRD7V8SsMarFQF ziTq$Ej%B`6_`nydplA8RJa^Ok(G-|*XJnw!N|ffLL8U$?h)7 zs;ar>rtfq1CGVpo2wU3*F^%Fr5!49BAruJ_Es65(6OUuX^Un-;!7y_7GcWp&Tr^+a zw6POa+xdFm$Tb)Yg$ahkl!hhJ1?cYR;N_*yvt`3NYyIk1#Pa8sh*TmmQj?QC1}N^G z%aC_&M+Bl#WEGI|ZlbUIe6h-cq^M@5ztgAcx}^F7q7d&>yw{R;$Ov})oU%aFub>`v z;>np@uHe*9njAd;lJ}@vwzP2FRi84Vv6%Y(TW*nm_KVx-sW^(`KXwgRMRJ3k;~-#< zU57TM&9iBL<{p+@ci~QrJ-+_>>$&EdYZ&P5;*_HfWmRiGXZ>a);fgx4eXai$?VLh5 zXu&AK@_HWn^kEEdS&5=*1cMs*qMY#EXYohN$qjYA$zzd>Hs5t`JZi!`c7qnTa=u z0(T6mil$LFt&a9Jt^DKLU*p-o{?Sb}0|AVD9)QD-Uc`GZ`y}uE$om24?aPqOxQKdh zI%?UL&Gc#YJb2%u;-lxC=6FF;v zp}l1bufF^e{oUO}OCoGuw}H*;)|m030g+CnG~8JcBRhq;!woKbH+<2{+;z5FfyyJF zPeoO=*)Xw5_=7=Z^7NT%NqL3Y*wn1fn}3AVGl+AxJw=O%aak`H)6@m|efOPc1;`QpD=eC^pg{k%{p#L&~vrp2LO8y z0L;am2zV|q$=kfG9X9c?&H%ja?qZo1Wp#Dv0UyimzKc7ryN2Gan~-D~Ns@3pqoC8@ zbs-mj=;IuA^g=2s!}RxO$)u9VlC;-0Fj-M)npnYgU%b}%<;^#kUItz`;f(XNzdm@6 z(mRwPIh@>WEQPEnM4~YQL7jkad-Lv4MvzX#8R+Y!x2qFLmJyCae{YYO%VexjB;s$~ zyh$>Rq7#Y5Bw1FZs@gg`m53{SJ>4`mH4`f^2#cyysC=Yh6xA+k%)>WxffU} zX^~DP-Eq8*gY5{WG*|Pr&wp9``Ul_10s7Oc*K5bjoxxe>pU*@0-pjnpf5t%wN?a4m_}jXU3MBgE)6Eq3X15Fp7&l8hFN zphwCP0*a|&I-dC(Esy=4;VmmiS%JByoWZe|ewgDwbP4%147RuZr=@|BlA;2v!8QLm z7}sd-X7Bq>x0;UwfV~F*8gWYiQ`tVjX(W@A#{3=lS_a?^ng9UDwuK%HGH-H~lmxzU z?uD%Q*FA_g@dcPNa~2={%vGHKz7J9v)kqXzux}8{vi3L*ux*=2G|H6f2$x*&ZXW*U zorafv`#=2YtMs4#^!w7*!5qoqILe+7FG>=^V+vGF!ygFX52y&?Vjx}Lev*~foqW>< zMcJPAJAh?^VSrIAkk4ja(;w4(OLekv9BLYB*}AcX(+{3v0fQg=+?T??`N56hA>hY9 zx`pdM_i0gj=-Hg|wL2uuA0pMc5h0udXF}q>*sx@oXx$Y4b=7gi*FC#yAX1hY9v&tZ z+upWy-B-WJ*S~!;=l*^xdN4vUbzru03fm%5KaJtd%UN>W1?1y>_<})-xg3oPFJR%9 z{)CYp#>gc14G0p#?c}JLNHLvYaNTpXExveXMc^)6F(7ZVXO9DbeEUta2=fXUs{E`rY zKqN*h6bP=bUu{67c8~OZcCQ&J~G_EROo(ub6z|MY54fy4ry8PJw@G1uGh8 zf9VlceCr~rYOCq&*?E_`%PzZ&U;p~ouX)Tg3~Hi2v?D*p$zQ&eROjXc?wmQcMYLfW z>FzB&@bTFI_(LJgY?e@6GbjJxc{E>;Y=7H6XQ_m6P&7aOvKnMXC)?Y?nmfKl%j37Z z#~loE#+6rd#;2~Lq$) z#;k)5<)N2W(BC&iT|+s8i6Y;+;zRbGcl?dmL8mK=uJ|5hlV_9d>%_<;#>)b`n8lV& zpTk|BznBkA%~RSmmm9zHot=LE^5x4p?6AY$@c2ciF5(}LJ;#NA?ZYl+uubEDIcJV- z5vpiFQZ*jAasi39b))|lt(nNeuiQy&(m|xV#+ZkNN96^|>yc!I?iU|m>%+gLd&Q#w zG|ZgC`)~XK3(h-*-mL=^bJ?9OH||IV3g7|Y=N=$<1?b<^LmdYIdk+8{f~x~40N(&+ z?w>oEz_x8lYidPVmEYO6wq0I!_g|$)Z~YNNT|F++Ev=^E$aAS*a0aE#hY+Z!L(z52 zY=-_yv08kW3vhC3i(+Pw^%sqSoC!Kk=eArQoqa3x>YL+K;VX3Zj&y*;v>AezMZ=I8Y-eXcl`0seDQ>(2dMI<0Awss!4Th z!8VO?k>Jjp>tK{ZYM2K3`oKCD9azyM6bK@XRr1tL8C&GYG9`2_xO7%P`S_J=s>d(RVVoJOW+>zM6U z5sr4T7ENj43GuC`X^*~cH{&fon;EM5Ghyk&C>xvU|oYU`xxx(X`F z!yx+*j=&KP!g2nsa)B(%^bI6AWbQPMJ?kPK`RCuAOe!e>QpdKf>4)#RH+AZ{7X+tG zu9Nx)Q@C2i1B3pyOoQ6W2$B}zvHR{;f#NGKEiGR1@hkOUIK*K8Ac=I5MaLbEmAJ3=N>C*!6=Spy3TatWr4R`fwCI9mp@9+^MB{u3omBTqGQPA zay;|QGjIF6>#nYASF$Wti0_TY( z|MJd%`c6G&0qeWsCzKY8_6Bj3OIhS16_y-1S4 zaU3eEtEr5tEP3VyzH`;(_KV9`;cq@d9P_E~$Xn!vh; ze$U3=evTKOe~yC>I~>PxxaXdGxc1s>S+~xmw>3>88jW({g%|RXk9>q9k38~iU-yDj zkL90_y~H`cTZ^J7*hYT8K2O57(8Hw!tLj{p^xVOxZ%o3IKQI-b3omwtH_!YXpuS?BY~pZ}I{c^N&Mx1s89d;b{Tp12Wr z2Ed`X;_?S^=Kz?zgYfS_VF30=003|#t_EN}Fqtvz2jF?&i^l17Qs<@~mi+NI;=b>G zje>zB2g*43eP5z+;ROUL>X2lG++Y{>F1W}E;h?BG{?clM5Tx2SFtm9&UCSOI*|tXH z`a4EGVUz97SHrk&iqUW+TGrS+S(-WTU=BIrXi-z&AWfS+mkE>V@vAOpmd*&$sT7W5 zV|u>bZw3s65Xh25eNzov)@|mqAGnmYuPh(==b|Jl*_&?tP2_!-eON16(B9I8qR9Jw z)@xf9v!*rhkGmfdmtS~haU|3D>*LS*jz4K38#lS758+KsY?@LFz@L8cD{j2%@?x?e zkV_i$L*9Lr)O^Z^2vn4j8yKRH=tDyK?-mP6(r8;+q;4v!@4T5czyC5%KJf%6oOt4E zes#^7HDt3{s;jH1sHh+u4!`5e4-O78d1510^&HOr!IKo@y*RtrS~%7+e=QWn7cFPy zudim~eLn}FyuN`%S0}LI}a2$P%Iz<@9Z9d$Zv~BdypepbfVK@FcF{KMCBA%QC||`2UXsfPD)906qhJ1&HFR zImcYeWLp*`H8n)a0zCDH+qvzE4^c3{Upbi>XJ5volio+Trjgu04`wcnfW1Ja3So)h`IaArvHiT&w$Hdgb|76LEO7p}DEMZOukBh-~wL0u?ystFY z`O>7kzKL>nsDI$j&`CrVoa&X4=W%-I4rr;|AwrcE*cqcYC&GonfcN&H%=5hkAH3`O zwvFoDrI!66P`CN2hVp#$iDGr3&W9(w)6H-W^0To5hNk;%@$&CYMo>vwlo{Ul386F$ z+uvxdDa9#78&#_+Qs(aBKhrI}ZYBj@2{i(BxNWF5b!vi*CrG9jU)>dauh4U$r*`_I zqdY&Z&rngaTV?5dTB2;b>BFFz z=EL^9;g{ERg3x9WZ>WM|PhNS4Bp{7ZBjiLA{UmPB5a6_EUM`xHwU5f*UL`L`ksOY%UNR(%MpaS%u51U)WVV_HX8ZJjO zS=@Ho!id~9i~aV;ip;n#;~c659^knz4QpgQGAup5rQ4fJ()$$~=pfSx)}ZC^>$d(Ml0%^l$bn2!Ab6llx}Bi~7NI~U#!S98T7hz- zG!>CGXBQsN_tYD5Y^jGis9xczIAG?m3+ma{PpdQ+So@7=D7B^eF!@7a{uK0>vkrk~ zan=ThPVG-Qob?W=gmzlzk2Ey|7h^E{yZs{b(-vQ_%v9r)8Js38k|dzD`5&MUPj-W$Um zSf>UT(#v8q2vWm`J-m*q=8xS*;TKzMP1L!~kDas?v4ctT(*dUM3U0me)`PhX9a++7 z4c6y-8~nD1Q3l|IiAsH_nED@ye3yC}(lrMG@Ja%I49%dz@{CP)Fjd7`k9r!aTnP{) zZUME%kkJIXV}TK=%^`za7N*0+mL0(cB$)6DB`ls1je z&lm02xjVZ50qs?%Gj6JUlB$wmP@!Bh&~!Zhn!^E07g->gSPHKtdg$JUz%MH7Jzsi9 zR79`A`ZA++jT|CyPVALTZb~lCiOIOy^5xu7_Bf>aF7=r&tUsG1eeC!^@cickskzjj zT+mpJ!E%EJMLhZMw~1SzHI2XG-8{7I@PKe%L56ua1t>5~ps4P9=%wO}B$H+FGCG8Q z(KYwy5Vw;DVYHIWeuPDEYS=Mc{E6-0Nb#fPXe7n(Pz$P-%Csme;CSGk`f9w2M^JXu z*H~UXE6AulIjWQ*NhOq5L37cCg6WW0hfY)Xm-IYLKQ!Z`ioIP7*#?D1v~>X9FH-Q%%j zwoqSPY1V%heqOQ2_<>B8n%MsYiG%^Y*ogGxyk|!ZsZ&-2VlgIpGRYNrvn2+Jm2Ac)q0$*`-F}m^b_O!Y z(R7f2HL+ZMO!)?s;U3oW`NBbUbAq-usm6V=ZnWgB;l*ie~Z{e+2Fj^*QGtoDUOJYeXXe!Dh`8+ zvk${u4Y~|{h<%+GBrap^T2E1$^Z6A?4eYtUU6RKXo>OB&M44cO4ggueCZK4cE8Ize z2NqZGg*w~ux!?&{Bu4s{w2x|xY=tFr<{;oIc@dqiO6nV@sREpoA(kWjXcya!Z=k(3 zLERIc-@2k5Zf!*QbC*L5=KOn{Ddu|g4id>QVw8>1K08lRXsQC5oz}SW=uggmfTZ?Gq#0)(1Nv>-tDWocv? zUvqE3xWrECyHOgvzAVzx(|Zi=cJ3$XJdNN~Q6fYEfbnmQb_I(jP<>z9S{-e0NcNo50{8 za3DLbbQ!b$DV)2$MoI_*h%-h4F?Eh#@8?8AH8S<(#`f<>%f>&aXp2JLpSSgYi3!Sj zS1Y;HfR+inM0%j0$Um3`Vh(_Q+wltjj-^|MlEmwG?VW+$R%atGAIytnt_ z_V0K@Kr^fwZO`#_IF8yiJ6Tj)c_8fvk5_Q~{Q%|CId1%5!O;kB+p-&eZ zryGnueYCt@wq4!DBRe;$dJ?`8(^XMwu17Gd%UIs(Lhj!K=ag8lul`u~TRbHlAla$@ znbM->9tFFt1Yl9DW-1~Weu2SM!#ArqGtM&p1=5FoYi&D(E`LtkNNeTbOk3<7=tkU%Ac#h_US}qZ1imoLwqM62nBCep@KXGbmmY@t5oJ#R^!8$W z;Fec_d%LI|&9-0bBCfRTp)-|fs2UuxIP$r-1oTzP86HBT)T3B7QOgL(o%%>67>C34}pVVsX^nviVAu-Sh#YDs4O5c+p< z{Q_4$O&2~hKBATpz?4}BGUd!HOHbd>vWF1WGpTX(XttJHMlYg;@dUPXqMJkEu~Ve+c;fIqYafsTQgA?4sw3t0x2(7 zcd4YY+NUQ`Rt8RK5^dmkv(ylPjhufhbn};oyM&&YE4RkC{iiT6#Y(3my4 z(WM*9|HWYW7j?mY3?fl@|H9X3yZ79$#5T3s zdy=egI6i`fJCNo2kN(p!hhmoEY((mq&>an()z28ed_}%YX)Odlk`k1@kXy`f82S7^ zyYPLdE9VplmI=1#z+>QDSKLvVR z+fDHz4|eyaz?lyEX%(}>94S_`SdD+YS&K|I z#&V2e#;qrqRaTgdJ3-->(0T(c*m&y>?9}4;#Tc6{VQQV7!590h7CT2mkpsLT zhI_Yxqa#PUok@37TRI)uCFbayw^5WcEb(b#iWDm>Q1iq+V^l1)G6eZo2UHfVp$IhT zeBt|z-jU8e?OBr>U{vgk4<=ZCKDc)7vq7w*4&=3{G6~s;WY7aD2+gQf){DzN0S+3^ zk9`SFw5wDmQs5>&{rP>-Zbz?E2P(>~>nZedWga@M2!!76FF}<^EtEi--KgT_eFt0# zppK^gd6gmWNmRNNRVFT$gSa0&Zv4A{ed4P0wP4475S~8fS~D~DV=;>7f#-QiRZ$~~ z=fc!-V9jkV;iy0!_bl85x1ZHnG%c;Hc{_aZYBar5?TQVh=4y{UfuG1N#))lm%8)=J z*7cra_ct9PsfY@ulO8pC_~+XJlY8X7AFFMjduj4$@XC^z#ndsAgc}2OsT8UU{2LhY zLs9R@Err;6p>Tr;It+2OAlDD!wv`$7K1=t>j{fO0p5s&$i8BQTKs0z%ie%c_!4#t$ z@;{7E=J*&cVe4U#9}24@$Qo=+`0eDul7S@TS!OpIIJ4S8i11btUR8(eZ9t7d6@d;f!*^{{riaE4Ge%laB3jgJcX z5#x4{_B^;FoREGHX%o}lO2dsCY-M;|dw9lMjBWohQOcnx$^#7(AV1uD42Zv0V&?qB zo2CAKl{zZin{D_0g_4qz0v$n-?@$!%xw(0Kt`x6Ww7F%#Xhmcv!`0aimoPIk)6+f<7Rcjk%$ za_@F)$zPXCjwyXvFgNRyk;?UTY#Ddm3D{XC z^H2sGfaHik3-1@0yq{@hA2%9x^+s_t1+!31J)Q7Z8h~QTC=z@w`QwZZ4M1A_UzEet-OIIHND<7bibo;NIapgmSa#*lkVCpk?96ozEl zI2kOFxG9c(1)Z=twHBMPs4 z+SFP(vCCb}n1K^d%O0IK8*TdkL34a(`ZfH~8ba9-xzI#do{y5Ca@~iwhsfO*Vuy9k z>_Qt7F}7IGaqGZL7*Ok*TSQw3oTAe@H=mN88YjW(JQ`2W7eRQLIMz>4gAJeItw%Sk zT$)8i^yK%qKk<4u3MeS-b;4;z*EdSwQO&mA(AK;iYQ+7}Gl2}Ikn`S#e~V3V>Qn1f zJ&AV5Y4+nP_jJJ-#eh%`uRBk1fRM^-?Mkynz zuI3+0<4*I3q1RpmRVSG_-)h%g-|Ob{f^g%W0>7ec+JQ2!6)6^bbb;}}=O^RD62Iy) z8CFF2)jlpno`%r!AJVmFp_rTix~VlELjkkO5QBeIV72^i?R~>Eqhnw?(w4g8bLlCb zpk$rk!DS<+GS5k*^M+`T!Lnrr=8v;FqtpJ65g`Uel!tbG?h@4{59xIn1$k6FF%2VP zeR9@yT@z@i|Dx;p`jbs?^$PN;k!c-8N zXUHAR=-`X@Gf}LKPpa;uI{;jhgG2_gd@f2r^pFR6@rty9cO^kD5zV(H**vLfFR&;0 zBg(!`C~=__NoK}63q3(BQ>V!Wi9@OW>Dh`gbUfl-HxNFqfX3bQ6Y?jE?4um&%^ar%FTZICZ`a?{R%PKm zAMeU!g)FI3M{=GCrtq^s6IC`#t}@%!V2#VCg`-{K&V8T$BTJmY=#Jve>`hJai~X7*~^FJkx_zAQ0*k6wU|b5_`m&JDbgS6C2@$UmI7GW#Ik!QBS9i+_qBtt48zlHGJ_0!1s2U`IPQBJz0L zV}3#dyKeYBN7&F@2C;Wb>(Q@|Wp?ekLu_Hf{&^vvqe3&~Vovqtir&q>of5kudg)ki z>!U`&K}()Rm=KjFb1KB2QpxWDCDiGFz&(ZCW=w4)XH|`?Qp;?k2qrcGdzv z$R@Rv{OW=P4RT#e(9>9!7J3cGm$% zzJXtC)$5+L?uY|b!Dy{lgPgBSk}caoX|f-#o&#&LBuPY{3@y_=)VJxRJ=qqow3{#d zLa9)fezYcm)VhIZ(wAm-ouoUz%P(tF1;4 zBcySQm>6#nm7din+$jk-L`R{81I%_4J-h?gyf$t3%vF zlZ2V(0I#od*PkBY1)fZ&M|CdYD><%>M|SIcL-(&Eunj|{whV7G*@v8&_Me;mgb;`Q ze3+khOZP{M$9IA-+Kc*l8%@hPL0F9!(Hh9all%Ltep% zL6fOKs(jiO8C;1h*Lvd#-5}y(_Q)D%X6$Fc+_+wX`YQaK@#=9uYr*=lhQxc4_o&Qi z$rhH!GB+Q}Fv^dDV+p4Znbm^@s)WASAk1C|`Vm*4A5qzI^~-k%@|$fNd|0{A($*PY zNY>v=FDC5GK-HaWd-M)0 zo9Nnx#J(<7`HmGKP92o>&!zHIjiHg#kRsrly^e(A1}EE1Q{_;t-OX5P97WmO95;*O z#a9l6OvT%|zwo5nsIUl9c|*1G3S#6~MwW8}Q!HN>8!o*ek1i*tHrFRg_vwFM)P(%L z$$cFz(92zmvK*A=H5|wYcwH!{?mUHI^v3WO<%MfvCmYll^Uam*pg{T`2M_SO4XWKzaqt7O@QH!bZ!u?+ zHRp*~m@~9Hg6mG@UWvc$xB;U}A06Gb1le7qb)nG$fs>D~y%z6mv~FKuGn|UHMz|Ks zFjX+?jhm^&vO|s*{S<^ifR(%pe)X^k{40><2mSk94q*OcZPd)?(RzAlCe9c!98 zsaQtBaxXsdwn1Ld$`yIJ#NYTqN{=p-ElX<0HkD4sn$Yjim+pkrCWt|61%c^98^E#+@8iA=T)2dg#aRCMY?T)A~5gox9;i<5P`EozYBC612Az^ zR!jWic)e}%h0Jll(rxWu~Fq9eR$=<9`(WKj@Mhr!&lO0lA z*~DAp=4xi1#$-S?Uq)ZUJSgL?=3_fw_>H$$P>{z%6X(|4I`H5TgN|10){+K~2U{~( zfi?S9Q!LV&&9C&>Rx6h*Ld(}$K#?^4>mTk+sY)D132hQnPB9`y*p;4fpMK?WP=$YBICBveYL$pAqJ!tOM^7>wmZ+@V~|-WK#@=XiUW_9Md%20 zvo5TYC&FF<&aU3BeJK3V{7dDi@N?tB*~2A_g8{6 z<#up0;8RFFa)G-hL2C%=%tKfmn*Q}VDAUN`F@7qa#TuRs-dBtgHs!*9WiN=YvcX#0 z^&5Ge)Pw+$8}@xhn=>WSOx`E9s!ezT;@3?KFaT9W0u`+^&DRF|huhsFFrjShYwYmH zd8^x?bv{86W@NiwlB)-XQ_g~Tu>5+rdFvoZH6M7b+v}|l0&(vp1z+L!)=q~vIHp_^ zuhXdRk8vUM8YocAm-LspSd$4i5R9-n%ii+~c70YJn2N*()Q zeu5etOJA(Yb;tpE?>HrkkMNzt2;VK)`DnFGjOg^epae5`w(|)aR{sqj zlvY&h+{?%0v&gG^omlnj0OrzcV9s5eKZF+hrfRd`QFGwkW%adV>6x;tmh^lngPmU5 zQh7U8ftL>*JJATHlP*$_WNZGp_un`PbVc~bNYShJ0N_WfZnuKbbzjMF+g2ONc=VJ2 zoOq`0I@OUqw(Qs#Q3?R}Fz*BA0*3P66{yidSxmNBDcom=?3|<%T$U_c6PhCCw@{hz z8FrJNMD;UHyBRAYs-TcT3GO&MER`d-lv}0^(IxBjWihpuLQXdE9;&hk5{WsG^?L~}|;Y`^f+5g_sN?_JosxhlF4r;Iy{@*s{BBYq>!!BLBh<9FFQYCCF zqfUd;m>Wd@L*Oz!VS+!s!lwnYE=Dqu62Lc@y>8epp6)AjuM4YwoircjT23v@9O@as zsTX&p*C6r>9l&4xwbiB5^xsW;C-_!;yL2EB-gxk3f;RzXy|$}UZ*JY@OQ)44MtO-8 zD%`QwHAflPp7Gr(Yuov&8eCri#%8gi(0TsP`85*&43loC5{pY*KcOpy$=`#0U3LQK z2+gAIV+~!2@jY$6#eby3H#-0BWcWRO>QwoYTGZ4oHN%=1w^9n|oLUn6 zt1kU^d&4*a1Uevr0_GABU-E|BE4vT34$g<#z5h&1aw?rj^-B&$!k0q>ncnF`6QG}g z<$sjEAt6Yw9j?=QFaAH^1(8!;>4%@(;h%S6x^tZglfdszf4TI)oitU_RrnF!rJaMX z>A(8A*}=d0Ll+8|5c%%qwqRC&NrBQuCJ5&z7g@$95xIT7f_Y#2{UBrQ=Ef`Ka~&-& z@PN+NuJfhQVVSVpH?W9)uMW0d4`D_|gM@~@(&qT|OQ2p$dAq@b8V4ysy6zxdu*O<{ zSGbQe6w6k&6E1jo5Iw8j*Kqgik8QSy@4_xz9jd8MN1aH1S2xtdb<55f=W6suI!|R( zyO?#zRUO$EaCUto#W9rJe-P|8+pnOAcQRake95B){WQgkTB#+t;+OZkMPJj7-RdTf zD{R%T`2_tbY%Wn^C>s@~KC`6MxfPCX6;6;reMuMZ{u-~h?pxWC1?fR{g|v-UZY_=^ z35?W^eVh@}iJoA*%CaCeQp$J2X0kw~CkNTy%D2PBH}eFZWZF%E)^_w!Cg-dR%J(oa z_aIb*W?yRqd{FYnmEgwf{A8WmJr}0h`f>#L{$;6VsVJ_?`PqYDk%?%FOt+%nR&N*2 z*DLyN#h#ik(F4b1!vvbDwq3khN`o~y-}V=ll>VDgLt9&hpGGpvalvCW+{b!DCt^fi zkZ=jRUYm8mFyF03yBe*8&sZ%6p zaS-Z|hEaEcr{|AIJ%bp|R4gt*>~Yw*>fncMirtOZm&&?WYM}@eQCCBR(oun;{7(38 zM5ciBqxDtJw4t3N%mwBuS{Ur-^LC9&;MF6e`x2@IbS%YeRzC@QdH*@Jkmj%BJ0auij4Ql4z^B+g8MfvJ=$>b4N|RYhrrjj zn2t=+7}uln_!xa8F8fWSK)Aj&vlK4CrKG(mPm(wL?@R_*?P8DNr~nOLv2qH|fZTfQ zr<=&~IOgQYe))W-oFH#UAGGHy_jsAR#Y~WHe=g4TcAGT4MI14}^Rgp%d@h??a&ig< zUWM^-v#Tv@#YK{AG-XB+cfk5MCraWTaGiw$NH^>LirWl0`L2q;<5&Kjq4coJ`8cKJ zG$~a1mAX);201ZD#F_P69WIk>Vc4Z~s;in|!a39PLJ>xqM=dSAOe7n*Pp1u-$CS<` z+rQ%QvyAPJ&-*k!kU&1q(8i9Fd1pDdSMw7COy)H+P?)=dXG`}K!(3r`hN;*|$0YQX z(hh+Kt{Kxu(G(t#lG_)lac=_=E*ztYYGV=uQ=JRvpAju0L)sEwqYoXHw1UloH zuEOVm(};ZcSgW=F<%uI$4e}-CnM1l0+z46oD|^c5BRW&{dY45#OmW#GL2_Q@^%}yB4B>d&zPWU|8I_7H> zL1^C9n2z;Y^~lI#^HtyyTLF`#M5gZzkDcCGUMhzc{oOMC`}EhOu43p;)TUjjx~w%dXPXyFFQK_Cq^aI*IPbB-^|I<_#$uq5WR><@#PA zzT41r2cU|+eoJU)0o)xx4#%iUKy7ep9q+anG5H3+z^|Ty#-RdNr#bx33{lWa zHIR^fC?KQ{%7c>E<7$+Ojl zS|n)w6DgN%^3b1sxD~xFUuq&4;R3CbUZbSMNK&AkuS4;=lRr<~_4x>8WD(E%Y>cKn1;azM0Z-;@?GI@|8l72xng{5Q*$ATIBlJc_X!V~Gd5t!%AmQ&A{f z6;A{Zc?D|w;1@pd|7eYS;IvD7?<_f9-Nb4FBc1}c6GmHs z9^ONQ_q-y@X`9Gmyw~D<>s&#;_)bM*215gdlhY4(nPcvgoIi5WBdm?vDD6=hdT-%= zr0EVD8l+V=kOtb@1nME`lUU>wvEu5WVnK%FJh-4(2(S1d@GGO-(=w zjAVoUB52S{`Zfl?1*%`eCajQuS&zC&EdZ+jxw$0z(|ei@kX{7{{$uI+i^^1LBEM|T?8ykUdNL}O%yFNV zM~4GVQ)GeyFFbiX8S$lrW|3?6nHjg#Ak_*>*Z)aVF z;axp5g|-O01f1sRDwyMN5$>%!Ct3MJdAlku`q4+aYP zzYA72Li(C-Q2EEH5lE)$?e!6A%+0m|80p1ROLKi%IGrId;Zc;@-@dBZP<|$?FEpM=PjY9DdxC}c_t*UB%$sYa zX^!I11x}lbzP8NK6T-{dM7IirsR?+vN7F50w@HF(B3Ilsf;B$_$M(S_R{a34+t(cs z4Mf{=7$o;@1EgXPBUIb+UFmuUpboAR@10UJ`fovqHg0qyGGDd~4mV*Wx@s%xV2}(1vs|A=Uc#((e4OGi58@!kgi;4m zv{!7Jbg!~IGe4zo2$k00gjBR+U2OU-C$^h-;U(W>`<{M+swQ|k$P$RTM(f(uCsEHJP^BAySsj@pqV(|V3fBwEWkHJV=Skr+C$8C>|gpy3Le^TQPdsp`cT`78T{NdhB{7;J!7>XsK5cIobDtCufk>x+Pr!oJ{3RSKD{sl z$qYJeNL#wmD0IvC$iDUjVZ7<&8~3(EE&FirGDg#Ght+$nmtqa!V*(%KcQ$K*6y**^ zTSSnMlGEbT98_beT_dB|WHXr=x2Mhtim5Vr&UM^UULUP@gi>2P52v-RpJWzd?fHob zR~|ZYV_@K zpSU9*2Uvc`eT?s19)=`$e4uKR@U17lE(noNw&xaj_J10wfe^EvM2gTm<&1%4_L2;q zP`?HnY0+JzMeoe?st+1Ts)=&BDzcgin8BgTM6Mhtp#u*QS$GR4CHO`8gJ)vzSU=}U z#|@iw_<1h&Hp@?Oc|^*GYwnpKl{j4u0-vdnvt~#>7l_YDWPb}&#{Y2;{9*{YV;SPR zR$ykSzWI!(S2lcCUMzr@momaeCUf_ft>`>Prg*qu*2%fP&b?nQ|58I=Kgx1dK3g!k zG))^a7hXZND94g7RujPyRWKts6l18M78B8puFMK};-yR&H>@jphiy#jb1qATQeZ|9 zMR-%hAK#}bv?R0IheRw~i2!lql&GW%o~YiWdn?P$hQx*n9l%Z9zW0PiO)90T9^%*4+Q`8fTIUPpa%BY)<88gA0I#ny!oE^1Qbg36p8EAElfh z*97pjgT=U9{Z zd3(DzTXnB+4H2e9t-%okkSb^mzR6i02MW4oPFsV9lEMM68Vo za`IImS|Hu&vG+0Si#qdHbxeZQgA$}oIUzXde887F@OH6;aAi)`?FFXpxHwd|%f9T- zEcwlMMPn#}IFZ^9njsLrQwH4c~KE^Kkmul^pvPVYmgiyA<8%%2MSFrnO zbkl2er%CV2r?u;{s+rA}SaKl``Y>i`?-HvFgx|&d8x8+qkFfcsEnKrNd)dQx^(27- zsS2dl@p*Vu9QV>uZF})|3?8^X<#ES{x?l4OUpvX3I@euj1)?DbYibzMKhx$gSp4~c zSc8x_q)KJHI_0$1FWp12*zRZS{-^ICS-RXCl3H1|wDD7m22|x4-Zt!9?A!>m7zqJY z;y5`ei$Z)wI#(p@PKPb`R;6x()1#ev?H(ktodo94@+vfeZr@Y$qlWLVTX)U@FI)AD9I959Yeqv zGV1^^-9FwWLk-BaDO%bG%Y+vfEk57x6)%5k zn96M=o~&DB5dvGvab@Y{`%@J0E-wu7tm%cNMeWsD-OU{Zf?1$+JzE?7J=leaLY?tpj;`x%!b^OpxKFl=#?cc8#PuLZgy0byz z0?Xsh;o=95(}_$?Nj+OZpXb#^TB{7P_v=Gd-d&y-m&#S0zq9#xS=1g3F-j1$sm_LY z@UvvBMtq6vQTevh&87y9gt6kh%N@4v3qqmN|6)eXk8M^&8%*Gy$3VwXR07;ebet?H z%ADl$N+S`gF%CJobds#u`RwGuXQxO$ zqYZzpGo*M_6lpTazN<*>-BHM6205fM{mXYndccWM~8v+PD6e^7{Ad* ziT>^@qn@oZ!#bxY#?KJ5(0^A%$KoPv{gvXO!SxopQ!4d?;ax!Xzz0ris~9O2;!53g zZLy*&J3&pv#K80#UIFUPp&5^Y-Itk8UDKQAPc)i;sSJkYMs+N6h8qKj)A?SY#Rcy6 zXa3q%8UFK|PY2wNTE_cd1Ge|KGMUE9BAzJ^C#y2Cz|L?&g}4lw(UeN?Dff^QS7gh3 zD0S9Qos!T%WG9$6`+W@O3QuXT7N3Z6aW&Z9`BO{)!4Pgy&=*8)nCJj;y{D2ZRZW+=lohY+eO=Ll4dvQPed(4sr7sDFRkPdV1@)!KD0aiHoZ0tG*VR z;$_s|7I>0>>_d;)BhRw@p(tbN{TztKv&_+7AAxk6vGdt&bOi6t9iXc4P+J~;>7Hh zS50_g7vw#EGN?*Sn~AZ2ek&$z`(=eM#chUc!sF1x?QOENxGX=D*yq)1?JB_T7MNfu zNtnS9yRW9Zoun^Lb$XB^ZN6yjaDKYuw&`&Um-?q80*}g%POTywgyZvUx$wRl>~&FR zz0B6}P;q$^Y3CX6uS|bOs|)Bs^+kOuQ)j>6YniK=v10y6PDU{aIfl z+_^Dc1b)0h6|-Q4*@6^>_=}$d;}7I(WHl?anz``D3l)3rtAFM>Ah-5r1JTv?UifGV zUZua!?;g~pY{M5>V#t0s6dz5&irnUdDOXOAu7xa)8LVdrJl(?j#S_HP<17NN6{_@G z%aUxA@J-K?PhK4iuFq#63Hi5}6zusJAe(agy z^*mV7I@ zkN6v0>y3r(`tXH>n^f>?}4tFS&f-@*Z-Qf&V2 zxxDif6^`N!f-M!f^7Mw7_?6incBy_((O3RpOCGt%L3mkiz7Wt<2_5|)R*ZGt~1E=S*rqtrP{A>vZQ{^ z$a8Hz;gk31oxz&F=hsT=~=riS`5fE{CL*G^@ zDOtZzI_ZAzI|bb(CCnyR0F#P7)3B&^5+g64>|__a=)E_)WR&W8HI@0Xr6K&xIXF>b z(w~+&_g&-WF@$(~^yAfpj-Gz$e(rqjHW%YJ_%K`YHwu<2Hkzz@slX$-kFFHm$ZqXS_~4{@(vL zElrxvc+oG9VSPppdAg&iW$pi~RH@<=+dc^$ys4)BA!|lBH3e-L!`o2mN9tSAg=ofg ziqs84W07S3QivJ1N8a8D0yiaP^PW!q3CqhZY$; z*&WG51H%ue9CDH5ny;=hifIa?wQxr(R|3HhP=f1Yg6F`6wbvhPs}0V0!ImgA=R6fe zy^hCTsw0}=NVjwOIbc^BGh6bRM`4KNI}0RxX5~3@Q4HT$??ZFh>0B_$aE*msf|v+o zPF-PkS?3++NU0TQXz!Qj$%`v`G;V^LdYlYuwYw_&{(j=ySrzy7xxu>hdS9q%Yg&Jp z@LQwnq?Drhes%|0ZD#A=jE)#h8z^;}UwfY+di%x?ExliCg&u=G4(>HNwtZbX!7u2; zd>^&+-RJoht8_iXbb_m#QPP^ZH2SQQ!9H)wT2P{6LeEZ>AKT30Jb1UiprDLQVH1iM z1guhaOrowfwlDPr_#og1$OB_P`CNR1^ub{(qA!&4rvl}dC8Dnb0d&RlT?py~f=+DX zEYi+StdOeB1(X@BArj zmzqL%xu~)7RF77ha74d-S5{WK7cuaQ45f_s_+5-8cHJAS2;7j;PnEgMu=$BvgAUA4 zN8NEC+5YN}oSq=2b_fC0wzFD^lMQ}_JA@a)$S&%u+ZG)4%E<>^!KBZp+OAc^0y&cC zh+D|@2MrA0b~KQ$4{4dC*?dPVNnqZbjXC;44l5LTPWq%C$ztGW4yMzYh;)9V%SeHHQ%-e+#ojG%=0NmB8zUDj=cq1 z#?qI3o4m`ykI$6i*oag#>+~C^C3?SSlAWHz=hY-YZBezDIM~2R0;+lDxnPQ4sdMG7 zvZ{t0kk(SPfcfz>s<6|sYPVZxkwxR&(anOd*uIuh{UoX~&9hjZ>BF~O`%|D;L})%J zeR8YWgo1N{W$ud{QvTuaZ&=}3R$fc&=#QIQP3E^Cg;f`{(4nqjLVlO4erE4jDI&MP zq$F%?W_@`Dh5wOs4Zv}IZ#%YaH%=N`O&c{%8mqBwZfvKG+1R%2Y#ZCQjqm>c-%NHU zJ3Euf-Fxmi@B83=Q0+a(bv!;^HsVZUm^Z(MLaHimm*t2`6!{)t8h-lsH~u8z>)ESB zMeCh;$7NL9XrJ^J8|qEmmh6MbKCY8zef;E~;0}9Of^`Wn9h9-WGv0TZ6OHfM$kQQ$ zxJMr!X;d(n1v)!w{T>R?LfVL81T91!=yj4}(rIaEt?7q2Q4<1wv`l24vDLaB%bPFu zeh1#IPemJ7(^CqWMvl^*c9bR;4`X9aSaXic?LuVTCl^L%bq7xmw!HuT&4<>R;rQ!L zW+pL}A7taCJFGtam=szMS63WBl2Vh0OcF1{Zq@`U7cfIdog)m8IGajP^vM`U4tu5! zk&Y2Fh<^)DpE8V2sO|{msmskM0VCT#vh+sldPcGCtctweYK{?)MVo8)va_?ZK!u@5 zA*;=xxc=w8PEmiyb`@5y19|n9Y zYc{U-UdpFF$8NQI0mNBNd+7Lp`I>XBY3)$E`fwKrbcv(rk+?Dhnclg zzh^WvaOx1Dd6w|*vqZi!BO~MeiEd({z6YXc1)}{gQla#8OMt{POHw{TdwC2s&jaO z7BXIjQMD8Jg-^?p62^{_j!oW>pvW?nRson!fGn}_);o|Uwuqc!I#L&5K6d*TKx*rL1fT1D!^Nrb@ z=4cRaItElZ2}k~YGro{qL$#Ogq=`x9|GKKR7VTQO0A|EQoL#wS@e+W78vmE}oFTks1h0 z+IVR~rr$xP9A*=l!c6OIu4T&V%C?z)=TE^up4T$@XClHr#V8)+c9+A?I7^3ay`vJo zxB2+D1;dJCD5(46Zs#n32gh%(XL86tg^@n zJ}}OaX_~`YM1Os{Xa)A{P}A-wC~G?w%pDo${hOnV3k+Lt=^TZsLVV541r`W}NS-@v8epr_U3U!Pcy*;@XS6@4c4aV?X(IbN3sn zzpBWsFPwJ9;w6~;-|eG8spuAWYMyj%Xvff^k_5^fSm@Zx;I!Grg%k_hJl<+~>K+~x zXBl`PBe>~^uYWuxVo4^be!(R-LlUL@_Co#Y%WH^vbo1cvIdTk&8Lr;_oL(fr)*B~lz`gdes&|2BNp zhC=DVzAj+i*^BW5vMz10Bfi!48zMakxzPucB4Hw}EH-rzWy2?V+WoG>2P5)-xJ>E^@=n=+wj1bJaFcy=3Js86GcpfIF zZG7^Ch|LhqD6jGqoH3vJqsgqItTj4csk78*EGV1p@yoP)el$pGjPGEk+h|>Fq3&u* z(DT~bz6Xl+aSO}JET>0o#Vrjt?~0N6&S`eJmIgSjCX_UrZ1BkJ*yC_xq2NLS$RdwK zmWW>HyEXc55a^h~f6U$tEUbT|iK}H}meZSFXWe%5L&G1+u{VifIgsttHrj0I8L96c0ikf`%5l8+uA9h*cC#op z^cdosu)1-5>1axj)4;C$EF!kBZ`#tzWk;!Km>Z^4mnc#m*?Q0&k~W-!h%jv{Sg^8B zZyOV1sKoC}27WvIYSVI(lA0W1sXZ%~cI>z74q}+#znfJ$*|+taX^I-j_^%BhNqchQYbA{tBY_6uN*>}*&r5v3r}_j}$T0?qTrxb5SlP*6 z3^*KGeokvTT2Gh0K{?!VS-mXiB10Xms!KJk5=dJ8@qNB90ZiXy2r`bhI-^&ZfAu^> zgtGUYuHnmGkA@ri?*xWX*bouG{TO0C*H76ZFNZ6U(ey?@VZx&0HxzjKL3b3ZcYC%f zwo*nn;&x7@zar-8O1iat^h;4ky1%5ni!HHC zR}ee&j$S=?XXc=fO9Y9^mX2-M(-*!9SBrRm^DRR3r-i5{P=I4qGArWrANRoBrWRT# z^c!+fIm>!I6}C5?#6~v;fTR;8QBS1qt~0kOkrSLI?z{L&liG>|nGQ>_BKnNYP&sG~ z1e;Gb2568q@+16E8e&u?D2b623c`> zWxFL2s!+laOa{tE6L!jlUO-EQf>Irx1O^bnmJkvIdnKLd1)k~GK3}1iH}|c5=S+{~ z(gM0H$u$XbljT+8!}X@`N&a6MUkYbRoSwy(HCVO^H~d0l8^O_So_r+xilB}JUR^(i z5688YryJ6Tna3fps|!QYrR<%fvlhgk7yqfs?uvCI+GpAQ z5V;bsjUUBvK60603!S*!;)WP<8tncVX+)&8@!_^vJc3r`_%l{zKG~6gsD+dTMr=j& zlfGC{hGwMcJ%tY3OC>!zc(R6hx!INuD8bD?9C@QYcN*0M1H-{t*IlNLR$o(AQrDFv z`hSh`O^qb8DT>YVgfEA>R74~yzW@9I(I0;WmmMEWWkdKi`1Pl5pno7!$eZ-=rFr{N zJ7#bX7lj^%ob>WUHS$c(!|s9isr@!TEYjPWiGW*z-Nu)y@-&wf9u9y?Y`&n`ScuRW z84H4+@6)vx#8zmD_ppT~bJ(|L-8%VjL{#+o=zy8hwE&g1(qQ_HWd9>{zRl^on6EchEhU_yA+gxjJesAD3XGFQY5}uK6duVnbeZ& zR1SkjeRHM;f%1;IN5^$&ZN&X%g_%Rk%}afjYhdQ;3GIpx!Z?UwF;+u5o#B%kxWw)i1luS3cI)?DJ8 zzfAIKe&oA5fSX0Xv{a<;?rKHC9QJH$046sj5mOOcrku^I>Ml(1Qn%aLpiu((+o2SM z?%UME<-pg6+M9QSo9Rl?{0_r&W#tJO3i=G8q`QwtM0xNU3yWp!S3aU0=x#ta%qkFd zf7Y%93(Ca&_4}vRYAw<2K|9kc@iYA;D4|h%J+xtp7DtAl%g)*Y>atEbwgMKSjzR&u zZvXZz(p9@Z^^P*kbj5|6J3;Z_@vr^+h$;EgY&`hm?Lnv2OSu4)#^L+ocvmhz(b@#}7bcYD^(MX6KdmxI*g_t1>fI zl{qNanOqI=pcwV}q?5DF+Um|dfA@>CGg2SFsgRWGeOa*aT(yWK`-~L5zMn~y-$I_# zka!yp^Uk2b2RT3ZM^a6FwQsXWe^?bZOGY{>2Ans~GdtADize&SiS?`Dr_CJI98>?S z5i?tz_)3ubAz~q7PhJni^e`7}8t6H<4(6897-|3k`=ln`f4xb)uGDY+EsOlR>f$X} z)3dM+Yq8+vrv@kYEM%guYY zuRHAc`)C8ds9Kx5BPBqH1KbU}v}d0*{mkSq3e|r9C(7c#g|k)mg%43n>zL9cr8En& z{zpLnDN=mk`k(Ids2}FM_}w4WJ~yL+s?z){kJ%W!2}LMmdVZ02|=)fA|)Lk18lpsMonLUr|@)C3N8pK3?$!nsEo(n z;$)baNj<{9jXUv-<)M&JYTlhjRb%!P<#W<4BKcWq0;kn_R7K=r@}lllBWJS-9Wbk# zBCFNo8xAK5@N80Ge*f{e)s#Ey^Ll@+b1^p387OzJF9i9&@Q~0B{Mc`gn}X|d!#g0F znYBRNSW?FYISgP zrzuUG#C|YC-nz9!(N8-65NX-dvyogeRCx$AhV+2R5x6hK6f=+@NFQjegt6)v&?4P0 zORZhF=ObHd!((>mr|q>kr)A;|Br*FLyHkhYfFI-^Hwowtdq+`EcZz^C zaXYOqmr3Oiq8k2|1i=-(%=yBw?qVJ<>d^5oUPc!2dE_{JiH(L0YGZd48aN$hKu6B933QHtGRlyR^4$uhFNZ)?@~ze zQprR{t)k^VVELZs!SB`)UEJl%65>J*vGilCJd=;%=AY>5_N0)ba)IYeY>TN*uOI0b zJ93nJ;wV3-?im9jt;uTiMby;@xjP-?)%^9DQvP%Z5nGN@*q)|jD_ut;`DV;*F@*7JPq`46_it4lq^H!Tik|H;l=U_AQCX6 z6hJ*V$L8Ah?3Ec~>k9D>o$JF7dz&&tDzM5I)WsUFKd1G=9FhAyao(EbG40e@doyY1 zy5Ys0lWYo;zq1kBy`VLBS(E9IwMCfp+hAcAp|Z{ry%5wV$7oE{zr`A0pr>`*yH+2R zl~*lS`+n|zb?UmSw2ygABaM~LTbv2SjU-VH9*rFcU*Nes{m@rDxt0na*rCFSKoINr zpzCJI1kIg97oh?g^?iGkoxjGdTX6*UtIF24NJkqWlC+pc!lO{%FIq4zH952pVWtl0 z-)BIGhZ@QL9Ym=Q3`_x{Tl&8-Oaw{(7$2Ykxey24FO@!5*;4!;dKb|25*oy`ib4+L zIWIlH9P32q*1b4hVx^*J&v$%o^jTS(oUnR1f-U6KFS@ZsSy2KqfHk@SJ6xn^2xS=8Z6!cpba15 z;fYde9f!q+(g<|x5r0s>UenX{KVx;8_LxvFYOr5LFR;PBA z%{4T`;mUUjQ*H>}RR?HnTDip&Kj3!rw!Yo3NWBTAB)zWk1-^cWdk`ec58e{mw0@x5 z_&$OmG~H5-MC?i2w@lCboWaN!>+^eomni)NWFp3~L3eWoyiv!Q)MAZZ`pB8+6g)G1RD(Eyg_$twydRDV7BYqjQ31e`hYd%;hqn_q?G>*>MbpyKN~8A)84QJZ z@Sc<$WppTtjVj!cRzAX7{HM2|n%-cDamPnRXu3dVB8@XlmbEol$F4Pmx9ciq@&1szC0Xbm;iKz8q{zUBbT7$F zd7@zG&J`;=j5Gr1Uhu3x?p3oto}>^$z78-k$~@c?nCrUQp6`I3b(Wn;taIB}xJ>Up zcW-Za5V~}2|4=%xV=^uGmwWMsTv~P~Ewu9YG!e$LN73Pi;H#`MdeuI5`P8EfZ!MSL z58K1uLmVK>poZWxM{MO$6-64WG{YBR0#&;maqu+U++_w7r)&A=oTmG7RX!(;y4OSH znhlRIe=tY(DdsYO#M*67vaX1K1ig0VFfeZae&4-PM}F#9O`r))fYy+1{>E%_JuyY{ zp`QUf>MEqoH4{PTP|Z~A;#c3vo=#g`fM6*I*6#nJ?^X&g_2oSrkYjNrj-w|6HbIL+LPr1bP`3 zlh&Kgo0juqUWc7Z_tVj~s6l8X6c|l5Yk`wyZs(`ZDM0D;C-sPYA-x+nGBJ}Y$rbd% zI_~%439-G0Yog){DBqecV}=bzH1m`?jEC=QOjrC2IijviiO{tnUWv~s<=;M2Lch;5 zVQn&m*sO}BK#9~Lh+)jc&y^@Zvq}{q%_~Rhau1Ds4?IAmolF}Ndw|f<*BndK`IxBl zzA(ux)?5u1oNY!fgutk3{JRL^z z2$=5il)`(vDo5)Q7c~#pfyk}xGt*H_*kC;~cQ#M37|G=@i(O8&xX@0K9sC7*>T}JL z{W{+mbn)?6)O|JOu0MEeD4(LckYCl5UROr{xoWZR<7FAY`3oR8$Oo_SWo`NA=Zj5DC7@;AA5jWtIea`x^pR(5A z@n#HGy)i&lpwM7QY5zRO0k_-~xAH@b;g$NwRO;Yy252Cv`}J3PiXnhuAaWjr+l$us z)qdSFI+!A*WWuR~4xAwZ1)0`dDt2p&>iDnFHyTxcGy5sbxqe9lQ%i-YXh!~#kvy0a!cJl-YWcw(&LG!n>wCjeMGj;YQ^ zl_~GDlT;y3qWXPsaoNP5&(NjWWF!lNt|nsHrbJ);D(Fm5dMqYe4PsSJ+u?%!uS;a+ zF)OS_oxyF)f-fXv)NnF$%9mo2b(Ue$v+{er;I7bEZbd^WV>=Eq-kjB%NrYje2Hxf; z-1%MmTbN`@V7ezEI9QE|=X(6(EwtrjKjT*`%>^^g(;$&+o0y2Q`*6W&oJsx^HmD52xK6t79Eu7*>)hkTC~(Li_yojtmiO z?1;345^8yKBj28NEQ1}rFTWCOx&mt&LxTSP-br|`9k4f&+r1|Z0)2mLA~Ml zCu~2825Jac7>Mt%fsFnO5K;c+2?0#7-{+c!Br9z{*`7J1YHIQ0-m$m2J=AXJc`r43 z6*j-Vx5s2zs}tqR{jdy_qt$A7q?zhIb(-otR53oTX#JMYK879d2<#fe&etZKgj(PY zuFD;yuyMW(?Vp73%|*$Hj?O z%LAR{{0WiEM9tN_rd?0V?!?`%GxkgWX1|K0^b_0%34y6`kT?y+Sz8C#wQR)2$| zlckrAd)>}cn8ijzrpvJ1*eaQVKHKlmQEbn%lj@(gyD;Y)@kO-9mbG+95uWUGN~$1eJA(tThgVe~^GXEajOCu)!P z9o;{i25Wc5l4$=km&k4TMwC`@rWp`VyRX$Goa%Z~y|i<9;1wXHZu#7`|G`xgqr$d{ zXM!@1kzMs4fMg7*Jg8*cQwu=Bb7k9Be3*-qJvjhCki6-r8;;!tF{ zj+##IavTWQ00U~AD{YZ2z=R;VdL57hvTVhQ zzQy9_XmKn$3#$mHwed%#IjnmAaoRTm3S+4{KO#3S$j~qBGjRZwj#tN#w8N&2h|&); zGY~sao9_q%m#3K~H+*Ud5IcnZEPp$;9eG4Nd7qj{gJVd3tH-t>y6V0@H#_Wq(r{RQ zI>4&Uix10L?fzZdR9Gq-ijgff7ada3_SDY&@piy}Ffr4*v+{GbB7EB_lazq=4f*eVCjlgSUcPUG%c(AKv0z7R+! z&|uGV6u{SY~=3uVgI?VsZ-2)?9=ZQVc4-hw94%+H2qw?Z0sx<(x$?=F^)jx@!)af zo^fd+ab&fRxSYZ@i-A@Y1bA4?50c!)^Sm$JdFB^t z9IlMkebzt@eQ5`($~uakP%6G?YkGPF9s~Wf&CH57kMqoph_Y_=$WjqMX6s(#42=3k zL2?qayX712kQ#cfxG^y?`T7eiI!#VDlb}5&gJ&!bK?j~5*|N1tVhBr{BWx&gGr#VT zQJ}XF=d8sxJvbiOY>=$Rse^5!vMZ#<5bL{y6|IMI8Ej{=aD(&fs={?9w)kNqk8s{5 zGw9K7IsP`qr1(8}%8d`O2+Yc*4kQsbVa0q~?5rmoUvF+YY9&js2u^<{>cc#|aP~Of zf(J~CVT)as!Wr{bSn};|7lx|{DGMr`FECixW`MLQ80$B{GG+tPgizCjlAKVb5F?Zs zsQzyrXzF}L%QX0q0hdA@M*8~H5;S#dEI8A?sp{dgQ;jWEUkz^XN{o=t+jqLP|^I zuwq7V^9}=d#OP77=>*Z9%R?X=9=>uQKKZ4{RY{LtWC{#^|v8= z4X$^Ib}N!y%}G86f=5lZUn{XfzsT?WXmdN;yuD%Fy&op~Q}68mLvbTMx2MxUMMk?X z0pTvGj7|Phcd^co7%cS81{Ui4bzek!y4Vuhw7=iU`p1n~W^UFqmNYip=pSlY9s;0N zUSRkcva`5V!iMriB#Waj;yWO#DyrA=Q0R4tgssz)=kp%@{W)rx0B%C$90!lYU1&JV zM<8a#+yTf*#Qx054uj+TcWsVE_6bfv0+*!KEtq*pw2upgY%zYTD@My|+icToB>Vxu zmK!R466HVML8l(iWc0T&U2LDMv|O&{?C!pNRC>+rQ#wxIHM1ToB^4h??|pv7kUF z?(O|hlNuHHyP#9xc>>pDs|()0v-Uh{Exf&RNsy+|YIov4S_e`ucgdbGH~YCOHUkB% z)V~8puMRgV)grk(x9cCrMCJ}aE8#q`okYLSA!n2M-B%t4ePl1UJl~oPb=H6?6hG@> zT+CY>&!;R>YqgQJe?tR}t#pD&Zj0HnFHm#Rq{87B!1o>9XWgD_D_-p5GwgHxP)Jv( zCFF{V=L>-v z&UB{)o>{!&il%wnl{yv^;AZNl%^_>D3NZYB(JO86?Jg_Z(48#&;pMvu=wI{0Ap9o` z<)M=ToPVordYPiKC7eUB+jNqY2aBEVk%VCMampttahZkYD}(F4E+*8NricG9Pg!a7 zE^f6v;@mGf$f3lFipsLqNYBXecH0P=^0^~E0q(uiQGoEe==&ep#a1tF;mS{wufw3O zEbEOcGag$@Ux{;*5sn@t%$O8qEmA1-=b24B?QC+4cb zEYRa5T1-P+wSDa3wKVE{NPw(Q6QN(MMWRDI*@y=K@hE`-uZ4<83zR@<*Wm`GL*9{Q z4tf+>4Ronp%!_x3lraAHgdYLkc%nd9y|>kgQm4l;d)<3LH<0oX?TSLV^+wVRsyO6D z_dsh&OB{FcC=~tQf%>u_XZc)A`KDzGcmZ1c(~gC))7G~$dWWtDxbKa|kP`{`TT#Cf zgc^qSVRGtgMObS8i61ut>SG+F*5BxBQi|5j4XI%7(paAS;=(11m8LXtS|)8Cdo~~W z%Usr1CNUC}{@e~bsCq^InDc#FT5y`8>kdvC9j}U@DWkc8FYJnj?cR+!iK2+GKWWU? z?)B@*5kB8b^kBu(Y@nr6PqKdkT*7C~5JQY67P*-|SJE-2aua_eoIh?yW(Dv)H@ba> zQ7!^umgzxPn0fIb5ZA3xTNbGva&7W#d78mSP13cRG&$g{R@T^^F(TxE3?Y?HxM5tr z?1{F^3;{ywS3FTXiVFn4wt~2O$dqr3Lhlw^cDn5o$jV3EMF#RpV z`hg|x?=ggnmSeJ4Tc)S@iOxr``R zZ2{$QiwS|8)`q1X)Q*`(`$%~wP(T}0*hKi5F?tc*X)_~}C72Cm2FD7LvqGsvNnJI{ z5{pAl2pH8PYmDOJ9=Y1%f4EpXDedY;0GwMUFE0@TJ07uL+nU2nAJ#)und9XP>8s13 z6)7+P!ZCsrO;uSmV13?9Jb}K*R&~UrrXO>(b;#(zFyjDpuN9` zT5`5rRl#dIoZ7hASre;pJndm(N$&{(V3P-s>N$f;`B%Ty!S!V18UJsKy9=_a9W8>2dVSj?mP_?< z5&2`!>IykBD`N+m*K6+68x1m=$&?dH1I+tQsYRbeE~7SZKYM++N-D~ZksTflHB?;b z^DZA0!*ctGe;;|EmVHyFpnmTTzWsk{SMNdH_N&)>V6$wO8q5`!F~u5ifURv(wlciS;Y6pb@(6L_ejOX?-^k7x+b=> zT?y^^Fpl{5t}b8hN8+js2Pl&el>%Sr3g`tcmiRAjQnV_u3J1fEg({IG}|cP5g0k zv+COK9`;&7{O*B#;r+l}u`(w?nRBqmx*OVCB8>XVF)k9x$iZeqY+Q%pr!{M$5!WA= zecI1u>U}`1e&3D;=*h9LX=fT8VZk4}qDPu^#y{o8sjw8oZ9rpu4_OOQfZ>9r+HRSq z+;awP$-vkrC1l;1Rn`SE4pI>U^!54CnPiIq4AUdIvzMFuF7DZJAhIVfBVNb`tz+*qdD!fzJqy458Vt2eBt9%I{=~d~HF>e)neBK1_Tzhe zviH07<+0Tq2HQPzA|LS7SbD=(sgnFgc;sDG4RCFGIz|RUa4&u?GsbyLq8v(llL#_Q z$e=2#H}00oYwt8#+aC#dk^u@z0OM%rc%;`MZ;Plze}(i{qMpAM<*q2r`>kZ_54W@gu$-QpY-EjNLzvYNZ@eO zZg>dFsUs0Gg;0t^M_^s376PTF^Z0|uKKw4}~&75+`(hmGvu(pZsX&~k|jbT~@+)Peq~1M|F>>>M5JD#3@xOAD?tAKkdvS|D%B z{$V~G53To*L%#L#ero;;7$m2`8={M*s@8wCG)Mu-roR-0$vonmJ3Ju>wZc`yqIP=l zI~6540P)q@HdLzF1Q4pi-)0O4ZlVv4%P3^_iJh?5Utx8AD%14ZYJ)*1^$;bANdP%C;c7FA);Q?XrK?F}cLLu&raaV;Ge&L`M2FL5 z)O#>gP?xqm5xxbQCVb>^D=vmuzU7>8XZmKIx)OS^n(+^&FvIjvfU~<$;5?X3N_C%y zZLr^v9KNp%60G#t^33+wWhd$1ZE#j7E^CUu6@x6+9AHz^4y-kQe`9i_goBTF{3*J4 z2h4g$(WcQaMLtIg4@KFZ3(;Is`RQIQD=|xQlPKmv=0>C7w2cycP%q;xk0+!9T^|tz%yjqBJ4Y_(%k|j; z-%=%UX*|yw_4|~YwR|$wIo|L^IA5)}4WR|_d=*vFSS5QY77~~g=k+N-U)#Vd9vAe= zQL1t zedQtNkG7zU?nh8`ldaA#mXTj-VgASl4_;kf{feo)<^ueXEbVP02hN)P4d1$_-ZeQP zTlGh+9NCycPBDM}OL2bM<9w^IU|_4A=;QFbgN9ba9Ry&Tt8_1?PQVnhufVhZq}s;A z0-alwmtau`5bY-rd?&~5mu+#N(4}HBMM~tXcDM82i!rJ#0bA-yahcEEkXno8$TdhF zj*CJI0Qv!Fa3z(C5~cBbNjAF!nC8sEl=&9L<)h}LutfJQVFzvceE)0ACT{N>FBH4M z-F}y6UjjD4l^%7`3!QsbtR35^9p{tP!(4fmz~dBX(?!kn`kV2c6y=3I`YW|k7&b(n z!lBr17F{lnoyz5Av#hF6qp+0g1Qj8>ewG*9_siijI!qb$=|)r7vvM-?l^{@o_f1_M zvq%CBNnHJA#mzt=`8&+b6yLZ*6l`;>mS|%>Z0G<>Rku) z66d&euSUU+gLER)e`G9{W^MQesrD1-9(^Y_@^;f3W^b~rVxBRlFGR&gPeHpbPSgKg zMSr-J$IwY(2Jvv`HG}JH;=B1EfYH})D{=ZYpBa@}hkL>`1k4#b~ z10u(l9R-n)@eL=`1ARBbdb7{DjFyRGU(CJf6u!Wr!tKpl1p3r)L@^TDoDPeGiC3Xr z7_%+AB_nb>Mpdq%eP}0{X{nN}aFs-+rH1(<0Kl*|C6(!1aN=(S#hRU~jHS2RZVPQM zd^=^l8x$#OK8fz=hTgz>@IfNFU-VLOW^b?-_R-=$8N1vM>5|=Hdh0Ri4)o239@b4h zlh_Y~_(4$M3h7+yJ78FXa$sXikO*YeNGg}pf*p&$f_Ufgv)aZmv&OJ!3VBT_>1!E8aWG-6Us zstISVB%FrXRKtJF$HgbIO2dSrgsH7_N}N*zfW}$?fcCh**YUi{2E}+eFkx-o)=%wK zEa;ACRksFvMk(aBO;G3s%e9S&F-qh){G1Gv#Cq@AcvBjwe`^$al#e}5!h?p5OG!s! zUQ07~)<_8G2s0%LX3gR*is^Z0p z+H8X=rfB>qlR?dVns0WV@WcmBvy^Rtz#mfZ3L@@@th43l_Q6*ik&-&4VA#E*I29>BtCptykG|6>^2Lxb+N3HFazDJm=x*ud4I^2#N5PPn!Kt*zw`EmZh?s@K_ z3oqctv(<_gYDjjpBOzUxT!=DfC3|g%_sGi z6CI73inBPCw@dVwuOn*TfoaMCi%mQ1i=sz1p$tt-WE)YiKVZ$!d>No-Za+}qVew55 z$Ug7%^EA~H9?o%L)abY)Dw4|>{YA)`#^X$dr-bu&A&KtyF+6zbD>iv4@^o)%85(Rq z7fKrBmY30AZVY6?0%S5zslPecF6Me|GpxR_K>*5ZKnAD>!X;6b1-+LV%vhMR{eI0> zxi(b$M7x+L(IEK~BJJQH2W{|ru0!EvfiQ2tA~~wnKG1!f4oI*nS)@UbSyH`^cgE4L zUY{VcMtHh-DWl$8D6C&KC^Ir!^HGrhyV1afPa@^+;l zRGlM&f>5Dwodj+ZaD*pq4IYEO=D4q%2prpxx|>@TgL^5&B-JUi@c@x3>? zKubIbi$J1*a->9Hqwhk$oB!G6Oeq`~s8+}Pg_)7i9>GGf)y3Vd#&icx+wEer*85{J zN;Z3d4Ru*NR6Se%$B)GG6VmJT0WD{~t!XB{vlx5RsZw(cmZ0-}oV4|9YVMLa-)LF( z=pHZW`VXFhG|}qyZbYpG(P{+$`Tu_g)Ot`h^`w(lznN5@!Hz)mDsTtTDO)jfX+H?Y zqyQ!UXPHZb40sn5%3#BE&AfQSu)YB%rY{r#!DhUcIJ{J|>nPxU@yD}Yz^z(G*hIrS zHNu-uLHI!EKYAg;gkRNs;!nk&zz9_{HpgoktSi2`JJX;wh=!=TPOxKqjG2l-O4Ya#Pw(eAjQ5>#$P-})B2SI3}33}cB9dNUNsUv3_` zBqcuaKV?MYJhkF~*Jh`li*rn7ri%y5q{!KXhVzOG(`-Hhxc_l5XB;^nB!&+HvY0GQ ztxtVysk|UEx@<=tIJh@o-yiB4Nz6=iL{Z9Ws>q=MrfERD!~vqsN>Mx*xVAhc&CV&+ zkpo02>Rk>kFYmU9!JUR?t{pzK6<+&4^_{5wY>Ta~oNvCJTxZKNGxwDZ%}u9w9hFL& zLnt`kgNr+=Vga8IPZ=#Y+egKXmP@ZCPMy+(poyyQE@v9`T61@G>zVSg;x1yA(!iIC*WrGBczAR#P(d@q(6^-niK;VGy^3MC5ii9 z^WZ<85d6aACGWe18$tKYQx7*g>fgdY%2lHTmd_$|&+W@G+;PH2r@Ebiu~~xO*i%Ta z+9#C|s#`v)R=-Jn(yx^^l}C-4F^iWkhDXLh+#{mLiP9|k!bQ|yXFGia382Gb9u24K z@)|l!2^PQB*U5w^F{;{|$;UO|X49|mNl^(VHz&WP>3?-VG;T0GF5DOev@v6hmUXYI4v|_B>xi23y$0b_dbb1@qYpY;lAcE(v-fU=d?hmvB)d_K%>p?83nT zK)D2S`-1{z44t%VQ$~h?=Gc&V3PlGr)2!JdW$?}Mpl^t=Bkfdr|Lu-qfz`B$k?EeC zs2_XM0c$};Q*2}#Tbkd<9Xi|JHCzgGDdE>4VZS0J+97~ve63VMa2KsaPPR1;5&yQ0 z_$Pu!6_0fImvL;q^8wm%kwUTEvI`&q1OvNRiDd<}8d+W{_J4oOtNqA&9R2wwPNn)Q(P!==tISKi%_4(3+HirvN95bMCC-Q! zpOE%a@Fypmx}tg$AG>(pGeJ~&bbgn5l(Dc#YG}#YT{uDZ&;H0}_ko85+(Bit+|hI?X?+l0ISWv4+r$jTB;?Fw1DBMX){Wo_hSms;yRg`m;a z-`-i9{d>{;Xj`b_S!0N%MfoJr)Naui_u1FVQA+1;T;R1-e0*EcH^%|T3G_JnNNQGNGKW&-Ybm7w4lsRD|_et(qW`iuK>uv2WIP|oR zPV|&?(}P(5G0Y(NaE{ZFN0-Gls@p;p4!x1Tt@jMG=z9@5qL%TT+!d-IL)I+J?n~cV zUuI3WqN6t5cUBs{S;LH1JmS^@p4NlD@9R%j2MGE(eKfU4?wmL`JJN9gi&x>8mHQ_h z|JI+%(H0H0jnVdP@+ReOSfj|udoj9@imC0<$dr{YTY7 zN_Ga@eh_tU$_7ZlD{1j(rwItH5trj?$2E(jh-1k-(Q6b)FyhufLK%y+aS2tJv)k<&j%dp*BbsemlCZyoPRuQZN9uvnlSz`(i2!#n>d zaZFmRN87>WaRI+v?{6sX?pqi+Q27mxOxYXkOs#fX5u!`_glfOHCcIDAa)}F7lulpa zrrweEpNbZhS)HiM|574 z$uA648o%e+;G)K<4E-^ZH7I}K^>lKaVB3A-BzFU3FzygltaAv}>E}HDP6BltXvu0A zJ8=e?yqec??ZkkI@6Wh%etyX=MZrHW8z#2xsdF9UbR#VoC4Js-d+{{xGgl&4>T6q3 zkfqnnKWj4r41$ZZCy(IT=vgroF&ViUv>P8|s8iEa9y4y0hk?gV6TneR+EX*+-y-Au##`JiB+qbY)vc2{;S`X}r#K~`9PO(lqmi$~rqG%Fi`dWKlIm&m zqODUnM<8)P7g$w?rs7)#e|%mU7%J}XQ=7gVYlZY<8Ye~TB8VGb`) zuT$>9>o#lZU0@*5+`_O5{1mG^uaO=CtiP*p4!W^;Xy;K3>&vRJzs&`~6c_2@H&p~} z9WaT*uz>3-Esqz9``rMox|TwHh-WvuGz=u>oUzH`hMZFqf;_L?pIO(7I6h8c57U_U zfEj<^vKrLpUDW}&NRd-Wzt^Y_V_mjnqHWvKgv@6hpU!#;b>s2uC4|9_fyNINX^*># z6cb}13!B|{tG!uH@&0QxF}Q)5@#J+5=O`Gllmk z7B`M1n*j;n>S@={%ILSD#k-M2(R~(@$$v7dc$Mh-{WcY=vKwpp9;5TnEv^fqkJ=>0D1`D(h06Qt0oAtkr11g3puZ zyjvDwpRu}@d&u$Uueki!m3f6B)R!o@MeA_7@sIW>uq`ibkA542)7jW~3;G z!0oTHRF)e?Zv)MS?R!EqvC*0X-CmXN?*iP28sztzp;p^&)w}Yj{L`%UFCAW{;v6a3 zu`~O3RBIdv=dR|G!JUHCMgYabt-yV+1Jyr5?&?hoc=~M1(*L0T?&NdB^(uiG7HxVP zOK=T5u&j1CvOl(}ms!}>0Gu`0F_043X*Y=Cck^4+Hs>%X`AsoC`_#CpU#abUU5mKL zJ~YK%@Q)llH_dOAnEUIHupNrJk8+8|=VYdD`N|`$;E9~na{x-)2W?bicqJ=?apoBn zQm#)@ta8K>9K1j0c7lJgBKJVft8 zO5Yht?I4GET@qsN*elv?O`WV@g3@cnI{I4M=}pE2`H#9I%+Y60R*np+ku(L_eZoCr z2Z`KqdpiS{ppJj+Ky+Y0-+gk@G#xy9b2d(GjD z&%Tup?0-1@@~ZmCRPDi+3c14%fFluEt&c_HTcjGpi~U*qC&8v33;KZA!;anaj+a!; z$e%Zn(>wV6)}s0ro0JtWX=c0fpAQ421bj-3qn8IsC>#~=fI_POqRPNeWD3q})ETz&C{_dMqLp)`aIUa47 zvMvIBLST)wg7q>SE^0m^KxOXFhCgIAPWf;td8hg;gbX$E3PJ@GNmXT%+M9HK#YVQEmE4T`*K(&bH#0r_j+ZRng~H>_jG>gCBEw4aBDWaL3{eY+nq2Jv@_Tr zzdh*aqE>|ilXRM^9`^5c;5Z^&MV;t6k}f7j)rl1jU^wO5Z92>ZUz>oG{S#V~1A~4c z*H&;l3+U6nsT&5qx*cHO2Q<~J{uLxhe7Mp)3Z$i7<8TU%k~>z;J+66j&I9l-<2AsS zqqyMi{67TmcMaOfh@UCEiJY{&ZF33Fpuy%}It^n5EDKpp&zNlP>LB9tJB)oxTFXY# zdP!CotTfSB8#2$r?J+56|3#r!8`sT(nz{YQ=`Y?}I<<_vXg#>*%ls)$JDCPO;aLHD z^QOu2k9H&fqf^i4h8BM=h007?yIn^Fv9`~oFWl26r39Jh222bsUf(oGMGS30Y#Rr& zup=d@&QNj_jfq>X15mrR*cPw11ER+Jyd;ct%)hKV62o^+-z zfT)Qp6~F4ji{wFc!WZbZPA{ci zHk;h;VXTAAkCs-v%s_WUkJT&=SC+j_P~ni3<+;i&&8LRCN5BBu*TP9HlIdTD?A3g3 z7~D`-J`pYC7K(f5PHo^&)d2RB!CTGkfL4{xW|i4aW2F8aANrPpqJF3q($WIuufdKeTL|NCj^zX z?P*fFGUWJ?U0Lft5RBbcDLV#AVHnn_DW#()5GQJH(qoe^|BVg^Ar4N)7qVxcQ-`#& zgO?LF1`g1vNyZ#(#EY%*m3S1|@@3t;tXLDvGsIp$4D2;Ki9Rq#`7M>uI4oec2wO5Q zrg?Xn5i=dGmJ^R#I`ypgPRqd2PeVU?Yu?OnC!GSCAm+ui6Z|(iJ^Gt6fjZ&To@s+d%Yq} zXE{P3vW}F2aS$wrpjy#=T^W+V<1H9m?gO!XZ{eL@aR1h+YmV3$1x9nJ1|ZV~_|`c+ z88)DdCfDx484(vz#}hr3^B9?u0N-oIWnwb&;W9cWq0FcTV#9vNBoJ> zh-vrlv^Pv=DO}YVd66sS>s!D%74iP*xXI-`)}c&&{oOa~FJr!6=SDPGq?L)f$4+zI^c{TH$I@(~l?Vt*ksH4slvtkn<&|^@mL; zE!;(Y(ZMlBekWgJouS8h-&;QLkC!S6iJABIOGcW&_b)`c#l&^cov?9PD66ZPBByQm zN>6T1VU>3RGa)dS&~L7FUX)h`?}oG;Go#)+(tcqpaX+APoe|VE>K)WK-!sJT-{G0+ z-MX-Uwa*sjSkUg2W)U~;Jqz{;cKqQ~%9S7OY1sa&N-S0EyJ%f?baJhdO1u6JK0mSm zS;9&9g6(*nk7>`lKxIVm)53$Cei+#DxfbY2(!%O!VN>R0P^bH*2e^E3rkh7%X!E>O z&GlNC$%iP$ zx{xj1`67)H+EsbO7_vLV@iqG2Rl@QN&G8>;EDZ>2-^7i-v|?STGIEsEt9{~H@|^T! zcXbilg(SS!Yipmo!0dXk2Q-y~<#e1<6KwI|Yi+zsmm+Rv2E4zT37L#Rcs$l=IvS z!8b}2dtSQRs)n*+>*|inbaTK^WY5EF0ocq$)pIbMs`v2Nt3=0SjO>&t!>cdr1r^}qK~&@S9sQNHsQT&zlXzv{5M{_(3V71mw!NdUZVCtd+qpR9R?%7gMp(3Htj=aszP_iE|4WqtU9_E=c@;*X`3YvXh@St_nGb6!nh}I5 z$C58Kw^=jJk6;d|Z*Xo#wXa-7(#Y#{Yc)`NaI{BNYhK~wMW4$Le28f)l4?}dLKOZ&eke@%8<8xt9imTzfk!%79eAXC>_IEXnuOZwtoSRG z-){E<^@|JqPDb=rBc$Oo)DF{42t+D;S0h%t2qS&iR2)27M*cBD`xPY>7rgcY)A1(p z7CIuJfH+=%E`L!4m9M}f@nO|*Z!d8-Z#?+TZcAMzP>2=5Y3T+%DJ)KFk4!&uTkwA1 zBK}LEHyWzlVVDyq&HvY0`S}r6A9|Nif1N|_{O$_U&#YgTI#lt@X`@scA_Na8;0rk7 z!8d$N*{F%aKDphueQ2-)J_I9e3zqi{0Ak-*+x)zj?<)icPD^Xm>b~|G ztEN895%)xvr&(M{c)YKGkNTl?-o{>7^}nc>dNj}!&A0LsPkeB@q_0H__yIQmsj8^x zC4KyX$hdiF(I14=w$mQ7jm#gg&CGxJGYkC(0DH9m1v}9EhySCS{vW>5-^uzfP5(Pf dDNx>nXpRISpVHe6cj+8#Sex6Ky)f}6{0~?oREYop diff --git a/swarm/maintainer.md b/swarm/maintainer.md deleted file mode 120000 index 617c4fb974a1..000000000000 --- a/swarm/maintainer.md +++ /dev/null @@ -1 +0,0 @@ -../.common-templates/maintainer-docker.md \ No newline at end of file diff --git a/swift/README.md b/swift/README.md index ddcde389883b..20c25758d4a7 100644 --- a/swift/README.md +++ b/swift/README.md @@ -24,21 +24,73 @@ WARNING: # Supported tags and respective `Dockerfile` links -- [`5.2.3`, `5.2`, `5.2.3-bionic`, `5.2-bionic`, `bionic`, `latest`](https://github.com/apple/swift-docker/blob/38f179345ace24236d6c09de84e77d91384014cd/5.2/ubuntu/18.04/Dockerfile) -- [`5.2.3-xenial`, `5.2-xenial`, `xenial`](https://github.com/apple/swift-docker/blob/38f179345ace24236d6c09de84e77d91384014cd/5.2/ubuntu/16.04/Dockerfile) -- [`5.2.3-slim`, `5.2-slim`, `5.2.3-bionic-slim`, `5.2-bionic-slim`, `bionic-slim`, `slim`](https://github.com/apple/swift-docker/blob/38f179345ace24236d6c09de84e77d91384014cd/5.2/ubuntu/18.04/slim/Dockerfile) -- [`5.2.3-xenial-slim`, `5.2-xenial-slim`, `xenial-slim`](https://github.com/apple/swift-docker/blob/38f179345ace24236d6c09de84e77d91384014cd/5.2/ubuntu/16.04/slim/Dockerfile) -- [`5.1.5`, `5.1`, `5.1.5-bionic`, `5.1-bionic`](https://github.com/apple/swift-docker/blob/05538e13a3015675d83e2553cdce5d1d67e17235/5.1/ubuntu/18.04/Dockerfile) -- [`5.1.5-xenial`, `5.1-xenial`](https://github.com/apple/swift-docker/blob/05538e13a3015675d83e2553cdce5d1d67e17235/5.1/ubuntu/16.04/Dockerfile) -- [`5.1.5-slim`, `5.1-slim`, `5.1.5-bionic-sim`, `5.1-bionic-slim`](https://github.com/apple/swift-docker/blob/05538e13a3015675d83e2553cdce5d1d67e17235/5.1/ubuntu/18.04/slim/Dockerfile) -- [`5.1.5-xenial-slim`, `5.1-xenial-slim`](https://github.com/apple/swift-docker/blob/05538e13a3015675d83e2553cdce5d1d67e17235/5.1/ubuntu/16.04/slim/Dockerfile) -- [`5.0.3`, `5.0`, `5.0.3-bionic`, `5.0-bionic`](https://github.com/apple/swift-docker/blob/78d0a2dde09af579d06e2114a101fd90b01fbfb0/5.0/ubuntu/18.04/Dockerfile) -- [`5.0.3-xenial`, `5.0-xenial`](https://github.com/apple/swift-docker/blob/78d0a2dde09af579d06e2114a101fd90b01fbfb0/5.0/ubuntu/16.04/Dockerfile) -- [`5.0.3-slim`, `5.0-slim`, `5.0.3-bionic-slim`, `5.0-bionic-slim`](https://github.com/apple/swift-docker/blob/78d0a2dde09af579d06e2114a101fd90b01fbfb0/5.0/ubuntu/18.04/slim/Dockerfile) -- [`5.0.3-xenial-slim`, `5.0-xenial-slim`](https://github.com/apple/swift-docker/blob/78d0a2dde09af579d06e2114a101fd90b01fbfb0/5.0/ubuntu/16.04/slim/Dockerfile) -- [`4.2.4`, `4.2`, `4`](https://github.com/apple/swift-docker/blob/f0a61df2dd9a14dd6988e6017ae58cc63df37f41/4.2/ubuntu/16.04/Dockerfile) -- [`4.1.3`, `4.1`](https://github.com/apple/swift-docker/blob/34aa283f9b3473ab22b2282f71773781b121af19/4.1/Dockerfile) -- [`4.0.3`, `4.0`](https://github.com/apple/swift-docker/blob/34aa283f9b3473ab22b2282f71773781b121af19/4.0/Dockerfile) +- [`5.7.2`, `5.7`, `5.7.2-jammy`, `5.7-jammy`, `jammy`, `latest`](https://github.com/apple/swift-docker/blob/59e3cc2532e57bb75b406bb9c589b62bd12edd5c/5.7/ubuntu/22.04/Dockerfile) +- [`5.7.2-slim`, `5.7-slim`, `5.7.2-jammy-slim`, `5.7-jammy-slim`, `jammy-slim`, `slim`](https://github.com/apple/swift-docker/blob/59e3cc2532e57bb75b406bb9c589b62bd12edd5c/5.7/ubuntu/22.04/slim/Dockerfile) +- [`5.7.2-bionic`, `5.7-bionic`, `bionic`](https://github.com/apple/swift-docker/blob/59e3cc2532e57bb75b406bb9c589b62bd12edd5c/5.7/ubuntu/18.04/Dockerfile) +- [`5.7.2-bionic-slim`, `5.7-bionic-slim`, `bionic-slim`](https://github.com/apple/swift-docker/blob/59e3cc2532e57bb75b406bb9c589b62bd12edd5c/5.7/ubuntu/18.04/slim/Dockerfile) +- [`5.7.2-focal-slim`, `5.7-focal-slim`, `focal-slim`](https://github.com/apple/swift-docker/blob/59e3cc2532e57bb75b406bb9c589b62bd12edd5c/5.7/ubuntu/20.04/slim/Dockerfile) +- [`5.7.2-focal`, `5.7-focal`, `focal`](https://github.com/apple/swift-docker/blob/59e3cc2532e57bb75b406bb9c589b62bd12edd5c/5.7/ubuntu/20.04/Dockerfile) +- [`5.7.2-amazonlinux2`, `5.7-amazonlinux2`, `amazonlinux2`](https://github.com/apple/swift-docker/blob/59e3cc2532e57bb75b406bb9c589b62bd12edd5c/5.7/amazonlinux/2/Dockerfile) +- [`5.7.2-amazonlinux2-slim`, `5.7-amazonlinux2-slim`, `amazonlinux2-slim`](https://github.com/apple/swift-docker/blob/59e3cc2532e57bb75b406bb9c589b62bd12edd5c/5.7/amazonlinux/2/slim/Dockerfile) +- [`5.7.2-centos7`, `5.7-centos7`, `centos7`](https://github.com/apple/swift-docker/blob/59e3cc2532e57bb75b406bb9c589b62bd12edd5c/5.7/centos/7/Dockerfile) +- [`5.7.2-centos7-slim`, `5.7-centos7-slim`, `centos7-slim`](https://github.com/apple/swift-docker/blob/59e3cc2532e57bb75b406bb9c589b62bd12edd5c/5.7/centos/7/slim/Dockerfile) +- [`5.6.3`, `5.6`, `5.6.3-bionic`, `5.6-bionic`](https://github.com/apple/swift-docker/blob/1188cc86d15f9e98d90db9f98de3598d5d5f7bb2/5.6/ubuntu/18.04/Dockerfile) +- [`5.6.3-slim`, `5.6-slim`, `5.6.3-bionic-slim`, `5.6-bionic-slim`](https://github.com/apple/swift-docker/blob/1188cc86d15f9e98d90db9f98de3598d5d5f7bb2/5.6/ubuntu/18.04/slim/Dockerfile) +- [`5.6.3-focal-slim`, `5.6-focal-slim`](https://github.com/apple/swift-docker/blob/1188cc86d15f9e98d90db9f98de3598d5d5f7bb2/5.6/ubuntu/20.04/slim/Dockerfile) +- [`5.6.3-focal`, `5.6-focal`](https://github.com/apple/swift-docker/blob/1188cc86d15f9e98d90db9f98de3598d5d5f7bb2/5.6/ubuntu/20.04/Dockerfile) +- [`5.6.3-amazonlinux2`, `5.6-amazonlinux2`](https://github.com/apple/swift-docker/blob/1188cc86d15f9e98d90db9f98de3598d5d5f7bb2/5.6/amazonlinux/2/Dockerfile) +- [`5.6.3-amazonlinux2-slim`, `5.6-amazonlinux2-slim`](https://github.com/apple/swift-docker/blob/1188cc86d15f9e98d90db9f98de3598d5d5f7bb2/5.6/amazonlinux/2/slim/Dockerfile) +- [`5.6.3-centos7`, `5.6-centos7`](https://github.com/apple/swift-docker/blob/1188cc86d15f9e98d90db9f98de3598d5d5f7bb2/5.6/centos/7/Dockerfile) +- [`5.6.3-centos7-slim`, `5.6-centos7-slim`](https://github.com/apple/swift-docker/blob/1188cc86d15f9e98d90db9f98de3598d5d5f7bb2/5.6/centos/7/slim/Dockerfile) +- [`5.5.3`, `5.5`, `5.5.3-bionic`, `5.5-bionic`](https://github.com/apple/swift-docker/blob/9394b31e064cf0d80eaab08b692a2886c7aea8fe/5.5/ubuntu/18.04/Dockerfile) +- [`5.5.3-xenial`, `5.5-xenial`, `xenial`](https://github.com/apple/swift-docker/blob/9394b31e064cf0d80eaab08b692a2886c7aea8fe/5.5/ubuntu/16.04/Dockerfile) +- [`5.5.3-slim`, `5.5-slim`, `5.5.3-bionic-slim`, `5.5-bionic-slim`](https://github.com/apple/swift-docker/blob/9394b31e064cf0d80eaab08b692a2886c7aea8fe/5.5/ubuntu/18.04/slim/Dockerfile) +- [`5.5.3-xenial-slim`, `5.5-xenial-slim`](https://github.com/apple/swift-docker/blob/9394b31e064cf0d80eaab08b692a2886c7aea8fe/5.5/ubuntu/16.04/slim/Dockerfile) +- [`5.5.3-focal-slim`, `5.5-focal-slim`](https://github.com/apple/swift-docker/blob/9394b31e064cf0d80eaab08b692a2886c7aea8fe/5.5/ubuntu/20.04/slim/Dockerfile) +- [`5.5.3-focal`, `5.5-focal`](https://github.com/apple/swift-docker/blob/9394b31e064cf0d80eaab08b692a2886c7aea8fe/5.5/ubuntu/20.04/Dockerfile) +- [`5.5.3-amazonlinux2`, `5.5-amazonlinux2`](https://github.com/apple/swift-docker/blob/9394b31e064cf0d80eaab08b692a2886c7aea8fe/5.5/amazonlinux/2/Dockerfile) +- [`5.5.3-amazonlinux2-slim`, `5.5-amazonlinux2-slim`](https://github.com/apple/swift-docker/blob/9394b31e064cf0d80eaab08b692a2886c7aea8fe/5.5/amazonlinux/2/slim/Dockerfile) +- [`5.5.3-centos7`, `5.5-centos7`](https://github.com/apple/swift-docker/blob/9394b31e064cf0d80eaab08b692a2886c7aea8fe/5.5/centos/7/Dockerfile) +- [`5.5.3-centos7-slim`, `5.5-centos7-slim`](https://github.com/apple/swift-docker/blob/9394b31e064cf0d80eaab08b692a2886c7aea8fe/5.5/centos/7/slim/Dockerfile) +- [`5.4.3`, `5.4`, `5.4.3-bionic`, `5.4-bionic`](https://github.com/apple/swift-docker/blob/2d2c2fb89fe6ecfd8885157eb1666ed2686503a0/5.4/ubuntu/18.04/Dockerfile) +- [`5.4.3-xenial`, `5.4-xenial`](https://github.com/apple/swift-docker/blob/2d2c2fb89fe6ecfd8885157eb1666ed2686503a0/5.4/ubuntu/16.04/Dockerfile) +- [`5.4.3-slim`, `5.4-slim`, `5.4.3-bionic-slim`, `5.4-bionic-slim`](https://github.com/apple/swift-docker/blob/2d2c2fb89fe6ecfd8885157eb1666ed2686503a0/5.4/ubuntu/18.04/slim/Dockerfile) +- [`5.4.3-xenial-slim`, `5.4-xenial-slim`](https://github.com/apple/swift-docker/blob/2d2c2fb89fe6ecfd8885157eb1666ed2686503a0/5.4/ubuntu/16.04/slim/Dockerfile) +- [`5.4.3-focal-slim`, `5.4-focal-slim`](https://github.com/apple/swift-docker/blob/2d2c2fb89fe6ecfd8885157eb1666ed2686503a0/5.4/ubuntu/20.04/slim/Dockerfile) +- [`5.4.3-focal`, `5.4-focal`](https://github.com/apple/swift-docker/blob/2d2c2fb89fe6ecfd8885157eb1666ed2686503a0/5.4/ubuntu/20.04/Dockerfile) +- [`5.4.3-amazonlinux2`, `5.4-amazonlinux2`](https://github.com/apple/swift-docker/blob/2d2c2fb89fe6ecfd8885157eb1666ed2686503a0/5.4/amazonlinux/2/Dockerfile) +- [`5.4.3-amazonlinux2-slim`, `5.4-amazonlinux2-slim`](https://github.com/apple/swift-docker/blob/2d2c2fb89fe6ecfd8885157eb1666ed2686503a0/5.4/amazonlinux/2/slim/Dockerfile) +- [`5.4.3-centos7`, `5.4-centos7`](https://github.com/apple/swift-docker/blob/2d2c2fb89fe6ecfd8885157eb1666ed2686503a0/5.4/centos/7/Dockerfile) +- [`5.4.3-centos7-slim`, `5.4-centos7-slim`](https://github.com/apple/swift-docker/blob/2d2c2fb89fe6ecfd8885157eb1666ed2686503a0/5.4/centos/7/slim/Dockerfile) +- [`5.3.3`, `5.3`, `5.3.3-bionic`, `5.3-bionic`](https://github.com/apple/swift-docker/blob/2d2c2fb89fe6ecfd8885157eb1666ed2686503a0/5.3/ubuntu/18.04/Dockerfile) +- [`5.3.3-xenial`, `5.3-xenial`](https://github.com/apple/swift-docker/blob/2d2c2fb89fe6ecfd8885157eb1666ed2686503a0/5.3/ubuntu/16.04/Dockerfile) +- [`5.3.3-slim`, `5.3-slim`, `5.3.3-bionic-slim`, `5.3-bionic-slim`](https://github.com/apple/swift-docker/blob/2d2c2fb89fe6ecfd8885157eb1666ed2686503a0/5.3/ubuntu/18.04/slim/Dockerfile) +- [`5.3.3-xenial-slim`, `5.3-xenial-slim`](https://github.com/apple/swift-docker/blob/2d2c2fb89fe6ecfd8885157eb1666ed2686503a0/5.3/ubuntu/16.04/slim/Dockerfile) +- [`5.3.3-focal-slim`, `5.3-focal-slim`](https://github.com/apple/swift-docker/blob/2d2c2fb89fe6ecfd8885157eb1666ed2686503a0/5.3/ubuntu/20.04/slim/Dockerfile) +- [`5.3.3-focal`, `5.3-focal`](https://github.com/apple/swift-docker/blob/2d2c2fb89fe6ecfd8885157eb1666ed2686503a0/5.3/ubuntu/20.04/Dockerfile) +- [`5.3.3-amazonlinux2`, `5.3-amazonlinux2`](https://github.com/apple/swift-docker/blob/2d2c2fb89fe6ecfd8885157eb1666ed2686503a0/5.3/amazonlinux/2/Dockerfile) +- [`5.3.3-amazonlinux2-slim`, `5.3-amazonlinux2-slim`](https://github.com/apple/swift-docker/blob/2d2c2fb89fe6ecfd8885157eb1666ed2686503a0/5.3/amazonlinux/2/slim/Dockerfile) +- [`5.3.3-centos7`, `5.3-centos7`](https://github.com/apple/swift-docker/blob/2d2c2fb89fe6ecfd8885157eb1666ed2686503a0/5.3/centos/7/Dockerfile) +- [`5.3.3-centos7-slim`, `5.3-centos7-slim`](https://github.com/apple/swift-docker/blob/2d2c2fb89fe6ecfd8885157eb1666ed2686503a0/5.3/centos/7/slim/Dockerfile) +- [`5.2.5`, `5.2`, `5.2.5-bionic`, `5.2-bionic`](https://github.com/apple/swift-docker/blob/2d2c2fb89fe6ecfd8885157eb1666ed2686503a0/5.2/ubuntu/18.04/Dockerfile) +- [`5.2.5-xenial`, `5.2-xenial`](https://github.com/apple/swift-docker/blob/2d2c2fb89fe6ecfd8885157eb1666ed2686503a0/5.2/ubuntu/16.04/Dockerfile) +- [`5.2.5-slim`, `5.2-slim`, `5.2.5-bionic-slim`, `5.2-bionic-slim`](https://github.com/apple/swift-docker/blob/2d2c2fb89fe6ecfd8885157eb1666ed2686503a0/5.2/ubuntu/18.04/slim/Dockerfile) +- [`5.2.5-xenial-slim`, `5.2-xenial-slim`](https://github.com/apple/swift-docker/blob/2d2c2fb89fe6ecfd8885157eb1666ed2686503a0/5.2/ubuntu/16.04/slim/Dockerfile) +- [`5.2.5-focal-slim`, `5.2-focal-slim`](https://github.com/apple/swift-docker/blob/2d2c2fb89fe6ecfd8885157eb1666ed2686503a0/5.2/ubuntu/20.04/slim/Dockerfile) +- [`5.2.5-focal`, `5.2-focal`](https://github.com/apple/swift-docker/blob/2d2c2fb89fe6ecfd8885157eb1666ed2686503a0/5.2/ubuntu/20.04/Dockerfile) +- [`5.2.5-amazonlinux2`, `5.2-amazonlinux2`](https://github.com/apple/swift-docker/blob/2d2c2fb89fe6ecfd8885157eb1666ed2686503a0/5.2/amazonlinux/2/Dockerfile) +- [`5.2.5-amazonlinux2-slim`, `5.2-amazonlinux2-slim`](https://github.com/apple/swift-docker/blob/2d2c2fb89fe6ecfd8885157eb1666ed2686503a0/5.2/amazonlinux/2/slim/Dockerfile) +- [`5.2.5-centos7`, `5.2-centos7`](https://github.com/apple/swift-docker/blob/2d2c2fb89fe6ecfd8885157eb1666ed2686503a0/5.2/centos/7/Dockerfile) +- [`5.2.5-centos7-slim`, `5.2-centos7-slim`](https://github.com/apple/swift-docker/blob/2d2c2fb89fe6ecfd8885157eb1666ed2686503a0/5.2/centos/7/slim/Dockerfile) +- [`5.1.5`, `5.1`, `5.1.5-bionic`, `5.1-bionic`](https://github.com/apple/swift-docker/blob/2d2c2fb89fe6ecfd8885157eb1666ed2686503a0/5.1/ubuntu/18.04/Dockerfile) +- [`5.1.5-xenial`, `5.1-xenial`](https://github.com/apple/swift-docker/blob/2d2c2fb89fe6ecfd8885157eb1666ed2686503a0/5.1/ubuntu/16.04/Dockerfile) +- [`5.1.5-slim`, `5.1-slim`, `5.1.5-bionic-sim`, `5.1-bionic-slim`](https://github.com/apple/swift-docker/blob/2d2c2fb89fe6ecfd8885157eb1666ed2686503a0/5.1/ubuntu/18.04/slim/Dockerfile) +- [`5.1.5-xenial-slim`, `5.1-xenial-slim`](https://github.com/apple/swift-docker/blob/2d2c2fb89fe6ecfd8885157eb1666ed2686503a0/5.1/ubuntu/16.04/slim/Dockerfile) +- [`5.0.3`, `5.0`, `5.0.3-bionic`, `5.0-bionic`](https://github.com/apple/swift-docker/blob/2d2c2fb89fe6ecfd8885157eb1666ed2686503a0/5.0/ubuntu/18.04/Dockerfile) +- [`5.0.3-xenial`, `5.0-xenial`](https://github.com/apple/swift-docker/blob/2d2c2fb89fe6ecfd8885157eb1666ed2686503a0/5.0/ubuntu/16.04/Dockerfile) +- [`5.0.3-slim`, `5.0-slim`, `5.0.3-bionic-slim`, `5.0-bionic-slim`](https://github.com/apple/swift-docker/blob/2d2c2fb89fe6ecfd8885157eb1666ed2686503a0/5.0/ubuntu/18.04/slim/Dockerfile) +- [`5.0.3-xenial-slim`, `5.0-xenial-slim`](https://github.com/apple/swift-docker/blob/2d2c2fb89fe6ecfd8885157eb1666ed2686503a0/5.0/ubuntu/16.04/slim/Dockerfile) +- [`4.2.4`, `4.2`, `4`](https://github.com/apple/swift-docker/blob/2d2c2fb89fe6ecfd8885157eb1666ed2686503a0/4.2/ubuntu/16.04/Dockerfile) # Quick reference (cont.) @@ -46,14 +98,14 @@ WARNING: [https://bugs.swift.org](https://bugs.swift.org) Component: Docker - **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) - [`amd64`](https://hub.docker.com/r/amd64/swift/) + [`amd64`](https://hub.docker.com/r/amd64/swift/), [`arm64v8`](https://hub.docker.com/r/arm64v8/swift/) - **Published image artifact details**: [repo-info repo's `repos/swift/` directory](https://github.com/docker-library/repo-info/blob/master/repos/swift) ([history](https://github.com/docker-library/repo-info/commits/master/repos/swift)) (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/swift`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fswift) + [official-images repo's `library/swift` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fswift) [official-images repo's `library/swift` file](https://github.com/docker-library/official-images/blob/master/library/swift) ([history](https://github.com/docker-library/official-images/commits/master/library/swift)) - **Source of this description**: @@ -116,7 +168,7 @@ The `swift` images come in many flavors, each designed for a specific use case. 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. -Some of these tags may have names like bionic or xenial in them. These are the suite code names for releases of [Ubuntu](https://wiki.ubuntu.com/Releases) 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 Ubuntu. +Some of these tags may have names like bionic, focal, jammy, or xenial in them. These are the suite code names for releases of [Ubuntu](https://wiki.ubuntu.com/Releases) 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 Ubuntu. ## `swift:-slim` diff --git a/swipl/README.md b/swipl/README.md index 3ccafd716fde..627edbde2ec6 100644 --- a/swipl/README.md +++ b/swipl/README.md @@ -20,12 +20,12 @@ WARNING: [the SWI-Prolog community](https://github.com/SWI-Prolog/docker-swipl) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`latest`, `8.1.30`](https://github.com/SWI-Prolog/docker-swipl/blob/0b4a94d8ca1ce9a973d8159393eff69a36fafe4e/8.1.30/stretch/Dockerfile) -- [`stable`, `8.0.3`](https://github.com/SWI-Prolog/docker-swipl/blob/0b4a94d8ca1ce9a973d8159393eff69a36fafe4e/8.0.3/stretch/Dockerfile) +- [`latest`, `9.1.1`](https://github.com/SWI-Prolog/docker-swipl/blob/d74a1b64f53d54d7ed6e74b3c36e5c6799e8964e/9.1.1/bullseye/Dockerfile) +- [`stable`, `9.0.2`](https://github.com/SWI-Prolog/docker-swipl/blob/d74a1b64f53d54d7ed6e74b3c36e5c6799e8964e/9.0.2/bullseye/Dockerfile) # Quick reference (cont.) @@ -40,7 +40,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/swipl`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fswipl) + [official-images repo's `library/swipl` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fswipl) [official-images repo's `library/swipl` file](https://github.com/docker-library/official-images/blob/master/library/swipl) ([history](https://github.com/docker-library/official-images/commits/master/library/swipl)) - **Source of this description**: diff --git a/teamspeak/README.md b/teamspeak/README.md index ce17dd02b007..8331accb8073 100644 --- a/teamspeak/README.md +++ b/teamspeak/README.md @@ -20,11 +20,11 @@ WARNING: TeamSpeak Developers [nwerensteijn](https://github.com/nwerensteijn) and [muenchow](https://github.com/muenchow) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`3.12`, `3.12.1`, `latest`](https://github.com/TeamSpeak-Systems/teamspeak-linux-docker-images/blob/dd1e68d64552f8848f88b542d2c6d4707a6f20b6/alpine/Dockerfile) +- [`3.13`, `3.13.7`, `latest`](https://github.com/TeamSpeak-Systems/teamspeak-linux-docker-images/blob/e1cd2cd1de40103c20adfe40079f2b6282215e72/alpine/Dockerfile) # Quick reference (cont.) @@ -39,7 +39,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/teamspeak`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fteamspeak) + [official-images repo's `library/teamspeak` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fteamspeak) [official-images repo's `library/teamspeak` file](https://github.com/docker-library/official-images/blob/master/library/teamspeak) ([history](https://github.com/docker-library/official-images/commits/master/library/teamspeak)) - **Source of this description**: diff --git a/telegraf/README.md b/telegraf/README.md index 02b64227d0ba..9b4a5366015a 100644 --- a/telegraf/README.md +++ b/telegraf/README.md @@ -20,16 +20,16 @@ WARNING: [InfluxData](https://github.com/influxdata/influxdata-docker) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`1.12`, `1.12.6`](https://github.com/influxdata/influxdata-docker/blob/5cc9340e1111f1ca9b9781db4ce210b31b785b2d/telegraf/1.12/Dockerfile) -- [`1.12-alpine`, `1.12.6-alpine`](https://github.com/influxdata/influxdata-docker/blob/5cc9340e1111f1ca9b9781db4ce210b31b785b2d/telegraf/1.12/alpine/Dockerfile) -- [`1.13`, `1.13.4`](https://github.com/influxdata/influxdata-docker/blob/5cc9340e1111f1ca9b9781db4ce210b31b785b2d/telegraf/1.13/Dockerfile) -- [`1.13-alpine`, `1.13.4-alpine`](https://github.com/influxdata/influxdata-docker/blob/5cc9340e1111f1ca9b9781db4ce210b31b785b2d/telegraf/1.13/alpine/Dockerfile) -- [`1.14`, `1.14.2`, `latest`](https://github.com/influxdata/influxdata-docker/blob/5cc9340e1111f1ca9b9781db4ce210b31b785b2d/telegraf/1.14/Dockerfile) -- [`1.14-alpine`, `1.14.2-alpine`, `alpine`](https://github.com/influxdata/influxdata-docker/blob/5cc9340e1111f1ca9b9781db4ce210b31b785b2d/telegraf/1.14/alpine/Dockerfile) +- [`1.23`, `1.23.4`](https://github.com/influxdata/influxdata-docker/blob/dbc42012042db536190ddd0686327a3a9e59a0e3/telegraf/1.23/Dockerfile) +- [`1.23-alpine`, `1.23.4-alpine`](https://github.com/influxdata/influxdata-docker/blob/dbc42012042db536190ddd0686327a3a9e59a0e3/telegraf/1.23/alpine/Dockerfile) +- [`1.24`, `1.24.4`](https://github.com/influxdata/influxdata-docker/blob/dbc42012042db536190ddd0686327a3a9e59a0e3/telegraf/1.24/Dockerfile) +- [`1.24-alpine`, `1.24.4-alpine`](https://github.com/influxdata/influxdata-docker/blob/dbc42012042db536190ddd0686327a3a9e59a0e3/telegraf/1.24/alpine/Dockerfile) +- [`1.25`, `1.25.0`, `latest`](https://github.com/influxdata/influxdata-docker/blob/dbc42012042db536190ddd0686327a3a9e59a0e3/telegraf/1.25/Dockerfile) +- [`1.25-alpine`, `1.25.0-alpine`, `alpine`](https://github.com/influxdata/influxdata-docker/blob/dbc42012042db536190ddd0686327a3a9e59a0e3/telegraf/1.25/alpine/Dockerfile) # Quick reference (cont.) @@ -44,7 +44,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/telegraf`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Ftelegraf) + [official-images repo's `library/telegraf` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Ftelegraf) [official-images repo's `library/telegraf` file](https://github.com/docker-library/official-images/blob/master/library/telegraf) ([history](https://github.com/docker-library/official-images/commits/master/library/telegraf)) - **Source of this description**: @@ -54,7 +54,7 @@ WARNING: Telegraf is an open source agent written in Go for collecting metrics and data on the system it's running on or from other services. Telegraf writes data it collects to InfluxDB in the correct format. -[Telegraf Official Docs](https://docs.influxdata.com/telegraf/latest/introduction/getting_started/) +[Telegraf Official Docs](https://docs.influxdata.com/telegraf/latest/introduction/getting-started/) ![logo](https://raw.githubusercontent.com/docker-library/docs/43d87118415bb75d7bb107683e79cd6d69186f67/telegraf/logo.png) @@ -73,7 +73,7 @@ The default configuration requires a running InfluxDB instance as an output plug Minimal example to start an InfluxDB container: ```console -$ docker run -d --name influxdb -p 8083:8083 -p 8086:8086 influxdb +$ docker run -d --name influxdb -p 8086:8086 influxdb ``` Starting Telegraf using the default config, which connects to InfluxDB at `http://localhost:8086/`: @@ -224,19 +224,23 @@ Check that the measurement `foo` is added in the DB. - [Output Plugins](https://docs.influxdata.com/telegraf/latest/plugins/outputs/) -### Monitoring the host filesystem +### Monitoring the Docker Engine Host -One of the more common use cases for Telegraf is running it in a container to monitor the host filesystem using the inputs that take information from the `/proc` filesystem. This section only applies to monitoring a Linux host. +One common use case for Telegraf is to monitor the Docker Engine Host from within a container. The recommended technique is to mount the host filesystems into the container and use environment variables to instruct Telegraf where to locate the filesystems. -To do this, you can mount the host's `/proc` filesystem inside of the container and set the location of `/proc` to an alternate location by using the `HOST_PROC` environment variable to change the location of where `/proc` is located. As an example: +The precise files that need to be made available varies from plugin to plugin. Here is an example showing the full set of supported locations: ```console $ docker run -d --name=telegraf \ - --net=influxdb \ - -e HOST_PROC=/host/proc \ - -v /proc:/host/proc:ro \ - -v $PWD/telegraf.conf:/etc/telegraf/telegraf.conf:ro \ - telegraf + -v $PWD/telegraf.conf:/etc/telegraf/telegraf.conf:ro \ + -v /:/hostfs:ro \ + -e HOST_ETC=/hostfs/etc \ + -e HOST_PROC=/hostfs/proc \ + -e HOST_SYS=/hostfs/sys \ + -e HOST_VAR=/hostfs/var \ + -e HOST_RUN=/hostfs/run \ + -e HOST_MOUNT_PREFIX=/hostfs \ + telegraf ``` ### Monitoring docker containers @@ -312,9 +316,9 @@ This is the defacto image. If you are unsure about what your needs are, you prob ## `telegraf:-alpine` -This image is based on the popular [Alpine Linux project](http://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. +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. -This variant is highly recommended when final image size being as small as possible is desired. The main caveat to note is that it does use [musl libc](http://www.musl-libc.org) instead of [glibc and friends](http://www.etalabs.net/compare_libcs.html), so certain software might run into issues depending on the depth of their libc requirements. However, most software doesn't have an issue with this, so this variant is usually a very safe choice. 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. +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. 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). diff --git a/telegraf/content.md b/telegraf/content.md index 43c344afd425..ee1a59af74f6 100644 --- a/telegraf/content.md +++ b/telegraf/content.md @@ -2,7 +2,7 @@ Telegraf is an open source agent written in Go for collecting metrics and data on the system it's running on or from other services. Telegraf writes data it collects to InfluxDB in the correct format. -[Telegraf Official Docs](https://docs.influxdata.com/telegraf/latest/introduction/getting_started/) +[Telegraf Official Docs](https://docs.influxdata.com/telegraf/latest/introduction/getting-started/) %%LOGO%% @@ -21,7 +21,7 @@ The default configuration requires a running InfluxDB instance as an output plug Minimal example to start an InfluxDB container: ```console -$ docker run -d --name influxdb -p 8083:8083 -p 8086:8086 influxdb +$ docker run -d --name influxdb -p 8086:8086 influxdb ``` Starting Telegraf using the default config, which connects to InfluxDB at `http://localhost:8086/`: @@ -172,19 +172,23 @@ Check that the measurement `foo` is added in the DB. - [Output Plugins](https://docs.influxdata.com/telegraf/latest/plugins/outputs/) -### Monitoring the host filesystem +### Monitoring the Docker Engine Host -One of the more common use cases for Telegraf is running it in a container to monitor the host filesystem using the inputs that take information from the `/proc` filesystem. This section only applies to monitoring a Linux host. +One common use case for Telegraf is to monitor the Docker Engine Host from within a container. The recommended technique is to mount the host filesystems into the container and use environment variables to instruct Telegraf where to locate the filesystems. -To do this, you can mount the host's `/proc` filesystem inside of the container and set the location of `/proc` to an alternate location by using the `HOST_PROC` environment variable to change the location of where `/proc` is located. As an example: +The precise files that need to be made available varies from plugin to plugin. Here is an example showing the full set of supported locations: ```console $ docker run -d --name=telegraf \ - --net=influxdb \ - -e HOST_PROC=/host/proc \ - -v /proc:/host/proc:ro \ - -v $PWD/telegraf.conf:/etc/telegraf/telegraf.conf:ro \ - %%IMAGE%% + -v $PWD/telegraf.conf:/etc/telegraf/telegraf.conf:ro \ + -v /:/hostfs:ro \ + -e HOST_ETC=/hostfs/etc \ + -e HOST_PROC=/hostfs/proc \ + -e HOST_SYS=/hostfs/sys \ + -e HOST_VAR=/hostfs/var \ + -e HOST_RUN=/hostfs/run \ + -e HOST_MOUNT_PREFIX=/hostfs \ + %%IMAGE%% ``` ### Monitoring docker containers diff --git a/thrift/README-short.txt b/thrift/README-short.txt deleted file mode 100644 index 8a282dccb3d6..000000000000 --- a/thrift/README-short.txt +++ /dev/null @@ -1 +0,0 @@ -Thrift is a framework for generating client and services from an IDL. diff --git a/thrift/README.md b/thrift/README.md deleted file mode 100644 index 0b5bcafa5805..000000000000 --- a/thrift/README.md +++ /dev/null @@ -1,75 +0,0 @@ - - -# Quick reference - -- **Maintained by**: - [the Docker Community](https://github.com/ahawkins/docker-thrift) - -- **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) - -# Supported tags and respective `Dockerfile` links - -- [`0.9`, `0.9.3`](https://github.com/ahawkins/docker-thrift/blob/d322572f7dd6ea468a14a4d832fbec26f152c71e/0.9/Dockerfile) -- [`0.10`, `0.10.0`](https://github.com/ahawkins/docker-thrift/blob/e1f81dfe3e8fac5588e12d2b880166d1743dbecd/0.10/Dockerfile) -- [`0.11`, `0.11.0`](https://github.com/ahawkins/docker-thrift/blob/00e197d889426695446baec4e034b5ddbb15bcb3/0.11/Dockerfile) -- [`0.12`, `0.12.0`, `latest`](https://github.com/ahawkins/docker-thrift/blob/d7e73876549d205898b1922bcbf69e74ef11c288/0.12/Dockerfile) - -# Quick reference (cont.) - -- **Where to file issues**: - [https://github.com/ahawkins/docker-thrift/issues](https://github.com/ahawkins/docker-thrift/issues) - -- **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) - [`amd64`](https://hub.docker.com/r/amd64/thrift/) - -- **Published image artifact details**: - [repo-info repo's `repos/thrift/` directory](https://github.com/docker-library/repo-info/blob/master/repos/thrift) ([history](https://github.com/docker-library/repo-info/commits/master/repos/thrift)) - (image metadata, transfer size, etc) - -- **Image updates**: - [official-images PRs with label `library/thrift`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fthrift) - [official-images repo's `library/thrift` file](https://github.com/docker-library/official-images/blob/master/library/thrift) ([history](https://github.com/docker-library/official-images/commits/master/library/thrift)) - -- **Source of this description**: - [docs repo's `thrift/` directory](https://github.com/docker-library/docs/tree/master/thrift) ([history](https://github.com/docker-library/docs/commits/master/thrift)) - -# What Is Thrift - -> The Apache Thrift software framework, for scalable cross-language services development, combines a software stack with a code generation engine to build services that work efficiently and seamlessly between C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, OCaml and Delphi and other languages. - -Read more about [Thrift](https://thrift.apache.org). - -# How To Use This Image - -This is image is intended to run as an executable. Files are provided by mounting a directory. Here's an example of compiling `service.thrift` to ruby to the current directory. - -```console -$ docker run -v "$PWD:/data" thrift thrift -o /data --gen rb /data/service.thrift -``` - -Note, that you may want to include `-u $(id -u)` to set the UID on generated files. The thrift process runs as root by default which will generate root owned files depending on your docker setup. - -# License - -View [license information](http://www.apache.org/licenses/) for the software contained in this image. - -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). - -Some additional license information which was able to be auto-detected might be found in [the `repo-info` repository's `thrift/` directory](https://github.com/docker-library/repo-info/tree/master/repos/thrift). - -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. diff --git a/thrift/content.md b/thrift/content.md deleted file mode 100644 index 8f9ab2f9c82d..000000000000 --- a/thrift/content.md +++ /dev/null @@ -1,15 +0,0 @@ -# What Is Thrift - -> The Apache Thrift software framework, for scalable cross-language services development, combines a software stack with a code generation engine to build services that work efficiently and seamlessly between C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, OCaml and Delphi and other languages. - -Read more about [Thrift](https://thrift.apache.org). - -# How To Use This Image - -This is image is intended to run as an executable. Files are provided by mounting a directory. Here's an example of compiling `service.thrift` to ruby to the current directory. - -```console -$ docker run -v "$PWD:/data" %%IMAGE%% thrift -o /data --gen rb /data/service.thrift -``` - -Note, that you may want to include `-u $(id -u)` to set the UID on generated files. The thrift process runs as root by default which will generate root owned files depending on your docker setup. diff --git a/thrift/github-repo b/thrift/github-repo deleted file mode 100644 index 0610e10f9f9a..000000000000 --- a/thrift/github-repo +++ /dev/null @@ -1 +0,0 @@ -https://github.com/ahawkins/docker-thrift diff --git a/thrift/license.md b/thrift/license.md deleted file mode 100644 index e4b27dd4944c..000000000000 --- a/thrift/license.md +++ /dev/null @@ -1 +0,0 @@ -View [license information](http://www.apache.org/licenses/) for the software contained in this image. diff --git a/thrift/maintainer.md b/thrift/maintainer.md deleted file mode 120000 index e727ff0696ae..000000000000 --- a/thrift/maintainer.md +++ /dev/null @@ -1 +0,0 @@ -../.common-templates/maintainer-community.md \ No newline at end of file diff --git a/tomcat/README.md b/tomcat/README.md index 70b4ed78bacc..936013036483 100644 --- a/tomcat/README.md +++ b/tomcat/README.md @@ -20,54 +20,48 @@ WARNING: [the Docker Community](https://github.com/docker-library/tomcat) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`10.0.0-M5-jdk14-openjdk-oracle`, `10.0.0-jdk14-openjdk-oracle`, `10.0-jdk14-openjdk-oracle`, `10-jdk14-openjdk-oracle`](https://github.com/docker-library/tomcat/blob/d2f3c19c20ca845c517ae5956d4d6a88531e220b/10.0/jdk14/openjdk-oracle/Dockerfile) -- [`10.0.0-M5-jdk14-openjdk-buster`, `10.0.0-jdk14-openjdk-buster`, `10.0-jdk14-openjdk-buster`, `10-jdk14-openjdk-buster`](https://github.com/docker-library/tomcat/blob/d2f3c19c20ca845c517ae5956d4d6a88531e220b/10.0/jdk14/openjdk-buster/Dockerfile) -- [`10.0.0-M5-jdk14-openjdk-slim-buster`, `10.0.0-jdk14-openjdk-slim-buster`, `10.0-jdk14-openjdk-slim-buster`, `10-jdk14-openjdk-slim-buster`](https://github.com/docker-library/tomcat/blob/d2f3c19c20ca845c517ae5956d4d6a88531e220b/10.0/jdk14/openjdk-slim-buster/Dockerfile) -- [`10.0.0-M5-jdk11-openjdk`, `10.0.0-jdk11-openjdk`, `10.0-jdk11-openjdk`, `10-jdk11-openjdk`, `10.0.0-M5-jdk11`, `10.0.0-jdk11`, `10.0-jdk11`, `10-jdk11`, `10.0.0-M5`, `10.0.0`, `10.0`, `10`](https://github.com/docker-library/tomcat/blob/d2f3c19c20ca845c517ae5956d4d6a88531e220b/10.0/jdk11/openjdk/Dockerfile) -- [`10.0.0-M5-jdk11-openjdk-slim`, `10.0.0-jdk11-openjdk-slim`, `10.0-jdk11-openjdk-slim`, `10-jdk11-openjdk-slim`](https://github.com/docker-library/tomcat/blob/d2f3c19c20ca845c517ae5956d4d6a88531e220b/10.0/jdk11/openjdk-slim/Dockerfile) -- [`10.0.0-M5-jdk11-adoptopenjdk-hotspot`, `10.0.0-jdk11-adoptopenjdk-hotspot`, `10.0-jdk11-adoptopenjdk-hotspot`, `10-jdk11-adoptopenjdk-hotspot`](https://github.com/docker-library/tomcat/blob/d2f3c19c20ca845c517ae5956d4d6a88531e220b/10.0/jdk11/adoptopenjdk-hotspot/Dockerfile) -- [`10.0.0-M5-jdk11-adoptopenjdk-openj9`, `10.0.0-jdk11-adoptopenjdk-openj9`, `10.0-jdk11-adoptopenjdk-openj9`, `10-jdk11-adoptopenjdk-openj9`](https://github.com/docker-library/tomcat/blob/d2f3c19c20ca845c517ae5956d4d6a88531e220b/10.0/jdk11/adoptopenjdk-openj9/Dockerfile) -- [`10.0.0-M5-jdk11-corretto`, `10.0.0-jdk11-corretto`, `10.0-jdk11-corretto`, `10-jdk11-corretto`](https://github.com/docker-library/tomcat/blob/d2f3c19c20ca845c517ae5956d4d6a88531e220b/10.0/jdk11/corretto/Dockerfile) -- [`10.0.0-M5-jdk8-openjdk`, `10.0.0-jdk8-openjdk`, `10.0-jdk8-openjdk`, `10-jdk8-openjdk`, `10.0.0-M5-jdk8`, `10.0.0-jdk8`, `10.0-jdk8`, `10-jdk8`](https://github.com/docker-library/tomcat/blob/d2f3c19c20ca845c517ae5956d4d6a88531e220b/10.0/jdk8/openjdk/Dockerfile) -- [`10.0.0-M5-jdk8-openjdk-slim`, `10.0.0-jdk8-openjdk-slim`, `10.0-jdk8-openjdk-slim`, `10-jdk8-openjdk-slim`](https://github.com/docker-library/tomcat/blob/d2f3c19c20ca845c517ae5956d4d6a88531e220b/10.0/jdk8/openjdk-slim/Dockerfile) -- [`10.0.0-M5-jdk8-adoptopenjdk-hotspot`, `10.0.0-jdk8-adoptopenjdk-hotspot`, `10.0-jdk8-adoptopenjdk-hotspot`, `10-jdk8-adoptopenjdk-hotspot`](https://github.com/docker-library/tomcat/blob/d2f3c19c20ca845c517ae5956d4d6a88531e220b/10.0/jdk8/adoptopenjdk-hotspot/Dockerfile) -- [`10.0.0-M5-jdk8-adoptopenjdk-openj9`, `10.0.0-jdk8-adoptopenjdk-openj9`, `10.0-jdk8-adoptopenjdk-openj9`, `10-jdk8-adoptopenjdk-openj9`](https://github.com/docker-library/tomcat/blob/d2f3c19c20ca845c517ae5956d4d6a88531e220b/10.0/jdk8/adoptopenjdk-openj9/Dockerfile) -- [`10.0.0-M5-jdk8-corretto`, `10.0.0-jdk8-corretto`, `10.0-jdk8-corretto`, `10-jdk8-corretto`](https://github.com/docker-library/tomcat/blob/d2f3c19c20ca845c517ae5956d4d6a88531e220b/10.0/jdk8/corretto/Dockerfile) -- [`9.0.35-jdk14-openjdk-oracle`, `9.0-jdk14-openjdk-oracle`, `9-jdk14-openjdk-oracle`, `jdk14-openjdk-oracle`](https://github.com/docker-library/tomcat/blob/d2f3c19c20ca845c517ae5956d4d6a88531e220b/9.0/jdk14/openjdk-oracle/Dockerfile) -- [`9.0.35-jdk14-openjdk-buster`, `9.0-jdk14-openjdk-buster`, `9-jdk14-openjdk-buster`, `jdk14-openjdk-buster`](https://github.com/docker-library/tomcat/blob/d2f3c19c20ca845c517ae5956d4d6a88531e220b/9.0/jdk14/openjdk-buster/Dockerfile) -- [`9.0.35-jdk14-openjdk-slim-buster`, `9.0-jdk14-openjdk-slim-buster`, `9-jdk14-openjdk-slim-buster`, `jdk14-openjdk-slim-buster`](https://github.com/docker-library/tomcat/blob/d2f3c19c20ca845c517ae5956d4d6a88531e220b/9.0/jdk14/openjdk-slim-buster/Dockerfile) -- [`9.0.35-jdk11-openjdk`, `9.0-jdk11-openjdk`, `9-jdk11-openjdk`, `jdk11-openjdk`, `9.0.35-jdk11`, `9.0-jdk11`, `9-jdk11`, `jdk11`, `9.0.35`, `9.0`, `9`, `latest`](https://github.com/docker-library/tomcat/blob/d2f3c19c20ca845c517ae5956d4d6a88531e220b/9.0/jdk11/openjdk/Dockerfile) -- [`9.0.35-jdk11-openjdk-slim`, `9.0-jdk11-openjdk-slim`, `9-jdk11-openjdk-slim`, `jdk11-openjdk-slim`](https://github.com/docker-library/tomcat/blob/d2f3c19c20ca845c517ae5956d4d6a88531e220b/9.0/jdk11/openjdk-slim/Dockerfile) -- [`9.0.35-jdk11-adoptopenjdk-hotspot`, `9.0-jdk11-adoptopenjdk-hotspot`, `9-jdk11-adoptopenjdk-hotspot`, `jdk11-adoptopenjdk-hotspot`](https://github.com/docker-library/tomcat/blob/d2f3c19c20ca845c517ae5956d4d6a88531e220b/9.0/jdk11/adoptopenjdk-hotspot/Dockerfile) -- [`9.0.35-jdk11-adoptopenjdk-openj9`, `9.0-jdk11-adoptopenjdk-openj9`, `9-jdk11-adoptopenjdk-openj9`, `jdk11-adoptopenjdk-openj9`](https://github.com/docker-library/tomcat/blob/d2f3c19c20ca845c517ae5956d4d6a88531e220b/9.0/jdk11/adoptopenjdk-openj9/Dockerfile) -- [`9.0.35-jdk11-corretto`, `9.0-jdk11-corretto`, `9-jdk11-corretto`, `jdk11-corretto`](https://github.com/docker-library/tomcat/blob/d2f3c19c20ca845c517ae5956d4d6a88531e220b/9.0/jdk11/corretto/Dockerfile) -- [`9.0.35-jdk8-openjdk`, `9.0-jdk8-openjdk`, `9-jdk8-openjdk`, `jdk8-openjdk`, `9.0.35-jdk8`, `9.0-jdk8`, `9-jdk8`, `jdk8`](https://github.com/docker-library/tomcat/blob/d2f3c19c20ca845c517ae5956d4d6a88531e220b/9.0/jdk8/openjdk/Dockerfile) -- [`9.0.35-jdk8-openjdk-slim`, `9.0-jdk8-openjdk-slim`, `9-jdk8-openjdk-slim`, `jdk8-openjdk-slim`](https://github.com/docker-library/tomcat/blob/d2f3c19c20ca845c517ae5956d4d6a88531e220b/9.0/jdk8/openjdk-slim/Dockerfile) -- [`9.0.35-jdk8-adoptopenjdk-hotspot`, `9.0-jdk8-adoptopenjdk-hotspot`, `9-jdk8-adoptopenjdk-hotspot`, `jdk8-adoptopenjdk-hotspot`](https://github.com/docker-library/tomcat/blob/d2f3c19c20ca845c517ae5956d4d6a88531e220b/9.0/jdk8/adoptopenjdk-hotspot/Dockerfile) -- [`9.0.35-jdk8-adoptopenjdk-openj9`, `9.0-jdk8-adoptopenjdk-openj9`, `9-jdk8-adoptopenjdk-openj9`, `jdk8-adoptopenjdk-openj9`](https://github.com/docker-library/tomcat/blob/d2f3c19c20ca845c517ae5956d4d6a88531e220b/9.0/jdk8/adoptopenjdk-openj9/Dockerfile) -- [`9.0.35-jdk8-corretto`, `9.0-jdk8-corretto`, `9-jdk8-corretto`, `jdk8-corretto`](https://github.com/docker-library/tomcat/blob/d2f3c19c20ca845c517ae5956d4d6a88531e220b/9.0/jdk8/corretto/Dockerfile) -- [`8.5.55-jdk14-openjdk-oracle`, `8.5-jdk14-openjdk-oracle`, `8-jdk14-openjdk-oracle`](https://github.com/docker-library/tomcat/blob/d2f3c19c20ca845c517ae5956d4d6a88531e220b/8.5/jdk14/openjdk-oracle/Dockerfile) -- [`8.5.55-jdk14-openjdk-buster`, `8.5-jdk14-openjdk-buster`, `8-jdk14-openjdk-buster`](https://github.com/docker-library/tomcat/blob/d2f3c19c20ca845c517ae5956d4d6a88531e220b/8.5/jdk14/openjdk-buster/Dockerfile) -- [`8.5.55-jdk14-openjdk-slim-buster`, `8.5-jdk14-openjdk-slim-buster`, `8-jdk14-openjdk-slim-buster`](https://github.com/docker-library/tomcat/blob/d2f3c19c20ca845c517ae5956d4d6a88531e220b/8.5/jdk14/openjdk-slim-buster/Dockerfile) -- [`8.5.55-jdk11-openjdk`, `8.5-jdk11-openjdk`, `8-jdk11-openjdk`, `8.5.55-jdk11`, `8.5-jdk11`, `8-jdk11`](https://github.com/docker-library/tomcat/blob/d2f3c19c20ca845c517ae5956d4d6a88531e220b/8.5/jdk11/openjdk/Dockerfile) -- [`8.5.55-jdk11-openjdk-slim`, `8.5-jdk11-openjdk-slim`, `8-jdk11-openjdk-slim`](https://github.com/docker-library/tomcat/blob/d2f3c19c20ca845c517ae5956d4d6a88531e220b/8.5/jdk11/openjdk-slim/Dockerfile) -- [`8.5.55-jdk11-adoptopenjdk-hotspot`, `8.5-jdk11-adoptopenjdk-hotspot`, `8-jdk11-adoptopenjdk-hotspot`](https://github.com/docker-library/tomcat/blob/d2f3c19c20ca845c517ae5956d4d6a88531e220b/8.5/jdk11/adoptopenjdk-hotspot/Dockerfile) -- [`8.5.55-jdk11-adoptopenjdk-openj9`, `8.5-jdk11-adoptopenjdk-openj9`, `8-jdk11-adoptopenjdk-openj9`](https://github.com/docker-library/tomcat/blob/d2f3c19c20ca845c517ae5956d4d6a88531e220b/8.5/jdk11/adoptopenjdk-openj9/Dockerfile) -- [`8.5.55-jdk11-corretto`, `8.5-jdk11-corretto`, `8-jdk11-corretto`](https://github.com/docker-library/tomcat/blob/d2f3c19c20ca845c517ae5956d4d6a88531e220b/8.5/jdk11/corretto/Dockerfile) -- [`8.5.55-jdk8-openjdk`, `8.5-jdk8-openjdk`, `8-jdk8-openjdk`, `8.5.55-jdk8`, `8.5-jdk8`, `8-jdk8`, `8.5.55`, `8.5`, `8`](https://github.com/docker-library/tomcat/blob/d2f3c19c20ca845c517ae5956d4d6a88531e220b/8.5/jdk8/openjdk/Dockerfile) -- [`8.5.55-jdk8-openjdk-slim`, `8.5-jdk8-openjdk-slim`, `8-jdk8-openjdk-slim`](https://github.com/docker-library/tomcat/blob/d2f3c19c20ca845c517ae5956d4d6a88531e220b/8.5/jdk8/openjdk-slim/Dockerfile) -- [`8.5.55-jdk8-adoptopenjdk-hotspot`, `8.5-jdk8-adoptopenjdk-hotspot`, `8-jdk8-adoptopenjdk-hotspot`](https://github.com/docker-library/tomcat/blob/d2f3c19c20ca845c517ae5956d4d6a88531e220b/8.5/jdk8/adoptopenjdk-hotspot/Dockerfile) -- [`8.5.55-jdk8-adoptopenjdk-openj9`, `8.5-jdk8-adoptopenjdk-openj9`, `8-jdk8-adoptopenjdk-openj9`](https://github.com/docker-library/tomcat/blob/d2f3c19c20ca845c517ae5956d4d6a88531e220b/8.5/jdk8/adoptopenjdk-openj9/Dockerfile) -- [`8.5.55-jdk8-corretto`, `8.5-jdk8-corretto`, `8-jdk8-corretto`](https://github.com/docker-library/tomcat/blob/d2f3c19c20ca845c517ae5956d4d6a88531e220b/8.5/jdk8/corretto/Dockerfile) -- [`7.0.103-jdk8-openjdk`, `7.0-jdk8-openjdk`, `7-jdk8-openjdk`, `7.0.103-jdk8`, `7.0-jdk8`, `7-jdk8`, `7.0.103`, `7.0`, `7`](https://github.com/docker-library/tomcat/blob/d2f3c19c20ca845c517ae5956d4d6a88531e220b/7/jdk8/openjdk/Dockerfile) -- [`7.0.103-jdk8-openjdk-slim`, `7.0-jdk8-openjdk-slim`, `7-jdk8-openjdk-slim`](https://github.com/docker-library/tomcat/blob/d2f3c19c20ca845c517ae5956d4d6a88531e220b/7/jdk8/openjdk-slim/Dockerfile) -- [`7.0.103-jdk8-adoptopenjdk-hotspot`, `7.0-jdk8-adoptopenjdk-hotspot`, `7-jdk8-adoptopenjdk-hotspot`](https://github.com/docker-library/tomcat/blob/d2f3c19c20ca845c517ae5956d4d6a88531e220b/7/jdk8/adoptopenjdk-hotspot/Dockerfile) -- [`7.0.103-jdk8-adoptopenjdk-openj9`, `7.0-jdk8-adoptopenjdk-openj9`, `7-jdk8-adoptopenjdk-openj9`](https://github.com/docker-library/tomcat/blob/d2f3c19c20ca845c517ae5956d4d6a88531e220b/7/jdk8/adoptopenjdk-openj9/Dockerfile) -- [`7.0.103-jdk8-corretto`, `7.0-jdk8-corretto`, `7-jdk8-corretto`](https://github.com/docker-library/tomcat/blob/d2f3c19c20ca845c517ae5956d4d6a88531e220b/7/jdk8/corretto/Dockerfile) +- [`11.0.0-M1-jdk17-temurin-jammy`, `11.0.0-jdk17-temurin-jammy`, `11.0-jdk17-temurin-jammy`, `11.0.0-M1-jdk17-temurin`, `11.0.0-jdk17-temurin`, `11.0-jdk17-temurin`, `11.0.0-M1-jdk17`, `11.0.0-jdk17`, `11.0-jdk17`, `11.0.0-M1`, `11.0.0`, `11.0`](https://github.com/docker-library/tomcat/blob/f413ee3c1b5be50b58db8cd1e9caff62a040b868/11.0/jdk17/temurin-jammy/Dockerfile) +- [`11.0.0-M1-jre17-temurin-jammy`, `11.0.0-jre17-temurin-jammy`, `11.0-jre17-temurin-jammy`, `11.0.0-M1-jre17-temurin`, `11.0.0-jre17-temurin`, `11.0-jre17-temurin`, `11.0.0-M1-jre17`, `11.0.0-jre17`, `11.0-jre17`](https://github.com/docker-library/tomcat/blob/f413ee3c1b5be50b58db8cd1e9caff62a040b868/11.0/jre17/temurin-jammy/Dockerfile) +- [`11.0.0-M1-jdk11-temurin-jammy`, `11.0.0-jdk11-temurin-jammy`, `11.0-jdk11-temurin-jammy`, `11.0.0-M1-jdk11-temurin`, `11.0.0-jdk11-temurin`, `11.0-jdk11-temurin`, `11.0.0-M1-jdk11`, `11.0.0-jdk11`, `11.0-jdk11`](https://github.com/docker-library/tomcat/blob/f413ee3c1b5be50b58db8cd1e9caff62a040b868/11.0/jdk11/temurin-jammy/Dockerfile) +- [`11.0.0-M1-jre11-temurin-jammy`, `11.0.0-jre11-temurin-jammy`, `11.0-jre11-temurin-jammy`, `11.0.0-M1-jre11-temurin`, `11.0.0-jre11-temurin`, `11.0-jre11-temurin`, `11.0.0-M1-jre11`, `11.0.0-jre11`, `11.0-jre11`](https://github.com/docker-library/tomcat/blob/f413ee3c1b5be50b58db8cd1e9caff62a040b868/11.0/jre11/temurin-jammy/Dockerfile) +- [`10.1.5-jdk17-temurin-jammy`, `10.1-jdk17-temurin-jammy`, `10-jdk17-temurin-jammy`, `jdk17-temurin-jammy`, `10.1.5-jdk17-temurin`, `10.1-jdk17-temurin`, `10-jdk17-temurin`, `jdk17-temurin`, `10.1.5-jdk17`, `10.1-jdk17`, `10-jdk17`, `jdk17`, `10.1.5`, `10.1`, `10`, `latest`](https://github.com/docker-library/tomcat/blob/09fae3d6a2967a4f78a2135bbd092e067a5fa3ec/10.1/jdk17/temurin-jammy/Dockerfile) +- [`10.1.5-jre17-temurin-jammy`, `10.1-jre17-temurin-jammy`, `10-jre17-temurin-jammy`, `jre17-temurin-jammy`, `10.1.5-jre17-temurin`, `10.1-jre17-temurin`, `10-jre17-temurin`, `jre17-temurin`, `10.1.5-jre17`, `10.1-jre17`, `10-jre17`, `jre17`](https://github.com/docker-library/tomcat/blob/09fae3d6a2967a4f78a2135bbd092e067a5fa3ec/10.1/jre17/temurin-jammy/Dockerfile) +- [`10.1.5-jdk11-temurin-jammy`, `10.1-jdk11-temurin-jammy`, `10-jdk11-temurin-jammy`, `jdk11-temurin-jammy`, `10.1.5-jdk11-temurin`, `10.1-jdk11-temurin`, `10-jdk11-temurin`, `jdk11-temurin`, `10.1.5-jdk11`, `10.1-jdk11`, `10-jdk11`, `jdk11`](https://github.com/docker-library/tomcat/blob/09fae3d6a2967a4f78a2135bbd092e067a5fa3ec/10.1/jdk11/temurin-jammy/Dockerfile) +- [`10.1.5-jre11-temurin-jammy`, `10.1-jre11-temurin-jammy`, `10-jre11-temurin-jammy`, `jre11-temurin-jammy`, `10.1.5-jre11-temurin`, `10.1-jre11-temurin`, `10-jre11-temurin`, `jre11-temurin`, `10.1.5-jre11`, `10.1-jre11`, `10-jre11`, `jre11`](https://github.com/docker-library/tomcat/blob/09fae3d6a2967a4f78a2135bbd092e067a5fa3ec/10.1/jre11/temurin-jammy/Dockerfile) +- [`9.0.71-jdk17-temurin-jammy`, `9.0-jdk17-temurin-jammy`, `9-jdk17-temurin-jammy`, `9.0.71-jdk17-temurin`, `9.0-jdk17-temurin`, `9-jdk17-temurin`, `9.0.71-jdk17`, `9.0-jdk17`, `9-jdk17`, `9.0.71`, `9.0`, `9`](https://github.com/docker-library/tomcat/blob/2fe063250eb12b5a1a49e91dbb8e69f4a4127e45/9.0/jdk17/temurin-jammy/Dockerfile) +- [`9.0.71-jre17-temurin-jammy`, `9.0-jre17-temurin-jammy`, `9-jre17-temurin-jammy`, `9.0.71-jre17-temurin`, `9.0-jre17-temurin`, `9-jre17-temurin`, `9.0.71-jre17`, `9.0-jre17`, `9-jre17`](https://github.com/docker-library/tomcat/blob/2fe063250eb12b5a1a49e91dbb8e69f4a4127e45/9.0/jre17/temurin-jammy/Dockerfile) +- [`9.0.71-jdk17-temurin-focal`, `9.0-jdk17-temurin-focal`, `9-jdk17-temurin-focal`](https://github.com/docker-library/tomcat/blob/2fe063250eb12b5a1a49e91dbb8e69f4a4127e45/9.0/jdk17/temurin-focal/Dockerfile) +- [`9.0.71-jre17-temurin-focal`, `9.0-jre17-temurin-focal`, `9-jre17-temurin-focal`](https://github.com/docker-library/tomcat/blob/2fe063250eb12b5a1a49e91dbb8e69f4a4127e45/9.0/jre17/temurin-focal/Dockerfile) +- [`9.0.71-jdk17-corretto-al2`, `9.0-jdk17-corretto-al2`, `9-jdk17-corretto-al2`, `9.0.71-jdk17-corretto`, `9.0-jdk17-corretto`, `9-jdk17-corretto`](https://github.com/docker-library/tomcat/blob/2fe063250eb12b5a1a49e91dbb8e69f4a4127e45/9.0/jdk17/corretto-al2/Dockerfile) +- [`9.0.71-jdk11-temurin-jammy`, `9.0-jdk11-temurin-jammy`, `9-jdk11-temurin-jammy`, `9.0.71-jdk11-temurin`, `9.0-jdk11-temurin`, `9-jdk11-temurin`, `9.0.71-jdk11`, `9.0-jdk11`, `9-jdk11`](https://github.com/docker-library/tomcat/blob/2fe063250eb12b5a1a49e91dbb8e69f4a4127e45/9.0/jdk11/temurin-jammy/Dockerfile) +- [`9.0.71-jre11-temurin-jammy`, `9.0-jre11-temurin-jammy`, `9-jre11-temurin-jammy`, `9.0.71-jre11-temurin`, `9.0-jre11-temurin`, `9-jre11-temurin`, `9.0.71-jre11`, `9.0-jre11`, `9-jre11`](https://github.com/docker-library/tomcat/blob/2fe063250eb12b5a1a49e91dbb8e69f4a4127e45/9.0/jre11/temurin-jammy/Dockerfile) +- [`9.0.71-jdk11-temurin-focal`, `9.0-jdk11-temurin-focal`, `9-jdk11-temurin-focal`](https://github.com/docker-library/tomcat/blob/2fe063250eb12b5a1a49e91dbb8e69f4a4127e45/9.0/jdk11/temurin-focal/Dockerfile) +- [`9.0.71-jre11-temurin-focal`, `9.0-jre11-temurin-focal`, `9-jre11-temurin-focal`](https://github.com/docker-library/tomcat/blob/2fe063250eb12b5a1a49e91dbb8e69f4a4127e45/9.0/jre11/temurin-focal/Dockerfile) +- [`9.0.71-jdk11-corretto-al2`, `9.0-jdk11-corretto-al2`, `9-jdk11-corretto-al2`, `9.0.71-jdk11-corretto`, `9.0-jdk11-corretto`, `9-jdk11-corretto`](https://github.com/docker-library/tomcat/blob/2fe063250eb12b5a1a49e91dbb8e69f4a4127e45/9.0/jdk11/corretto-al2/Dockerfile) +- [`9.0.71-jdk8-temurin-jammy`, `9.0-jdk8-temurin-jammy`, `9-jdk8-temurin-jammy`, `9.0.71-jdk8-temurin`, `9.0-jdk8-temurin`, `9-jdk8-temurin`, `9.0.71-jdk8`, `9.0-jdk8`, `9-jdk8`](https://github.com/docker-library/tomcat/blob/2fe063250eb12b5a1a49e91dbb8e69f4a4127e45/9.0/jdk8/temurin-jammy/Dockerfile) +- [`9.0.71-jre8-temurin-jammy`, `9.0-jre8-temurin-jammy`, `9-jre8-temurin-jammy`, `9.0.71-jre8-temurin`, `9.0-jre8-temurin`, `9-jre8-temurin`, `9.0.71-jre8`, `9.0-jre8`, `9-jre8`](https://github.com/docker-library/tomcat/blob/2fe063250eb12b5a1a49e91dbb8e69f4a4127e45/9.0/jre8/temurin-jammy/Dockerfile) +- [`9.0.71-jdk8-temurin-focal`, `9.0-jdk8-temurin-focal`, `9-jdk8-temurin-focal`](https://github.com/docker-library/tomcat/blob/2fe063250eb12b5a1a49e91dbb8e69f4a4127e45/9.0/jdk8/temurin-focal/Dockerfile) +- [`9.0.71-jre8-temurin-focal`, `9.0-jre8-temurin-focal`, `9-jre8-temurin-focal`](https://github.com/docker-library/tomcat/blob/2fe063250eb12b5a1a49e91dbb8e69f4a4127e45/9.0/jre8/temurin-focal/Dockerfile) +- [`9.0.71-jdk8-corretto-al2`, `9.0-jdk8-corretto-al2`, `9-jdk8-corretto-al2`, `9.0.71-jdk8-corretto`, `9.0-jdk8-corretto`, `9-jdk8-corretto`](https://github.com/docker-library/tomcat/blob/2fe063250eb12b5a1a49e91dbb8e69f4a4127e45/9.0/jdk8/corretto-al2/Dockerfile) +- [`8.5.84-jdk17-temurin-jammy`, `8.5-jdk17-temurin-jammy`, `8-jdk17-temurin-jammy`, `8.5.84-jdk17-temurin`, `8.5-jdk17-temurin`, `8-jdk17-temurin`, `8.5.84-jdk17`, `8.5-jdk17`, `8-jdk17`, `8.5.84`, `8.5`, `8`](https://github.com/docker-library/tomcat/blob/9cad4b1a880782d3504d7c8723fccc667965cf29/8.5/jdk17/temurin-jammy/Dockerfile) +- [`8.5.84-jre17-temurin-jammy`, `8.5-jre17-temurin-jammy`, `8-jre17-temurin-jammy`, `8.5.84-jre17-temurin`, `8.5-jre17-temurin`, `8-jre17-temurin`, `8.5.84-jre17`, `8.5-jre17`, `8-jre17`](https://github.com/docker-library/tomcat/blob/9cad4b1a880782d3504d7c8723fccc667965cf29/8.5/jre17/temurin-jammy/Dockerfile) +- [`8.5.84-jdk17-temurin-focal`, `8.5-jdk17-temurin-focal`, `8-jdk17-temurin-focal`](https://github.com/docker-library/tomcat/blob/9cad4b1a880782d3504d7c8723fccc667965cf29/8.5/jdk17/temurin-focal/Dockerfile) +- [`8.5.84-jre17-temurin-focal`, `8.5-jre17-temurin-focal`, `8-jre17-temurin-focal`](https://github.com/docker-library/tomcat/blob/9cad4b1a880782d3504d7c8723fccc667965cf29/8.5/jre17/temurin-focal/Dockerfile) +- [`8.5.84-jdk17-corretto-al2`, `8.5-jdk17-corretto-al2`, `8-jdk17-corretto-al2`, `8.5.84-jdk17-corretto`, `8.5-jdk17-corretto`, `8-jdk17-corretto`](https://github.com/docker-library/tomcat/blob/9cad4b1a880782d3504d7c8723fccc667965cf29/8.5/jdk17/corretto-al2/Dockerfile) +- [`8.5.84-jdk11-temurin-jammy`, `8.5-jdk11-temurin-jammy`, `8-jdk11-temurin-jammy`, `8.5.84-jdk11-temurin`, `8.5-jdk11-temurin`, `8-jdk11-temurin`, `8.5.84-jdk11`, `8.5-jdk11`, `8-jdk11`](https://github.com/docker-library/tomcat/blob/9cad4b1a880782d3504d7c8723fccc667965cf29/8.5/jdk11/temurin-jammy/Dockerfile) +- [`8.5.84-jre11-temurin-jammy`, `8.5-jre11-temurin-jammy`, `8-jre11-temurin-jammy`, `8.5.84-jre11-temurin`, `8.5-jre11-temurin`, `8-jre11-temurin`, `8.5.84-jre11`, `8.5-jre11`, `8-jre11`](https://github.com/docker-library/tomcat/blob/9cad4b1a880782d3504d7c8723fccc667965cf29/8.5/jre11/temurin-jammy/Dockerfile) +- [`8.5.84-jdk11-temurin-focal`, `8.5-jdk11-temurin-focal`, `8-jdk11-temurin-focal`](https://github.com/docker-library/tomcat/blob/9cad4b1a880782d3504d7c8723fccc667965cf29/8.5/jdk11/temurin-focal/Dockerfile) +- [`8.5.84-jre11-temurin-focal`, `8.5-jre11-temurin-focal`, `8-jre11-temurin-focal`](https://github.com/docker-library/tomcat/blob/9cad4b1a880782d3504d7c8723fccc667965cf29/8.5/jre11/temurin-focal/Dockerfile) +- [`8.5.84-jdk11-corretto-al2`, `8.5-jdk11-corretto-al2`, `8-jdk11-corretto-al2`, `8.5.84-jdk11-corretto`, `8.5-jdk11-corretto`, `8-jdk11-corretto`](https://github.com/docker-library/tomcat/blob/9cad4b1a880782d3504d7c8723fccc667965cf29/8.5/jdk11/corretto-al2/Dockerfile) +- [`8.5.84-jdk8-temurin-jammy`, `8.5-jdk8-temurin-jammy`, `8-jdk8-temurin-jammy`, `8.5.84-jdk8-temurin`, `8.5-jdk8-temurin`, `8-jdk8-temurin`, `8.5.84-jdk8`, `8.5-jdk8`, `8-jdk8`](https://github.com/docker-library/tomcat/blob/9cad4b1a880782d3504d7c8723fccc667965cf29/8.5/jdk8/temurin-jammy/Dockerfile) +- [`8.5.84-jre8-temurin-jammy`, `8.5-jre8-temurin-jammy`, `8-jre8-temurin-jammy`, `8.5.84-jre8-temurin`, `8.5-jre8-temurin`, `8-jre8-temurin`, `8.5.84-jre8`, `8.5-jre8`, `8-jre8`](https://github.com/docker-library/tomcat/blob/9cad4b1a880782d3504d7c8723fccc667965cf29/8.5/jre8/temurin-jammy/Dockerfile) +- [`8.5.84-jdk8-temurin-focal`, `8.5-jdk8-temurin-focal`, `8-jdk8-temurin-focal`](https://github.com/docker-library/tomcat/blob/9cad4b1a880782d3504d7c8723fccc667965cf29/8.5/jdk8/temurin-focal/Dockerfile) +- [`8.5.84-jre8-temurin-focal`, `8.5-jre8-temurin-focal`, `8-jre8-temurin-focal`](https://github.com/docker-library/tomcat/blob/9cad4b1a880782d3504d7c8723fccc667965cf29/8.5/jre8/temurin-focal/Dockerfile) +- [`8.5.84-jdk8-corretto-al2`, `8.5-jdk8-corretto-al2`, `8-jdk8-corretto-al2`, `8.5.84-jdk8-corretto`, `8.5-jdk8-corretto`, `8-jdk8-corretto`](https://github.com/docker-library/tomcat/blob/9cad4b1a880782d3504d7c8723fccc667965cf29/8.5/jdk8/corretto-al2/Dockerfile) # Quick reference (cont.) @@ -82,7 +76,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/tomcat`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Ftomcat) + [official-images repo's `library/tomcat` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Ftomcat) [official-images repo's `library/tomcat` file](https://github.com/docker-library/official-images/blob/master/library/tomcat) ([history](https://github.com/docker-library/official-images/commits/master/library/tomcat)) - **Source of this description**: @@ -124,20 +118,6 @@ The default Tomcat environment in the image is: The configuration files are available in `/usr/local/tomcat/conf/`. By default, no user is included in the "manager-gui" role required to operate the "/manager/html" web application. If you wish to use this app, you must define such a user in `tomcat-users.xml`. -# Image Variants - -The `tomcat` images come in many flavors, each designed for a specific use case. - -## `tomcat:` - -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. - -Some of these tags may have names like buster 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. - -## `tomcat:-slim` - -This image does not contain the common packages contained in the default tag and only contains the minimal packages needed to run `tomcat`. Unless you are working in an environment where *only* the `tomcat` image will be deployed and you have space constraints, we highly recommend using the default image of this repository. - # License View [license information](https://www.apache.org/licenses/LICENSE-2.0) for the software contained in this image. diff --git a/tomee/README.md b/tomee/README.md index 37092eef0d96..37f23153294d 100644 --- a/tomee/README.md +++ b/tomee/README.md @@ -20,25 +20,66 @@ WARNING: [the Docker Community](https://github.com/tomitribe/docker-tomee) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`8-jre-7.0.7-plume`, `7.0.7-plume`](https://github.com/tomitribe/docker-tomee/blob/c7642e963c08920560906159e126ea22b9ada61d/TomEE-7.0/jre8/plume/Dockerfile) -- [`8-jre-7.0.7-plus`, `7.0.7-plus`](https://github.com/tomitribe/docker-tomee/blob/c7642e963c08920560906159e126ea22b9ada61d/TomEE-7.0/jre8/plus/Dockerfile) -- [`8-jre-7.0.7-webprofile`, `7.0`](https://github.com/tomitribe/docker-tomee/blob/c7642e963c08920560906159e126ea22b9ada61d/TomEE-7.0/jre8/webprofile/Dockerfile) -- [`8-jre-7.1.2-plume`, `7.1.2-plume`](https://github.com/tomitribe/docker-tomee/blob/c7642e963c08920560906159e126ea22b9ada61d/TomEE-7.1/jre8/plume/Dockerfile) -- [`8-jre-7.1.2-plus`, `7.1.2-plus`](https://github.com/tomitribe/docker-tomee/blob/c7642e963c08920560906159e126ea22b9ada61d/TomEE-7.1/jre8/plus/Dockerfile) -- [`8-jre-7.1.2-microprofile`, `7.1.2-microprofile`](https://github.com/tomitribe/docker-tomee/blob/c7642e963c08920560906159e126ea22b9ada61d/TomEE-7.1/jre8/microprofile/Dockerfile) -- [`8-jre-7.1.2-webprofile`, `7.1.2-webprofile`, `7`, `7.1`](https://github.com/tomitribe/docker-tomee/blob/c7642e963c08920560906159e126ea22b9ada61d/TomEE-7.1/jre8/webprofile/Dockerfile) -- [`8-jre-8.0.1-plume`](https://github.com/tomitribe/docker-tomee/blob/c7642e963c08920560906159e126ea22b9ada61d/TomEE-8.0/jre8/plume/Dockerfile) -- [`8-jre-8.0.1-plus`](https://github.com/tomitribe/docker-tomee/blob/c7642e963c08920560906159e126ea22b9ada61d/TomEE-8.0/jre8/plus/Dockerfile) -- [`8-jre-8.0.1-microprofile`](https://github.com/tomitribe/docker-tomee/blob/c7642e963c08920560906159e126ea22b9ada61d/TomEE-8.0/jre8/microprofile/Dockerfile) -- [`8-jre-8.0.1-webprofile`](https://github.com/tomitribe/docker-tomee/blob/c7642e963c08920560906159e126ea22b9ada61d/TomEE-8.0/jre8/webprofile/Dockerfile) -- [`11-jre-8.0.1-plume`, `8.0.1-plume`](https://github.com/tomitribe/docker-tomee/blob/c7642e963c08920560906159e126ea22b9ada61d/TomEE-8.0/jre11/plume/Dockerfile) -- [`11-jre-8.0.1-plus`, `8.0.1-plus`](https://github.com/tomitribe/docker-tomee/blob/c7642e963c08920560906159e126ea22b9ada61d/TomEE-8.0/jre11/plus/Dockerfile) -- [`11-jre-8.0.1-microprofile`, `8.0.1-microprofile`](https://github.com/tomitribe/docker-tomee/blob/c7642e963c08920560906159e126ea22b9ada61d/TomEE-8.0/jre11/microprofile/Dockerfile) -- [`11-jre-8.0.1-webprofile`, `8.0.1-webprofile`, `latest`, `8`](https://github.com/tomitribe/docker-tomee/blob/c7642e963c08920560906159e126ea22b9ada61d/TomEE-8.0/jre11/webprofile/Dockerfile) +- [`8.0.13-jre17-Temurin-ubuntu-webprofile`, `8.0.13-Temurin-ubuntu-webprofile`, `8.0.13-jre17-ubuntu-webprofile`, `8.0.13-ubuntu-webprofile`, `8.0.13-jre17-Temurin-webprofile`, `8.0.13-Temurin-webprofile`, `8.0.13-jre17-webprofile`, `8.0.13-webprofile`, `8.0.13-jre17-Temurin-ubuntu`, `8.0.13-Temurin-ubuntu`, `8.0.13-jre17-ubuntu`, `8.0.13-ubuntu`, `8.0.13-jre17-Temurin`, `8.0.13-Temurin`, `8.0.13-jre17`, `8.0.13`, `8.0-jre17-Temurin-ubuntu-webprofile`, `8.0-Temurin-ubuntu-webprofile`, `8.0-jre17-ubuntu-webprofile`, `8.0-ubuntu-webprofile`, `8.0-jre17-Temurin-webprofile`, `8.0-Temurin-webprofile`, `8.0-jre17-webprofile`, `8.0-webprofile`, `8.0-jre17-Temurin-ubuntu`, `8.0-Temurin-ubuntu`, `8.0-jre17-ubuntu`, `8.0-ubuntu`, `8.0-jre17-Temurin`, `8.0-Temurin`, `8.0-jre17`, `8.0`, `8-jre17-Temurin-ubuntu-webprofile`, `8-Temurin-ubuntu-webprofile`, `8-jre17-ubuntu-webprofile`, `8-ubuntu-webprofile`, `8-jre17-Temurin-webprofile`, `8-Temurin-webprofile`, `8-jre17-webprofile`, `8-webprofile`, `8-jre17-Temurin-ubuntu`, `8-Temurin-ubuntu`, `8-jre17-ubuntu`, `8-ubuntu`, `8-jre17-Temurin`, `8-Temurin`, `8-jre17`, `8`, `jre17-Temurin-ubuntu-webprofile`, `Temurin-ubuntu-webprofile`, `jre17-ubuntu-webprofile`, `ubuntu-webprofile`, `jre17-Temurin-webprofile`, `Temurin-webprofile`, `jre17-webprofile`, `webprofile`, `jre17-Temurin-ubuntu`, `Temurin-ubuntu`, `jre17-ubuntu`, `ubuntu`, `jre17-Temurin`, `Temurin`, `jre17`, `latest`](https://github.com/tomitribe/docker-tomee/blob/3ca8b3bbd8e7c1c6762a6786241144b424b58573/TomEE-8.0/jre17/Temurin/ubuntu/webprofile/Dockerfile) +- [`8.0.13-jre17-Temurin-ubuntu-microprofile`, `8.0.13-Temurin-ubuntu-microprofile`, `8.0.13-jre17-ubuntu-microprofile`, `8.0.13-ubuntu-microprofile`, `8.0.13-jre17-Temurin-microprofile`, `8.0.13-Temurin-microprofile`, `8.0.13-jre17-microprofile`, `8.0.13-microprofile`, `8.0-jre17-Temurin-ubuntu-microprofile`, `8.0-Temurin-ubuntu-microprofile`, `8.0-jre17-ubuntu-microprofile`, `8.0-ubuntu-microprofile`, `8.0-jre17-Temurin-microprofile`, `8.0-Temurin-microprofile`, `8.0-jre17-microprofile`, `8.0-microprofile`, `8-jre17-Temurin-ubuntu-microprofile`, `8-Temurin-ubuntu-microprofile`, `8-jre17-ubuntu-microprofile`, `8-ubuntu-microprofile`, `8-jre17-Temurin-microprofile`, `8-Temurin-microprofile`, `8-jre17-microprofile`, `8-microprofile`, `jre17-Temurin-ubuntu-microprofile`, `Temurin-ubuntu-microprofile`, `jre17-ubuntu-microprofile`, `ubuntu-microprofile`, `jre17-Temurin-microprofile`, `Temurin-microprofile`, `jre17-microprofile`, `microprofile`](https://github.com/tomitribe/docker-tomee/blob/3ca8b3bbd8e7c1c6762a6786241144b424b58573/TomEE-8.0/jre17/Temurin/ubuntu/microprofile/Dockerfile) +- [`8.0.13-jre17-Temurin-ubuntu-plume`, `8.0.13-Temurin-ubuntu-plume`, `8.0.13-jre17-ubuntu-plume`, `8.0.13-ubuntu-plume`, `8.0.13-jre17-Temurin-plume`, `8.0.13-Temurin-plume`, `8.0.13-jre17-plume`, `8.0.13-plume`, `8.0-jre17-Temurin-ubuntu-plume`, `8.0-Temurin-ubuntu-plume`, `8.0-jre17-ubuntu-plume`, `8.0-ubuntu-plume`, `8.0-jre17-Temurin-plume`, `8.0-Temurin-plume`, `8.0-jre17-plume`, `8.0-plume`, `8-jre17-Temurin-ubuntu-plume`, `8-Temurin-ubuntu-plume`, `8-jre17-ubuntu-plume`, `8-ubuntu-plume`, `8-jre17-Temurin-plume`, `8-Temurin-plume`, `8-jre17-plume`, `8-plume`, `jre17-Temurin-ubuntu-plume`, `Temurin-ubuntu-plume`, `jre17-ubuntu-plume`, `ubuntu-plume`, `jre17-Temurin-plume`, `Temurin-plume`, `jre17-plume`, `plume`](https://github.com/tomitribe/docker-tomee/blob/3ca8b3bbd8e7c1c6762a6786241144b424b58573/TomEE-8.0/jre17/Temurin/ubuntu/plume/Dockerfile) +- [`8.0.13-jre17-Temurin-ubuntu-plus`, `8.0.13-Temurin-ubuntu-plus`, `8.0.13-jre17-ubuntu-plus`, `8.0.13-ubuntu-plus`, `8.0.13-jre17-Temurin-plus`, `8.0.13-Temurin-plus`, `8.0.13-jre17-plus`, `8.0.13-plus`, `8.0-jre17-Temurin-ubuntu-plus`, `8.0-Temurin-ubuntu-plus`, `8.0-jre17-ubuntu-plus`, `8.0-ubuntu-plus`, `8.0-jre17-Temurin-plus`, `8.0-Temurin-plus`, `8.0-jre17-plus`, `8.0-plus`, `8-jre17-Temurin-ubuntu-plus`, `8-Temurin-ubuntu-plus`, `8-jre17-ubuntu-plus`, `8-ubuntu-plus`, `8-jre17-Temurin-plus`, `8-Temurin-plus`, `8-jre17-plus`, `8-plus`, `jre17-Temurin-ubuntu-plus`, `Temurin-ubuntu-plus`, `jre17-ubuntu-plus`, `ubuntu-plus`, `jre17-Temurin-plus`, `Temurin-plus`, `jre17-plus`, `plus`](https://github.com/tomitribe/docker-tomee/blob/3ca8b3bbd8e7c1c6762a6786241144b424b58573/TomEE-8.0/jre17/Temurin/ubuntu/plus/Dockerfile) +- [`8.0.13-jre17-Temurin-alpine-webprofile`, `8.0.13-Temurin-alpine-webprofile`, `8.0.13-jre17-alpine-webprofile`, `8.0.13-alpine-webprofile`, `8.0.13-jre17-Temurin-alpine`, `8.0.13-Temurin-alpine`, `8.0.13-jre17-alpine`, `8.0.13-alpine`, `8.0-jre17-Temurin-alpine-webprofile`, `8.0-Temurin-alpine-webprofile`, `8.0-jre17-alpine-webprofile`, `8.0-alpine-webprofile`, `8.0-jre17-Temurin-alpine`, `8.0-Temurin-alpine`, `8.0-jre17-alpine`, `8.0-alpine`, `8-jre17-Temurin-alpine-webprofile`, `8-Temurin-alpine-webprofile`, `8-jre17-alpine-webprofile`, `8-alpine-webprofile`, `8-jre17-Temurin-alpine`, `8-Temurin-alpine`, `8-jre17-alpine`, `8-alpine`, `jre17-Temurin-alpine-webprofile`, `Temurin-alpine-webprofile`, `jre17-alpine-webprofile`, `alpine-webprofile`, `jre17-Temurin-alpine`, `Temurin-alpine`, `jre17-alpine`, `alpine`](https://github.com/tomitribe/docker-tomee/blob/3ca8b3bbd8e7c1c6762a6786241144b424b58573/TomEE-8.0/jre17/Temurin/alpine/webprofile/Dockerfile) +- [`8.0.13-jre17-Temurin-alpine-microprofile`, `8.0.13-Temurin-alpine-microprofile`, `8.0.13-jre17-alpine-microprofile`, `8.0.13-alpine-microprofile`, `8.0-jre17-Temurin-alpine-microprofile`, `8.0-Temurin-alpine-microprofile`, `8.0-jre17-alpine-microprofile`, `8.0-alpine-microprofile`, `8-jre17-Temurin-alpine-microprofile`, `8-Temurin-alpine-microprofile`, `8-jre17-alpine-microprofile`, `8-alpine-microprofile`, `jre17-Temurin-alpine-microprofile`, `Temurin-alpine-microprofile`, `jre17-alpine-microprofile`, `alpine-microprofile`](https://github.com/tomitribe/docker-tomee/blob/3ca8b3bbd8e7c1c6762a6786241144b424b58573/TomEE-8.0/jre17/Temurin/alpine/microprofile/Dockerfile) +- [`8.0.13-jre17-Temurin-alpine-plume`, `8.0.13-Temurin-alpine-plume`, `8.0.13-jre17-alpine-plume`, `8.0.13-alpine-plume`, `8.0-jre17-Temurin-alpine-plume`, `8.0-Temurin-alpine-plume`, `8.0-jre17-alpine-plume`, `8.0-alpine-plume`, `8-jre17-Temurin-alpine-plume`, `8-Temurin-alpine-plume`, `8-jre17-alpine-plume`, `8-alpine-plume`, `jre17-Temurin-alpine-plume`, `Temurin-alpine-plume`, `jre17-alpine-plume`, `alpine-plume`](https://github.com/tomitribe/docker-tomee/blob/3ca8b3bbd8e7c1c6762a6786241144b424b58573/TomEE-8.0/jre17/Temurin/alpine/plume/Dockerfile) +- [`8.0.13-jre17-Temurin-alpine-plus`, `8.0.13-Temurin-alpine-plus`, `8.0.13-jre17-alpine-plus`, `8.0.13-alpine-plus`, `8.0-jre17-Temurin-alpine-plus`, `8.0-Temurin-alpine-plus`, `8.0-jre17-alpine-plus`, `8.0-alpine-plus`, `8-jre17-Temurin-alpine-plus`, `8-Temurin-alpine-plus`, `8-jre17-alpine-plus`, `8-alpine-plus`, `jre17-Temurin-alpine-plus`, `Temurin-alpine-plus`, `jre17-alpine-plus`, `alpine-plus`](https://github.com/tomitribe/docker-tomee/blob/3ca8b3bbd8e7c1c6762a6786241144b424b58573/TomEE-8.0/jre17/Temurin/alpine/plus/Dockerfile) +- [`8.0.13-jre11-Temurin-ubuntu-webprofile`, `8.0.13-jre11-ubuntu-webprofile`, `8.0.13-jre11-Temurin-webprofile`, `8.0.13-jre11-webprofile`, `8.0.13-jre11-Temurin-ubuntu`, `8.0.13-jre11-ubuntu`, `8.0.13-jre11-Temurin`, `8.0.13-jre11`, `8.0-jre11-Temurin-ubuntu-webprofile`, `8.0-jre11-ubuntu-webprofile`, `8.0-jre11-Temurin-webprofile`, `8.0-jre11-webprofile`, `8.0-jre11-Temurin-ubuntu`, `8.0-jre11-ubuntu`, `8.0-jre11-Temurin`, `8.0-jre11`, `8-jre11-Temurin-ubuntu-webprofile`, `8-jre11-ubuntu-webprofile`, `8-jre11-Temurin-webprofile`, `8-jre11-webprofile`, `8-jre11-Temurin-ubuntu`, `8-jre11-ubuntu`, `8-jre11-Temurin`, `8-jre11`, `jre11-Temurin-ubuntu-webprofile`, `jre11-ubuntu-webprofile`, `jre11-Temurin-webprofile`, `jre11-webprofile`, `jre11-Temurin-ubuntu`, `jre11-ubuntu`, `jre11-Temurin`, `jre11`](https://github.com/tomitribe/docker-tomee/blob/3ca8b3bbd8e7c1c6762a6786241144b424b58573/TomEE-8.0/jre11/Temurin/ubuntu/webprofile/Dockerfile) +- [`8.0.13-jre11-Temurin-ubuntu-microprofile`, `8.0.13-jre11-ubuntu-microprofile`, `8.0.13-jre11-Temurin-microprofile`, `8.0.13-jre11-microprofile`, `8.0-jre11-Temurin-ubuntu-microprofile`, `8.0-jre11-ubuntu-microprofile`, `8.0-jre11-Temurin-microprofile`, `8.0-jre11-microprofile`, `8-jre11-Temurin-ubuntu-microprofile`, `8-jre11-ubuntu-microprofile`, `8-jre11-Temurin-microprofile`, `8-jre11-microprofile`, `jre11-Temurin-ubuntu-microprofile`, `jre11-ubuntu-microprofile`, `jre11-Temurin-microprofile`, `jre11-microprofile`](https://github.com/tomitribe/docker-tomee/blob/3ca8b3bbd8e7c1c6762a6786241144b424b58573/TomEE-8.0/jre11/Temurin/ubuntu/microprofile/Dockerfile) +- [`8.0.13-jre11-Temurin-ubuntu-plume`, `8.0.13-jre11-ubuntu-plume`, `8.0.13-jre11-Temurin-plume`, `8.0.13-jre11-plume`, `8.0-jre11-Temurin-ubuntu-plume`, `8.0-jre11-ubuntu-plume`, `8.0-jre11-Temurin-plume`, `8.0-jre11-plume`, `8-jre11-Temurin-ubuntu-plume`, `8-jre11-ubuntu-plume`, `8-jre11-Temurin-plume`, `8-jre11-plume`, `jre11-Temurin-ubuntu-plume`, `jre11-ubuntu-plume`, `jre11-Temurin-plume`, `jre11-plume`](https://github.com/tomitribe/docker-tomee/blob/3ca8b3bbd8e7c1c6762a6786241144b424b58573/TomEE-8.0/jre11/Temurin/ubuntu/plume/Dockerfile) +- [`8.0.13-jre11-Temurin-ubuntu-plus`, `8.0.13-jre11-ubuntu-plus`, `8.0.13-jre11-Temurin-plus`, `8.0.13-jre11-plus`, `8.0-jre11-Temurin-ubuntu-plus`, `8.0-jre11-ubuntu-plus`, `8.0-jre11-Temurin-plus`, `8.0-jre11-plus`, `8-jre11-Temurin-ubuntu-plus`, `8-jre11-ubuntu-plus`, `8-jre11-Temurin-plus`, `8-jre11-plus`, `jre11-Temurin-ubuntu-plus`, `jre11-ubuntu-plus`, `jre11-Temurin-plus`, `jre11-plus`](https://github.com/tomitribe/docker-tomee/blob/3ca8b3bbd8e7c1c6762a6786241144b424b58573/TomEE-8.0/jre11/Temurin/ubuntu/plus/Dockerfile) +- [`8.0.13-jre11-Temurin-alpine-webprofile`, `8.0.13-jre11-alpine-webprofile`, `8.0.13-jre11-Temurin-alpine`, `8.0.13-jre11-alpine`, `8.0-jre11-Temurin-alpine-webprofile`, `8.0-jre11-alpine-webprofile`, `8.0-jre11-Temurin-alpine`, `8.0-jre11-alpine`, `8-jre11-Temurin-alpine-webprofile`, `8-jre11-alpine-webprofile`, `8-jre11-Temurin-alpine`, `8-jre11-alpine`, `jre11-Temurin-alpine-webprofile`, `jre11-alpine-webprofile`, `jre11-Temurin-alpine`, `jre11-alpine`](https://github.com/tomitribe/docker-tomee/blob/3ca8b3bbd8e7c1c6762a6786241144b424b58573/TomEE-8.0/jre11/Temurin/alpine/webprofile/Dockerfile) +- [`8.0.13-jre11-Temurin-alpine-microprofile`, `8.0.13-jre11-alpine-microprofile`, `8.0-jre11-Temurin-alpine-microprofile`, `8.0-jre11-alpine-microprofile`, `8-jre11-Temurin-alpine-microprofile`, `8-jre11-alpine-microprofile`, `jre11-Temurin-alpine-microprofile`, `jre11-alpine-microprofile`](https://github.com/tomitribe/docker-tomee/blob/3ca8b3bbd8e7c1c6762a6786241144b424b58573/TomEE-8.0/jre11/Temurin/alpine/microprofile/Dockerfile) +- [`8.0.13-jre11-Temurin-alpine-plume`, `8.0.13-jre11-alpine-plume`, `8.0-jre11-Temurin-alpine-plume`, `8.0-jre11-alpine-plume`, `8-jre11-Temurin-alpine-plume`, `8-jre11-alpine-plume`, `jre11-Temurin-alpine-plume`, `jre11-alpine-plume`](https://github.com/tomitribe/docker-tomee/blob/3ca8b3bbd8e7c1c6762a6786241144b424b58573/TomEE-8.0/jre11/Temurin/alpine/plume/Dockerfile) +- [`8.0.13-jre11-Temurin-alpine-plus`, `8.0.13-jre11-alpine-plus`, `8.0-jre11-Temurin-alpine-plus`, `8.0-jre11-alpine-plus`, `8-jre11-Temurin-alpine-plus`, `8-jre11-alpine-plus`, `jre11-Temurin-alpine-plus`, `jre11-alpine-plus`](https://github.com/tomitribe/docker-tomee/blob/3ca8b3bbd8e7c1c6762a6786241144b424b58573/TomEE-8.0/jre11/Temurin/alpine/plus/Dockerfile) +- [`8.0.13-jre8-Temurin-ubuntu-webprofile`, `8.0.13-jre8-ubuntu-webprofile`, `8.0.13-jre8-Temurin-webprofile`, `8.0.13-jre8-webprofile`, `8.0.13-jre8-Temurin-ubuntu`, `8.0.13-jre8-ubuntu`, `8.0.13-jre8-Temurin`, `8.0.13-jre8`, `8.0-jre8-Temurin-ubuntu-webprofile`, `8.0-jre8-ubuntu-webprofile`, `8.0-jre8-Temurin-webprofile`, `8.0-jre8-webprofile`, `8.0-jre8-Temurin-ubuntu`, `8.0-jre8-ubuntu`, `8.0-jre8-Temurin`, `8.0-jre8`, `8-jre8-Temurin-ubuntu-webprofile`, `8-jre8-ubuntu-webprofile`, `8-jre8-Temurin-webprofile`, `8-jre8-webprofile`, `8-jre8-Temurin-ubuntu`, `8-jre8-ubuntu`, `8-jre8-Temurin`, `8-jre8`, `jre8-Temurin-ubuntu-webprofile`, `jre8-ubuntu-webprofile`, `jre8-Temurin-webprofile`, `jre8-webprofile`, `jre8-Temurin-ubuntu`, `jre8-ubuntu`, `jre8-Temurin`, `jre8`](https://github.com/tomitribe/docker-tomee/blob/3ca8b3bbd8e7c1c6762a6786241144b424b58573/TomEE-8.0/jre8/Temurin/ubuntu/webprofile/Dockerfile) +- [`8.0.13-jre8-Temurin-ubuntu-microprofile`, `8.0.13-jre8-ubuntu-microprofile`, `8.0.13-jre8-Temurin-microprofile`, `8.0.13-jre8-microprofile`, `8.0-jre8-Temurin-ubuntu-microprofile`, `8.0-jre8-ubuntu-microprofile`, `8.0-jre8-Temurin-microprofile`, `8.0-jre8-microprofile`, `8-jre8-Temurin-ubuntu-microprofile`, `8-jre8-ubuntu-microprofile`, `8-jre8-Temurin-microprofile`, `8-jre8-microprofile`, `jre8-Temurin-ubuntu-microprofile`, `jre8-ubuntu-microprofile`, `jre8-Temurin-microprofile`, `jre8-microprofile`](https://github.com/tomitribe/docker-tomee/blob/3ca8b3bbd8e7c1c6762a6786241144b424b58573/TomEE-8.0/jre8/Temurin/ubuntu/microprofile/Dockerfile) +- [`8.0.13-jre8-Temurin-ubuntu-plume`, `8.0.13-jre8-ubuntu-plume`, `8.0.13-jre8-Temurin-plume`, `8.0.13-jre8-plume`, `8.0-jre8-Temurin-ubuntu-plume`, `8.0-jre8-ubuntu-plume`, `8.0-jre8-Temurin-plume`, `8.0-jre8-plume`, `8-jre8-Temurin-ubuntu-plume`, `8-jre8-ubuntu-plume`, `8-jre8-Temurin-plume`, `8-jre8-plume`, `jre8-Temurin-ubuntu-plume`, `jre8-ubuntu-plume`, `jre8-Temurin-plume`, `jre8-plume`](https://github.com/tomitribe/docker-tomee/blob/3ca8b3bbd8e7c1c6762a6786241144b424b58573/TomEE-8.0/jre8/Temurin/ubuntu/plume/Dockerfile) +- [`8.0.13-jre8-Temurin-ubuntu-plus`, `8.0.13-jre8-ubuntu-plus`, `8.0.13-jre8-Temurin-plus`, `8.0.13-jre8-plus`, `8.0-jre8-Temurin-ubuntu-plus`, `8.0-jre8-ubuntu-plus`, `8.0-jre8-Temurin-plus`, `8.0-jre8-plus`, `8-jre8-Temurin-ubuntu-plus`, `8-jre8-ubuntu-plus`, `8-jre8-Temurin-plus`, `8-jre8-plus`, `jre8-Temurin-ubuntu-plus`, `jre8-ubuntu-plus`, `jre8-Temurin-plus`, `jre8-plus`](https://github.com/tomitribe/docker-tomee/blob/3ca8b3bbd8e7c1c6762a6786241144b424b58573/TomEE-8.0/jre8/Temurin/ubuntu/plus/Dockerfile) +- [`8.0.13-jre8-Temurin-alpine-webprofile`, `8.0.13-jre8-alpine-webprofile`, `8.0.13-jre8-Temurin-alpine`, `8.0.13-jre8-alpine`, `8.0-jre8-Temurin-alpine-webprofile`, `8.0-jre8-alpine-webprofile`, `8.0-jre8-Temurin-alpine`, `8.0-jre8-alpine`, `8-jre8-Temurin-alpine-webprofile`, `8-jre8-alpine-webprofile`, `8-jre8-Temurin-alpine`, `8-jre8-alpine`, `jre8-Temurin-alpine-webprofile`, `jre8-alpine-webprofile`, `jre8-Temurin-alpine`, `jre8-alpine`](https://github.com/tomitribe/docker-tomee/blob/3ca8b3bbd8e7c1c6762a6786241144b424b58573/TomEE-8.0/jre8/Temurin/alpine/webprofile/Dockerfile) +- [`8.0.13-jre8-Temurin-alpine-microprofile`, `8.0.13-jre8-alpine-microprofile`, `8.0-jre8-Temurin-alpine-microprofile`, `8.0-jre8-alpine-microprofile`, `8-jre8-Temurin-alpine-microprofile`, `8-jre8-alpine-microprofile`, `jre8-Temurin-alpine-microprofile`, `jre8-alpine-microprofile`](https://github.com/tomitribe/docker-tomee/blob/3ca8b3bbd8e7c1c6762a6786241144b424b58573/TomEE-8.0/jre8/Temurin/alpine/microprofile/Dockerfile) +- [`8.0.13-jre8-Temurin-alpine-plume`, `8.0.13-jre8-alpine-plume`, `8.0-jre8-Temurin-alpine-plume`, `8.0-jre8-alpine-plume`, `8-jre8-Temurin-alpine-plume`, `8-jre8-alpine-plume`, `jre8-Temurin-alpine-plume`, `jre8-alpine-plume`](https://github.com/tomitribe/docker-tomee/blob/3ca8b3bbd8e7c1c6762a6786241144b424b58573/TomEE-8.0/jre8/Temurin/alpine/plume/Dockerfile) +- [`8.0.13-jre8-Temurin-alpine-plus`, `8.0.13-jre8-alpine-plus`, `8.0-jre8-Temurin-alpine-plus`, `8.0-jre8-alpine-plus`, `8-jre8-Temurin-alpine-plus`, `8-jre8-alpine-plus`, `jre8-Temurin-alpine-plus`, `jre8-alpine-plus`](https://github.com/tomitribe/docker-tomee/blob/3ca8b3bbd8e7c1c6762a6786241144b424b58573/TomEE-8.0/jre8/Temurin/alpine/plus/Dockerfile) +- [`8.0.13-jre17-Semeru-ubuntu-webprofile`, `8.0.13-Semeru-ubuntu-webprofile`, `8.0.13-jre17-Semeru-webprofile`, `8.0.13-Semeru-webprofile`, `8.0.13-jre17-Semeru-ubuntu`, `8.0.13-Semeru-ubuntu`, `8.0.13-jre17-Semeru`, `8.0.13-Semeru`, `8.0-jre17-Semeru-ubuntu-webprofile`, `8.0-Semeru-ubuntu-webprofile`, `8.0-jre17-Semeru-webprofile`, `8.0-Semeru-webprofile`, `8.0-jre17-Semeru-ubuntu`, `8.0-Semeru-ubuntu`, `8.0-jre17-Semeru`, `8.0-Semeru`, `8-jre17-Semeru-ubuntu-webprofile`, `8-Semeru-ubuntu-webprofile`, `8-jre17-Semeru-webprofile`, `8-Semeru-webprofile`, `8-jre17-Semeru-ubuntu`, `8-Semeru-ubuntu`, `8-jre17-Semeru`, `8-Semeru`, `jre17-Semeru-ubuntu-webprofile`, `Semeru-ubuntu-webprofile`, `jre17-Semeru-webprofile`, `Semeru-webprofile`, `jre17-Semeru-ubuntu`, `Semeru-ubuntu`, `jre17-Semeru`, `Semeru`](https://github.com/tomitribe/docker-tomee/blob/3ca8b3bbd8e7c1c6762a6786241144b424b58573/TomEE-8.0/jre17/Semeru/ubuntu/webprofile/Dockerfile) +- [`8.0.13-jre17-Semeru-ubuntu-microprofile`, `8.0.13-Semeru-ubuntu-microprofile`, `8.0.13-jre17-Semeru-microprofile`, `8.0.13-Semeru-microprofile`, `8.0-jre17-Semeru-ubuntu-microprofile`, `8.0-Semeru-ubuntu-microprofile`, `8.0-jre17-Semeru-microprofile`, `8.0-Semeru-microprofile`, `8-jre17-Semeru-ubuntu-microprofile`, `8-Semeru-ubuntu-microprofile`, `8-jre17-Semeru-microprofile`, `8-Semeru-microprofile`, `jre17-Semeru-ubuntu-microprofile`, `Semeru-ubuntu-microprofile`, `jre17-Semeru-microprofile`, `Semeru-microprofile`](https://github.com/tomitribe/docker-tomee/blob/3ca8b3bbd8e7c1c6762a6786241144b424b58573/TomEE-8.0/jre17/Semeru/ubuntu/microprofile/Dockerfile) +- [`8.0.13-jre17-Semeru-ubuntu-plume`, `8.0.13-Semeru-ubuntu-plume`, `8.0.13-jre17-Semeru-plume`, `8.0.13-Semeru-plume`, `8.0-jre17-Semeru-ubuntu-plume`, `8.0-Semeru-ubuntu-plume`, `8.0-jre17-Semeru-plume`, `8.0-Semeru-plume`, `8-jre17-Semeru-ubuntu-plume`, `8-Semeru-ubuntu-plume`, `8-jre17-Semeru-plume`, `8-Semeru-plume`, `jre17-Semeru-ubuntu-plume`, `Semeru-ubuntu-plume`, `jre17-Semeru-plume`, `Semeru-plume`](https://github.com/tomitribe/docker-tomee/blob/3ca8b3bbd8e7c1c6762a6786241144b424b58573/TomEE-8.0/jre17/Semeru/ubuntu/plume/Dockerfile) +- [`8.0.13-jre17-Semeru-ubuntu-plus`, `8.0.13-Semeru-ubuntu-plus`, `8.0.13-jre17-Semeru-plus`, `8.0.13-Semeru-plus`, `8.0-jre17-Semeru-ubuntu-plus`, `8.0-Semeru-ubuntu-plus`, `8.0-jre17-Semeru-plus`, `8.0-Semeru-plus`, `8-jre17-Semeru-ubuntu-plus`, `8-Semeru-ubuntu-plus`, `8-jre17-Semeru-plus`, `8-Semeru-plus`, `jre17-Semeru-ubuntu-plus`, `Semeru-ubuntu-plus`, `jre17-Semeru-plus`, `Semeru-plus`](https://github.com/tomitribe/docker-tomee/blob/3ca8b3bbd8e7c1c6762a6786241144b424b58573/TomEE-8.0/jre17/Semeru/ubuntu/plus/Dockerfile) +- [`8.0.13-jre11-Semeru-ubuntu-webprofile`, `8.0.13-jre11-Semeru-webprofile`, `8.0.13-jre11-Semeru-ubuntu`, `8.0.13-jre11-Semeru`, `8.0-jre11-Semeru-ubuntu-webprofile`, `8.0-jre11-Semeru-webprofile`, `8.0-jre11-Semeru-ubuntu`, `8.0-jre11-Semeru`, `8-jre11-Semeru-ubuntu-webprofile`, `8-jre11-Semeru-webprofile`, `8-jre11-Semeru-ubuntu`, `8-jre11-Semeru`, `jre11-Semeru-ubuntu-webprofile`, `jre11-Semeru-webprofile`, `jre11-Semeru-ubuntu`, `jre11-Semeru`](https://github.com/tomitribe/docker-tomee/blob/3ca8b3bbd8e7c1c6762a6786241144b424b58573/TomEE-8.0/jre11/Semeru/ubuntu/webprofile/Dockerfile) +- [`8.0.13-jre11-Semeru-ubuntu-microprofile`, `8.0.13-jre11-Semeru-microprofile`, `8.0-jre11-Semeru-ubuntu-microprofile`, `8.0-jre11-Semeru-microprofile`, `8-jre11-Semeru-ubuntu-microprofile`, `8-jre11-Semeru-microprofile`, `jre11-Semeru-ubuntu-microprofile`, `jre11-Semeru-microprofile`](https://github.com/tomitribe/docker-tomee/blob/3ca8b3bbd8e7c1c6762a6786241144b424b58573/TomEE-8.0/jre11/Semeru/ubuntu/microprofile/Dockerfile) +- [`8.0.13-jre11-Semeru-ubuntu-plume`, `8.0.13-jre11-Semeru-plume`, `8.0-jre11-Semeru-ubuntu-plume`, `8.0-jre11-Semeru-plume`, `8-jre11-Semeru-ubuntu-plume`, `8-jre11-Semeru-plume`, `jre11-Semeru-ubuntu-plume`, `jre11-Semeru-plume`](https://github.com/tomitribe/docker-tomee/blob/3ca8b3bbd8e7c1c6762a6786241144b424b58573/TomEE-8.0/jre11/Semeru/ubuntu/plume/Dockerfile) +- [`8.0.13-jre11-Semeru-ubuntu-plus`, `8.0.13-jre11-Semeru-plus`, `8.0-jre11-Semeru-ubuntu-plus`, `8.0-jre11-Semeru-plus`, `8-jre11-Semeru-ubuntu-plus`, `8-jre11-Semeru-plus`, `jre11-Semeru-ubuntu-plus`, `jre11-Semeru-plus`](https://github.com/tomitribe/docker-tomee/blob/3ca8b3bbd8e7c1c6762a6786241144b424b58573/TomEE-8.0/jre11/Semeru/ubuntu/plus/Dockerfile) +- [`9.0.0.RC1-jre17-Temurin-ubuntu-webprofile`, `9.0.0.RC1-Temurin-ubuntu-webprofile`, `9.0.0.RC1-jre17-ubuntu-webprofile`, `9.0.0.RC1-ubuntu-webprofile`, `9.0.0.RC1-jre17-Temurin-webprofile`, `9.0.0.RC1-Temurin-webprofile`, `9.0.0.RC1-jre17-webprofile`, `9.0.0.RC1-webprofile`, `9.0.0.RC1-jre17-Temurin-ubuntu`, `9.0.0.RC1-Temurin-ubuntu`, `9.0.0.RC1-jre17-ubuntu`, `9.0.0.RC1-ubuntu`, `9.0.0.RC1-jre17-Temurin`, `9.0.0.RC1-Temurin`, `9.0.0.RC1-jre17`, `9.0.0.RC1`, `9.0-jre17-Temurin-ubuntu-webprofile`, `9.0-Temurin-ubuntu-webprofile`, `9.0-jre17-ubuntu-webprofile`, `9.0-ubuntu-webprofile`, `9.0-jre17-Temurin-webprofile`, `9.0-Temurin-webprofile`, `9.0-jre17-webprofile`, `9.0-webprofile`, `9.0-jre17-Temurin-ubuntu`, `9.0-Temurin-ubuntu`, `9.0-jre17-ubuntu`, `9.0-ubuntu`, `9.0-jre17-Temurin`, `9.0-Temurin`, `9.0-jre17`, `9.0`, `9-jre17-Temurin-ubuntu-webprofile`, `9-Temurin-ubuntu-webprofile`, `9-jre17-ubuntu-webprofile`, `9-ubuntu-webprofile`, `9-jre17-Temurin-webprofile`, `9-Temurin-webprofile`, `9-jre17-webprofile`, `9-webprofile`, `9-jre17-Temurin-ubuntu`, `9-Temurin-ubuntu`, `9-jre17-ubuntu`, `9-ubuntu`, `9-jre17-Temurin`, `9-Temurin`, `9-jre17`, `9`](https://github.com/tomitribe/docker-tomee/blob/3ca8b3bbd8e7c1c6762a6786241144b424b58573/TomEE-9.0/jre17/Temurin/ubuntu/webprofile/Dockerfile) +- [`9.0.0.RC1-jre17-Temurin-ubuntu-microprofile`, `9.0.0.RC1-Temurin-ubuntu-microprofile`, `9.0.0.RC1-jre17-ubuntu-microprofile`, `9.0.0.RC1-ubuntu-microprofile`, `9.0.0.RC1-jre17-Temurin-microprofile`, `9.0.0.RC1-Temurin-microprofile`, `9.0.0.RC1-jre17-microprofile`, `9.0.0.RC1-microprofile`, `9.0-jre17-Temurin-ubuntu-microprofile`, `9.0-Temurin-ubuntu-microprofile`, `9.0-jre17-ubuntu-microprofile`, `9.0-ubuntu-microprofile`, `9.0-jre17-Temurin-microprofile`, `9.0-Temurin-microprofile`, `9.0-jre17-microprofile`, `9.0-microprofile`, `9-jre17-Temurin-ubuntu-microprofile`, `9-Temurin-ubuntu-microprofile`, `9-jre17-ubuntu-microprofile`, `9-ubuntu-microprofile`, `9-jre17-Temurin-microprofile`, `9-Temurin-microprofile`, `9-jre17-microprofile`, `9-microprofile`](https://github.com/tomitribe/docker-tomee/blob/3ca8b3bbd8e7c1c6762a6786241144b424b58573/TomEE-9.0/jre17/Temurin/ubuntu/microprofile/Dockerfile) +- [`9.0.0.RC1-jre17-Temurin-ubuntu-plume`, `9.0.0.RC1-Temurin-ubuntu-plume`, `9.0.0.RC1-jre17-ubuntu-plume`, `9.0.0.RC1-ubuntu-plume`, `9.0.0.RC1-jre17-Temurin-plume`, `9.0.0.RC1-Temurin-plume`, `9.0.0.RC1-jre17-plume`, `9.0.0.RC1-plume`, `9.0-jre17-Temurin-ubuntu-plume`, `9.0-Temurin-ubuntu-plume`, `9.0-jre17-ubuntu-plume`, `9.0-ubuntu-plume`, `9.0-jre17-Temurin-plume`, `9.0-Temurin-plume`, `9.0-jre17-plume`, `9.0-plume`, `9-jre17-Temurin-ubuntu-plume`, `9-Temurin-ubuntu-plume`, `9-jre17-ubuntu-plume`, `9-ubuntu-plume`, `9-jre17-Temurin-plume`, `9-Temurin-plume`, `9-jre17-plume`, `9-plume`](https://github.com/tomitribe/docker-tomee/blob/3ca8b3bbd8e7c1c6762a6786241144b424b58573/TomEE-9.0/jre17/Temurin/ubuntu/plume/Dockerfile) +- [`9.0.0.RC1-jre17-Temurin-ubuntu-plus`, `9.0.0.RC1-Temurin-ubuntu-plus`, `9.0.0.RC1-jre17-ubuntu-plus`, `9.0.0.RC1-ubuntu-plus`, `9.0.0.RC1-jre17-Temurin-plus`, `9.0.0.RC1-Temurin-plus`, `9.0.0.RC1-jre17-plus`, `9.0.0.RC1-plus`, `9.0-jre17-Temurin-ubuntu-plus`, `9.0-Temurin-ubuntu-plus`, `9.0-jre17-ubuntu-plus`, `9.0-ubuntu-plus`, `9.0-jre17-Temurin-plus`, `9.0-Temurin-plus`, `9.0-jre17-plus`, `9.0-plus`, `9-jre17-Temurin-ubuntu-plus`, `9-Temurin-ubuntu-plus`, `9-jre17-ubuntu-plus`, `9-ubuntu-plus`, `9-jre17-Temurin-plus`, `9-Temurin-plus`, `9-jre17-plus`, `9-plus`](https://github.com/tomitribe/docker-tomee/blob/3ca8b3bbd8e7c1c6762a6786241144b424b58573/TomEE-9.0/jre17/Temurin/ubuntu/plus/Dockerfile) +- [`9.0.0.RC1-jre17-Temurin-alpine-webprofile`, `9.0.0.RC1-Temurin-alpine-webprofile`, `9.0.0.RC1-jre17-alpine-webprofile`, `9.0.0.RC1-alpine-webprofile`, `9.0.0.RC1-jre17-Temurin-alpine`, `9.0.0.RC1-Temurin-alpine`, `9.0.0.RC1-jre17-alpine`, `9.0.0.RC1-alpine`, `9.0-jre17-Temurin-alpine-webprofile`, `9.0-Temurin-alpine-webprofile`, `9.0-jre17-alpine-webprofile`, `9.0-alpine-webprofile`, `9.0-jre17-Temurin-alpine`, `9.0-Temurin-alpine`, `9.0-jre17-alpine`, `9.0-alpine`, `9-jre17-Temurin-alpine-webprofile`, `9-Temurin-alpine-webprofile`, `9-jre17-alpine-webprofile`, `9-alpine-webprofile`, `9-jre17-Temurin-alpine`, `9-Temurin-alpine`, `9-jre17-alpine`, `9-alpine`](https://github.com/tomitribe/docker-tomee/blob/3ca8b3bbd8e7c1c6762a6786241144b424b58573/TomEE-9.0/jre17/Temurin/alpine/webprofile/Dockerfile) +- [`9.0.0.RC1-jre17-Temurin-alpine-microprofile`, `9.0.0.RC1-Temurin-alpine-microprofile`, `9.0.0.RC1-jre17-alpine-microprofile`, `9.0.0.RC1-alpine-microprofile`, `9.0-jre17-Temurin-alpine-microprofile`, `9.0-Temurin-alpine-microprofile`, `9.0-jre17-alpine-microprofile`, `9.0-alpine-microprofile`, `9-jre17-Temurin-alpine-microprofile`, `9-Temurin-alpine-microprofile`, `9-jre17-alpine-microprofile`, `9-alpine-microprofile`](https://github.com/tomitribe/docker-tomee/blob/3ca8b3bbd8e7c1c6762a6786241144b424b58573/TomEE-9.0/jre17/Temurin/alpine/microprofile/Dockerfile) +- [`9.0.0.RC1-jre17-Temurin-alpine-plume`, `9.0.0.RC1-Temurin-alpine-plume`, `9.0.0.RC1-jre17-alpine-plume`, `9.0.0.RC1-alpine-plume`, `9.0-jre17-Temurin-alpine-plume`, `9.0-Temurin-alpine-plume`, `9.0-jre17-alpine-plume`, `9.0-alpine-plume`, `9-jre17-Temurin-alpine-plume`, `9-Temurin-alpine-plume`, `9-jre17-alpine-plume`, `9-alpine-plume`](https://github.com/tomitribe/docker-tomee/blob/3ca8b3bbd8e7c1c6762a6786241144b424b58573/TomEE-9.0/jre17/Temurin/alpine/plume/Dockerfile) +- [`9.0.0.RC1-jre17-Temurin-alpine-plus`, `9.0.0.RC1-Temurin-alpine-plus`, `9.0.0.RC1-jre17-alpine-plus`, `9.0.0.RC1-alpine-plus`, `9.0-jre17-Temurin-alpine-plus`, `9.0-Temurin-alpine-plus`, `9.0-jre17-alpine-plus`, `9.0-alpine-plus`, `9-jre17-Temurin-alpine-plus`, `9-Temurin-alpine-plus`, `9-jre17-alpine-plus`, `9-alpine-plus`](https://github.com/tomitribe/docker-tomee/blob/3ca8b3bbd8e7c1c6762a6786241144b424b58573/TomEE-9.0/jre17/Temurin/alpine/plus/Dockerfile) +- [`9.0.0.RC1-jre11-Temurin-ubuntu-webprofile`, `9.0.0.RC1-jre11-ubuntu-webprofile`, `9.0.0.RC1-jre11-Temurin-webprofile`, `9.0.0.RC1-jre11-webprofile`, `9.0.0.RC1-jre11-Temurin-ubuntu`, `9.0.0.RC1-jre11-ubuntu`, `9.0.0.RC1-jre11-Temurin`, `9.0.0.RC1-jre11`, `9.0-jre11-Temurin-ubuntu-webprofile`, `9.0-jre11-ubuntu-webprofile`, `9.0-jre11-Temurin-webprofile`, `9.0-jre11-webprofile`, `9.0-jre11-Temurin-ubuntu`, `9.0-jre11-ubuntu`, `9.0-jre11-Temurin`, `9.0-jre11`, `9-jre11-Temurin-ubuntu-webprofile`, `9-jre11-ubuntu-webprofile`, `9-jre11-Temurin-webprofile`, `9-jre11-webprofile`, `9-jre11-Temurin-ubuntu`, `9-jre11-ubuntu`, `9-jre11-Temurin`, `9-jre11`](https://github.com/tomitribe/docker-tomee/blob/3ca8b3bbd8e7c1c6762a6786241144b424b58573/TomEE-9.0/jre11/Temurin/ubuntu/webprofile/Dockerfile) +- [`9.0.0.RC1-jre11-Temurin-ubuntu-microprofile`, `9.0.0.RC1-jre11-ubuntu-microprofile`, `9.0.0.RC1-jre11-Temurin-microprofile`, `9.0.0.RC1-jre11-microprofile`, `9.0-jre11-Temurin-ubuntu-microprofile`, `9.0-jre11-ubuntu-microprofile`, `9.0-jre11-Temurin-microprofile`, `9.0-jre11-microprofile`, `9-jre11-Temurin-ubuntu-microprofile`, `9-jre11-ubuntu-microprofile`, `9-jre11-Temurin-microprofile`, `9-jre11-microprofile`](https://github.com/tomitribe/docker-tomee/blob/3ca8b3bbd8e7c1c6762a6786241144b424b58573/TomEE-9.0/jre11/Temurin/ubuntu/microprofile/Dockerfile) +- [`9.0.0.RC1-jre11-Temurin-ubuntu-plume`, `9.0.0.RC1-jre11-ubuntu-plume`, `9.0.0.RC1-jre11-Temurin-plume`, `9.0.0.RC1-jre11-plume`, `9.0-jre11-Temurin-ubuntu-plume`, `9.0-jre11-ubuntu-plume`, `9.0-jre11-Temurin-plume`, `9.0-jre11-plume`, `9-jre11-Temurin-ubuntu-plume`, `9-jre11-ubuntu-plume`, `9-jre11-Temurin-plume`, `9-jre11-plume`](https://github.com/tomitribe/docker-tomee/blob/3ca8b3bbd8e7c1c6762a6786241144b424b58573/TomEE-9.0/jre11/Temurin/ubuntu/plume/Dockerfile) +- [`9.0.0.RC1-jre11-Temurin-ubuntu-plus`, `9.0.0.RC1-jre11-ubuntu-plus`, `9.0.0.RC1-jre11-Temurin-plus`, `9.0.0.RC1-jre11-plus`, `9.0-jre11-Temurin-ubuntu-plus`, `9.0-jre11-ubuntu-plus`, `9.0-jre11-Temurin-plus`, `9.0-jre11-plus`, `9-jre11-Temurin-ubuntu-plus`, `9-jre11-ubuntu-plus`, `9-jre11-Temurin-plus`, `9-jre11-plus`](https://github.com/tomitribe/docker-tomee/blob/3ca8b3bbd8e7c1c6762a6786241144b424b58573/TomEE-9.0/jre11/Temurin/ubuntu/plus/Dockerfile) +- [`9.0.0.RC1-jre11-Temurin-alpine-webprofile`, `9.0.0.RC1-jre11-alpine-webprofile`, `9.0.0.RC1-jre11-Temurin-alpine`, `9.0.0.RC1-jre11-alpine`, `9.0-jre11-Temurin-alpine-webprofile`, `9.0-jre11-alpine-webprofile`, `9.0-jre11-Temurin-alpine`, `9.0-jre11-alpine`, `9-jre11-Temurin-alpine-webprofile`, `9-jre11-alpine-webprofile`, `9-jre11-Temurin-alpine`, `9-jre11-alpine`](https://github.com/tomitribe/docker-tomee/blob/3ca8b3bbd8e7c1c6762a6786241144b424b58573/TomEE-9.0/jre11/Temurin/alpine/webprofile/Dockerfile) +- [`9.0.0.RC1-jre11-Temurin-alpine-microprofile`, `9.0.0.RC1-jre11-alpine-microprofile`, `9.0-jre11-Temurin-alpine-microprofile`, `9.0-jre11-alpine-microprofile`, `9-jre11-Temurin-alpine-microprofile`, `9-jre11-alpine-microprofile`](https://github.com/tomitribe/docker-tomee/blob/3ca8b3bbd8e7c1c6762a6786241144b424b58573/TomEE-9.0/jre11/Temurin/alpine/microprofile/Dockerfile) +- [`9.0.0.RC1-jre11-Temurin-alpine-plume`, `9.0.0.RC1-jre11-alpine-plume`, `9.0-jre11-Temurin-alpine-plume`, `9.0-jre11-alpine-plume`, `9-jre11-Temurin-alpine-plume`, `9-jre11-alpine-plume`](https://github.com/tomitribe/docker-tomee/blob/3ca8b3bbd8e7c1c6762a6786241144b424b58573/TomEE-9.0/jre11/Temurin/alpine/plume/Dockerfile) +- [`9.0.0.RC1-jre11-Temurin-alpine-plus`, `9.0.0.RC1-jre11-alpine-plus`, `9.0-jre11-Temurin-alpine-plus`, `9.0-jre11-alpine-plus`, `9-jre11-Temurin-alpine-plus`, `9-jre11-alpine-plus`](https://github.com/tomitribe/docker-tomee/blob/3ca8b3bbd8e7c1c6762a6786241144b424b58573/TomEE-9.0/jre11/Temurin/alpine/plus/Dockerfile) +- [`9.0.0.RC1-jre17-Semeru-ubuntu-webprofile`, `9.0.0.RC1-Semeru-ubuntu-webprofile`, `9.0.0.RC1-jre17-Semeru-webprofile`, `9.0.0.RC1-Semeru-webprofile`, `9.0.0.RC1-jre17-Semeru-ubuntu`, `9.0.0.RC1-Semeru-ubuntu`, `9.0.0.RC1-jre17-Semeru`, `9.0.0.RC1-Semeru`, `9.0-jre17-Semeru-ubuntu-webprofile`, `9.0-Semeru-ubuntu-webprofile`, `9.0-jre17-Semeru-webprofile`, `9.0-Semeru-webprofile`, `9.0-jre17-Semeru-ubuntu`, `9.0-Semeru-ubuntu`, `9.0-jre17-Semeru`, `9.0-Semeru`, `9-jre17-Semeru-ubuntu-webprofile`, `9-Semeru-ubuntu-webprofile`, `9-jre17-Semeru-webprofile`, `9-Semeru-webprofile`, `9-jre17-Semeru-ubuntu`, `9-Semeru-ubuntu`, `9-jre17-Semeru`, `9-Semeru`](https://github.com/tomitribe/docker-tomee/blob/3ca8b3bbd8e7c1c6762a6786241144b424b58573/TomEE-9.0/jre17/Semeru/ubuntu/webprofile/Dockerfile) +- [`9.0.0.RC1-jre17-Semeru-ubuntu-microprofile`, `9.0.0.RC1-Semeru-ubuntu-microprofile`, `9.0.0.RC1-jre17-Semeru-microprofile`, `9.0.0.RC1-Semeru-microprofile`, `9.0-jre17-Semeru-ubuntu-microprofile`, `9.0-Semeru-ubuntu-microprofile`, `9.0-jre17-Semeru-microprofile`, `9.0-Semeru-microprofile`, `9-jre17-Semeru-ubuntu-microprofile`, `9-Semeru-ubuntu-microprofile`, `9-jre17-Semeru-microprofile`, `9-Semeru-microprofile`](https://github.com/tomitribe/docker-tomee/blob/3ca8b3bbd8e7c1c6762a6786241144b424b58573/TomEE-9.0/jre17/Semeru/ubuntu/microprofile/Dockerfile) +- [`9.0.0.RC1-jre17-Semeru-ubuntu-plume`, `9.0.0.RC1-Semeru-ubuntu-plume`, `9.0.0.RC1-jre17-Semeru-plume`, `9.0.0.RC1-Semeru-plume`, `9.0-jre17-Semeru-ubuntu-plume`, `9.0-Semeru-ubuntu-plume`, `9.0-jre17-Semeru-plume`, `9.0-Semeru-plume`, `9-jre17-Semeru-ubuntu-plume`, `9-Semeru-ubuntu-plume`, `9-jre17-Semeru-plume`, `9-Semeru-plume`](https://github.com/tomitribe/docker-tomee/blob/3ca8b3bbd8e7c1c6762a6786241144b424b58573/TomEE-9.0/jre17/Semeru/ubuntu/plume/Dockerfile) +- [`9.0.0.RC1-jre17-Semeru-ubuntu-plus`, `9.0.0.RC1-Semeru-ubuntu-plus`, `9.0.0.RC1-jre17-Semeru-plus`, `9.0.0.RC1-Semeru-plus`, `9.0-jre17-Semeru-ubuntu-plus`, `9.0-Semeru-ubuntu-plus`, `9.0-jre17-Semeru-plus`, `9.0-Semeru-plus`, `9-jre17-Semeru-ubuntu-plus`, `9-Semeru-ubuntu-plus`, `9-jre17-Semeru-plus`, `9-Semeru-plus`](https://github.com/tomitribe/docker-tomee/blob/3ca8b3bbd8e7c1c6762a6786241144b424b58573/TomEE-9.0/jre17/Semeru/ubuntu/plus/Dockerfile) +- [`9.0.0.RC1-jre11-Semeru-ubuntu-webprofile`, `9.0.0.RC1-jre11-Semeru-webprofile`, `9.0.0.RC1-jre11-Semeru-ubuntu`, `9.0.0.RC1-jre11-Semeru`, `9.0-jre11-Semeru-ubuntu-webprofile`, `9.0-jre11-Semeru-webprofile`, `9.0-jre11-Semeru-ubuntu`, `9.0-jre11-Semeru`, `9-jre11-Semeru-ubuntu-webprofile`, `9-jre11-Semeru-webprofile`, `9-jre11-Semeru-ubuntu`, `9-jre11-Semeru`](https://github.com/tomitribe/docker-tomee/blob/3ca8b3bbd8e7c1c6762a6786241144b424b58573/TomEE-9.0/jre11/Semeru/ubuntu/webprofile/Dockerfile) +- [`9.0.0.RC1-jre11-Semeru-ubuntu-microprofile`, `9.0.0.RC1-jre11-Semeru-microprofile`, `9.0-jre11-Semeru-ubuntu-microprofile`, `9.0-jre11-Semeru-microprofile`, `9-jre11-Semeru-ubuntu-microprofile`, `9-jre11-Semeru-microprofile`](https://github.com/tomitribe/docker-tomee/blob/3ca8b3bbd8e7c1c6762a6786241144b424b58573/TomEE-9.0/jre11/Semeru/ubuntu/microprofile/Dockerfile) +- [`9.0.0.RC1-jre11-Semeru-ubuntu-plume`, `9.0.0.RC1-jre11-Semeru-plume`, `9.0-jre11-Semeru-ubuntu-plume`, `9.0-jre11-Semeru-plume`, `9-jre11-Semeru-ubuntu-plume`, `9-jre11-Semeru-plume`](https://github.com/tomitribe/docker-tomee/blob/3ca8b3bbd8e7c1c6762a6786241144b424b58573/TomEE-9.0/jre11/Semeru/ubuntu/plume/Dockerfile) +- [`9.0.0.RC1-jre11-Semeru-ubuntu-plus`, `9.0.0.RC1-jre11-Semeru-plus`, `9.0-jre11-Semeru-ubuntu-plus`, `9.0-jre11-Semeru-plus`, `9-jre11-Semeru-ubuntu-plus`, `9-jre11-Semeru-plus`](https://github.com/tomitribe/docker-tomee/blob/3ca8b3bbd8e7c1c6762a6786241144b424b58573/TomEE-9.0/jre11/Semeru/ubuntu/plus/Dockerfile) # Quick reference (cont.) @@ -46,14 +87,14 @@ WARNING: [https://github.com/tomitribe/docker-tomee/issues](https://github.com/tomitribe/docker-tomee/issues) - **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) - [`amd64`](https://hub.docker.com/r/amd64/tomee/) + [`amd64`](https://hub.docker.com/r/amd64/tomee/), [`arm64v8`](https://hub.docker.com/r/arm64v8/tomee/) - **Published image artifact details**: [repo-info repo's `repos/tomee/` directory](https://github.com/docker-library/repo-info/blob/master/repos/tomee) ([history](https://github.com/docker-library/repo-info/commits/master/repos/tomee)) (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/tomee`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Ftomee) + [official-images repo's `library/tomee` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Ftomee) [official-images repo's `library/tomee` file](https://github.com/docker-library/official-images/blob/master/library/tomee) ([history](https://github.com/docker-library/official-images/commits/master/library/tomee)) - **Source of this description**: @@ -123,6 +164,22 @@ You can also use this image as base image for deploying your war application. To COPY / /usr/local/tomee/webapps/ ``` +# Image Variants + +The `tomee` images come in many flavors, each designed for a specific use case. + +## `tomee:` + +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. + +## `tomee:-alpine` + +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. + +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. + +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). + # License View [license information](http://www.apache.org/licenses/LICENSE-2.0) for the software contained in this image. diff --git a/traefik/README.md b/traefik/README.md index c3cecc1001bf..257cdbbbcb42 100644 --- a/traefik/README.md +++ b/traefik/README.md @@ -17,33 +17,35 @@ WARNING: # Quick reference - **Maintained by**: - [the Traefik Project](https://github.com/containous/traefik-library-image) + [the Traefik Project](https://github.com/traefik/traefik-library-image) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`v2.2.1-windowsservercore-1809`, `2.2.1-windowsservercore-1809`, `v2.2-windowsservercore-1809`, `2.2-windowsservercore-1809`, `chevrotin-windowsservercore-1809`, `windowsservercore-1809`](https://github.com/containous/traefik-library-image/blob/4aa0b86550fec343ad25e330624c887ad48e5e08/windows/1809/Dockerfile) -- [`v2.2.1`, `2.2.1`, `v2.2`, `2.2`, `chevrotin`, `latest`](https://github.com/containous/traefik-library-image/blob/4aa0b86550fec343ad25e330624c887ad48e5e08/alpine/Dockerfile) -- [`v1.7.24-windowsservercore-1809`, `1.7.24-windowsservercore-1809`, `v1.7-windowsservercore-1809`, `1.7-windowsservercore-1809`, `maroilles-windowsservercore-1809`](https://github.com/containous/traefik-library-image/blob/7b90db1b9b495c897bb92a8d3de4f98957fd460d/windows/1809/Dockerfile) -- [`v1.7.24-alpine`, `1.7.24-alpine`, `v1.7-alpine`, `1.7-alpine`, `maroilles-alpine`](https://github.com/containous/traefik-library-image/blob/7b90db1b9b495c897bb92a8d3de4f98957fd460d/alpine/Dockerfile) -- [`v1.7.24`, `1.7.24`, `v1.7`, `1.7`, `maroilles`](https://github.com/containous/traefik-library-image/blob/7b90db1b9b495c897bb92a8d3de4f98957fd460d/scratch/Dockerfile) +- [`v3.0.0-beta2-windowsservercore-1809`, `3.0.0-beta2-windowsservercore-1809`, `v3.0-windowsservercore-1809`, `3.0-windowsservercore-1809`, `beaufort-windowsservercore-1809`](https://github.com/traefik/traefik-library-image/blob/e2fc89bcccd185a9e332deae22a71e209aca1fb3/windows/1809/Dockerfile) +- [`v3.0.0-beta2`, `3.0.0-beta2`, `v3.0`, `3.0`, `beaufort`](https://github.com/traefik/traefik-library-image/blob/e2fc89bcccd185a9e332deae22a71e209aca1fb3/alpine/Dockerfile) +- [`v2.9.6-windowsservercore-1809`, `2.9.6-windowsservercore-1809`, `v2.9-windowsservercore-1809`, `2.9-windowsservercore-1809`, `banon-windowsservercore-1809`, `windowsservercore-1809`](https://github.com/traefik/traefik-library-image/blob/940d317751fabafc8b2a99b4a9b23b14c5b8bdc9/windows/1809/Dockerfile) +- [`v2.9.6`, `2.9.6`, `v2.9`, `2.9`, `banon`, `latest`](https://github.com/traefik/traefik-library-image/blob/940d317751fabafc8b2a99b4a9b23b14c5b8bdc9/alpine/Dockerfile) +- [`v1.7.34-windowsservercore-1809`, `1.7.34-windowsservercore-1809`, `v1.7-windowsservercore-1809`, `1.7-windowsservercore-1809`, `maroilles-windowsservercore-1809`](https://github.com/traefik/traefik-library-image/blob/4434758cf14bbd1ec9511b3f2a37b0a6ce846db6/windows/1809/Dockerfile) +- [`v1.7.34-alpine`, `1.7.34-alpine`, `v1.7-alpine`, `1.7-alpine`, `maroilles-alpine`](https://github.com/traefik/traefik-library-image/blob/4434758cf14bbd1ec9511b3f2a37b0a6ce846db6/alpine/Dockerfile) +- [`v1.7.34`, `1.7.34`, `v1.7`, `1.7`, `maroilles`](https://github.com/traefik/traefik-library-image/blob/4434758cf14bbd1ec9511b3f2a37b0a6ce846db6/scratch/Dockerfile) # Quick reference (cont.) - **Where to file issues**: - [https://github.com/containous/traefik-library-image/issues](https://github.com/containous/traefik-library-image/issues) + [https://github.com/traefik/traefik-library-image/issues](https://github.com/traefik/traefik-library-image/issues) - **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) - [`amd64`](https://hub.docker.com/r/amd64/traefik/), [`arm32v6`](https://hub.docker.com/r/arm32v6/traefik/), [`arm64v8`](https://hub.docker.com/r/arm64v8/traefik/), [`windows-amd64`](https://hub.docker.com/r/winamd64/traefik/) + [`amd64`](https://hub.docker.com/r/amd64/traefik/), [`arm32v6`](https://hub.docker.com/r/arm32v6/traefik/), [`arm64v8`](https://hub.docker.com/r/arm64v8/traefik/), [`s390x`](https://hub.docker.com/r/s390x/traefik/), [`windows-amd64`](https://hub.docker.com/r/winamd64/traefik/) - **Published image artifact details**: [repo-info repo's `repos/traefik/` directory](https://github.com/docker-library/repo-info/blob/master/repos/traefik) ([history](https://github.com/docker-library/repo-info/commits/master/repos/traefik)) (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/traefik`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Ftraefik) + [official-images repo's `library/traefik` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Ftraefik) [official-images repo's `library/traefik` file](https://github.com/docker-library/official-images/blob/master/library/traefik) ([history](https://github.com/docker-library/official-images/commits/master/library/traefik)) - **Source of this description**: @@ -80,13 +82,13 @@ Start Traefik: docker run -d -p 8080:8080 -p 80:80 \ -v $PWD/traefik.yml:/etc/traefik/traefik.yml \ -v /var/run/docker.sock:/var/run/docker.sock \ -traefik:v2.0 +traefik:v2.5 ``` Start a backend server, named `test`: ```bash -docker run -d --name test containous/whoami +docker run -d --name test traefik/whoami ``` And finally, you can access to your `whoami` server throught Traefik, on the domain name `test.docker.localhost`: @@ -112,11 +114,11 @@ X-Real-Ip: 172.17.0.1 The web UI [http://localhost:8080](http://localhost:8080) will give you an overview of the routers, services, and middlewares. -![Web UI](https://raw.githubusercontent.com/containous/traefik/v2.0/docs/content/assets/img/webui-dashboard.png) +![Web UI](https://raw.githubusercontent.com/traefik/traefik/v2.5/docs/content/assets/img/webui-dashboard.png) # Traefik v1 - Example usage -Grab a [sample configuration file](https://raw.githubusercontent.com/containous/traefik/v1.7/traefik.sample.toml) and rename it to `traefik.toml`. Enable `docker` provider and web UI: +Grab a [sample configuration file](https://raw.githubusercontent.com/traefik/traefik/v1.7/traefik.sample.toml) and rename it to `traefik.toml`. Enable `docker` provider and web UI: ```toml ## traefik.toml @@ -141,7 +143,7 @@ traefik:v1.7 Start a backend server, named `test`: ```bash -docker run -d --name test containous/whoami +docker run -d --name test traefik/whoami ``` And finally, you can access to your `whoami` server throught Traefik, on the domain name `{containerName}.{configuredDomain}` (`test.docker.localhost`): @@ -167,16 +169,16 @@ X-Forwarded-Server: f2e05c433120 The web UI [http://localhost:8080](http://localhost:8080) will give you an overview of the frontends/backends and also a health dashboard. -![Web UI Providers](https://raw.githubusercontent.com/containous/traefik/v1.7/docs/img/web.frontend.png) +![Web UI Providers](https://raw.githubusercontent.com/traefik/traefik/v1.7/docs/img/web.frontend.png) # Documentation You can find the complete documentation: -- for [v1.7](https://docs.traefik.io/v1.7) -- for [v2.0](https://docs.traefik.io/v2.0) +- for [v2.x](https://doc.traefik.io/traefik/) +- for [v1.7](https://doc.traefik.io/traefik/v1.7) -A community support is available at [https://community.containo.us](https://community.containo.us) +A community support is available at [https://community.traefik.io](https://community.traefik.io) A collection of contributions around Traefik can be found at [https://awesome.traefik.io](https://awesome.traefik.io). @@ -199,7 +201,7 @@ For information about how to get Docker running on Windows, please see the relev # License -View [license information](https://github.com/containous/traefik/blob/master/LICENSE.md) for the software contained in this image. +View [license information](https://github.com/traefik/traefik/blob/master/LICENSE.md) for the software contained in this image. 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). diff --git a/traefik/content.md b/traefik/content.md index a93f1471397f..e51dfd914812 100644 --- a/traefik/content.md +++ b/traefik/content.md @@ -29,13 +29,13 @@ Start Traefik: docker run -d -p 8080:8080 -p 80:80 \ -v $PWD/traefik.yml:/etc/traefik/traefik.yml \ -v /var/run/docker.sock:/var/run/docker.sock \ -traefik:v2.0 +traefik:v2.5 ``` Start a backend server, named `test`: ```bash -docker run -d --name test containous/whoami +docker run -d --name test traefik/whoami ``` And finally, you can access to your `whoami` server throught Traefik, on the domain name `test.docker.localhost`: @@ -61,11 +61,11 @@ X-Real-Ip: 172.17.0.1 The web UI [http://localhost:8080](http://localhost:8080) will give you an overview of the routers, services, and middlewares. -![Web UI](https://raw.githubusercontent.com/containous/traefik/v2.0/docs/content/assets/img/webui-dashboard.png) +![Web UI](https://raw.githubusercontent.com/traefik/traefik/v2.5/docs/content/assets/img/webui-dashboard.png) # Traefik v1 - Example usage -Grab a [sample configuration file](https://raw.githubusercontent.com/containous/traefik/v1.7/traefik.sample.toml) and rename it to `traefik.toml`. Enable `docker` provider and web UI: +Grab a [sample configuration file](https://raw.githubusercontent.com/traefik/traefik/v1.7/traefik.sample.toml) and rename it to `traefik.toml`. Enable `docker` provider and web UI: ```toml ## traefik.toml @@ -90,7 +90,7 @@ traefik:v1.7 Start a backend server, named `test`: ```bash -docker run -d --name test containous/whoami +docker run -d --name test traefik/whoami ``` And finally, you can access to your `whoami` server throught Traefik, on the domain name `{containerName}.{configuredDomain}` (`test.docker.localhost`): @@ -116,15 +116,15 @@ X-Forwarded-Server: f2e05c433120 The web UI [http://localhost:8080](http://localhost:8080) will give you an overview of the frontends/backends and also a health dashboard. -![Web UI Providers](https://raw.githubusercontent.com/containous/traefik/v1.7/docs/img/web.frontend.png) +![Web UI Providers](https://raw.githubusercontent.com/traefik/traefik/v1.7/docs/img/web.frontend.png) # Documentation You can find the complete documentation: -- for [v1.7](https://docs.traefik.io/v1.7) -- for [v2.0](https://docs.traefik.io/v2.0) +- for [v2.x](https://doc.traefik.io/traefik/) +- for [v1.7](https://doc.traefik.io/traefik/v1.7) -A community support is available at [https://community.containo.us](https://community.containo.us) +A community support is available at [https://community.traefik.io](https://community.traefik.io) A collection of contributions around Traefik can be found at [https://awesome.traefik.io](https://awesome.traefik.io). diff --git a/traefik/github-repo b/traefik/github-repo index fce1f64e6393..ecf3af618cf6 100644 --- a/traefik/github-repo +++ b/traefik/github-repo @@ -1 +1 @@ -https://github.com/containous/traefik-library-image +https://github.com/traefik/traefik-library-image diff --git a/traefik/license.md b/traefik/license.md index 771cbe787039..e234732351e0 100644 --- a/traefik/license.md +++ b/traefik/license.md @@ -1 +1 @@ -View [license information](https://github.com/containous/traefik/blob/master/LICENSE.md) for the software contained in this image. +View [license information](https://github.com/traefik/traefik/blob/master/LICENSE.md) for the software contained in this image. diff --git a/ubuntu/README.md b/ubuntu/README.md index 93518a3726aa..baf7ec070f12 100644 --- a/ubuntu/README.md +++ b/ubuntu/README.md @@ -17,19 +17,20 @@ WARNING: # Quick reference - **Maintained by**: - [Canonical](https://partner-images.canonical.com/core/) and [Tianon (Debian Developer)](https://github.com/tianon/docker-brew-ubuntu-core) + [Canonical](https://launchpad.net/cloud-images) and [Tianon (Debian Developer)](https://git.launchpad.net/cloud-images/+oci/ubuntu-base) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`18.04`, `bionic-20200403`, `bionic`](https://github.com/tianon/docker-brew-ubuntu-core/blob/451851eab04432157249eb444d5a42714e2a7112/bionic/Dockerfile) -- [`19.10`, `eoan-20200410`, `eoan`](https://github.com/tianon/docker-brew-ubuntu-core/blob/451851eab04432157249eb444d5a42714e2a7112/eoan/Dockerfile) -- [`20.04`, `focal-20200423`, `focal`, `latest`, `rolling`](https://github.com/tianon/docker-brew-ubuntu-core/blob/451851eab04432157249eb444d5a42714e2a7112/focal/Dockerfile) -- [`20.10`, `groovy-20200505`, `groovy`, `devel`](https://github.com/tianon/docker-brew-ubuntu-core/blob/451851eab04432157249eb444d5a42714e2a7112/groovy/Dockerfile) -- [`14.04`, `trusty-20191217`, `trusty`](https://github.com/tianon/docker-brew-ubuntu-core/blob/451851eab04432157249eb444d5a42714e2a7112/trusty/Dockerfile) -- [`16.04`, `xenial-20200326`, `xenial`](https://github.com/tianon/docker-brew-ubuntu-core/blob/451851eab04432157249eb444d5a42714e2a7112/xenial/Dockerfile) +- [`18.04`, `bionic-20221215`, `bionic`](https://git.launchpad.net/cloud-images/+oci/ubuntu-base/tree/Dockerfile?h=refs/tags/dist-bionic-amd64-20221215&id=0ae8196fe7299a6f6954b5f0208f57f170f12c35) +- [`20.04`, `focal-20221130`, `focal`](https://git.launchpad.net/cloud-images/+oci/ubuntu-base/tree/Dockerfile?h=refs/tags/dist-focal-amd64-20221130&id=0373f3064197249345734f2db985a32bced5c541) +- [`22.04`, `jammy-20221130`, `jammy`, `latest`](https://git.launchpad.net/cloud-images/+oci/ubuntu-base/tree/Dockerfile?h=refs/tags/dist-jammy-amd64-20221130&id=5107d90663ceb24789a9fa19136b0753c5651aa0) +- [`22.10`, `kinetic-20221130`, `kinetic`, `rolling`](https://git.launchpad.net/cloud-images/+oci/ubuntu-base/tree/Dockerfile?h=refs/tags/dist-kinetic-amd64-20221130&id=28c4e64ea84b6e9bcd1352e81cf71dbb47f259cc) +- [`23.04`, `lunar-20221216`, `lunar`, `devel`](https://git.launchpad.net/cloud-images/+oci/ubuntu-base/tree/Dockerfile?h=refs/tags/dist-lunar-amd64-20221216&id=cbaec25db5166d7e31cf418cc5efb5000ffaaf88) +- [`14.04`, `trusty-20191217`, `trusty`](https://git.launchpad.net/cloud-images/+oci/ubuntu-base/tree/Dockerfile?h=refs/tags/dist-trusty-amd64-20191217&id=131f6d8ad3ff6875f210766c88b463f96992b5ab) +- [`16.04`, `xenial-20210804`, `xenial`](https://git.launchpad.net/cloud-images/+oci/ubuntu-base/tree/Dockerfile?h=refs/tags/dist-xenial-amd64-20210804&id=45e83e2e11f641ba2fea381e705ededbd2778f16) # Quick reference (cont.) @@ -37,14 +38,14 @@ WARNING: [the cloud-images bug tracker](https://bugs.launchpad.net/cloud-images) (include the `docker` tag) - **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) - [`amd64`](https://hub.docker.com/r/amd64/ubuntu/), [`arm32v7`](https://hub.docker.com/r/arm32v7/ubuntu/), [`arm64v8`](https://hub.docker.com/r/arm64v8/ubuntu/), [`i386`](https://hub.docker.com/r/i386/ubuntu/), [`ppc64le`](https://hub.docker.com/r/ppc64le/ubuntu/), [`s390x`](https://hub.docker.com/r/s390x/ubuntu/) + [`amd64`](https://hub.docker.com/r/amd64/ubuntu/), [`arm32v7`](https://hub.docker.com/r/arm32v7/ubuntu/), [`arm64v8`](https://hub.docker.com/r/arm64v8/ubuntu/), [`i386`](https://hub.docker.com/r/i386/ubuntu/), [`ppc64le`](https://hub.docker.com/r/ppc64le/ubuntu/), [`riscv64`](https://hub.docker.com/r/riscv64/ubuntu/), [`s390x`](https://hub.docker.com/r/s390x/ubuntu/) - **Published image artifact details**: [repo-info repo's `repos/ubuntu/` directory](https://github.com/docker-library/repo-info/blob/master/repos/ubuntu) ([history](https://github.com/docker-library/repo-info/commits/master/repos/ubuntu)) (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/ubuntu`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fubuntu) + [official-images repo's `library/ubuntu` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fubuntu) [official-images repo's `library/ubuntu` file](https://github.com/docker-library/official-images/blob/master/library/ubuntu) ([history](https://github.com/docker-library/official-images/commits/master/library/ubuntu)) - **Source of this description**: @@ -62,7 +63,7 @@ Development of Ubuntu is led by Canonical Ltd. Canonical generates revenue throu # What's in this image? -This image is built from official rootfs tarballs provided by Canonical (specifically, https://partner-images.canonical.com/core/). +This image is built from official rootfs tarballs provided by Canonical (see `dist-*` tags at https://git.launchpad.net/cloud-images/+oci/ubuntu-base). The `ubuntu:latest` tag points to the "latest LTS", since that's the version recommended for general use. The `ubuntu:rolling` tag points to the latest release (regardless of LTS status). @@ -80,6 +81,16 @@ RUN apt-get update && apt-get install -y locales && rm -rf /var/lib/apt/lists/* ENV LANG en_US.utf8 ``` +# How is the rootfs built? + +The tarballs published by Canonical, referenced by `dist-*` tags in https://git.launchpad.net/cloud-images/+oci/ubuntu-base Git repository, are built from scripts that live in [the livecd-rootfs project](https://code.launchpad.net/~ubuntu-core-dev/livecd-rootfs/+git/livecd-rootfs/+ref/ubuntu/master), especially `live-build/auto/build`. The builds are run on Launchpad. For build history see `livefs` build pages of individual releases on Launchpad: + +- [Bionic](https://launchpad.net/~cloud-images-release-managers/+livefs/ubuntu/bionic/ubuntu-oci) +- [Focal](https://launchpad.net/~cloud-images-release-managers/+livefs/ubuntu/focal/ubuntu-oci) +- [Jammy](https://launchpad.net/~cloud-images-release-managers/+livefs/ubuntu/jammy/ubuntu-oci) +- [Kinetic](https://launchpad.net/~cloud-images-release-managers/+livefs/ubuntu/kinetic/ubuntu-oci) +- [Lunar](https://launchpad.net/~cloud-images-release-managers/+livefs/ubuntu/lunar/ubuntu-oci) + # License View [license information](https://www.ubuntu.com/about/about-ubuntu/licensing) for the software contained in this image. diff --git a/ubuntu/content.md b/ubuntu/content.md index 7841766ec815..d8c2e37c6143 100644 --- a/ubuntu/content.md +++ b/ubuntu/content.md @@ -10,7 +10,7 @@ Development of Ubuntu is led by Canonical Ltd. Canonical generates revenue throu # What's in this image? -This image is built from official rootfs tarballs provided by Canonical (specifically, https://partner-images.canonical.com/core/). +This image is built from official rootfs tarballs provided by Canonical (see `dist-*` tags at https://git.launchpad.net/cloud-images/+oci/ubuntu-base). The `%%IMAGE%%:latest` tag points to the "latest LTS", since that's the version recommended for general use. The `%%IMAGE%%:rolling` tag points to the latest release (regardless of LTS status). @@ -27,3 +27,13 @@ RUN apt-get update && apt-get install -y locales && rm -rf /var/lib/apt/lists/* && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8 ENV LANG en_US.utf8 ``` + +# How is the rootfs built? + +The tarballs published by Canonical, referenced by `dist-*` tags in https://git.launchpad.net/cloud-images/+oci/ubuntu-base Git repository, are built from scripts that live in [the livecd-rootfs project](https://code.launchpad.net/~ubuntu-core-dev/livecd-rootfs/+git/livecd-rootfs/+ref/ubuntu/master), especially `live-build/auto/build`. The builds are run on Launchpad. For build history see `livefs` build pages of individual releases on Launchpad: + +- [Bionic](https://launchpad.net/~cloud-images-release-managers/+livefs/ubuntu/bionic/ubuntu-oci) +- [Focal](https://launchpad.net/~cloud-images-release-managers/+livefs/ubuntu/focal/ubuntu-oci) +- [Jammy](https://launchpad.net/~cloud-images-release-managers/+livefs/ubuntu/jammy/ubuntu-oci) +- [Kinetic](https://launchpad.net/~cloud-images-release-managers/+livefs/ubuntu/kinetic/ubuntu-oci) +- [Lunar](https://launchpad.net/~cloud-images-release-managers/+livefs/ubuntu/lunar/ubuntu-oci) diff --git a/ubuntu/github-repo b/ubuntu/github-repo index 8adaa2c0cead..e58535c256a5 100644 --- a/ubuntu/github-repo +++ b/ubuntu/github-repo @@ -1 +1 @@ -https://github.com/tianon/docker-brew-ubuntu-core +https://git.launchpad.net/cloud-images/+oci/ubuntu-base diff --git a/ubuntu/maintainer.md b/ubuntu/maintainer.md index a6ead816ed37..541c9f2f5909 100644 --- a/ubuntu/maintainer.md +++ b/ubuntu/maintainer.md @@ -1 +1 @@ -[Canonical](https://partner-images.canonical.com/core/) and [Tianon (Debian Developer)](%%GITHUB-REPO%%) +[Canonical](https://launchpad.net/cloud-images) and [Tianon (Debian Developer)](%%GITHUB-REPO%%) diff --git a/update.sh b/update.sh index 5e845598ee8b..0b73bf051ba3 100755 --- a/update.sh +++ b/update.sh @@ -106,8 +106,10 @@ for image in "${images[@]}"; do deprecated= if [ -f "$repo/deprecated.md" ]; then - deprecated=$'# **DEPRECATION NOTICE**\n\n' - deprecated+="$(cat "$repo/deprecated.md")" + deprecated="$(< "$repo/deprecated.md")" + if [ "${deprecated:0:2}" != '# ' ]; then + deprecated=$'# **DEPRECATION NOTICE**\n\n'"$deprecated" + fi deprecated+=$'\n\n' fi @@ -125,6 +127,12 @@ for image in "${images[@]}"; do { cat "$helperDir/autogenerated-warning.md" echo + + if [ -n "$ARCH_SPECIFIC_DOCS" ]; then + echo '**Note:** this is the "per-architecture" repository for the `'"$BASHBREW_ARCH"'` builds of [the `'"$repo"'` official image](https://hub.docker.com/_/'"$repo"') -- for more information, see ["Architectures other than amd64?" in the official images documentation](https://github.com/docker-library/official-images#architectures-other-than-amd64) and ["An image'\''s source changed in Git, now what?" in the official images FAQ](https://github.com/docker-library/faq#an-images-source-changed-in-git-now-what).' + echo + fi + echo -n "$deprecated" cat "$helperDir/template.md" } > "$targetFile" diff --git a/varnish/README.md b/varnish/README.md index 07800daac494..d23cefc79802 100644 --- a/varnish/README.md +++ b/varnish/README.md @@ -20,12 +20,15 @@ WARNING: [the Varnish Docker Community](https://github.com/varnish/docker-varnish) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`6.0`, `6.0.6-1`, `6.0.6`, `stable`](https://github.com/varnish/docker-varnish/blob/d32d16eb38cd161f0e626880cbd334da7d301027/stable/debian/Dockerfile) -- [`6.4`, `6.4.0-1`, `6.4.0`, `6`, `latest`, `fresh`](https://github.com/varnish/docker-varnish/blob/d32d16eb38cd161f0e626880cbd334da7d301027/fresh/debian/Dockerfile) +- [`fresh`, `7.2.1`, `7.2`, `latest`](https://github.com/varnish/docker-varnish/blob/b62a2443a5f1b821fbb096aea9d349f0de20b0a3/fresh/debian/Dockerfile) +- [`fresh-alpine`, `7.2.1-alpine`, `7.2-alpine`, `alpine`](https://github.com/varnish/docker-varnish/blob/b62a2443a5f1b821fbb096aea9d349f0de20b0a3/fresh/alpine/Dockerfile) +- [`old`, `7.1.2`, `7.1`](https://github.com/varnish/docker-varnish/blob/e7acf36bd4afd05427bc3fb251ae4b3374168f27/old/debian/Dockerfile) +- [`old-alpine`, `7.1.2-alpine`, `7.1-alpine`](https://github.com/varnish/docker-varnish/blob/e7acf36bd4afd05427bc3fb251ae4b3374168f27/old/alpine/Dockerfile) +- [`stable`, `6.0.11`, `6.0`](https://github.com/varnish/docker-varnish/blob/e7acf36bd4afd05427bc3fb251ae4b3374168f27/stable/debian/Dockerfile) # Quick reference (cont.) @@ -33,14 +36,14 @@ WARNING: [https://github.com/varnish/docker-varnish/issues](https://github.com/varnish/docker-varnish/issues) - **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) - [`amd64`](https://hub.docker.com/r/amd64/varnish/) + [`amd64`](https://hub.docker.com/r/amd64/varnish/), [`arm32v7`](https://hub.docker.com/r/arm32v7/varnish/), [`arm64v8`](https://hub.docker.com/r/arm64v8/varnish/), [`i386`](https://hub.docker.com/r/i386/varnish/), [`ppc64le`](https://hub.docker.com/r/ppc64le/varnish/), [`s390x`](https://hub.docker.com/r/s390x/varnish/) - **Published image artifact details**: [repo-info repo's `repos/varnish/` directory](https://github.com/docker-library/repo-info/blob/master/repos/varnish) ([history](https://github.com/docker-library/repo-info/commits/master/repos/varnish)) (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/varnish`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fvarnish) + [official-images repo's `library/varnish` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fvarnish) [official-images repo's `library/varnish` file](https://github.com/docker-library/official-images/blob/master/library/varnish) ([history](https://github.com/docker-library/official-images/commits/master/library/varnish)) - **Source of this description**: @@ -61,23 +64,49 @@ Varnish is an HTTP accelerator designed for content-heavy dynamic web sites as w Create a `default.vcl` file: ```vcl -vcl 4.0; +# specify the VCL syntax version to use +vcl 4.1; -backend default { - .host = "www.nytimes.com:80"; +# import vmod_dynamic for better backend name resolution +import dynamic; + +# we won't use any static backend, but Varnish still need a default one +backend default none; + +# set up a dynamic director +# for more info, see https://github.com/nigoroll/libvmod-dynamic/blob/master/src/vmod_dynamic.vcc +sub vcl_init { + new d = dynamic.director(port = "80"); +} + +sub vcl_recv { + # force the host header to match the backend (not all backends need it, + # but example.com does) + set req.http.host = "example.com"; + # set the backend + set req.backend_hint = d.backend("example.com"); } ``` Then run: ```console -$ docker run --name my-running-varnish -v /path/to/default.vcl:/etc/varnish/default.vcl:ro --tmpfs /var/lib/varnish:exec -d varnish +# we need the configuration file at /etc/varnish/default.vcl, +# our workdir has to be mounted as tmpfs to avoid disk I/O, +# and we'll use port 8080 to talk to our container (internally listening on 80) +$ docker run \ + -v /path/to/default.vcl:/etc/varnish/default.vcl:ro \ + --tmpfs /var/lib/varnish/varnishd:exec \ + -p 8080:80 \ + varnish ``` +From there, you can visit `localhost:8080` in your browser and see the example.com homepage. + Alternatively, a simple `Dockerfile` can be used to generate a new image that includes the necessary `default.vcl` (which is a much cleaner solution than the bind mount above): ```dockerfile -FROM varnish:6.2 +FROM varnish COPY default.vcl /etc/varnish/ ``` @@ -85,16 +114,126 @@ COPY default.vcl /etc/varnish/ Place this file in the same directory as your `default.vcl`, run `docker build -t my-varnish .`, then start your container: ```console -$ docker run --name my-running-varnish --tmpfs /var/lib/varnish:exec -d my-varnish +$ docker --tmpfs /var/lib/varnish/varnishd:exec -p 8080:80 my-varnish +``` + +## Reloading the configuration + +The images all ship with [varnishreload](https://github.com/varnishcache/pkg-varnish-cache/blob/master/systemd/varnishreload#L42) which allows you to easily update the running configuration without restarting the container (and therefore losing your cache). At its most basic, you just need this: + +```console +# update the default.vcl in your container +docker cp new_default.vcl running_container:/etc/varnish/default.vcl +# run varnishreload +docker exec running_container varnishreload +``` + +Note that `varnishreload` also supports reloading other files (it doesn't have to be `default.vcl`), labels (`l`), and garbage collection of old labeles (`-m`) among others. To know more, run + +```console +docker run varnish varnishreload -h +``` + +## Additional configuration + +### Cache size (VARNISH_SIZE) + +By default, the containers will use a cache size of 100MB, which is usually a bit too small, but you can quickly set it through the `VARNISH_SIZE` environment variable: + +```console +$ docker run --tmpfs /var/lib/varnish/varnishd:exec -p 8080:80 -e VARNISH_SIZE=2G varnish +``` + +### Listening ports (VARNISH_HTTP_PORT/VARNISH_PROXY_PORT) + +Varnish will listen to HTTP traffic on port `80`, and this can be overridden by setting the environment variable `VARNISH_HTTP_PORT`. Similarly, the variable `VARNISH_PROXY_PORT` (defaulting to `8443`) dictate the listening port for the [PROXY protocol](https://www.haproxy.org/download/1.8/doc/proxy-protocol.txt) used notably to interact with [hitch](https://hub.docker.com/_/hitch) (which, coincidentally, uses `8443` as a default too!). + +```console +# instruct varnish to listening to port 7777 instead of 80 +$ docker run --tmpfs /var/lib/varnish/varnishd:exec -p 8080:7777 -e VARNISH_HTTP_PORT=7777 varnish ``` -### Exposing the port +### Extra arguments + +Additionally, you can add arguments to `docker run` after `varnish`, if the first argument starts with a `-`, the whole list will be appendend to the [default command](https://github.com/varnish/docker-varnish/blob/master/fresh/debian/scripts/docker-varnish-entrypoint): ```console -+$ docker run --name my-running-varnish --tmpfs /var/lib/varnish:exec -d -p 8080:80 my-varnish +# extend the default keep period +$ docker run --tmpfs /var/lib/varnish/varnishd:exec -p 8080:80 -e VARNISH_SIZE=2G varnish -p default_keep=300 +``` + +If your first argument after `varnish` doesn't start with `-`, it will be interpreted as a command to override the default one: + +```console +# show the command-line options +$ docker run varnish varnishd -? + +# list parameters usable with -p +$ docker run varnish varnishd -x parameter + +# run the server with your own parameters (don't forget -F to not daemonize) +$ docker run varnish varnishd -F -a :8080 -b 127.0.0.1:8181 -t 600 -p feature=+http2 ``` -Then you can hit `http://localhost:8080` or `http://host-ip:8080` in your browser. +## vmods (since 7.1) + +As mentioned above, you can use [vmod_dynamic](https://github.com/nigoroll/libvmod-dynamic) for backend resolution. The [varnish-modules](https://github.com/varnish/varnish-modules) collection is also included in the image. All the documentation regarding usage and syntax can be found in the [src/](https://github.com/varnish/varnish-modules/tree/master/src) directory of the repository. + +On top of this, images include [install-vmod](https://github.com/varnish/toolbox/tree/master/install-vmod), a helper script to quickly download, compile and install vmods while creating your own images. Note that images set the `ENV` variable `VMOD_DEPS` to ease the task further. + +### Debian + +```dockerfile +FROM varnish:7.1 + +# set the user to root, and install build dependencies +USER root +RUN set -e; \ + apt-get update; \ + apt-get -y install $VMOD_DEPS /pkgs/*.deb; \ + \ +# install one, possibly multiple vmods + install-vmod https://github.com/varnish/varnish-modules/releases/download/0.20.0/varnish-modules-0.20.0.tar.gz; \ + \ +# clean up and set the user back to varnish + apt-get -y purge --auto-remove $VMOD_DEPS varnish-dev; \ + rm -rf /var/lib/apt/lists/* +USER varnish +``` + +### Alpine + +```dockerfile +FROM varnish:7.1-alpine + +# install build dependencies +USER root +RUN set -e; \ + apk add --no-cache $VMOD_DEPS; \ + \ +# install one, possibly multiple vmods + install-vmod https://github.com/varnish/varnish-modules/releases/download/0.20.0/varnish-modules-0.20.0.tar.gz; \ + \ +# clean up + apk del --no-network $VMOD_DEPS +USER varnish +``` + +# Image Variants + +The `varnish` images come in many flavors, each designed for a specific use case. + +## `varnish:` + +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. + +## `varnish:-alpine` + +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. + +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. + +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). # License diff --git a/varnish/content.md b/varnish/content.md index 2b389fce230a..b76c7937e2f0 100644 --- a/varnish/content.md +++ b/varnish/content.md @@ -13,23 +13,49 @@ Varnish is an HTTP accelerator designed for content-heavy dynamic web sites as w Create a `default.vcl` file: ```vcl -vcl 4.0; +# specify the VCL syntax version to use +vcl 4.1; -backend default { - .host = "www.nytimes.com:80"; +# import vmod_dynamic for better backend name resolution +import dynamic; + +# we won't use any static backend, but Varnish still need a default one +backend default none; + +# set up a dynamic director +# for more info, see https://github.com/nigoroll/libvmod-dynamic/blob/master/src/vmod_dynamic.vcc +sub vcl_init { + new d = dynamic.director(port = "80"); +} + +sub vcl_recv { + # force the host header to match the backend (not all backends need it, + # but example.com does) + set req.http.host = "example.com"; + # set the backend + set req.backend_hint = d.backend("example.com"); } ``` Then run: ```console -$ docker run --name my-running-varnish -v /path/to/default.vcl:/etc/varnish/default.vcl:ro --tmpfs /var/lib/varnish:exec -d %%IMAGE%% +# we need the configuration file at /etc/varnish/default.vcl, +# our workdir has to be mounted as tmpfs to avoid disk I/O, +# and we'll use port 8080 to talk to our container (internally listening on 80) +$ docker run \ + -v /path/to/default.vcl:/etc/varnish/default.vcl:ro \ + --tmpfs /var/lib/varnish/varnishd:exec \ + -p 8080:80 \ + %%IMAGE%% ``` +From there, you can visit `localhost:8080` in your browser and see the example.com homepage. + Alternatively, a simple `Dockerfile` can be used to generate a new image that includes the necessary `default.vcl` (which is a much cleaner solution than the bind mount above): ```dockerfile -FROM %%IMAGE%%:6.2 +FROM %%IMAGE%% COPY default.vcl /etc/varnish/ ``` @@ -37,13 +63,107 @@ COPY default.vcl /etc/varnish/ Place this file in the same directory as your `default.vcl`, run `docker build -t my-varnish .`, then start your container: ```console -$ docker run --name my-running-varnish --tmpfs /var/lib/varnish:exec -d my-varnish +$ docker --tmpfs /var/lib/varnish/varnishd:exec -p 8080:80 my-varnish +``` + +## Reloading the configuration + +The images all ship with [varnishreload](https://github.com/varnishcache/pkg-varnish-cache/blob/master/systemd/varnishreload#L42) which allows you to easily update the running configuration without restarting the container (and therefore losing your cache). At its most basic, you just need this: + +```console +# update the default.vcl in your container +docker cp new_default.vcl running_container:/etc/varnish/default.vcl +# run varnishreload +docker exec running_container varnishreload +``` + +Note that `varnishreload` also supports reloading other files (it doesn't have to be `default.vcl`), labels (`l`), and garbage collection of old labeles (`-m`) among others. To know more, run + +```console +docker run varnish varnishreload -h +``` + +## Additional configuration + +### Cache size (VARNISH_SIZE) + +By default, the containers will use a cache size of 100MB, which is usually a bit too small, but you can quickly set it through the `VARNISH_SIZE` environment variable: + +```console +$ docker run --tmpfs /var/lib/varnish/varnishd:exec -p 8080:80 -e VARNISH_SIZE=2G %%IMAGE%% +``` + +### Listening ports (VARNISH_HTTP_PORT/VARNISH_PROXY_PORT) + +Varnish will listen to HTTP traffic on port `80`, and this can be overridden by setting the environment variable `VARNISH_HTTP_PORT`. Similarly, the variable `VARNISH_PROXY_PORT` (defaulting to `8443`) dictate the listening port for the [PROXY protocol](https://www.haproxy.org/download/1.8/doc/proxy-protocol.txt) used notably to interact with [hitch](https://hub.docker.com/_/hitch) (which, coincidentally, uses `8443` as a default too!). + +```console +# instruct varnish to listening to port 7777 instead of 80 +$ docker run --tmpfs /var/lib/varnish/varnishd:exec -p 8080:7777 -e VARNISH_HTTP_PORT=7777 %%IMAGE%% ``` -### Exposing the port +### Extra arguments + +Additionally, you can add arguments to `docker run` after `%%IMAGE%%`, if the first argument starts with a `-`, the whole list will be appendend to the [default command](https://github.com/varnish/docker-varnish/blob/master/fresh/debian/scripts/docker-varnish-entrypoint): ```console -+$ docker run --name my-running-varnish --tmpfs /var/lib/varnish:exec -d -p 8080:80 my-varnish +# extend the default keep period +$ docker run --tmpfs /var/lib/varnish/varnishd:exec -p 8080:80 -e VARNISH_SIZE=2G %%IMAGE%% -p default_keep=300 +``` + +If your first argument after `%%IMAGE%%` doesn't start with `-`, it will be interpreted as a command to override the default one: + +```console +# show the command-line options +$ docker run %%IMAGE%% varnishd -? + +# list parameters usable with -p +$ docker run %%IMAGE%% varnishd -x parameter + +# run the server with your own parameters (don't forget -F to not daemonize) +$ docker run %%IMAGE%% varnishd -F -a :8080 -b 127.0.0.1:8181 -t 600 -p feature=+http2 ``` -Then you can hit `http://localhost:8080` or `http://host-ip:8080` in your browser. +## vmods (since 7.1) + +As mentioned above, you can use [vmod_dynamic](https://github.com/nigoroll/libvmod-dynamic) for backend resolution. The [varnish-modules](https://github.com/varnish/varnish-modules) collection is also included in the image. All the documentation regarding usage and syntax can be found in the [src/](https://github.com/varnish/varnish-modules/tree/master/src) directory of the repository. + +On top of this, images include [install-vmod](https://github.com/varnish/toolbox/tree/master/install-vmod), a helper script to quickly download, compile and install vmods while creating your own images. Note that images set the `ENV` variable `VMOD_DEPS` to ease the task further. + +### Debian + +```dockerfile +FROM %%IMAGE%%:7.1 + +# set the user to root, and install build dependencies +USER root +RUN set -e; \ + apt-get update; \ + apt-get -y install $VMOD_DEPS /pkgs/*.deb; \ + \ +# install one, possibly multiple vmods + install-vmod https://github.com/varnish/varnish-modules/releases/download/0.20.0/varnish-modules-0.20.0.tar.gz; \ + \ +# clean up and set the user back to varnish + apt-get -y purge --auto-remove $VMOD_DEPS varnish-dev; \ + rm -rf /var/lib/apt/lists/* +USER varnish +``` + +### Alpine + +```dockerfile +FROM %%IMAGE%%:7.1-alpine + +# install build dependencies +USER root +RUN set -e; \ + apk add --no-cache $VMOD_DEPS; \ + \ +# install one, possibly multiple vmods + install-vmod https://github.com/varnish/varnish-modules/releases/download/0.20.0/varnish-modules-0.20.0.tar.gz; \ + \ +# clean up + apk del --no-network $VMOD_DEPS +USER varnish +``` diff --git a/vault/README.md b/vault/README.md index d4b70e385a2c..bb41736f1ebe 100644 --- a/vault/README.md +++ b/vault/README.md @@ -20,12 +20,14 @@ WARNING: [HashiCorp](https://github.com/hashicorp/docker-vault) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`1.4.1`, `latest`](https://github.com/hashicorp/docker-vault/blob/8e01b9c30e7a45772d44d1b52a6562c86765bf62/0.X/Dockerfile) -- [`1.3.5`](https://github.com/hashicorp/docker-vault/blob/1abb18d8e24864f084fd6ae3123f895f94bc5c97/0.X/Dockerfile) +- [`1.12.2`, `latest`](https://github.com/hashicorp/docker-vault/blob/2cba27a16dc7bea0857561ab0424de1bb6e0ffd3/0.X/Dockerfile) +- [`1.11.6`](https://github.com/hashicorp/docker-vault/blob/a7bb73b2f1c8ed40ca8baf5ba2a4c2191e70d506/0.X/Dockerfile) +- [`1.10.9`](https://github.com/hashicorp/docker-vault/blob/cfafe61e0b2679ca8aa24d8ea457767acccb3e1d/0.X/Dockerfile) +- [`1.9.10`](https://github.com/hashicorp/docker-vault/blob/62322ee96a690b07cdc669eb9876fc05e073ff2c/0.X/Dockerfile) # Quick reference (cont.) @@ -40,7 +42,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/vault`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fvault) + [official-images repo's `library/vault` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fvault) [official-images repo's `library/vault` file](https://github.com/docker-library/official-images/blob/master/library/vault) ([history](https://github.com/docker-library/official-images/commits/master/library/vault)) - **Source of this description**: @@ -53,7 +55,7 @@ Vault is a tool for securely accessing secrets. A secret is anything that you wa - [Vault documentation](https://www.vaultproject.io/) - [Vault on GitHub](https://github.com/hashicorp/vault) -![logo](https://raw.githubusercontent.com/docker-library/docs/fab4b16599d1424cee888d47af850e0ba07e6a37/vault/logo.svg?sanitize=true) +![logo](https://raw.githubusercontent.com/docker-library/docs/90d4d43bdfccd5cb21e5fd964d32b0074af0f357/vault/logo.svg?sanitize=true) # Using the Container @@ -93,18 +95,26 @@ As an example: $ docker run --cap-add=IPC_LOCK -e 'VAULT_DEV_ROOT_TOKEN_ID=myroot' -e 'VAULT_DEV_LISTEN_ADDRESS=0.0.0.0:1234' vault ``` -## Running Vault in Server Mode +## Running Vault in Server Mode for Development ```console -$ docker run --cap-add=IPC_LOCK -e 'VAULT_LOCAL_CONFIG={"backend": {"file": {"path": "/vault/file"}}, "default_lease_ttl": "168h", "max_lease_ttl": "720h"}' vault server +$ docker run --cap-add=IPC_LOCK -e 'VAULT_LOCAL_CONFIG={"storage": {"file": {"path": "/vault/file"}}, "listener": [{"tcp": { "address": "0.0.0.0:8200", "tls_disable": true}}], "default_lease_ttl": "168h", "max_lease_ttl": "720h", "ui": true}' -p 8200:8200 vault server ``` -This runs a Vault server using the `file` storage backend at path `/vault/file`, with a default secret lease duration of one week and a maximum of 30 days. +This runs a Vault server with TLS disabled, the `file` storage backend at path `/vault/file` and a default secret lease duration of one week and a maximum of 30 days. Disabling TLS and using the `file` storage backend are not recommended for production use. Note the `--cap-add=IPC_LOCK`: this is required in order for Vault to lock memory, which prevents it from being swapped to disk. This is highly recommended. In a non-development environment, if you do not wish to use this functionality, you must add `"disable_mlock: true"` to the configuration information. At startup, the server will read configuration HCL and JSON files from `/vault/config` (any information passed into `VAULT_LOCAL_CONFIG` is written into `local.json` in this directory and read as part of reading the directory for configuration files). Please see Vault's [configuration documentation](https://www.vaultproject.io/docs/config/index.html) for a full list of options. +We suggest volume mounting a directory into the Docker image in order to give both the configuration and TLS certificates to Vault. You can accomplish this with: + +```console +$ docker run --volume config/:/vault/config.d ... +``` + +For more scalability and reliability, we suggest running containerized Vault in an orchestration environment like k8s or OpenShift. + Since 0.6.3 this container also supports the `VAULT_REDIRECT_INTERFACE` and `VAULT_CLUSTER_INTERFACE` environment variables. If set, the IP addresses used for the redirect and cluster addresses in Vault's configuration will be the address of the named interface inside the container (e.g. `eth0`). # License diff --git a/vault/content.md b/vault/content.md index 03ab0129bdec..d3a27503d7e0 100644 --- a/vault/content.md +++ b/vault/content.md @@ -45,16 +45,24 @@ As an example: $ docker run --cap-add=IPC_LOCK -e 'VAULT_DEV_ROOT_TOKEN_ID=myroot' -e 'VAULT_DEV_LISTEN_ADDRESS=0.0.0.0:1234' %%IMAGE%% ``` -## Running Vault in Server Mode +## Running Vault in Server Mode for Development ```console -$ docker run --cap-add=IPC_LOCK -e 'VAULT_LOCAL_CONFIG={"backend": {"file": {"path": "/vault/file"}}, "default_lease_ttl": "168h", "max_lease_ttl": "720h"}' %%IMAGE%% server +$ docker run --cap-add=IPC_LOCK -e 'VAULT_LOCAL_CONFIG={"storage": {"file": {"path": "/vault/file"}}, "listener": [{"tcp": { "address": "0.0.0.0:8200", "tls_disable": true}}], "default_lease_ttl": "168h", "max_lease_ttl": "720h", "ui": true}' -p 8200:8200 %%IMAGE%% server ``` -This runs a Vault server using the `file` storage backend at path `/vault/file`, with a default secret lease duration of one week and a maximum of 30 days. +This runs a Vault server with TLS disabled, the `file` storage backend at path `/vault/file` and a default secret lease duration of one week and a maximum of 30 days. Disabling TLS and using the `file` storage backend are not recommended for production use. Note the `--cap-add=IPC_LOCK`: this is required in order for Vault to lock memory, which prevents it from being swapped to disk. This is highly recommended. In a non-development environment, if you do not wish to use this functionality, you must add `"disable_mlock: true"` to the configuration information. At startup, the server will read configuration HCL and JSON files from `/vault/config` (any information passed into `VAULT_LOCAL_CONFIG` is written into `local.json` in this directory and read as part of reading the directory for configuration files). Please see Vault's [configuration documentation](https://www.vaultproject.io/docs/config/index.html) for a full list of options. +We suggest volume mounting a directory into the Docker image in order to give both the configuration and TLS certificates to Vault. You can accomplish this with: + +```console +$ docker run --volume config/:/vault/config.d ... +``` + +For more scalability and reliability, we suggest running containerized Vault in an orchestration environment like k8s or OpenShift. + Since 0.6.3 this container also supports the `VAULT_REDIRECT_INTERFACE` and `VAULT_CLUSTER_INTERFACE` environment variables. If set, the IP addresses used for the redirect and cluster addresses in Vault's configuration will be the address of the named interface inside the container (e.g. `eth0`). diff --git a/vault/logo.svg b/vault/logo.svg index f9d995f58897..86094d3162f5 100644 --- a/vault/logo.svg +++ b/vault/logo.svg @@ -1,4 +1,4 @@ - + diff --git a/websphere-liberty/README-short.txt b/websphere-liberty/README-short.txt index 95d740bbea44..e5e2c189ce77 100644 --- a/websphere-liberty/README-short.txt +++ b/websphere-liberty/README-short.txt @@ -1 +1 @@ -Official IBM WebSphere Application Server for Developers Liberty image. +WebSphere Liberty multi-architecture images based on Ubuntu 18.04 diff --git a/websphere-liberty/README.md b/websphere-liberty/README.md index 71fbc94bd367..9ee844159d50 100644 --- a/websphere-liberty/README.md +++ b/websphere-liberty/README.md @@ -24,15 +24,30 @@ WARNING: # Supported tags and respective `Dockerfile` links -- [`beta`](https://github.com/WASdev/ci.docker/blob/c89d127a536ed68bbf8d3d5ad92da443fb1a87d0/beta/Dockerfile) -- [`kernel`](https://github.com/WASdev/ci.docker/blob/c89d127a536ed68bbf8d3d5ad92da443fb1a87d0/ga/latest/kernel/Dockerfile.ubuntu.ibmjava8) -- [`full`, `latest`](https://github.com/WASdev/ci.docker/blob/c89d127a536ed68bbf8d3d5ad92da443fb1a87d0/ga/latest/full/Dockerfile.ubuntu.ibmjava8) -- [`20.0.0.5-kernel-java8-ibmjava`](https://github.com/WASdev/ci.docker/blob/c89d127a536ed68bbf8d3d5ad92da443fb1a87d0/ga/20.0.0.5/kernel/Dockerfile.ubuntu.ibmjava8) -- [`20.0.0.5-full-java8-ibmjava`](https://github.com/WASdev/ci.docker/blob/c89d127a536ed68bbf8d3d5ad92da443fb1a87d0/ga/20.0.0.5/full/Dockerfile.ubuntu.ibmjava8) -- [`20.0.0.3-kernel-java8-ibmjava`](https://github.com/WASdev/ci.docker/blob/c89d127a536ed68bbf8d3d5ad92da443fb1a87d0/ga/20.0.0.3/kernel/Dockerfile.ubuntu.ibmjava8) -- [`20.0.0.3-full-java8-ibmjava`](https://github.com/WASdev/ci.docker/blob/c89d127a536ed68bbf8d3d5ad92da443fb1a87d0/ga/20.0.0.3/full/Dockerfile.ubuntu.ibmjava8) -- [`19.0.0.12-kernel-java8-ibmjava`](https://github.com/WASdev/ci.docker/blob/c89d127a536ed68bbf8d3d5ad92da443fb1a87d0/ga/19.0.0.12/kernel/Dockerfile.ubuntu.ibmjava8) -- [`19.0.0.12-full-java8-ibmjava`](https://github.com/WASdev/ci.docker/blob/c89d127a536ed68bbf8d3d5ad92da443fb1a87d0/ga/19.0.0.12/full/Dockerfile.ubuntu.ibmjava8) +- [`kernel`](https://github.com/WASdev/ci.docker/blob/f8d0a6782d41a5606b2668cea9042e57cedece00/ga/latest/kernel/Dockerfile.ubuntu.ibmjava8) +- [`kernel-java11-openj9`](https://github.com/WASdev/ci.docker/blob/f8d0a6782d41a5606b2668cea9042e57cedece00/ga/latest/kernel/Dockerfile.ubuntu.openjdk11) +- [`kernel-java17-openj9`](https://github.com/WASdev/ci.docker/blob/f8d0a6782d41a5606b2668cea9042e57cedece00/ga/latest/kernel/Dockerfile.ubuntu.openjdk17) +- [`full`, `latest`](https://github.com/WASdev/ci.docker/blob/f8d0a6782d41a5606b2668cea9042e57cedece00/ga/latest/full/Dockerfile.ubuntu.ibmjava8) +- [`full-java11-openj9`](https://github.com/WASdev/ci.docker/blob/f8d0a6782d41a5606b2668cea9042e57cedece00/ga/latest/full/Dockerfile.ubuntu.openjdk11) +- [`full-java17-openj9`](https://github.com/WASdev/ci.docker/blob/f8d0a6782d41a5606b2668cea9042e57cedece00/ga/latest/full/Dockerfile.ubuntu.openjdk17) +- [`22.0.0.13-kernel-java8-ibmjava`](https://github.com/WASdev/ci.docker/blob/f8d0a6782d41a5606b2668cea9042e57cedece00/ga/22.0.0.13/kernel/Dockerfile.ubuntu.ibmjava8) +- [`22.0.0.13-kernel-java11-openj9`](https://github.com/WASdev/ci.docker/blob/f8d0a6782d41a5606b2668cea9042e57cedece00/ga/22.0.0.13/kernel/Dockerfile.ubuntu.openjdk11) +- [`22.0.0.13-kernel-java17-openj9`](https://github.com/WASdev/ci.docker/blob/f8d0a6782d41a5606b2668cea9042e57cedece00/ga/22.0.0.13/kernel/Dockerfile.ubuntu.openjdk17) +- [`22.0.0.13-full-java8-ibmjava`](https://github.com/WASdev/ci.docker/blob/f8d0a6782d41a5606b2668cea9042e57cedece00/ga/22.0.0.13/full/Dockerfile.ubuntu.ibmjava8) +- [`22.0.0.13-full-java11-openj9`](https://github.com/WASdev/ci.docker/blob/f8d0a6782d41a5606b2668cea9042e57cedece00/ga/22.0.0.13/full/Dockerfile.ubuntu.openjdk11) +- [`22.0.0.13-full-java17-openj9`](https://github.com/WASdev/ci.docker/blob/f8d0a6782d41a5606b2668cea9042e57cedece00/ga/22.0.0.13/full/Dockerfile.ubuntu.openjdk17) +- [`22.0.0.12-kernel-java8-ibmjava`](https://github.com/WASdev/ci.docker/blob/f8d0a6782d41a5606b2668cea9042e57cedece00/ga/22.0.0.12/kernel/Dockerfile.ubuntu.ibmjava8) +- [`22.0.0.12-kernel-java11-openj9`](https://github.com/WASdev/ci.docker/blob/f8d0a6782d41a5606b2668cea9042e57cedece00/ga/22.0.0.12/kernel/Dockerfile.ubuntu.openjdk11) +- [`22.0.0.12-kernel-java17-openj9`](https://github.com/WASdev/ci.docker/blob/f8d0a6782d41a5606b2668cea9042e57cedece00/ga/22.0.0.12/kernel/Dockerfile.ubuntu.openjdk17) +- [`22.0.0.12-full-java8-ibmjava`](https://github.com/WASdev/ci.docker/blob/f8d0a6782d41a5606b2668cea9042e57cedece00/ga/22.0.0.12/full/Dockerfile.ubuntu.ibmjava8) +- [`22.0.0.12-full-java11-openj9`](https://github.com/WASdev/ci.docker/blob/f8d0a6782d41a5606b2668cea9042e57cedece00/ga/22.0.0.12/full/Dockerfile.ubuntu.openjdk11) +- [`22.0.0.12-full-java17-openj9`](https://github.com/WASdev/ci.docker/blob/f8d0a6782d41a5606b2668cea9042e57cedece00/ga/22.0.0.12/full/Dockerfile.ubuntu.openjdk17) +- [`22.0.0.9-kernel-java8-ibmjava`](https://github.com/WASdev/ci.docker/blob/f8d0a6782d41a5606b2668cea9042e57cedece00/ga/22.0.0.9/kernel/Dockerfile.ubuntu.ibmjava8) +- [`22.0.0.9-kernel-java11-openj9`](https://github.com/WASdev/ci.docker/blob/f8d0a6782d41a5606b2668cea9042e57cedece00/ga/22.0.0.9/kernel/Dockerfile.ubuntu.openjdk11) +- [`22.0.0.9-kernel-java17-openj9`](https://github.com/WASdev/ci.docker/blob/f8d0a6782d41a5606b2668cea9042e57cedece00/ga/22.0.0.9/kernel/Dockerfile.ubuntu.openjdk17) +- [`22.0.0.9-full-java8-ibmjava`](https://github.com/WASdev/ci.docker/blob/f8d0a6782d41a5606b2668cea9042e57cedece00/ga/22.0.0.9/full/Dockerfile.ubuntu.ibmjava8) +- [`22.0.0.9-full-java11-openj9`](https://github.com/WASdev/ci.docker/blob/f8d0a6782d41a5606b2668cea9042e57cedece00/ga/22.0.0.9/full/Dockerfile.ubuntu.openjdk11) +- [`22.0.0.9-full-java17-openj9`](https://github.com/WASdev/ci.docker/blob/f8d0a6782d41a5606b2668cea9042e57cedece00/ga/22.0.0.9/full/Dockerfile.ubuntu.openjdk17) # Quick reference (cont.) @@ -40,14 +55,14 @@ WARNING: [https://github.com/WASdev/ci.docker/issues](https://github.com/WASdev/ci.docker/issues) - **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) - [`amd64`](https://hub.docker.com/r/amd64/websphere-liberty/), [`i386`](https://hub.docker.com/r/i386/websphere-liberty/), [`ppc64le`](https://hub.docker.com/r/ppc64le/websphere-liberty/), [`s390x`](https://hub.docker.com/r/s390x/websphere-liberty/) + [`amd64`](https://hub.docker.com/r/amd64/websphere-liberty/), [`ppc64le`](https://hub.docker.com/r/ppc64le/websphere-liberty/), [`s390x`](https://hub.docker.com/r/s390x/websphere-liberty/) - **Published image artifact details**: [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)) (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/websphere-liberty`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fwebsphere-liberty) + [official-images repo's `library/websphere-liberty` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fwebsphere-liberty) [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)) - **Source of this description**: @@ -55,9 +70,9 @@ WARNING: # Overview -The images in this repository contain WebSphere Liberty application server and the IBM Java Runtime Environment. For more information please see our [official repository](https://github.com/WASdev/ci.docker). +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/). -This repository contains WebSphere Liberty based on top of IBM Java 8 with Ubuntu images only. See [here](https://hub.docker.com/r/ibmcom/websphere-liberty/) for WebSphere Liberty based on Red Hat's Universal Base Image, which includes additional java options. +For more information on these images please see our [GitHub repository](https://github.com/WASdev/ci.docker#container-images). # Image User @@ -187,13 +202,15 @@ To elaborate these capabilities this section assumes the standalone Spring Boot FROM websphere-liberty:kernel as staging COPY --chown=1001:0 hellospringboot.jar /staging/myFatApp.jar COPY --chown=1001:0 server.xml /config/ - RUN configure.sh && springBootUtility thin \ + RUN springBootUtility thin \ --sourceAppPath=/staging/myFatApp.jar \ --targetThinAppPath=/staging/myThinApp.jar \ --targetLibCachePath=/staging/lib.index.cache FROM websphere-liberty:kernel + COPY --chown=1001:0 server.xml /config COPY --from=staging /staging/lib.index.cache /lib.index.cache COPY --from=staging /staging/myThinApp.jar /config/dropins/spring/myThinApp.jar + RUN configure.sh ``` 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. diff --git a/websphere-liberty/content.md b/websphere-liberty/content.md index 53e445b93479..594967161d40 100644 --- a/websphere-liberty/content.md +++ b/websphere-liberty/content.md @@ -1,8 +1,8 @@ # Overview -The images in this repository contain WebSphere Liberty application server and the IBM Java Runtime Environment. For more information please see our [official repository](https://github.com/WASdev/ci.docker). +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/). -This repository contains WebSphere Liberty based on top of IBM Java 8 with Ubuntu images only. See [here](https://hub.docker.com/r/ibmcom/websphere-liberty/) for WebSphere Liberty based on Red Hat's Universal Base Image, which includes additional java options. +For more information on these images please see our [GitHub repository](https://github.com/WASdev/ci.docker#container-images). # Image User @@ -132,13 +132,15 @@ To elaborate these capabilities this section assumes the standalone Spring Boot FROM %%IMAGE%%:kernel as staging COPY --chown=1001:0 hellospringboot.jar /staging/myFatApp.jar COPY --chown=1001:0 server.xml /config/ - RUN configure.sh && springBootUtility thin \ + RUN springBootUtility thin \ --sourceAppPath=/staging/myFatApp.jar \ --targetThinAppPath=/staging/myThinApp.jar \ --targetLibCachePath=/staging/lib.index.cache FROM %%IMAGE%%:kernel + COPY --chown=1001:0 server.xml /config COPY --from=staging /staging/lib.index.cache /lib.index.cache COPY --from=staging /staging/myThinApp.jar /config/dropins/spring/myThinApp.jar + RUN configure.sh ``` 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. diff --git a/wordpress/README.md b/wordpress/README.md index 07a9e95a8268..afbb28f10ae4 100644 --- a/wordpress/README.md +++ b/wordpress/README.md @@ -20,22 +20,22 @@ WARNING: [the Docker Community](https://github.com/docker-library/wordpress) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`5.4.1-php7.2-apache`, `5.4-php7.2-apache`, `5-php7.2-apache`, `php7.2-apache`, `5.4.1-php7.2`, `5.4-php7.2`, `5-php7.2`, `php7.2`](https://github.com/docker-library/wordpress/blob/8215003254de4bf0a8ddd717c3c393e778b872ce/php7.2/apache/Dockerfile) -- [`5.4.1-php7.2-fpm`, `5.4-php7.2-fpm`, `5-php7.2-fpm`, `php7.2-fpm`](https://github.com/docker-library/wordpress/blob/8215003254de4bf0a8ddd717c3c393e778b872ce/php7.2/fpm/Dockerfile) -- [`5.4.1-php7.2-fpm-alpine`, `5.4-php7.2-fpm-alpine`, `5-php7.2-fpm-alpine`, `php7.2-fpm-alpine`](https://github.com/docker-library/wordpress/blob/8215003254de4bf0a8ddd717c3c393e778b872ce/php7.2/fpm-alpine/Dockerfile) -- [`5.4.1-apache`, `5.4-apache`, `5-apache`, `apache`, `5.4.1`, `5.4`, `5`, `latest`, `5.4.1-php7.3-apache`, `5.4-php7.3-apache`, `5-php7.3-apache`, `php7.3-apache`, `5.4.1-php7.3`, `5.4-php7.3`, `5-php7.3`, `php7.3`](https://github.com/docker-library/wordpress/blob/8215003254de4bf0a8ddd717c3c393e778b872ce/php7.3/apache/Dockerfile) -- [`5.4.1-fpm`, `5.4-fpm`, `5-fpm`, `fpm`, `5.4.1-php7.3-fpm`, `5.4-php7.3-fpm`, `5-php7.3-fpm`, `php7.3-fpm`](https://github.com/docker-library/wordpress/blob/8215003254de4bf0a8ddd717c3c393e778b872ce/php7.3/fpm/Dockerfile) -- [`5.4.1-fpm-alpine`, `5.4-fpm-alpine`, `5-fpm-alpine`, `fpm-alpine`, `5.4.1-php7.3-fpm-alpine`, `5.4-php7.3-fpm-alpine`, `5-php7.3-fpm-alpine`, `php7.3-fpm-alpine`](https://github.com/docker-library/wordpress/blob/8215003254de4bf0a8ddd717c3c393e778b872ce/php7.3/fpm-alpine/Dockerfile) -- [`5.4.1-php7.4-apache`, `5.4-php7.4-apache`, `5-php7.4-apache`, `php7.4-apache`, `5.4.1-php7.4`, `5.4-php7.4`, `5-php7.4`, `php7.4`](https://github.com/docker-library/wordpress/blob/8215003254de4bf0a8ddd717c3c393e778b872ce/php7.4/apache/Dockerfile) -- [`5.4.1-php7.4-fpm`, `5.4-php7.4-fpm`, `5-php7.4-fpm`, `php7.4-fpm`](https://github.com/docker-library/wordpress/blob/8215003254de4bf0a8ddd717c3c393e778b872ce/php7.4/fpm/Dockerfile) -- [`5.4.1-php7.4-fpm-alpine`, `5.4-php7.4-fpm-alpine`, `5-php7.4-fpm-alpine`, `php7.4-fpm-alpine`](https://github.com/docker-library/wordpress/blob/8215003254de4bf0a8ddd717c3c393e778b872ce/php7.4/fpm-alpine/Dockerfile) -- [`cli-2.4.0-php7.2`, `cli-2.4-php7.2`, `cli-2-php7.2`, `cli-php7.2`](https://github.com/docker-library/wordpress/blob/c63f536e5d24b474c93e6c4b8deeacf95a89eb64/php7.2/cli/Dockerfile) -- [`cli-2.4.0`, `cli-2.4`, `cli-2`, `cli`, `cli-2.4.0-php7.3`, `cli-2.4-php7.3`, `cli-2-php7.3`, `cli-php7.3`](https://github.com/docker-library/wordpress/blob/c63f536e5d24b474c93e6c4b8deeacf95a89eb64/php7.3/cli/Dockerfile) -- [`cli-2.4.0-php7.4`, `cli-2.4-php7.4`, `cli-2-php7.4`, `cli-php7.4`](https://github.com/docker-library/wordpress/blob/c63f536e5d24b474c93e6c4b8deeacf95a89eb64/php7.4/cli/Dockerfile) +- [`6.1.1-apache`, `6.1-apache`, `6-apache`, `apache`, `6.1.1`, `6.1`, `6`, `latest`, `6.1.1-php8.0-apache`, `6.1-php8.0-apache`, `6-php8.0-apache`, `php8.0-apache`, `6.1.1-php8.0`, `6.1-php8.0`, `6-php8.0`, `php8.0`](https://github.com/docker-library/wordpress/blob/97f75b51f909fbd9894d128ea6893120cfd23979/latest/php8.0/apache/Dockerfile) +- [`6.1.1-fpm`, `6.1-fpm`, `6-fpm`, `fpm`, `6.1.1-php8.0-fpm`, `6.1-php8.0-fpm`, `6-php8.0-fpm`, `php8.0-fpm`](https://github.com/docker-library/wordpress/blob/97f75b51f909fbd9894d128ea6893120cfd23979/latest/php8.0/fpm/Dockerfile) +- [`6.1.1-fpm-alpine`, `6.1-fpm-alpine`, `6-fpm-alpine`, `fpm-alpine`, `6.1.1-php8.0-fpm-alpine`, `6.1-php8.0-fpm-alpine`, `6-php8.0-fpm-alpine`, `php8.0-fpm-alpine`](https://github.com/docker-library/wordpress/blob/97f75b51f909fbd9894d128ea6893120cfd23979/latest/php8.0/fpm-alpine/Dockerfile) +- [`6.1.1-php8.1-apache`, `6.1-php8.1-apache`, `6-php8.1-apache`, `php8.1-apache`, `6.1.1-php8.1`, `6.1-php8.1`, `6-php8.1`, `php8.1`](https://github.com/docker-library/wordpress/blob/97f75b51f909fbd9894d128ea6893120cfd23979/latest/php8.1/apache/Dockerfile) +- [`6.1.1-php8.1-fpm`, `6.1-php8.1-fpm`, `6-php8.1-fpm`, `php8.1-fpm`](https://github.com/docker-library/wordpress/blob/97f75b51f909fbd9894d128ea6893120cfd23979/latest/php8.1/fpm/Dockerfile) +- [`6.1.1-php8.1-fpm-alpine`, `6.1-php8.1-fpm-alpine`, `6-php8.1-fpm-alpine`, `php8.1-fpm-alpine`](https://github.com/docker-library/wordpress/blob/97f75b51f909fbd9894d128ea6893120cfd23979/latest/php8.1/fpm-alpine/Dockerfile) +- [`6.1.1-php8.2-apache`, `6.1-php8.2-apache`, `6-php8.2-apache`, `php8.2-apache`, `6.1.1-php8.2`, `6.1-php8.2`, `6-php8.2`, `php8.2`](https://github.com/docker-library/wordpress/blob/6569609b4db94cdf0c2eac852456049ac7eacea5/latest/php8.2/apache/Dockerfile) +- [`6.1.1-php8.2-fpm`, `6.1-php8.2-fpm`, `6-php8.2-fpm`, `php8.2-fpm`](https://github.com/docker-library/wordpress/blob/6569609b4db94cdf0c2eac852456049ac7eacea5/latest/php8.2/fpm/Dockerfile) +- [`6.1.1-php8.2-fpm-alpine`, `6.1-php8.2-fpm-alpine`, `6-php8.2-fpm-alpine`, `php8.2-fpm-alpine`](https://github.com/docker-library/wordpress/blob/6569609b4db94cdf0c2eac852456049ac7eacea5/latest/php8.2/fpm-alpine/Dockerfile) +- [`cli-2.7.1`, `cli-2.7`, `cli-2`, `cli`, `cli-2.7.1-php8.0`, `cli-2.7-php8.0`, `cli-2-php8.0`, `cli-php8.0`](https://github.com/docker-library/wordpress/blob/b95184001fd181d86d4a409a4ae26b23795bb0d4/cli/php8.0/alpine/Dockerfile) +- [`cli-2.7.1-php8.1`, `cli-2.7-php8.1`, `cli-2-php8.1`, `cli-php8.1`](https://github.com/docker-library/wordpress/blob/b95184001fd181d86d4a409a4ae26b23795bb0d4/cli/php8.1/alpine/Dockerfile) +- [`cli-2.7.1-php8.2`, `cli-2.7-php8.2`, `cli-2-php8.2`, `cli-php8.2`](https://github.com/docker-library/wordpress/blob/6569609b4db94cdf0c2eac852456049ac7eacea5/cli/php8.2/alpine/Dockerfile) # Quick reference (cont.) @@ -50,7 +50,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/wordpress`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fwordpress) + [official-images repo's `library/wordpress` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fwordpress) [official-images repo's `library/wordpress` file](https://github.com/docker-library/official-images/blob/master/library/wordpress) ([history](https://github.com/docker-library/official-images/commits/master/library/wordpress)) - **Source of this description**: @@ -70,7 +70,7 @@ WordPress is a free and open source blogging tool and a content management syste $ docker run --name some-wordpress --network some-network -d wordpress ``` -The following environment variables are also honored for configuring your WordPress instance: +The following environment variables are also honored for configuring your WordPress instance (by [a custom `wp-config.php` implementation](https://github.com/docker-library/wordpress/blob/master/wp-config-docker.php)): - `-e WORDPRESS_DB_HOST=...` - `-e WORDPRESS_DB_USER=...` @@ -81,7 +81,7 @@ The following environment variables are also honored for configuring your WordPr - `-e WORDPRESS_DEBUG=1` (defaults to disabled, non-empty value will enable `WP_DEBUG` in `wp-config.php`) - `-e WORDPRESS_CONFIG_EXTRA=...` (defaults to nothing, non-empty value will be embedded verbatim inside `wp-config.php` -- especially useful for applying extra configuration values this image does not provide by default such as `WP_ALLOW_MULTISITE`; see [docker-library/wordpress#142](https://github.com/docker-library/wordpress/pull/142) for more details) -If the `WORDPRESS_DB_NAME` specified does not already exist on the given MySQL server, it will be created automatically upon startup of the `wordpress` container, provided that the `WORDPRESS_DB_USER` specified has the necessary permissions to create it. +The `WORDPRESS_DB_NAME` needs to already exist on the given MySQL server; it will not be created by the `wordpress` container. If you'd like to be able to access the instance from the host without the container's IP, standard port mappings can be used: @@ -91,13 +91,6 @@ $ docker run --name some-wordpress -p 8080:80 -d wordpress Then, access it via `http://localhost:8080` or `http://host-ip:8080` in a browser. -If you'd like to use an external database instead of a `mysql` container, specify the hostname and port with `WORDPRESS_DB_HOST` along with the password in `WORDPRESS_DB_PASSWORD` and the username in `WORDPRESS_DB_USER` (if it is something other than `root`): - -```console -$ docker run --name some-wordpress -e WORDPRESS_DB_HOST=10.1.2.3:3306 \ - -e WORDPRESS_DB_USER=... -e WORDPRESS_DB_PASSWORD=... -d wordpress -``` - When running WordPress with TLS behind a reverse proxy such as NGINX which is responsible for doing TLS termination, be sure to set `X-Forwarded-Proto` appropriately (see ["Using a Reverse Proxy" in "Administration Over SSL" in upstream's documentation](https://wordpress.org/support/article/administration-over-ssl/#using-a-reverse-proxy)). No additional environment variables or configuration should be necessary (this image automatically adds the noted `HTTP_X_FORWARDED_PROTO` code to `wp-config.php` if *any* of the above-noted environment variables are specified). If your database requires SSL, [WordPress ticket #28625](https://core.trac.wordpress.org/ticket/28625) has the relevant details regarding support for that with WordPress upstream. As a workaround, [the "Secure DB Connection" plugin](https://wordpress.org/plugins/secure-db-connection/) can be extracted into the WordPress directory and the appropriate values described in the configuration of that plugin added in `wp-config.php`. @@ -158,25 +151,69 @@ Run `docker stack deploy -c stack.yml wordpress` (or `docker-compose -f stack.ym This image does not provide any additional PHP extensions or other libraries, even if they are required by popular plugins (e.g. [it cannot send e-mails](https://github.com/docker-library/wordpress/issues/30)). There are an infinite number of possible plugins, and they potentially require any extension PHP supports. Including every PHP extension that exists would dramatically increase the image size. -If you need additional PHP extensions, you'll need to create your own image `FROM` this one. The [documentation of the `php` image](https://github.com/docker-library/docs/blob/master/php/README.md#how-to-install-more-php-extensions) explains how to compile additional extensions. Additionally, the [`wordpress` Dockerfile](https://github.com/docker-library/wordpress/blob/618490d4bdff6c5774b84b717979bfe3d6ba8ad1/apache/Dockerfile#L5-L9) has an example of doing this. - -The following Docker Hub features can help with the task of keeping your dependent images up-to-date: - -- [Automated Builds](https://docs.docker.com/docker-hub/builds/) let Docker Hub automatically build your Dockerfile each time you push changes to it. +If you need additional PHP extensions, you'll need to create your own image `FROM` this one. The [documentation of the `php` image](https://github.com/docker-library/docs/blob/master/php/README.md#how-to-install-more-php-extensions) explains how to compile additional extensions. Additionally, [an older `Dockerfile` for `wordpress`](https://github.com/docker-library/wordpress/blob/618490d4bdff6c5774b84b717979bfe3d6ba8ad1/apache/Dockerfile#L5-L9) has a simplified example of doing this and [a newer version of that same `Dockerfile`](https://github.com/docker-library/wordpress/blob/5bbbfa8909232af10ea3fea8b80302a6041a2d04/latest/php7.4/apache/Dockerfile#L18-L62) has a much more thorough example. ## Include pre-installed themes / plugins -Mount the volume containing your themes or plugins to the proper directory; and then apply them through the wp-admin webui. Ensure read/write/execute permissions are in place for the user. +Mount the volume containing your themes or plugins to the proper directory; and then apply them through the "wp-admin" UI. Ensure read/write/execute permissions are in place for the user: - Themes go in a subdirectory in `/var/www/html/wp-content/themes/` - Plugins go in a subdirectory in `/var/www/html/wp-content/plugins/` +If you wish to provide additional content in an image for deploying in multiple installations, place it in the same directories under `/usr/src/wordpress/` instead (which gets copied to `/var/www/html/` on the container's initial startup). + +## Static image / updates-via-redeploy + +The default configuration for this image matches the official WordPress defaults in which automatic updates are enabled (so the initial install comes from the image, but after that it becomes self-managing within the `/var/www/html/` data volume). + +If you wish to have a more static deployment (similar to other containerized applications) and deploy new containers to update WordPress + themes/plugins, then you'll want to use something like the following (and run the resulting image read-only): + +```dockerfile +FROM wordpress:apache +WORKDIR /usr/src/wordpress +RUN set -eux; \ + find /etc/apache2 -name '*.conf' -type f -exec sed -ri -e "s!/var/www/html!$PWD!g" -e "s!Directory /var/www/!Directory $PWD!g" '{}' +; \ + cp -s wp-config-docker.php wp-config.php +COPY custom-theme/ ./wp-content/themes/custom-theme/ +COPY custom-plugin/ ./wp-content/plugins/custom-plugin/ +``` + +For FPM-based images, remove the `find` instruction and adjust the `SCRIPT_FILENAME` paths in your reverse proxy from `/var/www/html` to `/usr/src/wordpress`. + +Run the result read-only, providing writeable storage for `/tmp`, `/run`, and (optionally) `wp-content/uploads`: + +```console +$ docker run ... \ + --read-only \ + --tmpfs /tmp \ + --tmpfs /run \ + --mount type=...,src=...,dst=/usr/src/wordpress/wp-content/uploads \ + ... \ + --env WORDPRESS_DB_HOST=... \ + --env WORDPRESS_AUTH_KEY=... \ + --env ... \ + custom-wordpress:tag +``` + +**Note:** be sure to rebuild and redeploy regularly to ensure you get all the latest WordPress security updates. + ## Running as an arbitrary user -See [the "Running as an arbitrary user" section of the `php` image documentation](https://hub.docker.com/_/php/). +See [the "Running as an arbitrary user" section of the `php` image documentation](https://github.com/docker-library/docs/blob/master/php/README.md#running-as-an-arbitrary-user). When running WP-CLI via the `cli` variants of this image, it is important to note that they're based on Alpine, and have a default `USER` of Alpine's `www-data`, whose UID is `82` (compared to the Debian-based WordPress variants whose default effective UID is `33`), so when running `wordpress:cli` against an existing Debian-based WordPress install, something like `--user 33:33` is likely going to be necessary (possibly also something like `-e HOME=/tmp` depending on the `wp` command invoked and whether it tries to use `~/.wp-cli`). See [docker-library/wordpress#256](https://github.com/docker-library/wordpress/issues/256) for more discussion around this. +## Configuring PHP directives + +See [the "Configuration" section of the `php` image documentation](https://github.com/docker-library/docs/blob/master/php/README.md#configuration). + +For example, to adjust common `php.ini` flags like `upload_max_filesize`, you could create a `custom.ini` with the desired parameters and place it in the `$PHP_INI_DIR/conf.d/` directory: + +```dockerfile +FROM wordpress:tag +COPY custom.ini $PHP_INI_DIR/conf.d/ +``` + # Image Variants The `wordpress` images come in many flavors, each designed for a specific use case. @@ -185,13 +222,21 @@ The `wordpress` images come in many flavors, each designed for a specific use ca 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. -## `wordpress:-alpine` +## `wordpress:-fpm` -This image is based on the popular [Alpine Linux project](http://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. +This variant contains PHP-FPM, which is a FastCGI implementation for PHP. See [the PHP-FPM website](https://php-fpm.org/) for more information about PHP-FPM. -This variant is highly recommended when final image size being as small as possible is desired. The main caveat to note is that it does use [musl libc](http://www.musl-libc.org) instead of [glibc and friends](http://www.etalabs.net/compare_libcs.html), so certain software might run into issues depending on the depth of their libc requirements. However, most software doesn't have an issue with this, so this variant is usually a very safe choice. 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. +In order to use this image variant, some kind of reverse proxy (such as NGINX, Apache, or other tool which speaks the FastCGI protocol) will be required. -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). +Some potentially helpful resources: + +- [PHP-FPM.org](https://php-fpm.org/) +- [simplified example by @md5](https://gist.github.com/md5/d9206eacb5a0ff5d6be0) +- [very detailed article by Pascal Landau](https://www.pascallandau.com/blog/php-php-fpm-and-nginx-on-docker-in-windows-10/) +- [Stack Overflow discussion](https://stackoverflow.com/q/29905953/433558) +- [Apache httpd Wiki example](https://wiki.apache.org/httpd/PHPFPMWordpress) + +**WARNING:** the FastCGI protocol is inherently trusting, and thus *extremely* insecure to expose outside of a private container network -- unless you know *exactly* what you are doing (and are willing to accept the extreme risk), do not use Docker's `--publish` (`-p`) flag with this image variant. ## `wordpress:cli` @@ -203,11 +248,16 @@ The simplest way to use it with an existing WordPress container would be somethi $ docker run -it --rm \ --volumes-from some-wordpress \ --network container:some-wordpress \ + -e WORDPRESS_DB_USER=... \ + -e WORDPRESS_DB_PASSWORD=... \ + # [and other used environment variables] wordpress:cli user list ``` Generally speaking, for WP-CLI to interact with a WordPress install, it needs access to the on-disk files of the WordPress install, and access to the database (and the easiest way to accomplish that such that `wp-config.php` does not require changes is to simply join the networking context of the existing and presumably working WordPress container, but there are many other ways to accomplish that which will be left as an exercise for the reader). +**NOTE:** Since March 2021, WordPress images use a customized `wp-config.php` that pulls the values directly from the environment variables defined above (see `wp-config-docker.php` in [docker-library/wordpress#572](https://github.com/docker-library/wordpress/pull/572) and [docker-library/wordpress#577](https://github.com/docker-library/wordpress/pull/577)). As a result of reading environment variables directly, the cli container also needs the same set of environment variables to properly evaluate `wp-config.php`. + # License View [license information](https://wordpress.org/about/license/) for the software contained in this image. diff --git a/wordpress/content.md b/wordpress/content.md index b8f05a8ee0e8..3f60fe112d1c 100644 --- a/wordpress/content.md +++ b/wordpress/content.md @@ -12,7 +12,7 @@ WordPress is a free and open source blogging tool and a content management syste $ docker run --name some-%%REPO%% --network some-network -d %%IMAGE%% ``` -The following environment variables are also honored for configuring your WordPress instance: +The following environment variables are also honored for configuring your WordPress instance (by [a custom `wp-config.php` implementation](https://github.com/docker-library/wordpress/blob/master/wp-config-docker.php)): - `-e WORDPRESS_DB_HOST=...` - `-e WORDPRESS_DB_USER=...` @@ -23,7 +23,7 @@ The following environment variables are also honored for configuring your WordPr - `-e WORDPRESS_DEBUG=1` (defaults to disabled, non-empty value will enable `WP_DEBUG` in `wp-config.php`) - `-e WORDPRESS_CONFIG_EXTRA=...` (defaults to nothing, non-empty value will be embedded verbatim inside `wp-config.php` -- especially useful for applying extra configuration values this image does not provide by default such as `WP_ALLOW_MULTISITE`; see [docker-library/wordpress#142](https://github.com/docker-library/wordpress/pull/142) for more details) -If the `WORDPRESS_DB_NAME` specified does not already exist on the given MySQL server, it will be created automatically upon startup of the `%%REPO%%` container, provided that the `WORDPRESS_DB_USER` specified has the necessary permissions to create it. +The `WORDPRESS_DB_NAME` needs to already exist on the given MySQL server; it will not be created by the `%%REPO%%` container. If you'd like to be able to access the instance from the host without the container's IP, standard port mappings can be used: @@ -33,13 +33,6 @@ $ docker run --name some-%%REPO%% -p 8080:80 -d %%IMAGE%% Then, access it via `http://localhost:8080` or `http://host-ip:8080` in a browser. -If you'd like to use an external database instead of a `mysql` container, specify the hostname and port with `WORDPRESS_DB_HOST` along with the password in `WORDPRESS_DB_PASSWORD` and the username in `WORDPRESS_DB_USER` (if it is something other than `root`): - -```console -$ docker run --name some-%%REPO%% -e WORDPRESS_DB_HOST=10.1.2.3:3306 \ - -e WORDPRESS_DB_USER=... -e WORDPRESS_DB_PASSWORD=... -d %%IMAGE%% -``` - When running WordPress with TLS behind a reverse proxy such as NGINX which is responsible for doing TLS termination, be sure to set `X-Forwarded-Proto` appropriately (see ["Using a Reverse Proxy" in "Administration Over SSL" in upstream's documentation](https://wordpress.org/support/article/administration-over-ssl/#using-a-reverse-proxy)). No additional environment variables or configuration should be necessary (this image automatically adds the noted `HTTP_X_FORWARDED_PROTO` code to `wp-config.php` if *any* of the above-noted environment variables are specified). If your database requires SSL, [WordPress ticket #28625](https://core.trac.wordpress.org/ticket/28625) has the relevant details regarding support for that with WordPress upstream. As a workaround, [the "Secure DB Connection" plugin](https://wordpress.org/plugins/secure-db-connection/) can be extracted into the WordPress directory and the appropriate values described in the configuration of that plugin added in `wp-config.php`. @@ -49,7 +42,7 @@ If your database requires SSL, [WordPress ticket #28625](https://core.trac.wordp 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/` files. For example: ```console -$ docker run --name some-wordpress -e WORDPRESS_DB_PASSWORD_FILE=/run/secrets/mysql-root ... -d %%IMAGE%%:tag +$ docker run --name some-%%REPO%% -e WORDPRESS_DB_PASSWORD_FILE=/run/secrets/mysql-root ... -d %%IMAGE%%:tag ``` Currently, this is supported for `WORDPRESS_DB_HOST`, `WORDPRESS_DB_USER`, `WORDPRESS_DB_PASSWORD`, `WORDPRESS_DB_NAME`, `WORDPRESS_AUTH_KEY`, `WORDPRESS_SECURE_AUTH_KEY`, `WORDPRESS_LOGGED_IN_KEY`, `WORDPRESS_NONCE_KEY`, `WORDPRESS_AUTH_SALT`, `WORDPRESS_SECURE_AUTH_SALT`, `WORDPRESS_LOGGED_IN_SALT`, `WORDPRESS_NONCE_SALT`, `WORDPRESS_TABLE_PREFIX`, and `WORDPRESS_DEBUG`. @@ -62,21 +55,65 @@ Run `docker stack deploy -c stack.yml %%REPO%%` (or `docker-compose -f stack.yml This image does not provide any additional PHP extensions or other libraries, even if they are required by popular plugins (e.g. [it cannot send e-mails](https://github.com/docker-library/wordpress/issues/30)). There are an infinite number of possible plugins, and they potentially require any extension PHP supports. Including every PHP extension that exists would dramatically increase the image size. -If you need additional PHP extensions, you'll need to create your own image `FROM` this one. The [documentation of the `php` image](https://github.com/docker-library/docs/blob/master/php/README.md#how-to-install-more-php-extensions) explains how to compile additional extensions. Additionally, the [`wordpress` Dockerfile](https://github.com/docker-library/wordpress/blob/618490d4bdff6c5774b84b717979bfe3d6ba8ad1/apache/Dockerfile#L5-L9) has an example of doing this. - -The following Docker Hub features can help with the task of keeping your dependent images up-to-date: - -- [Automated Builds](https://docs.docker.com/docker-hub/builds/) let Docker Hub automatically build your Dockerfile each time you push changes to it. +If you need additional PHP extensions, you'll need to create your own image `FROM` this one. The [documentation of the `php` image](https://github.com/docker-library/docs/blob/master/php/README.md#how-to-install-more-php-extensions) explains how to compile additional extensions. Additionally, [an older `Dockerfile` for `%%IMAGE%%`](https://github.com/docker-library/wordpress/blob/618490d4bdff6c5774b84b717979bfe3d6ba8ad1/apache/Dockerfile#L5-L9) has a simplified example of doing this and [a newer version of that same `Dockerfile`](https://github.com/docker-library/wordpress/blob/5bbbfa8909232af10ea3fea8b80302a6041a2d04/latest/php7.4/apache/Dockerfile#L18-L62) has a much more thorough example. ## Include pre-installed themes / plugins -Mount the volume containing your themes or plugins to the proper directory; and then apply them through the wp-admin webui. Ensure read/write/execute permissions are in place for the user. +Mount the volume containing your themes or plugins to the proper directory; and then apply them through the "wp-admin" UI. Ensure read/write/execute permissions are in place for the user: - Themes go in a subdirectory in `/var/www/html/wp-content/themes/` - Plugins go in a subdirectory in `/var/www/html/wp-content/plugins/` +If you wish to provide additional content in an image for deploying in multiple installations, place it in the same directories under `/usr/src/wordpress/` instead (which gets copied to `/var/www/html/` on the container's initial startup). + +## Static image / updates-via-redeploy + +The default configuration for this image matches the official WordPress defaults in which automatic updates are enabled (so the initial install comes from the image, but after that it becomes self-managing within the `/var/www/html/` data volume). + +If you wish to have a more static deployment (similar to other containerized applications) and deploy new containers to update WordPress + themes/plugins, then you'll want to use something like the following (and run the resulting image read-only): + +```dockerfile +FROM %%IMAGE%%:apache +WORKDIR /usr/src/wordpress +RUN set -eux; \ + find /etc/apache2 -name '*.conf' -type f -exec sed -ri -e "s!/var/www/html!$PWD!g" -e "s!Directory /var/www/!Directory $PWD!g" '{}' +; \ + cp -s wp-config-docker.php wp-config.php +COPY custom-theme/ ./wp-content/themes/custom-theme/ +COPY custom-plugin/ ./wp-content/plugins/custom-plugin/ +``` + +For FPM-based images, remove the `find` instruction and adjust the `SCRIPT_FILENAME` paths in your reverse proxy from `/var/www/html` to `/usr/src/wordpress`. + +Run the result read-only, providing writeable storage for `/tmp`, `/run`, and (optionally) `wp-content/uploads`: + +```console +$ docker run ... \ + --read-only \ + --tmpfs /tmp \ + --tmpfs /run \ + --mount type=...,src=...,dst=/usr/src/wordpress/wp-content/uploads \ + ... \ + --env WORDPRESS_DB_HOST=... \ + --env WORDPRESS_AUTH_KEY=... \ + --env ... \ + custom-wordpress:tag +``` + +**Note:** be sure to rebuild and redeploy regularly to ensure you get all the latest WordPress security updates. + ## Running as an arbitrary user -See [the "Running as an arbitrary user" section of the `php` image documentation](https://hub.docker.com/_/php/). +See [the "Running as an arbitrary user" section of the `php` image documentation](https://github.com/docker-library/docs/blob/master/php/README.md#running-as-an-arbitrary-user). When running WP-CLI via the `cli` variants of this image, it is important to note that they're based on Alpine, and have a default `USER` of Alpine's `www-data`, whose UID is `82` (compared to the Debian-based WordPress variants whose default effective UID is `33`), so when running `%%IMAGE%%:cli` against an existing Debian-based WordPress install, something like `--user 33:33` is likely going to be necessary (possibly also something like `-e HOME=/tmp` depending on the `wp` command invoked and whether it tries to use `~/.wp-cli`). See [docker-library/wordpress#256](https://github.com/docker-library/wordpress/issues/256) for more discussion around this. + +## Configuring PHP directives + +See [the "Configuration" section of the `php` image documentation](https://github.com/docker-library/docs/blob/master/php/README.md#configuration). + +For example, to adjust common `php.ini` flags like `upload_max_filesize`, you could create a `custom.ini` with the desired parameters and place it in the `$PHP_INI_DIR/conf.d/` directory: + +```dockerfile +FROM %%IMAGE%%:tag +COPY custom.ini $PHP_INI_DIR/conf.d/ +``` diff --git a/wordpress/variant-cli.md b/wordpress/variant-cli.md index 6e4d2933b2ba..b27341d01b49 100644 --- a/wordpress/variant-cli.md +++ b/wordpress/variant-cli.md @@ -8,7 +8,12 @@ The simplest way to use it with an existing WordPress container would be somethi $ docker run -it --rm \ --volumes-from some-wordpress \ --network container:some-wordpress \ - wordpress:cli user list + -e WORDPRESS_DB_USER=... \ + -e WORDPRESS_DB_PASSWORD=... \ + # [and other used environment variables] + %%IMAGE%%:cli user list ``` Generally speaking, for WP-CLI to interact with a WordPress install, it needs access to the on-disk files of the WordPress install, and access to the database (and the easiest way to accomplish that such that `wp-config.php` does not require changes is to simply join the networking context of the existing and presumably working WordPress container, but there are many other ways to accomplish that which will be left as an exercise for the reader). + +**NOTE:** Since March 2021, WordPress images use a customized `wp-config.php` that pulls the values directly from the environment variables defined above (see `wp-config-docker.php` in [docker-library/wordpress#572](https://github.com/docker-library/wordpress/pull/572) and [docker-library/wordpress#577](https://github.com/docker-library/wordpress/pull/577)). As a result of reading environment variables directly, the cli container also needs the same set of environment variables to properly evaluate `wp-config.php`. diff --git a/wordpress/variant-fpm.md b/wordpress/variant-fpm.md new file mode 120000 index 000000000000..5ed64ee63493 --- /dev/null +++ b/wordpress/variant-fpm.md @@ -0,0 +1 @@ +../php/variant-fpm.md \ No newline at end of file diff --git a/xwiki/README.md b/xwiki/README.md index 207905d3fd7e..eabbdcf4c373 100644 --- a/xwiki/README.md +++ b/xwiki/README.md @@ -24,10 +24,15 @@ WARNING: # Supported tags and respective `Dockerfile` links -- [`11`, `11.10`, `11.10.5`, `11-mysql-tomcat`, `11.10-mysql-tomcat`, `11.10.5-mysql-tomcat`, `lts-mysql-tomcat`, `lts-mysql`, `lts`](https://github.com/xwiki-contrib/docker-xwiki/blob/f6c69a5d6c525829713209cb2a0d8ce14b8a5038/11/mysql-tomcat/Dockerfile) -- [`11-postgres-tomcat`, `11.10-postgres-tomcat`, `11.10.5-postgres-tomcat`, `lts-postgres-tomcat`, `lts-postgres`](https://github.com/xwiki-contrib/docker-xwiki/blob/f6c69a5d6c525829713209cb2a0d8ce14b8a5038/11/postgres-tomcat/Dockerfile) -- [`12`, `12.3`, `12-mysql-tomcat`, `12.3-mysql-tomcat`, `mysql-tomcat`, `stable-mysql-tomcat`, `stable-mysql`, `stable`, `latest`](https://github.com/xwiki-contrib/docker-xwiki/blob/ebb23e6def6d52dc5dc79bb5844f71f68aba0728/12/mysql-tomcat/Dockerfile) -- [`12-postgres-tomcat`, `12.3-postgres-tomcat`, `postgres-tomcat`, `stable-postgres-tomcat`, `stable-postgres`](https://github.com/xwiki-contrib/docker-xwiki/blob/ebb23e6def6d52dc5dc79bb5844f71f68aba0728/12/postgres-tomcat/Dockerfile) +- [`14`, `14.10`, `14.10.3`, `14-mysql-tomcat`, `14.10-mysql-tomcat`, `14.10.3-mysql-tomcat`, `mysql-tomcat`, `stable-mysql-tomcat`, `stable-mysql`, `stable`, `latest`, `lts-mysql-tomcat`, `lts-mysql`, `lts`](https://github.com/xwiki-contrib/docker-xwiki/blob/572e93824b7c86ad545db1460c70fca7c9203e4a/14/mysql-tomcat/Dockerfile) +- [`14-postgres-tomcat`, `14.10-postgres-tomcat`, `14.10.3-postgres-tomcat`, `postgres-tomcat`, `stable-postgres-tomcat`, `stable-postgres`, `lts-postgres-tomcat`, `lts-postgres`](https://github.com/xwiki-contrib/docker-xwiki/blob/572e93824b7c86ad545db1460c70fca7c9203e4a/14/postgres-tomcat/Dockerfile) +- [`14-mariadb-tomcat`, `14.10-mariadb-tomcat`, `14.10.3-mariadb-tomcat`, `mariadb-tomcat`, `stable-mariadb-tomcat`, `stable-mariadb`, `lts-mariadb-tomcat`, `lts-mariadb`](https://github.com/xwiki-contrib/docker-xwiki/blob/572e93824b7c86ad545db1460c70fca7c9203e4a/14/mariadb-tomcat/Dockerfile) +- [`14.4`, `14.4.7`, `14.4-mysql-tomcat`, `14.4.7-mysql-tomcat`](https://github.com/xwiki-contrib/docker-xwiki/blob/2afb800f554f08f7ada9b1ab09f9140fca737177/14.4/mysql-tomcat/Dockerfile) +- [`14.4-postgres-tomcat`, `14.4.7-postgres-tomcat`](https://github.com/xwiki-contrib/docker-xwiki/blob/2afb800f554f08f7ada9b1ab09f9140fca737177/14.4/postgres-tomcat/Dockerfile) +- [`14.4-mariadb-tomcat`, `14.4.7-mariadb-tomcat`](https://github.com/xwiki-contrib/docker-xwiki/blob/2afb800f554f08f7ada9b1ab09f9140fca737177/14.4/mariadb-tomcat/Dockerfile) +- [`13`, `13.10`, `13.10.11`, `13-mysql-tomcat`, `13.10-mysql-tomcat`, `13.10.11-mysql-tomcat`](https://github.com/xwiki-contrib/docker-xwiki/blob/cd1487dfd967742d686a60f48f07e984b8f263a3/13/mysql-tomcat/Dockerfile) +- [`13-postgres-tomcat`, `13.10-postgres-tomcat`, `13.10.11-postgres-tomcat`](https://github.com/xwiki-contrib/docker-xwiki/blob/cd1487dfd967742d686a60f48f07e984b8f263a3/13/postgres-tomcat/Dockerfile) +- [`13-mariadb-tomcat`, `13.10-mariadb-tomcat`, `13.10.11-mariadb-tomcat`](https://github.com/xwiki-contrib/docker-xwiki/blob/cd1487dfd967742d686a60f48f07e984b8f263a3/13/mariadb-tomcat/Dockerfile) # Quick reference (cont.) @@ -42,7 +47,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/xwiki`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fxwiki) + [official-images repo's `library/xwiki` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fxwiki) [official-images repo's `library/xwiki` file](https://github.com/docker-library/official-images/blob/master/library/xwiki) ([history](https://github.com/docker-library/official-images/commits/master/library/xwiki)) - **Source of this description**: diff --git a/yourls/README.md b/yourls/README.md index bc825d7c1b4d..bb82dc0d2e08 100644 --- a/yourls/README.md +++ b/yourls/README.md @@ -17,21 +17,21 @@ WARNING: # Quick reference - **Maintained by**: - [YOURLS](https://github.com/YOURLS/docker-yourls) + [YOURLS](https://github.com/YOURLS/docker) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`1.7.9-apache`, `1.7-apache`, `1-apache`, `apache`, `1.7.9`, `1.7`, `1`, `latest`](https://github.com/YOURLS/docker-yourls/blob/fe07662938efe12d7c8c82bea32d1d34874d0665/apache/Dockerfile) -- [`1.7.9-fpm`, `1.7-fpm`, `1-fpm`, `fpm`](https://github.com/YOURLS/docker-yourls/blob/fe07662938efe12d7c8c82bea32d1d34874d0665/fpm/Dockerfile) -- [`1.7.9-fpm-alpine`, `1.7-fpm-alpine`, `1-fpm-alpine`, `fpm-alpine`](https://github.com/YOURLS/docker-yourls/blob/fe07662938efe12d7c8c82bea32d1d34874d0665/fpm-alpine/Dockerfile) +- [`1.9.1-apache`, `1.9-apache`, `1-apache`, `apache`, `1.9.1`, `1.9`, `1`, `latest`](https://github.com/YOURLS/docker/blob/38f550a34a4eb96419d9d3ebabe802c439103218/apache/Dockerfile) +- [`1.9.1-fpm`, `1.9-fpm`, `1-fpm`, `fpm`](https://github.com/YOURLS/docker/blob/38f550a34a4eb96419d9d3ebabe802c439103218/fpm/Dockerfile) +- [`1.9.1-fpm-alpine`, `1.9-fpm-alpine`, `1-fpm-alpine`, `fpm-alpine`](https://github.com/YOURLS/docker/blob/38f550a34a4eb96419d9d3ebabe802c439103218/fpm-alpine/Dockerfile) # Quick reference (cont.) - **Where to file issues**: - [https://github.com/YOURLS/docker-yourls/issues](https://github.com/YOURLS/docker-yourls/issues) + [https://github.com/YOURLS/docker/issues](https://github.com/YOURLS/docker/issues) - **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) [`amd64`](https://hub.docker.com/r/amd64/yourls/), [`arm32v5`](https://hub.docker.com/r/arm32v5/yourls/), [`arm32v6`](https://hub.docker.com/r/arm32v6/yourls/), [`arm32v7`](https://hub.docker.com/r/arm32v7/yourls/), [`arm64v8`](https://hub.docker.com/r/arm64v8/yourls/), [`i386`](https://hub.docker.com/r/i386/yourls/), [`mips64le`](https://hub.docker.com/r/mips64le/yourls/), [`ppc64le`](https://hub.docker.com/r/ppc64le/yourls/), [`s390x`](https://hub.docker.com/r/s390x/yourls/) @@ -41,7 +41,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/yourls`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fyourls) + [official-images repo's `library/yourls` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fyourls) [official-images repo's `library/yourls` file](https://github.com/docker-library/official-images/blob/master/library/yourls) ([history](https://github.com/docker-library/official-images/commits/master/library/yourls)) - **Source of this description**: @@ -53,10 +53,12 @@ YOURLS is a set of PHP scripts that will allow you to run Your Own URL Shortener > [github.com/YOURLS/YOURLS](https://github.com/YOURLS/YOURLS) -![logo](https://raw.githubusercontent.com/docker-library/docs/56798ba4051d863557e7e6256c452a9265745675/yourls/logo.png) +![logo](https://raw.githubusercontent.com/docker-library/docs/1b75e08d68679797623d98ba82ca80090f5a26d2/yourls/logo.svg?sanitize=true) # How to use this image +## Start a `yourls` server instance + ```console $ docker run --name some-yourls --link some-mysql:mysql \ -e YOURLS_SITE="https://example.com" \ @@ -65,20 +67,16 @@ $ docker run --name some-yourls --link some-mysql:mysql \ -d yourls ``` -The YOURLS instance accepts [a number of environment variables for configuration](https://yourls.org/#Config). -A few notable/important examples for using this Docker image include: +The YOURLS instance accepts a number of environment variables for configuration, see *Environment Variables* section below. -- `-e YOURLS_DB_HOST=...` (defaults to the IP and port of the linked `mysql` container) -- `-e YOURLS_DB_USER=...` (defaults to "root") -- `-e YOURLS_DB_PASS=...` (defaults to the value of the `MYSQL_ROOT_PASSWORD` environment variable from the linked `mysql` container) -- `-e YOURLS_DB_NAME=...` (defaults to "yourls") -- `-e YOURLS_DB_PREFIX=...` (defaults to "yourls_", only set this when you need to override the default table prefix) -- `-e YOURLS_COOKIEKEY=...` (default to unique random SHA1s) -- `-e YOURLS_SITE=...` (yourls instance url) -- `-e YOURLS_USER=...` (yourls instance user name) -- `-e YOURLS_PASS=...` (yourls instance user password) +If you'd like to use an external database instead of a linked `mysql` container, specify the hostname and port with `YOURLS_DB_HOST` along with the password in `YOURLS_DB_PASS` and the username in `YOURLS_DB_USER` (if it is something other than `root`): -If the `YOURLS_DB_NAME` specified does not already exist on the given MySQL server, it will be created automatically upon startup of the `yourls` container, provided that the `YOURLS_DB_USER` specified has the necessary permissions to create it. +```console +$ docker run --name some-yourlss -e YOURLS_DB_HOST=10.1.2.3:3306 \ + -e YOURLS_DB_USER=... -e YOURLS_DB_PASS=... -d yourls +``` + +## Connect to the YOURLS administration interface If you'd like to be able to access the instance from the host without the container's IP, standard port mappings can be used: @@ -86,15 +84,63 @@ If you'd like to be able to access the instance from the host without the contai $ docker run --name some-yourls --link some-mysql:mysql -p 8080:80 -d yourls ``` -Then, access it via `http://localhost:8080/admin/` or `http://host-ip:8080/admin/` in a browser. +Then, access it via `http://localhost:8080/admin/` or `http://:8080/admin/` in a browser. -If you'd like to use an external database instead of a linked `mysql` container, specify the hostname and port with `YOURLS_DB_HOST` along with the password in `YOURLS_DB_PASS` and the username in `YOURLS_DB_USER` (if it is something other than `root`): +**Note:** On first instantiation, reaching the root folder will generate an error. Access the YOURLS administration interface via the path `/admin/`. + +## Environment Variables + +When you start the `yourls` image, you can adjust the configuration of the YOURLS instance by passing one or more environment variables on the `docker run` command line. +The YOURLS instance accepts [a number of environment variables for configuration](https://yourls.org/#Config). +A few notable/important examples for using this Docker image include the following. + +### `YOURLS_SITE` + +**Required.** +YOURLS instance URL, no trailing slash, lowercase. + +Example: `YOURLS_SITE="https://example.com"` + +### `YOURLS_USER` + +**Required.** +YOURLS instance username. + +Example: `YOURLS_USER="example_username"` + +### `YOURLS_PASS` + +**Required.** +YOURLS instance password. + +Example: `YOURLS_PASS="example_password"` + +### `YOURLS_DB_HOST`, `YOURLS_DB_USER`, `YOURLS_DB_PASS` + +**Optional if linked `mysql` container.** + +Host, user (defaults to `root`) and password for the database. + +### `YOURLS_DB_NAME` + +**Optional.** +Database name, defaults to `yourls`. The database must have been created before installing YOURLS. + +### `YOURLS_DB_PREFIX` + +**Optional.** +Database tables prefix, defaults to `yourls_`. Only set this when you need to override the default table prefix. + +## Docker Secrets + +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/` files. For example: ```console -$ docker run --name some-yourlss -e YOURLS_DB_HOST=10.1.2.3:3306 \ - -e YOURLS_DB_USER=... -e YOURLS_DB_PASS=... -d yourls +$ docker run --name some-yourls -e YOURLS_DB_PASS_FILE=/run/secrets/mysql-root ... -d yourls:tag ``` +Currently, this is supported for `YOURLS_DB_HOST`, `YOURLS_DB_USER`, `YOURLS_DB_PASS`, `YOURLS_DB_NAME`, `YOURLS_DB_PREFIX`, `YOURLS_SITE`, `YOURLS_USER`, and `YOURLS_PASS`. + ## ... via [`docker stack deploy`](https://docs.docker.com/engine/reference/commandline/stack_deploy/) or [`docker-compose`](https://github.com/docker/compose) Example `stack.yml` for `yourls`: @@ -116,15 +162,16 @@ services: YOURLS_PASS: example_password mysql: - image: mysql:5.7 + image: mysql restart: always environment: MYSQL_ROOT_PASSWORD: example + MYSQL_DATABASE: yourls ``` -[![Try in PWD](https://github.com/play-with-docker/stacks/raw/cff22438cb4195ace27f9b15784bbb497047afa7/assets/images/button.png)](http://play-with-docker.com?stack=https://raw.githubusercontent.com/docker-library/docs/be1a84b44ec3c028aa0ac5a9c8e413e43dfe05e4/yourls/stack.yml) +[![Try in PWD](https://github.com/play-with-docker/stacks/raw/cff22438cb4195ace27f9b15784bbb497047afa7/assets/images/button.png)](http://play-with-docker.com?stack=https://raw.githubusercontent.com/docker-library/docs/6dba1507190ff91149046ce4bcbac43529d76bd4/yourls/stack.yml) -Run `docker stack deploy -c stack.yml yourls` (or `docker-compose -f stack.yml up`), wait for it to initialize completely, and visit `http://swarm-ip:8080/admin/`, `http://localhost:8080/admin/`, or `http://host-ip:8080/admin/` (as appropriate). +Run `docker stack deploy -c stack.yml yourls` (or `docker-compose -f stack.yml up`), wait for it to initialize completely, and visit `http://swarm-ip:8080/admin/`, `http://localhost:8080/admin/`, or `http://:8080/admin/` (as appropriate). ## Adding additional libraries / extensions @@ -144,13 +191,21 @@ The `yourls` images come in many flavors, each designed for a specific use case. 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. -## `yourls:-alpine` +## `yourls:-fpm` + +This variant contains PHP-FPM, which is a FastCGI implementation for PHP. See [the PHP-FPM website](https://php-fpm.org/) for more information about PHP-FPM. + +In order to use this image variant, some kind of reverse proxy (such as NGINX, Apache, or other tool which speaks the FastCGI protocol) will be required. -This image is based on the popular [Alpine Linux project](http://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. +Some potentially helpful resources: -This variant is highly recommended when final image size being as small as possible is desired. The main caveat to note is that it does use [musl libc](http://www.musl-libc.org) instead of [glibc and friends](http://www.etalabs.net/compare_libcs.html), so certain software might run into issues depending on the depth of their libc requirements. However, most software doesn't have an issue with this, so this variant is usually a very safe choice. 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. +- [PHP-FPM.org](https://php-fpm.org/) +- [simplified example by @md5](https://gist.github.com/md5/d9206eacb5a0ff5d6be0) +- [very detailed article by Pascal Landau](https://www.pascallandau.com/blog/php-php-fpm-and-nginx-on-docker-in-windows-10/) +- [Stack Overflow discussion](https://stackoverflow.com/q/29905953/433558) +- [Apache httpd Wiki example](https://wiki.apache.org/httpd/PHPFPMWordpress) -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). +**WARNING:** the FastCGI protocol is inherently trusting, and thus *extremely* insecure to expose outside of a private container network -- unless you know *exactly* what you are doing (and are willing to accept the extreme risk), do not use Docker's `--publish` (`-p`) flag with this image variant. # License diff --git a/yourls/content.md b/yourls/content.md index 4fc227ecf945..404ab6d96da2 100644 --- a/yourls/content.md +++ b/yourls/content.md @@ -8,6 +8,8 @@ YOURLS is a set of PHP scripts that will allow you to run Your Own URL Shortener # How to use this image +## Start a `%%IMAGE%%` server instance + ```console $ docker run --name some-%%REPO%% --link some-mysql:mysql \ -e YOURLS_SITE="https://example.com" \ @@ -16,20 +18,16 @@ $ docker run --name some-%%REPO%% --link some-mysql:mysql \ -d %%IMAGE%% ``` -The YOURLS instance accepts [a number of environment variables for configuration](https://yourls.org/#Config). -A few notable/important examples for using this Docker image include: +The YOURLS instance accepts a number of environment variables for configuration, see *Environment Variables* section below. -- `-e YOURLS_DB_HOST=...` (defaults to the IP and port of the linked `mysql` container) -- `-e YOURLS_DB_USER=...` (defaults to "root") -- `-e YOURLS_DB_PASS=...` (defaults to the value of the `MYSQL_ROOT_PASSWORD` environment variable from the linked `mysql` container) -- `-e YOURLS_DB_NAME=...` (defaults to "yourls") -- `-e YOURLS_DB_PREFIX=...` (defaults to "yourls_", only set this when you need to override the default table prefix) -- `-e YOURLS_COOKIEKEY=...` (default to unique random SHA1s) -- `-e YOURLS_SITE=...` (yourls instance url) -- `-e YOURLS_USER=...` (yourls instance user name) -- `-e YOURLS_PASS=...` (yourls instance user password) +If you'd like to use an external database instead of a linked `mysql` container, specify the hostname and port with `YOURLS_DB_HOST` along with the password in `YOURLS_DB_PASS` and the username in `YOURLS_DB_USER` (if it is something other than `root`): -If the `YOURLS_DB_NAME` specified does not already exist on the given MySQL server, it will be created automatically upon startup of the `yourls` container, provided that the `YOURLS_DB_USER` specified has the necessary permissions to create it. +```console +$ docker run --name some-%%REPO%%s -e YOURLS_DB_HOST=10.1.2.3:3306 \ + -e YOURLS_DB_USER=... -e YOURLS_DB_PASS=... -d %%IMAGE%% +``` + +## Connect to the YOURLS administration interface If you'd like to be able to access the instance from the host without the container's IP, standard port mappings can be used: @@ -37,18 +35,66 @@ If you'd like to be able to access the instance from the host without the contai $ docker run --name some-%%REPO%% --link some-mysql:mysql -p 8080:80 -d %%IMAGE%% ``` -Then, access it via `http://localhost:8080/admin/` or `http://host-ip:8080/admin/` in a browser. +Then, access it via `http://localhost:8080/admin/` or `http://:8080/admin/` in a browser. -If you'd like to use an external database instead of a linked `mysql` container, specify the hostname and port with `YOURLS_DB_HOST` along with the password in `YOURLS_DB_PASS` and the username in `YOURLS_DB_USER` (if it is something other than `root`): +**Note:** On first instantiation, reaching the root folder will generate an error. Access the YOURLS administration interface via the path `/admin/`. + +## Environment Variables + +When you start the `yourls` image, you can adjust the configuration of the YOURLS instance by passing one or more environment variables on the `docker run` command line. +The YOURLS instance accepts [a number of environment variables for configuration](https://yourls.org/#Config). +A few notable/important examples for using this Docker image include the following. + +### `YOURLS_SITE` + +**Required.** +YOURLS instance URL, no trailing slash, lowercase. + +Example: `YOURLS_SITE="https://example.com"` + +### `YOURLS_USER` + +**Required.** +YOURLS instance username. + +Example: `YOURLS_USER="example_username"` + +### `YOURLS_PASS` + +**Required.** +YOURLS instance password. + +Example: `YOURLS_PASS="example_password"` + +### `YOURLS_DB_HOST`, `YOURLS_DB_USER`, `YOURLS_DB_PASS` + +**Optional if linked `mysql` container.** + +Host, user (defaults to `root`) and password for the database. + +### `YOURLS_DB_NAME` + +**Optional.** +Database name, defaults to `yourls`. The database must have been created before installing YOURLS. + +### `YOURLS_DB_PREFIX` + +**Optional.** +Database tables prefix, defaults to `yourls_`. Only set this when you need to override the default table prefix. + +## Docker Secrets + +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/` files. For example: ```console -$ docker run --name some-%%REPO%%s -e YOURLS_DB_HOST=10.1.2.3:3306 \ - -e YOURLS_DB_USER=... -e YOURLS_DB_PASS=... -d %%IMAGE%% +$ docker run --name some-%%REPO%% -e YOURLS_DB_PASS_FILE=/run/secrets/mysql-root ... -d %%IMAGE%%:tag ``` +Currently, this is supported for `YOURLS_DB_HOST`, `YOURLS_DB_USER`, `YOURLS_DB_PASS`, `YOURLS_DB_NAME`, `YOURLS_DB_PREFIX`, `YOURLS_SITE`, `YOURLS_USER`, and `YOURLS_PASS`. + ## %%STACK%% -Run `docker stack deploy -c stack.yml %%REPO%%` (or `docker-compose -f stack.yml up`), wait for it to initialize completely, and visit `http://swarm-ip:8080/admin/`, `http://localhost:8080/admin/`, or `http://host-ip:8080/admin/` (as appropriate). +Run `docker stack deploy -c stack.yml %%REPO%%` (or `docker-compose -f stack.yml up`), wait for it to initialize completely, and visit `http://swarm-ip:8080/admin/`, `http://localhost:8080/admin/`, or `http://:8080/admin/` (as appropriate). ## Adding additional libraries / extensions diff --git a/yourls/github-repo b/yourls/github-repo index b4d52b5a741e..8f03e3682b1e 100644 --- a/yourls/github-repo +++ b/yourls/github-repo @@ -1 +1 @@ -https://github.com/YOURLS/docker-yourls +https://github.com/YOURLS/docker diff --git a/yourls/logo.png b/yourls/logo.png deleted file mode 100644 index 91fc1507c3e5702c74c150ee820004b7345ed292..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12112 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 \ No newline at end of file diff --git a/yourls/stack.yml b/yourls/stack.yml index 1f353855edca..2c467f98effd 100644 --- a/yourls/stack.yml +++ b/yourls/stack.yml @@ -14,7 +14,8 @@ services: YOURLS_PASS: example_password mysql: - image: mysql:5.7 + image: mysql restart: always environment: MYSQL_ROOT_PASSWORD: example + MYSQL_DATABASE: yourls diff --git a/yourls/variant-fpm.md b/yourls/variant-fpm.md new file mode 120000 index 000000000000..5ed64ee63493 --- /dev/null +++ b/yourls/variant-fpm.md @@ -0,0 +1 @@ +../php/variant-fpm.md \ No newline at end of file diff --git a/znc/README.md b/znc/README.md index 7326656ea848..91fb9aebe8e0 100644 --- a/znc/README.md +++ b/znc/README.md @@ -20,12 +20,12 @@ WARNING: [the ZNC Community](https://github.com/znc/znc-docker) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`1.8.0`, `1.8`, `latest`](https://github.com/znc/znc-docker/blob/91f58af10b62197187af1f0a9695488e88279e98/full/Dockerfile) -- [`1.8.0-slim`, `1.8-slim`, `slim`](https://github.com/znc/znc-docker/blob/91f58af10b62197187af1f0a9695488e88279e98/slim/Dockerfile) +- [`1.8.2`, `1.8`, `latest`](https://github.com/znc/znc-docker/blob/d5bb727806f238f95bc74fcc182042932cd60c11/full/Dockerfile) +- [`1.8.2-slim`, `1.8-slim`, `slim`](https://github.com/znc/znc-docker/blob/d5bb727806f238f95bc74fcc182042932cd60c11/slim/Dockerfile) # Quick reference (cont.) @@ -40,7 +40,7 @@ WARNING: (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/znc`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fznc) + [official-images repo's `library/znc` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fznc) [official-images repo's `library/znc` file](https://github.com/docker-library/official-images/blob/master/library/znc) ([history](https://github.com/docker-library/official-images/commits/master/library/znc)) - **Source of this description**: @@ -65,10 +65,10 @@ $ docker run -it -v znc-cfg:/znc-data znc --makeconf To run ZNC: ```console -$ docker run -p 6697:6697 -v znc-cfg:/znc-data znc +$ docker run -p 12345:12345 -v znc-cfg:/znc-data znc ``` -The port should match the port you used during `--makeconf`. Note that 6667 is often blocked by web browsers, and therefore is not recommended. +The port (12345 in the example above) should match the port you used during `--makeconf`. Note that 6667 and 6697 are often blocked by web browsers, and therefore are not recommended for ZNC. If you use any external module, put the .cpp, .py or .pm file to `/znc-data/modules` (you may need to create that directory). diff --git a/znc/content.md b/znc/content.md index 3018cc833cee..bb7e79cca9ff 100644 --- a/znc/content.md +++ b/znc/content.md @@ -17,10 +17,10 @@ $ docker run -it -v znc-cfg:/znc-data %%IMAGE%% --makeconf To run ZNC: ```console -$ docker run -p 6697:6697 -v znc-cfg:/znc-data %%IMAGE%% +$ docker run -p 12345:12345 -v znc-cfg:/znc-data %%IMAGE%% ``` -The port should match the port you used during `--makeconf`. Note that 6667 is often blocked by web browsers, and therefore is not recommended. +The port (12345 in the example above) should match the port you used during `--makeconf`. Note that 6667 and 6697 are often blocked by web browsers, and therefore are not recommended for ZNC. If you use any external module, put the .cpp, .py or .pm file to `/znc-data/modules` (you may need to create that directory). diff --git a/zookeeper/README.md b/zookeeper/README.md index 01b2ff8b5f93..0e92437ec62e 100644 --- a/zookeeper/README.md +++ b/zookeeper/README.md @@ -20,13 +20,18 @@ WARNING: [the Docker Community](https://github.com/31z4/zookeeper-docker) - **Where to get help**: - [the Docker Community Forums](https://forums.docker.com/), [the Docker Community Slack](http://dockr.ly/slack), or [Stack Overflow](https://stackoverflow.com/search?tab=newest&q=docker) + [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) # Supported tags and respective `Dockerfile` links -- [`3.4.14`, `3.4`](https://github.com/31z4/zookeeper-docker/blob/1ed5af662e6749021687fbf2a9b445b1adf2fb46/3.4.14/Dockerfile) -- [`3.5.7`, `3.5`](https://github.com/31z4/zookeeper-docker/blob/415ec2ced7dea27398befc9cb9ff5de299323be8/3.5.7/Dockerfile) -- [`3.6.1`, `3.6`, `latest`](https://github.com/31z4/zookeeper-docker/blob/c0039669a527a56b19ceb30a6523ed206fbf245d/3.6.1/Dockerfile) +- [`3.5.9`, `3.5`](https://github.com/31z4/zookeeper-docker/blob/060f64d28d1780373f90ac152bd2538abcf1924c/3.5.9/Dockerfile) +- [`3.5.9-temurin`, `3.5-temurin`](https://github.com/31z4/zookeeper-docker/blob/5cf119d9c5d61024fdba66f7be707413513a8b0d/3.5.9/Dockerfile) +- [`3.6.3`, `3.6`](https://github.com/31z4/zookeeper-docker/blob/060f64d28d1780373f90ac152bd2538abcf1924c/3.6.3/Dockerfile) +- [`3.6.3-temurin`, `3.6-temurin`](https://github.com/31z4/zookeeper-docker/blob/5cf119d9c5d61024fdba66f7be707413513a8b0d/3.6.3/Dockerfile) +- [`3.7.1`, `3.7`](https://github.com/31z4/zookeeper-docker/blob/060f64d28d1780373f90ac152bd2538abcf1924c/3.7.1/Dockerfile) +- [`3.7.1-temurin`, `3.7-temurin`](https://github.com/31z4/zookeeper-docker/blob/5cf119d9c5d61024fdba66f7be707413513a8b0d/3.7.1/Dockerfile) +- [`3.8.0`, `3.8`](https://github.com/31z4/zookeeper-docker/blob/060f64d28d1780373f90ac152bd2538abcf1924c/3.8.0/Dockerfile) +- [`3.8.0-temurin`, `3.8-temurin`, `latest`](https://github.com/31z4/zookeeper-docker/blob/5cf119d9c5d61024fdba66f7be707413513a8b0d/3.8.0/Dockerfile) # Quick reference (cont.) @@ -34,14 +39,14 @@ WARNING: [https://github.com/31z4/zookeeper-docker/issues](https://github.com/31z4/zookeeper-docker/issues) - **Supported architectures**: ([more info](https://github.com/docker-library/official-images#architectures-other-than-amd64)) - [`amd64`](https://hub.docker.com/r/amd64/zookeeper/) + [`amd64`](https://hub.docker.com/r/amd64/zookeeper/), [`arm64v8`](https://hub.docker.com/r/arm64v8/zookeeper/) - **Published image artifact details**: [repo-info repo's `repos/zookeeper/` directory](https://github.com/docker-library/repo-info/blob/master/repos/zookeeper) ([history](https://github.com/docker-library/repo-info/commits/master/repos/zookeeper)) (image metadata, transfer size, etc) - **Image updates**: - [official-images PRs with label `library/zookeeper`](https://github.com/docker-library/official-images/pulls?q=label%3Alibrary%2Fzookeeper) + [official-images repo's `library/zookeeper` label](https://github.com/docker-library/official-images/issues?q=label%3Alibrary%2Fzookeeper) [official-images repo's `library/zookeeper` file](https://github.com/docker-library/official-images/blob/master/library/zookeeper) ([history](https://github.com/docker-library/official-images/commits/master/library/zookeeper)) - **Source of this description**: @@ -93,7 +98,7 @@ services: - 2181:2181 environment: ZOO_MY_ID: 1 - ZOO_SERVERS: server.1=0.0.0.0:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181 + ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181 zoo2: image: zookeeper @@ -103,7 +108,7 @@ services: - 2182:2181 environment: ZOO_MY_ID: 2 - ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=0.0.0.0:2888:3888;2181 server.3=zoo3:2888:3888;2181 + ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181 zoo3: image: zookeeper @@ -113,12 +118,12 @@ services: - 2183:2181 environment: ZOO_MY_ID: 3 - ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=0.0.0.0:2888:3888;2181 + ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181 ``` -[![Try in PWD](https://github.com/play-with-docker/stacks/raw/cff22438cb4195ace27f9b15784bbb497047afa7/assets/images/button.png)](http://play-with-docker.com?stack=https://raw.githubusercontent.com/docker-library/docs/ef162dce5998011e1753c3337dcbe61200c522d2/zookeeper/stack.yml) +[![Try in PWD](https://github.com/play-with-docker/stacks/raw/cff22438cb4195ace27f9b15784bbb497047afa7/assets/images/button.png)](http://play-with-docker.com?stack=https://raw.githubusercontent.com/docker-library/docs/fb51d93e6bb1e8b773a728d297a45b834f04d3d1/zookeeper/stack.yml) -This will start Zookeeper 3.5 in [replicated mode](https://zookeeper.apache.org/doc/current/zookeeperStarted.html#sc_RunningReplicatedZooKeeper). Please note, that Zookeeper 3.4 has slightly different `ZOO_SERVERS` format. Run `docker stack deploy -c stack.yml zookeeper` (or `docker-compose -f stack.yml up`) and wait for it to initialize completely. Ports `2181-2183` will be exposed. +This will start Zookeeper in [replicated mode](https://zookeeper.apache.org/doc/current/zookeeperStarted.html#sc_RunningReplicatedZooKeeper). Run `docker stack deploy -c stack.yml zookeeper` (or `docker-compose -f stack.yml up`) and wait for it to initialize completely. Ports `2181-2183` will be exposed. > Please be aware that setting up multiple servers on a single machine will not create any redundancy. If something were to happen which caused the machine to die, all of the zookeeper servers would be offline. Full redundancy requires that each server have its own machine. It must be a completely separate physical server. Multiple virtual machines on the same physical host are still vulnerable to the complete failure of that host. @@ -174,7 +179,7 @@ Defaults to `true`. Zookeeper's [`standaloneEnabled`](https://zookeeper.apache.o Defaults to `true`. Zookeeper's [`admin.enableServer`](http://zookeeper.apache.org/doc/r3.5.7/zookeeperAdmin.html#sc_adminserver_config) -> New in 3.5.0: The AdminServer is an embedded Jetty server that provides an HTTP interface to the four letter word commands. By default, the server is started on port 8080, and commands are issued by going to the URL "/commands/[command name]", e.g., http://localhost:8080/commands/stat. +> The AdminServer is an embedded Jetty server that provides an HTTP interface to the four letter word commands. By default, the server is started on port 8080, and commands are issued by going to the URL "/commands/[command name]", e.g., http://localhost:8080/commands/stat. ### `ZOO_AUTOPURGE_PURGEINTERVAL` @@ -196,7 +201,17 @@ Defaults to `srvr`. Zookeeper's [`4lw.commands.whitelist`](https://zookeeper.apa ## Advanced configuration -Not every Zookeeper configuration setting is exposed via the environment variables listed above. These variables are only meant to cover minimum configuration keywords and some often changing options. If [mounting your custom config file](#configuration) as a volume doesn't work for you, consider using `JVMFLAGS` environment variable. Many of the Zookeeper advanced configuration options can be set there using Java system properties in the form of `-Dproperty=value`. For example, you can use Netty instead of NIO (default option) as a server communication framework: +### `ZOO_CFG_EXTRA` + +Not every Zookeeper configuration setting is exposed via the environment variables listed above. These variables are only meant to cover minimum configuration keywords and some often changing options. If [mounting your custom config file](#configuration) as a volume doesn't work for you, consider using `ZOO_CFG_EXTRA` environment variable. You can add arbitrary configuration parameters to Zookeeper configuration file using this variable. The following example shows how to enable Prometheus metrics exporter on port `7070`: + +```console +$ docker run --name some-zookeeper --restart always -e ZOO_CFG_EXTRA="metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider metricsProvider.httpPort=7070" zookeeper +``` + +### `JVMFLAGS` + +Many of the Zookeeper advanced configuration options can be set there using Java system properties in the form of `-Dproperty=value`. For example, you can use Netty instead of NIO (default option) as a server communication framework: ```console $ docker run --name some-zookeeper --restart always -e JVMFLAGS="-Dzookeeper.serverCnxnFactory=org.apache.zookeeper.server.NettyServerCnxnFactory" zookeeper @@ -220,9 +235,7 @@ The id must be unique within the ensemble and should have a value between 1 and ### `ZOO_SERVERS` -This variable allows you to specify a list of machines of the Zookeeper ensemble. Each entry has the form of `server.id=host:port:port`. Entries are separated with space. Do note that this variable will not have any effect if you start the container with a `/conf` directory that already contains the `zoo.cfg` file. - -In 3.5, the syntax of this has changed. Servers should be specified as such: `server.id=::[:role];[:]` [Zookeeper Dynamic Reconfiguration](https://zookeeper.apache.org/doc/r3.5.7/zookeeperReconfig.html) +This variable allows you to specify a list of machines of the Zookeeper ensemble. Each entry should be specified as such: `server.id=::[:role];[:]` [Zookeeper Dynamic Reconfiguration](https://zookeeper.apache.org/doc/r3.5.7/zookeeperReconfig.html). Entries are separated with space. Do note that this variable will not have any effect if you start the container with a `/conf` directory that already contains the `zoo.cfg` file. ## Where to store data diff --git a/zookeeper/content.md b/zookeeper/content.md index 67c86a889af9..96a332509060 100644 --- a/zookeeper/content.md +++ b/zookeeper/content.md @@ -30,7 +30,7 @@ $ docker run -it --rm --link some-zookeeper:zookeeper %%IMAGE%% zkCli.sh -server ## %%STACK%% -This will start Zookeeper 3.5 in [replicated mode](https://zookeeper.apache.org/doc/current/zookeeperStarted.html#sc_RunningReplicatedZooKeeper). Please note, that Zookeeper 3.4 has slightly different `ZOO_SERVERS` format. Run `docker stack deploy -c stack.yml %%REPO%%` (or `docker-compose -f stack.yml up`) and wait for it to initialize completely. Ports `2181-2183` will be exposed. +This will start Zookeeper in [replicated mode](https://zookeeper.apache.org/doc/current/zookeeperStarted.html#sc_RunningReplicatedZooKeeper). Run `docker stack deploy -c stack.yml %%REPO%%` (or `docker-compose -f stack.yml up`) and wait for it to initialize completely. Ports `2181-2183` will be exposed. > Please be aware that setting up multiple servers on a single machine will not create any redundancy. If something were to happen which caused the machine to die, all of the zookeeper servers would be offline. Full redundancy requires that each server have its own machine. It must be a completely separate physical server. Multiple virtual machines on the same physical host are still vulnerable to the complete failure of that host. @@ -86,7 +86,7 @@ Defaults to `true`. Zookeeper's [`standaloneEnabled`](https://zookeeper.apache.o Defaults to `true`. Zookeeper's [`admin.enableServer`](http://zookeeper.apache.org/doc/r3.5.7/zookeeperAdmin.html#sc_adminserver_config) -> New in 3.5.0: The AdminServer is an embedded Jetty server that provides an HTTP interface to the four letter word commands. By default, the server is started on port 8080, and commands are issued by going to the URL "/commands/[command name]", e.g., http://localhost:8080/commands/stat. +> The AdminServer is an embedded Jetty server that provides an HTTP interface to the four letter word commands. By default, the server is started on port 8080, and commands are issued by going to the URL "/commands/[command name]", e.g., http://localhost:8080/commands/stat. ### `ZOO_AUTOPURGE_PURGEINTERVAL` @@ -108,7 +108,17 @@ Defaults to `srvr`. Zookeeper's [`4lw.commands.whitelist`](https://zookeeper.apa ## Advanced configuration -Not every Zookeeper configuration setting is exposed via the environment variables listed above. These variables are only meant to cover minimum configuration keywords and some often changing options. If [mounting your custom config file](#configuration) as a volume doesn't work for you, consider using `JVMFLAGS` environment variable. Many of the Zookeeper advanced configuration options can be set there using Java system properties in the form of `-Dproperty=value`. For example, you can use Netty instead of NIO (default option) as a server communication framework: +### `ZOO_CFG_EXTRA` + +Not every Zookeeper configuration setting is exposed via the environment variables listed above. These variables are only meant to cover minimum configuration keywords and some often changing options. If [mounting your custom config file](#configuration) as a volume doesn't work for you, consider using `ZOO_CFG_EXTRA` environment variable. You can add arbitrary configuration parameters to Zookeeper configuration file using this variable. The following example shows how to enable Prometheus metrics exporter on port `7070`: + +```console +$ docker run --name some-zookeeper --restart always -e ZOO_CFG_EXTRA="metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider metricsProvider.httpPort=7070" %%IMAGE%% +``` + +### `JVMFLAGS` + +Many of the Zookeeper advanced configuration options can be set there using Java system properties in the form of `-Dproperty=value`. For example, you can use Netty instead of NIO (default option) as a server communication framework: ```console $ docker run --name some-zookeeper --restart always -e JVMFLAGS="-Dzookeeper.serverCnxnFactory=org.apache.zookeeper.server.NettyServerCnxnFactory" %%IMAGE%% @@ -132,9 +142,7 @@ The id must be unique within the ensemble and should have a value between 1 and ### `ZOO_SERVERS` -This variable allows you to specify a list of machines of the Zookeeper ensemble. Each entry has the form of `server.id=host:port:port`. Entries are separated with space. Do note that this variable will not have any effect if you start the container with a `/conf` directory that already contains the `zoo.cfg` file. - -In 3.5, the syntax of this has changed. Servers should be specified as such: `server.id=::[:role];[:]` [Zookeeper Dynamic Reconfiguration](https://zookeeper.apache.org/doc/r3.5.7/zookeeperReconfig.html) +This variable allows you to specify a list of machines of the Zookeeper ensemble. Each entry should be specified as such: `server.id=::[:role];[:]` [Zookeeper Dynamic Reconfiguration](https://zookeeper.apache.org/doc/r3.5.7/zookeeperReconfig.html). Entries are separated with space. Do note that this variable will not have any effect if you start the container with a `/conf` directory that already contains the `zoo.cfg` file. ## Where to store data diff --git a/zookeeper/stack.yml b/zookeeper/stack.yml index 1e6ce31863b6..cec88f0dce55 100644 --- a/zookeeper/stack.yml +++ b/zookeeper/stack.yml @@ -9,7 +9,7 @@ services: - 2181:2181 environment: ZOO_MY_ID: 1 - ZOO_SERVERS: server.1=0.0.0.0:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181 + ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181 zoo2: image: zookeeper @@ -19,7 +19,7 @@ services: - 2182:2181 environment: ZOO_MY_ID: 2 - ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=0.0.0.0:2888:3888;2181 server.3=zoo3:2888:3888;2181 + ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181 zoo3: image: zookeeper @@ -29,4 +29,4 @@ services: - 2183:2181 environment: ZOO_MY_ID: 3 - ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=0.0.0.0:2888:3888;2181 + ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181 From 665814152d9e9059aaf4531f619e731a2ecde948 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Cotineau?= Date: Tue, 7 Feb 2023 09:08:20 +0100 Subject: [PATCH 2/2] SonarQube document the LTS tag and Arm64 support --- sonarqube/content.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/sonarqube/content.md b/sonarqube/content.md index 03386a25d96a..4d9138ff2d90 100644 --- a/sonarqube/content.md +++ b/sonarqube/content.md @@ -27,10 +27,14 @@ To quickly run a demo instance, see Using Docker on the [Try Out SonarQube](http ## Installation +> **Multi-platform support**: Starting from SonarQube `9.9` LTS, the docker images support running both on `amd64` architecture and `arm64`-based Apple Silicon (M1). + For installation instructions, see Installing the Server from the Docker Image on the [Install the Server](https://docs.sonarqube.org/latest/setup/install-server/) page. To run a cluster with the Data Center Edition, please refer to Installing SonarQube from the Docker Image on the [Install the Server as a Cluster](https://docs.sonarqube.org/latest/setup/install-cluster/) page. +> The `lts` tag on Docker images is replaced with every new LTS release. If you want to avoid any automatic major upgrades, we recommend using the corresponding `9.9-` tag instead of `lts-`. + ## Configuration ### Database