[info=08aecb0d3a66f4ac3328367354f1db69]
OBS-URL: https://build.opensuse.org/package/show/devel:BCI:Tumbleweed/mariadb-image?expand=0&rev=103
This commit is contained in:
commit
f8e36fe555
23
.gitattributes
vendored
Normal file
23
.gitattributes
vendored
Normal file
@ -0,0 +1,23 @@
|
||||
## Default LFS
|
||||
*.7z filter=lfs diff=lfs merge=lfs -text
|
||||
*.bsp filter=lfs diff=lfs merge=lfs -text
|
||||
*.bz2 filter=lfs diff=lfs merge=lfs -text
|
||||
*.gem filter=lfs diff=lfs merge=lfs -text
|
||||
*.gz filter=lfs diff=lfs merge=lfs -text
|
||||
*.jar filter=lfs diff=lfs merge=lfs -text
|
||||
*.lz filter=lfs diff=lfs merge=lfs -text
|
||||
*.lzma filter=lfs diff=lfs merge=lfs -text
|
||||
*.obscpio filter=lfs diff=lfs merge=lfs -text
|
||||
*.oxt filter=lfs diff=lfs merge=lfs -text
|
||||
*.pdf filter=lfs diff=lfs merge=lfs -text
|
||||
*.png filter=lfs diff=lfs merge=lfs -text
|
||||
*.rpm filter=lfs diff=lfs merge=lfs -text
|
||||
*.tbz filter=lfs diff=lfs merge=lfs -text
|
||||
*.tbz2 filter=lfs diff=lfs merge=lfs -text
|
||||
*.tgz filter=lfs diff=lfs merge=lfs -text
|
||||
*.ttf filter=lfs diff=lfs merge=lfs -text
|
||||
*.txz filter=lfs diff=lfs merge=lfs -text
|
||||
*.whl filter=lfs diff=lfs merge=lfs -text
|
||||
*.xz filter=lfs diff=lfs merge=lfs -text
|
||||
*.zip filter=lfs diff=lfs merge=lfs -text
|
||||
*.zst filter=lfs diff=lfs merge=lfs -text
|
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
.osc
|
71
Dockerfile
Normal file
71
Dockerfile
Normal file
@ -0,0 +1,71 @@
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
# Copyright (c) 2024 SUSE LLC
|
||||
|
||||
# All modifications and additions to the file contributed by third parties
|
||||
# remain the property of their copyright owners, unless otherwise agreed
|
||||
# upon.
|
||||
|
||||
# The content of THIS FILE IS AUTOGENERATED and should not be manually modified.
|
||||
# It is maintained by the BCI team and generated by
|
||||
# https://github.com/SUSE/BCI-dockerfile-generator
|
||||
|
||||
# Please submit bugfixes or comments via https://bugs.opensuse.org/
|
||||
# You can contact the BCI team via https://github.com/SUSE/bci/discussions
|
||||
|
||||
|
||||
#!BuildTag: opensuse/mariadb:11.4
|
||||
#!BuildTag: opensuse/mariadb:11.4-%RELEASE%
|
||||
#!BuildTag: opensuse/mariadb:latest
|
||||
|
||||
FROM opensuse/tumbleweed:latest
|
||||
|
||||
# Define labels according to https://en.opensuse.org/Building_derived_containers
|
||||
# labelprefix=org.opensuse.application.mariadb
|
||||
LABEL org.opencontainers.image.authors="openSUSE (https://www.opensuse.org/)"
|
||||
LABEL org.opencontainers.image.title="openSUSE Tumbleweed MariaDB Server"
|
||||
LABEL org.opencontainers.image.description="MariaDB Server container based on the openSUSE Tumbleweed Base Container Image."
|
||||
LABEL org.opencontainers.image.version="11.4"
|
||||
LABEL org.opencontainers.image.url="https://www.opensuse.org"
|
||||
LABEL org.opencontainers.image.created="%BUILDTIME%"
|
||||
LABEL org.opencontainers.image.vendor="openSUSE Project"
|
||||
LABEL org.opencontainers.image.source="%SOURCEURL%"
|
||||
LABEL org.opensuse.reference="registry.opensuse.org/opensuse/mariadb:11.4-%RELEASE%"
|
||||
LABEL org.openbuildservice.disturl="%DISTURL%"
|
||||
LABEL org.opensuse.lifecycle-url="https://en.opensuse.org/Lifetime#openSUSE_BCI"
|
||||
LABEL org.opensuse.release-stage="released"
|
||||
# endlabelprefix
|
||||
LABEL io.artifacthub.package.readme-url="https://raw.githubusercontent.com/SUSE/BCI-dockerfile-generator/Tumbleweed/mariadb-image/README.md"
|
||||
|
||||
RUN set -euo pipefail; zypper -n in --no-recommends mariadb mariadb-tools gawk timezone util-linux findutils; zypper -n clean; rm -rf /var/log/{lastlog,tallylog,zypper.log,zypp/history,YaST2}
|
||||
ENTRYPOINT ["docker-entrypoint.sh"]
|
||||
CMD ["mariadbd"]
|
||||
EXPOSE 3306
|
||||
# sanity check that the version from the tag is equal to the version of mariadb-client that we expect
|
||||
RUN set -euo pipefail; [ "$(rpm -q --qf '%{version}' mariadb-client | cut -d '.' -f -2)" = "11.4" ]
|
||||
|
||||
RUN set -euo pipefail; mkdir /docker-entrypoint-initdb.d
|
||||
|
||||
# docker-entrypoint from https://github.com/MariaDB/mariadb-docker.git
|
||||
COPY docker-entrypoint.sh /usr/local/bin/
|
||||
RUN set -euo pipefail; chmod 755 /usr/local/bin/docker-entrypoint.sh
|
||||
RUN set -euo pipefail; ln -s usr/local/bin/docker-entrypoint.sh / # backwards compat
|
||||
|
||||
# healthcheck from https://github.com/MariaDB/mariadb-docker.git
|
||||
COPY healthcheck.sh /usr/local/bin/
|
||||
RUN set -euo pipefail; chmod 755 /usr/local/bin/healthcheck.sh
|
||||
|
||||
COPY gosu /usr/local/bin/gosu
|
||||
RUN set -euo pipefail; chmod 755 /usr/local/bin/gosu
|
||||
|
||||
RUN set -euo pipefail; sed -i -e 's,$(pwgen .*),$(openssl rand -base64 36),' /usr/local/bin/docker-entrypoint.sh
|
||||
|
||||
# Ensure all logs goes to stdout
|
||||
RUN set -euo pipefail; sed -i 's/^log/#log/g' /etc/my.cnf
|
||||
|
||||
# Disable binding to localhost only, doesn't make sense in a container
|
||||
RUN set -euo pipefail; sed -i -e 's|^\(bind-address.*\)|#\1|g' /etc/my.cnf
|
||||
|
||||
RUN set -euo pipefail; mkdir /run/mysql
|
||||
|
||||
VOLUME /var/lib/mysql
|
75
README.md
Normal file
75
README.md
Normal file
@ -0,0 +1,75 @@
|
||||
# MariaDB Server container image
|
||||
|
||||
![Redistributable](https://img.shields.io/badge/Redistributable-Yes-green)
|
||||
|
||||
## Description
|
||||
MariaDB is an open-source, multi-threaded, relational database management system. It's a backward-compatible branch of the MySQL Community Server that provides a drop-in replacement for MySQL.
|
||||
|
||||
|
||||
## Usage
|
||||
By default, the image launches MariaDB with the same configuration that comes with SUSE Linux Enterprise Server, with two exceptions: logging is sent to stdout, and binding to `localhost` is disabled.
|
||||
|
||||
The only environment variable required to start the container is the MariaDB root password.
|
||||
|
||||
```ShellSession
|
||||
$ podman run -it --rm -p 3306:3306 -e MARIADB_ROOT_PASSWORD=my-password registry.opensuse.org/opensuse/mariadb:11.4
|
||||
```
|
||||
|
||||
or:
|
||||
|
||||
```ShellSession
|
||||
$ podman run -it --rm -p 3306:3306 -e MARIADB_ALLOW_EMPTY_ROOT_PASSWORD=1 registry.opensuse.org/opensuse/mariadb:11.4
|
||||
```
|
||||
|
||||
### Volumes
|
||||
|
||||
The database is stored in the directory `/var/lib/mysql`.
|
||||
|
||||
When using the MariaDB image, we recommend one of the following options:
|
||||
|
||||
* Use a named volume to manage the storage of your database data. This is the default option and it is easy to use. 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 the created directory to a directory accessible from inside the container. This stores 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. If you choose this approach, make sure that the specified directory exists, and its permissions along with other security mechanisms on the host system are set up correctly.
|
||||
|
||||
To mount a host directory as a volume for your data run the following command:
|
||||
|
||||
```ShellSession
|
||||
$ podman run -it --rm -v /my/own/datadir:/var/lib/mysql:Z -p 3306:3306 -e MARIADB_ROOT_PASSWORD=my-password registry.opensuse.org/opensuse/mariadb:11.4
|
||||
```
|
||||
|
||||
The `-v /my/own/datadir:/var/lib/mysql:Z` part of the command mounts the `/my/own/datadir` directory from the underlying host system as `/var/lib/mysql` inside the container, where MariaDB will by default write its data files.
|
||||
|
||||
### Environment variables
|
||||
|
||||
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.
|
||||
|
||||
All other environment variables are optional.
|
||||
|
||||
All environment variables are documented in the MariaDB's Knowledge Base [MariaDB Server Docker Official Image Environment Variables](https://mariadb.com/kb/en/mariadb-server-docker-official-image-environment-variables/).
|
||||
|
||||
### Health, liveness and readiness
|
||||
|
||||
There are no explicit health checks added to the container image. However, you can use the `healthcheck.sh` script to choose from a limited selection of tests to check for what you consider health, liveness, and readiness.
|
||||
|
||||
If there is no database initialized when the container starts, a default database is created. This means that incoming connections are not accepted until the initialization is completed. Use the `healthcheck.sh` script to check for container readiness.
|
||||
|
||||
To learn about `healthcheck.sh`, how to use it, and what tests are provided, refer to the MariaDB's Knowledge Base [Using Healthcheck.sh](https://mariadb.com/kb/en/using-healthcheck-sh/).
|
||||
|
||||
## Usage against an existing database
|
||||
|
||||
If you start a MariaDB container instance with a data directory that already contains a database (specifically, a MySQL subdirectory), no environment variables that control initialization are needed or examined, and no pre-existing databases are changed.
|
||||
|
||||
The only exception is the `MARIADB_AUTO_UPGRADE` environment variable. If it's set, it may run `mysql_upgrade` or `mariadb-upgrade`, potentially causing changes to the system tables.
|
||||
|
||||
### Backup and restore
|
||||
|
||||
Information on how to perform backup and restore can be found on the MariaDB Knowledge Base [Container Backup and Restoration](https://mariadb.com/kb/en/container-backup-and-restoration/).
|
||||
|
||||
## Licensing
|
||||
|
||||
`SPDX-License-Identifier: MIT`
|
||||
|
||||
This documentation and the build recipe are licensed as MIT.
|
||||
The container itself contains various software components under various open source licenses listed in the associated
|
||||
Software Bill of Materials (SBOM).
|
||||
|
||||
This image is based on [openSUSE Tumbleweed](https://get.opensuse.org/tumbleweed/).
|
7
_constraints
Normal file
7
_constraints
Normal file
@ -0,0 +1,7 @@
|
||||
<constraints>
|
||||
<hardware>
|
||||
<disk>
|
||||
<size unit="G">11</size>
|
||||
</disk>
|
||||
</hardware>
|
||||
</constraints>
|
10
_service
Normal file
10
_service
Normal file
@ -0,0 +1,10 @@
|
||||
<services>
|
||||
<service mode="buildtime" name="docker_label_helper"/>
|
||||
<service mode="buildtime" name="kiwi_metainfo_helper"/>
|
||||
<service name="replace_using_package_version" mode="buildtime">
|
||||
<param name="file">docker-entrypoint.sh</param>
|
||||
<param name="regex">%%mariadb_version%%</param>
|
||||
<param name="package">mariadb</param>
|
||||
<param name="parse-version">patch</param>
|
||||
</service>
|
||||
</services>
|
719
docker-entrypoint.sh
Normal file
719
docker-entrypoint.sh
Normal file
@ -0,0 +1,719 @@
|
||||
#!/bin/bash
|
||||
set -eo pipefail
|
||||
shopt -s nullglob
|
||||
|
||||
# logging functions
|
||||
mysql_log() {
|
||||
local type="$1"; shift
|
||||
printf '%s [%s] [Entrypoint]: %s\n' "$(date --rfc-3339=seconds)" "$type" "$*"
|
||||
}
|
||||
mysql_note() {
|
||||
mysql_log Note "$@"
|
||||
}
|
||||
mysql_warn() {
|
||||
mysql_log Warn "$@" >&2
|
||||
}
|
||||
mysql_error() {
|
||||
mysql_log ERROR "$@" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
# usage: file_env VAR [DEFAULT]
|
||||
# ie: file_env 'XYZ_DB_PASSWORD' 'example'
|
||||
# (will allow for "$XYZ_DB_PASSWORD_FILE" to fill in the value of
|
||||
# "$XYZ_DB_PASSWORD" from a file, especially for Docker's secrets feature)
|
||||
file_env() {
|
||||
local var="$1"
|
||||
local fileVar="${var}_FILE"
|
||||
local def="${2:-}"
|
||||
if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then
|
||||
mysql_error "Both $var and $fileVar are set (but are exclusive)"
|
||||
fi
|
||||
local val="$def"
|
||||
if [ "${!var:-}" ]; then
|
||||
val="${!var}"
|
||||
elif [ "${!fileVar:-}" ]; then
|
||||
val="$(< "${!fileVar}")"
|
||||
fi
|
||||
export "$var"="$val"
|
||||
unset "$fileVar"
|
||||
}
|
||||
|
||||
# set MARIADB_xyz from MYSQL_xyz when MARIADB_xyz is unset
|
||||
# and make them the same value (so user scripts can use either)
|
||||
_mariadb_file_env() {
|
||||
local var="$1"; shift
|
||||
local maria="MARIADB_${var#MYSQL_}"
|
||||
file_env "$var" "$@"
|
||||
file_env "$maria" "${!var}"
|
||||
if [ "${!maria:-}" ]; then
|
||||
export "$var"="${!maria}"
|
||||
fi
|
||||
}
|
||||
|
||||
# check to see if this file is being run or sourced from another script
|
||||
_is_sourced() {
|
||||
# https://unix.stackexchange.com/a/215279
|
||||
[ "${#FUNCNAME[@]}" -ge 2 ] \
|
||||
&& [ "${FUNCNAME[0]}" = '_is_sourced' ] \
|
||||
&& [ "${FUNCNAME[1]}" = 'source' ]
|
||||
}
|
||||
|
||||
# usage: docker_process_init_files [file [file [...]]]
|
||||
# ie: docker_process_init_files /always-initdb.d/*
|
||||
# process initializer files, based on file extensions
|
||||
docker_process_init_files() {
|
||||
# mysql here for backwards compatibility "${mysql[@]}"
|
||||
# ShellCheck: mysql appears unused. Verify use (or export if used externally)
|
||||
# shellcheck disable=SC2034
|
||||
mysql=( docker_process_sql )
|
||||
|
||||
echo
|
||||
local f
|
||||
for f; do
|
||||
case "$f" in
|
||||
*.sh)
|
||||
# https://github.com/docker-library/postgres/issues/450#issuecomment-393167936
|
||||
# https://github.com/docker-library/postgres/pull/452
|
||||
if [ -x "$f" ]; then
|
||||
mysql_note "$0: running $f"
|
||||
"$f"
|
||||
else
|
||||
mysql_note "$0: sourcing $f"
|
||||
# ShellCheck can't follow non-constant source. Use a directive to specify location.
|
||||
# shellcheck disable=SC1090
|
||||
. "$f"
|
||||
fi
|
||||
;;
|
||||
*.sql) mysql_note "$0: running $f"; docker_process_sql < "$f"; echo ;;
|
||||
*.sql.gz) mysql_note "$0: running $f"; gunzip -c "$f" | docker_process_sql; echo ;;
|
||||
*.sql.xz) mysql_note "$0: running $f"; xzcat "$f" | docker_process_sql; echo ;;
|
||||
*.sql.zst) mysql_note "$0: running $f"; zstd -dc "$f" | docker_process_sql; echo ;;
|
||||
*) mysql_warn "$0: ignoring $f" ;;
|
||||
esac
|
||||
echo
|
||||
done
|
||||
}
|
||||
|
||||
# arguments necessary to run "mariadbd --verbose --help" successfully (used for testing configuration validity and for extracting default/configured values)
|
||||
_verboseHelpArgs=(
|
||||
--verbose --help
|
||||
)
|
||||
|
||||
mysql_check_config() {
|
||||
local toRun=( "$@" "${_verboseHelpArgs[@]}" ) errors
|
||||
if ! errors="$("${toRun[@]}" 2>&1 >/dev/null)"; then
|
||||
mysql_error $'mariadbd failed while attempting to check config\n\tcommand was: '"${toRun[*]}"$'\n\t'"$errors"
|
||||
fi
|
||||
}
|
||||
|
||||
# Fetch value from server config
|
||||
# We use mariadbd --verbose --help instead of my_print_defaults because the
|
||||
# latter only show values present in config files, and not server defaults
|
||||
mysql_get_config() {
|
||||
local conf="$1"; shift
|
||||
"$@" "${_verboseHelpArgs[@]}" 2>/dev/null \
|
||||
| awk -v conf="$conf" '$1 == conf && /^[^ \t]/ { sub(/^[^ \t]+[ \t]+/, ""); print; exit }'
|
||||
# match "datadir /some/path with/spaces in/it here" but not "--xyz=abc\n datadir (xyz)"
|
||||
}
|
||||
|
||||
# Do a temporary startup of the MariaDB server, for init purposes
|
||||
docker_temp_server_start() {
|
||||
"$@" --skip-networking --default-time-zone=SYSTEM --socket="${SOCKET}" --wsrep_on=OFF \
|
||||
--expire-logs-days=0 \
|
||||
--loose-innodb_buffer_pool_load_at_startup=0 \
|
||||
--skip-ssl --ssl-cert='' --ssl-key='' --ssl-ca='' \
|
||||
&
|
||||
declare -g MARIADB_PID
|
||||
MARIADB_PID=$!
|
||||
mysql_note "Waiting for server startup"
|
||||
# only use the root password if the database has already been initialized
|
||||
# so that it won't try to fill in a password file when it hasn't been set yet
|
||||
extraArgs=()
|
||||
if [ -z "$DATABASE_ALREADY_EXISTS" ]; then
|
||||
extraArgs+=( '--dont-use-mysql-root-password' )
|
||||
fi
|
||||
local i
|
||||
for i in {30..0}; do
|
||||
if docker_process_sql "${extraArgs[@]}" --database=mysql \
|
||||
--skip-ssl --skip-ssl-verify-server-cert \
|
||||
<<<'SELECT 1' &> /dev/null; then
|
||||
break
|
||||
fi
|
||||
sleep 1
|
||||
done
|
||||
if [ "$i" = 0 ]; then
|
||||
mysql_error "Unable to start server."
|
||||
fi
|
||||
}
|
||||
|
||||
# Stop the server. When using a local socket file mariadb-admin will block until
|
||||
# the shutdown is complete.
|
||||
docker_temp_server_stop() {
|
||||
kill "$MARIADB_PID"
|
||||
wait "$MARIADB_PID"
|
||||
}
|
||||
|
||||
# Verify that the minimally required password settings are set for new databases.
|
||||
docker_verify_minimum_env() {
|
||||
# Restoring from backup requires no environment variables
|
||||
declare -g DATABASE_INIT_FROM_BACKUP
|
||||
for file in /docker-entrypoint-initdb.d/*.tar{.gz,.xz,.zst}; do
|
||||
if [ -f "${file}" ]; then
|
||||
DATABASE_INIT_FROM_BACKUP='true'
|
||||
return
|
||||
fi
|
||||
done
|
||||
if [ -z "$MARIADB_ROOT_PASSWORD" ] && [ -z "$MARIADB_ROOT_PASSWORD_HASH" ] && [ -z "$MARIADB_ALLOW_EMPTY_ROOT_PASSWORD" ] && [ -z "$MARIADB_RANDOM_ROOT_PASSWORD" ]; then
|
||||
mysql_error $'Database is uninitialized and password option is not specified\n\tYou need to specify one of MARIADB_ROOT_PASSWORD, MARIADB_ROOT_PASSWORD_HASH, MARIADB_ALLOW_EMPTY_ROOT_PASSWORD and MARIADB_RANDOM_ROOT_PASSWORD'
|
||||
fi
|
||||
# More preemptive exclusions of combinations should have been made before *PASSWORD_HASH was added, but for now we don't enforce due to compatibility.
|
||||
if [ -n "$MARIADB_ROOT_PASSWORD" ] || [ -n "$MARIADB_ALLOW_EMPTY_ROOT_PASSWORD" ] || [ -n "$MARIADB_RANDOM_ROOT_PASSWORD" ] && [ -n "$MARIADB_ROOT_PASSWORD_HASH" ]; then
|
||||
mysql_error "Cannot specify MARIADB_ROOT_PASSWORD_HASH and another MARIADB_ROOT_PASSWORD* option."
|
||||
fi
|
||||
if [ -n "$MARIADB_PASSWORD" ] && [ -n "$MARIADB_PASSWORD_HASH" ]; then
|
||||
mysql_error "Cannot specify MARIADB_PASSWORD_HASH and MARIADB_PASSWORD option."
|
||||
fi
|
||||
if [ -n "$MARIADB_REPLICATION_USER" ]; then
|
||||
if [ -z "$MARIADB_MASTER_HOST" ]; then
|
||||
# its a master, we're creating a user
|
||||
if [ -z "$MARIADB_REPLICATION_PASSWORD" ] && [ -z "$MARIADB_REPLICATION_PASSWORD_HASH" ]; then
|
||||
mysql_error "MARIADB_REPLICATION_PASSWORD or MARIADB_REPLICATION_PASSWORD_HASH not found to create replication user for master"
|
||||
fi
|
||||
else
|
||||
# its a replica
|
||||
if [ -z "$MARIADB_REPLICATION_PASSWORD" ] ; then
|
||||
mysql_error "MARIADB_REPLICATION_PASSWORD is mandatory to specify the replication on the replica image."
|
||||
fi
|
||||
if [ -n "$MARIADB_REPLICATION_PASSWORD_HASH" ] ; then
|
||||
mysql_warn "MARIADB_REPLICATION_PASSWORD_HASH cannot be specified on a replica"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
if [ -n "$MARIADB_MASTER_HOST" ] && { [ -z "$MARIADB_REPLICATION_USER" ] || [ -z "$MARIADB_REPLICATION_PASSWORD" ] ; }; then
|
||||
mysql_error "For a replica, MARIADB_REPLICATION_USER and MARIADB_REPLICATION is mandatory."
|
||||
fi
|
||||
}
|
||||
|
||||
# creates folders for the database
|
||||
# also ensures permission for user mysql of run as root
|
||||
docker_create_db_directories() {
|
||||
local user; user="$(id -u)"
|
||||
|
||||
# TODO other directories that are used by default? like /var/lib/mysql-files
|
||||
# see https://github.com/docker-library/mysql/issues/562
|
||||
mkdir -p "$DATADIR"
|
||||
|
||||
if [ "$user" = "0" ]; then
|
||||
# this will cause less disk access than `chown -R`
|
||||
find "$DATADIR" \! -user mysql -exec chown mysql: '{}' +
|
||||
# See https://github.com/MariaDB/mariadb-docker/issues/363
|
||||
find "${SOCKET%/*}" -maxdepth 0 \! -user mysql -exec chown mysql: '{}' \;
|
||||
|
||||
# memory.pressure
|
||||
local cgroup; cgroup=$(</proc/self/cgroup)
|
||||
local mempressure="/sys/fs/cgroup/${cgroup:3}/memory.pressure"
|
||||
if [ -w "$mempressure" ]; then
|
||||
chown mysql: "$mempressure" || mysql_warn "unable to change ownership of $mempressure, functionality unavailable to MariaDB"
|
||||
else
|
||||
mysql_warn "$mempressure not writable, functionality unavailable to MariaDB"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
_mariadb_version() {
|
||||
echo -n "%%mariadb_version%%-MariaDB"
|
||||
}
|
||||
|
||||
# initializes the database directory
|
||||
docker_init_database_dir() {
|
||||
mysql_note "Initializing database files"
|
||||
installArgs=( --datadir="$DATADIR" --rpm --auth-root-authentication-method=normal )
|
||||
# "Other options are passed to mariadbd." (so we pass all "mariadbd" arguments directly here)
|
||||
|
||||
local mariadbdArgs=()
|
||||
for arg in "${@:2}"; do
|
||||
# Check if the argument contains whitespace
|
||||
if [[ "$arg" =~ [[:space:]] ]]; then
|
||||
mysql_warn "Not passing argument \'$arg\' to mariadb-install-db because mariadb-install-db does not support arguments with whitespace."
|
||||
else
|
||||
mariadbdArgs+=("$arg")
|
||||
fi
|
||||
done
|
||||
mariadb-install-db "${installArgs[@]}" "${mariadbdArgs[@]}" \
|
||||
--skip-test-db \
|
||||
--old-mode='UTF8_IS_UTF8MB3' \
|
||||
--default-time-zone=SYSTEM --enforce-storage-engine= \
|
||||
--skip-log-bin \
|
||||
--expire-logs-days=0 \
|
||||
--loose-innodb_buffer_pool_load_at_startup=0 \
|
||||
--loose-innodb_buffer_pool_dump_at_shutdown=0
|
||||
mysql_note "Database files initialized"
|
||||
}
|
||||
|
||||
# Loads various settings that are used elsewhere in the script
|
||||
# This should be called after mysql_check_config, but before any other functions
|
||||
docker_setup_env() {
|
||||
# Get config
|
||||
declare -g DATADIR SOCKET PORT
|
||||
DATADIR="$(mysql_get_config 'datadir' "$@")"
|
||||
SOCKET="$(mysql_get_config 'socket' "$@")"
|
||||
PORT="$(mysql_get_config 'port' "$@")"
|
||||
|
||||
|
||||
# Initialize values that might be stored in a file
|
||||
_mariadb_file_env 'MYSQL_ROOT_HOST' '%'
|
||||
_mariadb_file_env 'MYSQL_DATABASE'
|
||||
_mariadb_file_env 'MYSQL_USER'
|
||||
_mariadb_file_env 'MYSQL_PASSWORD'
|
||||
_mariadb_file_env 'MYSQL_ROOT_PASSWORD'
|
||||
# No MYSQL_ compatibility needed for new variables
|
||||
file_env 'MARIADB_PASSWORD_HASH'
|
||||
file_env 'MARIADB_ROOT_PASSWORD_HASH'
|
||||
# env variables related to replication
|
||||
file_env 'MARIADB_REPLICATION_USER'
|
||||
file_env 'MARIADB_REPLICATION_PASSWORD'
|
||||
file_env 'MARIADB_REPLICATION_PASSWORD_HASH'
|
||||
# env variables related to master
|
||||
file_env 'MARIADB_MASTER_HOST'
|
||||
file_env 'MARIADB_MASTER_PORT' 3306
|
||||
|
||||
# set MARIADB_ from MYSQL_ when it is unset and then make them the same value
|
||||
: "${MARIADB_ALLOW_EMPTY_ROOT_PASSWORD:=${MYSQL_ALLOW_EMPTY_PASSWORD:-}}"
|
||||
export MYSQL_ALLOW_EMPTY_PASSWORD="$MARIADB_ALLOW_EMPTY_ROOT_PASSWORD" MARIADB_ALLOW_EMPTY_ROOT_PASSWORD
|
||||
: "${MARIADB_RANDOM_ROOT_PASSWORD:=${MYSQL_RANDOM_ROOT_PASSWORD:-}}"
|
||||
export MYSQL_RANDOM_ROOT_PASSWORD="$MARIADB_RANDOM_ROOT_PASSWORD" MARIADB_RANDOM_ROOT_PASSWORD
|
||||
: "${MARIADB_INITDB_SKIP_TZINFO:=${MYSQL_INITDB_SKIP_TZINFO:-}}"
|
||||
export MYSQL_INITDB_SKIP_TZINFO="$MARIADB_INITDB_SKIP_TZINFO" MARIADB_INITDB_SKIP_TZINFO
|
||||
|
||||
declare -g DATABASE_ALREADY_EXISTS
|
||||
if [ -d "$DATADIR/mysql" ]; then
|
||||
DATABASE_ALREADY_EXISTS='true'
|
||||
fi
|
||||
}
|
||||
|
||||
# Execute the client, use via docker_process_sql to handle root password
|
||||
docker_exec_client() {
|
||||
# args sent in can override this db, since they will be later in the command
|
||||
if [ -n "$MYSQL_DATABASE" ]; then
|
||||
set -- --database="$MYSQL_DATABASE" "$@"
|
||||
fi
|
||||
mariadb --protocol=socket -uroot -hlocalhost --socket="${SOCKET}" "$@"
|
||||
}
|
||||
|
||||
# Execute sql script, passed via stdin
|
||||
# usage: docker_process_sql [--dont-use-mysql-root-password] [mysql-cli-args]
|
||||
# ie: docker_process_sql --database=mydb <<<'INSERT ...'
|
||||
# ie: docker_process_sql --dont-use-mysql-root-password --database=mydb <my-file.sql
|
||||
docker_process_sql() {
|
||||
if [ '--dont-use-mysql-root-password' = "$1" ]; then
|
||||
shift
|
||||
MYSQL_PWD='' docker_exec_client "$@"
|
||||
else
|
||||
MYSQL_PWD=$MARIADB_ROOT_PASSWORD docker_exec_client "$@"
|
||||
fi
|
||||
}
|
||||
|
||||
# SQL escape the string $1 to be placed in a string literal.
|
||||
# escape, \ followed by '
|
||||
docker_sql_escape_string_literal() {
|
||||
local newline=$'\n'
|
||||
local escaped=${1//\\/\\\\}
|
||||
escaped="${escaped//$newline/\\n}"
|
||||
echo "${escaped//\'/\\\'}"
|
||||
}
|
||||
|
||||
# Creates replication user
|
||||
create_replica_user() {
|
||||
if [ -n "$MARIADB_REPLICATION_PASSWORD_HASH" ]; then
|
||||
echo "CREATE USER '$MARIADB_REPLICATION_USER'@'%' IDENTIFIED BY PASSWORD '$MARIADB_REPLICATION_PASSWORD_HASH';"
|
||||
else
|
||||
# SQL escape the user password, \ followed by '
|
||||
local userPasswordEscaped
|
||||
userPasswordEscaped=$(docker_sql_escape_string_literal "${MARIADB_REPLICATION_PASSWORD}")
|
||||
echo "CREATE USER '$MARIADB_REPLICATION_USER'@'%' IDENTIFIED BY '$userPasswordEscaped';"
|
||||
fi
|
||||
echo "GRANT REPLICATION REPLICA ON *.* TO '$MARIADB_REPLICATION_USER'@'%';"
|
||||
}
|
||||
|
||||
# Create healthcheck users
|
||||
create_healthcheck_users() {
|
||||
local healthCheckGrant=USAGE
|
||||
local healthCheckConnectPass
|
||||
local healthCheckConnectPassEscaped
|
||||
healthCheckConnectPass="$(pwgen --numerals --capitalize --symbols --remove-chars="=#'\\" -1 32)"
|
||||
healthCheckConnectPassEscaped=$(docker_sql_escape_string_literal "${healthCheckConnectPass}")
|
||||
if [ -n "$MARIADB_HEALTHCHECK_GRANTS" ]; then
|
||||
healthCheckGrant="$MARIADB_HEALTHCHECK_GRANTS"
|
||||
fi
|
||||
for host in 127.0.0.1 ::1 localhost; do
|
||||
echo "CREATE USER IF NOT EXISTS healthcheck@'$host' IDENTIFIED BY '$healthCheckConnectPassEscaped';"
|
||||
# doing this so if the users exists, we're just setting the password, and not replacing the existing grants
|
||||
echo "SET PASSWORD FOR healthcheck@'$host' = PASSWORD('$healthCheckConnectPassEscaped');"
|
||||
echo "GRANT $healthCheckGrant ON *.* TO healthcheck@'$host';"
|
||||
done
|
||||
local maskPreserve
|
||||
maskPreserve=$(umask -p)
|
||||
umask 0077
|
||||
echo -e "[mariadb-client]\\nport=$PORT\\nsocket=$SOCKET\\nuser=healthcheck\\npassword=$healthCheckConnectPass\\nprotocol=tcp\\n" > "$DATADIR"/.my-healthcheck.cnf
|
||||
$maskPreserve
|
||||
}
|
||||
|
||||
# Initializes database with timezone info and root password, plus optional extra db/user
|
||||
docker_setup_db() {
|
||||
# Load timezone info into database
|
||||
if [ -z "$MARIADB_INITDB_SKIP_TZINFO" ]; then
|
||||
# --skip-write-binlog usefully disables binary logging
|
||||
# but also outputs LOCK TABLES to improve the IO of
|
||||
# Aria (MDEV-23326) for 10.4+.
|
||||
mariadb-tzinfo-to-sql --skip-write-binlog /usr/share/zoneinfo \
|
||||
| docker_process_sql --dont-use-mysql-root-password --database=mysql
|
||||
# tell docker_process_sql to not use MYSQL_ROOT_PASSWORD since it is not set yet
|
||||
fi
|
||||
# Generate random root password
|
||||
if [ -n "$MARIADB_RANDOM_ROOT_PASSWORD" ]; then
|
||||
MARIADB_ROOT_PASSWORD="$(pwgen --numerals --capitalize --symbols --remove-chars="'\\" -1 32)"
|
||||
export MARIADB_ROOT_PASSWORD MYSQL_ROOT_PASSWORD=$MARIADB_ROOT_PASSWORD
|
||||
mysql_note "GENERATED ROOT PASSWORD: $MARIADB_ROOT_PASSWORD"
|
||||
fi
|
||||
|
||||
# Creates root users for non-localhost hosts
|
||||
local rootCreate=
|
||||
local rootPasswordEscaped=
|
||||
if [ -n "$MARIADB_ROOT_PASSWORD" ]; then
|
||||
# Sets root password and creates root users for non-localhost hosts
|
||||
rootPasswordEscaped=$(docker_sql_escape_string_literal "${MARIADB_ROOT_PASSWORD}")
|
||||
fi
|
||||
|
||||
# default root to listen for connections from anywhere
|
||||
if [ -n "$MARIADB_ROOT_HOST" ] && [ "$MARIADB_ROOT_HOST" != 'localhost' ]; then
|
||||
# ref "read -d ''", no, we don't care if read finds a terminating character in this heredoc
|
||||
# https://unix.stackexchange.com/questions/265149/why-is-set-o-errexit-breaking-this-read-heredoc-expression/265151#265151
|
||||
if [ -n "$MARIADB_ROOT_PASSWORD_HASH" ]; then
|
||||
read -r -d '' rootCreate <<-EOSQL || true
|
||||
CREATE USER 'root'@'${MARIADB_ROOT_HOST}' IDENTIFIED BY PASSWORD '${MARIADB_ROOT_PASSWORD_HASH}' ;
|
||||
GRANT ALL ON *.* TO 'root'@'${MARIADB_ROOT_HOST}' WITH GRANT OPTION ;
|
||||
GRANT PROXY ON ''@'%' TO 'root'@'${MARIADB_ROOT_HOST}' WITH GRANT OPTION;
|
||||
EOSQL
|
||||
else
|
||||
read -r -d '' rootCreate <<-EOSQL || true
|
||||
CREATE USER 'root'@'${MARIADB_ROOT_HOST}' IDENTIFIED BY '${rootPasswordEscaped}' ;
|
||||
GRANT ALL ON *.* TO 'root'@'${MARIADB_ROOT_HOST}' WITH GRANT OPTION ;
|
||||
GRANT PROXY ON ''@'%' TO 'root'@'${MARIADB_ROOT_HOST}' WITH GRANT OPTION;
|
||||
EOSQL
|
||||
fi
|
||||
fi
|
||||
|
||||
local mysqlAtLocalhost=
|
||||
local mysqlAtLocalhostGrants=
|
||||
# Install mysql@localhost user
|
||||
if [ -n "$MARIADB_MYSQL_LOCALHOST_USER" ]; then
|
||||
read -r -d '' mysqlAtLocalhost <<-EOSQL || true
|
||||
CREATE USER mysql@localhost IDENTIFIED VIA unix_socket;
|
||||
EOSQL
|
||||
if [ -n "$MARIADB_MYSQL_LOCALHOST_GRANTS" ]; then
|
||||
if [ "$MARIADB_MYSQL_LOCALHOST_GRANTS" != USAGE ]; then
|
||||
mysql_warn "Excessive privileges ON *.* TO mysql@localhost facilitates risks to the confidentiality, integrity and availability of data stored"
|
||||
fi
|
||||
mysqlAtLocalhostGrants="GRANT ${MARIADB_MYSQL_LOCALHOST_GRANTS} ON *.* TO mysql@localhost;";
|
||||
fi
|
||||
fi
|
||||
|
||||
local createHealthCheckUsers
|
||||
createHealthCheckUsers=$(create_healthcheck_users)
|
||||
|
||||
local rootLocalhostPass=
|
||||
if [ -z "$MARIADB_ROOT_PASSWORD_HASH" ]; then
|
||||
# handle MARIADB_ROOT_PASSWORD_HASH for root@localhost after /docker-entrypoint-initdb.d
|
||||
rootLocalhostPass="SET PASSWORD FOR 'root'@'localhost'= PASSWORD('${rootPasswordEscaped}');"
|
||||
fi
|
||||
|
||||
local createDatabase=
|
||||
# Creates a custom database and user if specified
|
||||
if [ -n "$MARIADB_DATABASE" ]; then
|
||||
mysql_note "Creating database ${MARIADB_DATABASE}"
|
||||
createDatabase="CREATE DATABASE IF NOT EXISTS \`$MARIADB_DATABASE\`;"
|
||||
fi
|
||||
|
||||
local createUser=
|
||||
local userGrants=
|
||||
if [ -n "$MARIADB_PASSWORD" ] || [ -n "$MARIADB_PASSWORD_HASH" ] && [ -n "$MARIADB_USER" ]; then
|
||||
mysql_note "Creating user ${MARIADB_USER}"
|
||||
if [ -n "$MARIADB_PASSWORD_HASH" ]; then
|
||||
createUser="CREATE USER '$MARIADB_USER'@'%' IDENTIFIED BY PASSWORD '$MARIADB_PASSWORD_HASH';"
|
||||
else
|
||||
# SQL escape the user password, \ followed by '
|
||||
local userPasswordEscaped
|
||||
userPasswordEscaped=$(docker_sql_escape_string_literal "${MARIADB_PASSWORD}")
|
||||
createUser="CREATE USER '$MARIADB_USER'@'%' IDENTIFIED BY '$userPasswordEscaped';"
|
||||
fi
|
||||
|
||||
if [ -n "$MARIADB_DATABASE" ]; then
|
||||
mysql_note "Giving user ${MARIADB_USER} access to schema ${MARIADB_DATABASE}"
|
||||
userGrants="GRANT ALL ON \`${MARIADB_DATABASE//_/\\_}\`.* TO '$MARIADB_USER'@'%';"
|
||||
fi
|
||||
fi
|
||||
|
||||
# To create replica user
|
||||
local createReplicaUser=
|
||||
local changeMasterTo=
|
||||
local startReplica=
|
||||
if [ -n "$MARIADB_REPLICATION_USER" ] ; then
|
||||
if [ -z "$MARIADB_MASTER_HOST" ]; then
|
||||
# on master
|
||||
mysql_note "Creating user ${MARIADB_REPLICATION_USER}"
|
||||
createReplicaUser=$(create_replica_user)
|
||||
else
|
||||
# on replica
|
||||
local rplPasswordEscaped
|
||||
rplPasswordEscaped=$(docker_sql_escape_string_literal "${MARIADB_REPLICATION_PASSWORD}")
|
||||
# SC cannot follow how MARIADB_MASTER_PORT is assigned a default value.
|
||||
# shellcheck disable=SC2153
|
||||
changeMasterTo="CHANGE MASTER TO MASTER_HOST='$MARIADB_MASTER_HOST', MASTER_USER='$MARIADB_REPLICATION_USER', MASTER_PASSWORD='$rplPasswordEscaped', MASTER_PORT=$MARIADB_MASTER_PORT, MASTER_CONNECT_RETRY=10;"
|
||||
startReplica="START REPLICA;"
|
||||
fi
|
||||
fi
|
||||
|
||||
mysql_note "Securing system users (equivalent to running mysql_secure_installation)"
|
||||
# tell docker_process_sql to not use MARIADB_ROOT_PASSWORD since it is just now being set
|
||||
# --binary-mode to save us from the semi-mad users go out of their way to confuse the encoding.
|
||||
docker_process_sql --dont-use-mysql-root-password --database=mysql --binary-mode <<-EOSQL
|
||||
-- Securing system users shouldn't be replicated
|
||||
SET @orig_sql_log_bin= @@SESSION.SQL_LOG_BIN;
|
||||
SET @@SESSION.SQL_LOG_BIN=0;
|
||||
-- we need the SQL_MODE NO_BACKSLASH_ESCAPES mode to be clear for the password to be set
|
||||
SET @@SESSION.SQL_MODE=REPLACE(@@SESSION.SQL_MODE, 'NO_BACKSLASH_ESCAPES', '');
|
||||
|
||||
DROP USER IF EXISTS root@'127.0.0.1', root@'::1';
|
||||
EXECUTE IMMEDIATE CONCAT('DROP USER IF EXISTS root@\'', @@hostname,'\'');
|
||||
|
||||
${rootLocalhostPass}
|
||||
${rootCreate}
|
||||
${mysqlAtLocalhost}
|
||||
${mysqlAtLocalhostGrants}
|
||||
${createHealthCheckUsers}
|
||||
-- end of securing system users, rest of init now...
|
||||
SET @@SESSION.SQL_LOG_BIN=@orig_sql_log_bin;
|
||||
-- create users/databases
|
||||
${createDatabase}
|
||||
${createUser}
|
||||
${createReplicaUser}
|
||||
${userGrants}
|
||||
|
||||
${changeMasterTo}
|
||||
${startReplica}
|
||||
EOSQL
|
||||
}
|
||||
|
||||
# create a new installation
|
||||
docker_mariadb_init()
|
||||
{
|
||||
|
||||
# check dir permissions to reduce likelihood of half-initialized database
|
||||
ls /docker-entrypoint-initdb.d/ > /dev/null
|
||||
|
||||
if [ -n "$DATABASE_INIT_FROM_BACKUP" ]; then
|
||||
shopt -s dotglob
|
||||
for file in /docker-entrypoint-initdb.d/*.tar{.gz,.xz,.zst}; do
|
||||
mkdir -p "$DATADIR"/.init
|
||||
tar --auto-compress --extract --file "$file" --directory="$DATADIR"/.init
|
||||
mariadb-backup --target-dir="$DATADIR"/.init --datadir="$DATADIR"/.restore --move-back
|
||||
|
||||
mv "$DATADIR"/.restore/** "$DATADIR"/
|
||||
if [ -f "$DATADIR/.init/backup-my.cnf" ]; then
|
||||
mv "$DATADIR/.init/backup-my.cnf" "$DATADIR/.my.cnf"
|
||||
mysql_note "Adding startup configuration:"
|
||||
my_print_defaults --defaults-file="$DATADIR/.my.cnf" --mariadbd
|
||||
fi
|
||||
rm -rf "$DATADIR"/.init "$DATADIR"/.restore
|
||||
if [ "$(id -u)" = "0" ]; then
|
||||
# this will cause less disk access than `chown -R`
|
||||
find "$DATADIR" \! -user mysql -exec chown mysql: '{}' +
|
||||
fi
|
||||
done
|
||||
if _check_if_upgrade_is_needed; then
|
||||
docker_mariadb_upgrade "$@"
|
||||
fi
|
||||
return
|
||||
fi
|
||||
docker_init_database_dir "$@"
|
||||
|
||||
mysql_note "Starting temporary server"
|
||||
docker_temp_server_start "$@"
|
||||
mysql_note "Temporary server started."
|
||||
|
||||
docker_setup_db
|
||||
docker_process_init_files /docker-entrypoint-initdb.d/*
|
||||
# Wait until after /docker-entrypoint-initdb.d is performed before setting
|
||||
# root@localhost password to a hash we don't know the password for.
|
||||
if [ -n "${MARIADB_ROOT_PASSWORD_HASH}" ]; then
|
||||
mysql_note "Setting root@localhost password hash"
|
||||
docker_process_sql --dont-use-mysql-root-password --binary-mode <<-EOSQL
|
||||
SET @@SESSION.SQL_LOG_BIN=0;
|
||||
SET PASSWORD FOR 'root'@'localhost'= '${MARIADB_ROOT_PASSWORD_HASH}';
|
||||
EOSQL
|
||||
fi
|
||||
|
||||
mysql_note "Stopping temporary server"
|
||||
docker_temp_server_stop
|
||||
mysql_note "Temporary server stopped"
|
||||
|
||||
echo
|
||||
mysql_note "MariaDB init process done. Ready for start up."
|
||||
echo
|
||||
}
|
||||
|
||||
# backup the mysql database
|
||||
docker_mariadb_backup_system()
|
||||
{
|
||||
if [ -n "$MARIADB_DISABLE_UPGRADE_BACKUP" ] \
|
||||
&& [ "$MARIADB_DISABLE_UPGRADE_BACKUP" = 1 ]; then
|
||||
mysql_note "MariaDB upgrade backup disabled due to \$MARIADB_DISABLE_UPGRADE_BACKUP=1 setting"
|
||||
return
|
||||
fi
|
||||
local backup_db="system_mysql_backup_unknown_version.sql.zst"
|
||||
local oldfullversion="unknown_version"
|
||||
if [ -r "$DATADIR"/mariadb_upgrade_info ]; then
|
||||
read -r -d '' oldfullversion < "$DATADIR"/mariadb_upgrade_info || true
|
||||
if [ -n "$oldfullversion" ]; then
|
||||
backup_db="system_mysql_backup_${oldfullversion}.sql.zst"
|
||||
fi
|
||||
fi
|
||||
|
||||
mysql_note "Backing up system database to $backup_db"
|
||||
if ! mariadb-dump --skip-lock-tables --replace --databases mysql --socket="${SOCKET}" | zstd > "${DATADIR}/${backup_db}"; then
|
||||
mysql_error "Unable backup system database for upgrade from $oldfullversion."
|
||||
fi
|
||||
mysql_note "Backing up complete"
|
||||
}
|
||||
|
||||
# perform mariadb-upgrade
|
||||
# backup the mysql database if this is a major upgrade
|
||||
docker_mariadb_upgrade() {
|
||||
if [ -z "$MARIADB_AUTO_UPGRADE" ] \
|
||||
|| [ "$MARIADB_AUTO_UPGRADE" = 0 ]; then
|
||||
mysql_note "MariaDB upgrade (mariadb-upgrade or creating healthcheck users) required, but skipped due to \$MARIADB_AUTO_UPGRADE setting"
|
||||
return
|
||||
fi
|
||||
mysql_note "Starting temporary server"
|
||||
docker_temp_server_start "$@" --skip-grant-tables \
|
||||
--loose-innodb_buffer_pool_dump_at_shutdown=0 \
|
||||
--skip-slave-start
|
||||
mysql_note "Temporary server started."
|
||||
|
||||
docker_mariadb_backup_system
|
||||
|
||||
if [ ! -f "$DATADIR"/.my-healthcheck.cnf ]; then
|
||||
mysql_note "Creating healthcheck users"
|
||||
local createHealthCheckUsers
|
||||
createHealthCheckUsers=$(create_healthcheck_users)
|
||||
docker_process_sql --dont-use-mysql-root-password --binary-mode <<-EOSQL
|
||||
-- Healthcheck users shouldn't be replicated
|
||||
SET @@SESSION.SQL_LOG_BIN=0;
|
||||
-- we need the SQL_MODE NO_BACKSLASH_ESCAPES mode to be clear for the password to be set
|
||||
SET @@SESSION.SQL_MODE=REPLACE(@@SESSION.SQL_MODE, 'NO_BACKSLASH_ESCAPES', '');
|
||||
FLUSH PRIVILEGES;
|
||||
$createHealthCheckUsers
|
||||
EOSQL
|
||||
mysql_note "Stopping temporary server"
|
||||
docker_temp_server_stop
|
||||
mysql_note "Temporary server stopped"
|
||||
|
||||
if _check_if_upgrade_is_needed; then
|
||||
# need a restart as FLUSH PRIVILEGES isn't reversable
|
||||
mysql_note "Restarting temporary server for upgrade"
|
||||
docker_temp_server_start "$@" --skip-grant-tables \
|
||||
--loose-innodb_buffer_pool_dump_at_shutdown=0 \
|
||||
--skip-slave-start
|
||||
else
|
||||
return 0
|
||||
fi
|
||||
fi
|
||||
|
||||
mysql_note "Starting mariadb-upgrade"
|
||||
mariadb-upgrade --upgrade-system-tables
|
||||
mysql_note "Finished mariadb-upgrade"
|
||||
|
||||
mysql_note "Stopping temporary server"
|
||||
docker_temp_server_stop
|
||||
mysql_note "Temporary server stopped"
|
||||
}
|
||||
|
||||
|
||||
_check_if_upgrade_is_needed() {
|
||||
if [ ! -f "$DATADIR"/mariadb_upgrade_info ]; then
|
||||
mysql_note "MariaDB upgrade information missing, assuming required"
|
||||
return 0
|
||||
fi
|
||||
local mariadbVersion
|
||||
mariadbVersion="$(_mariadb_version)"
|
||||
IFS='.-' read -ra newversion <<<"$mariadbVersion"
|
||||
IFS='.-' read -ra oldversion < "$DATADIR"/mariadb_upgrade_info || true
|
||||
|
||||
if [[ ${#newversion[@]} -lt 2 ]] || [[ ${#oldversion[@]} -lt 2 ]] \
|
||||
|| [[ ${oldversion[0]} -lt ${newversion[0]} ]] \
|
||||
|| [[ ${oldversion[0]} -eq ${newversion[0]} && ${oldversion[1]} -lt ${newversion[1]} ]]; then
|
||||
return 0
|
||||
fi
|
||||
if [ ! -f "$DATADIR"/.my-healthcheck.cnf ]; then
|
||||
mysql_note "MariaDB heathcheck configation file missing, assuming desirable"
|
||||
return 0
|
||||
fi
|
||||
mysql_note "MariaDB upgrade not required"
|
||||
return 1
|
||||
}
|
||||
|
||||
# check arguments for an option that would cause mariadbd to stop
|
||||
# return true if there is one
|
||||
_mysql_want_help() {
|
||||
local arg
|
||||
for arg; do
|
||||
case "$arg" in
|
||||
-'?'|--help|--print-defaults|-V|--version)
|
||||
return 0
|
||||
;;
|
||||
esac
|
||||
done
|
||||
return 1
|
||||
}
|
||||
|
||||
_main() {
|
||||
# if command starts with an option, prepend mariadbd
|
||||
if [ "${1:0:1}" = '-' ]; then
|
||||
set -- mariadbd "$@"
|
||||
fi
|
||||
|
||||
#ENDOFSUBSTITUTIONS
|
||||
# skip setup if they aren't running mysqld or want an option that stops mysqld
|
||||
if [ "$1" = 'mariadbd' ] || [ "$1" = 'mysqld' ] && ! _mysql_want_help "$@"; then
|
||||
mysql_note "Entrypoint script for MariaDB Server ${MARIADB_VERSION} started."
|
||||
|
||||
mysql_check_config "$@"
|
||||
# Load various environment variables
|
||||
docker_setup_env "$@"
|
||||
docker_create_db_directories
|
||||
|
||||
# If container is started as root user, restart as dedicated mysql user
|
||||
if [ "$(id -u)" = "0" ]; then
|
||||
mysql_note "Switching to dedicated user 'mysql'"
|
||||
exec gosu mysql "${BASH_SOURCE[0]}" "$@"
|
||||
fi
|
||||
|
||||
# there's no database, so it needs to be initialized
|
||||
if [ -z "$DATABASE_ALREADY_EXISTS" ]; then
|
||||
docker_verify_minimum_env
|
||||
|
||||
docker_mariadb_init "$@"
|
||||
# MDEV-27636 mariadb_upgrade --check-if-upgrade-is-needed cannot be run offline
|
||||
#elif mariadb-upgrade --check-if-upgrade-is-needed; then
|
||||
elif _check_if_upgrade_is_needed; then
|
||||
docker_mariadb_upgrade "$@"
|
||||
fi
|
||||
fi
|
||||
exec "$@"
|
||||
}
|
||||
|
||||
# If we are sourced from elsewhere, don't perform any further actions
|
||||
if ! _is_sourced; then
|
||||
_main "$@"
|
||||
fi
|
11
gosu
Normal file
11
gosu
Normal file
@ -0,0 +1,11 @@
|
||||
#!/bin/bash
|
||||
|
||||
u=$1
|
||||
shift
|
||||
|
||||
if ! id -u "$u" > /dev/null 2>&1; then
|
||||
echo "Invalid user: $u"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
exec setpriv --reuid="$u" --regid="$u" --clear-groups -- "$@"
|
355
healthcheck.sh
Normal file
355
healthcheck.sh
Normal file
@ -0,0 +1,355 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Healthcheck script for MariaDB
|
||||
#
|
||||
# Runs various tests on the MariaDB server to check its health. Pass the tests
|
||||
# to run as arguments. If all tests succeed, the server is considered healthy,
|
||||
# otherwise it's not.
|
||||
#
|
||||
# Arguments are processed in strict order. Set replication_* options before
|
||||
# the --replication option. This allows a different set of replication checks
|
||||
# on different connections.
|
||||
#
|
||||
# --su{=|-mariadb} is option to run the healthcheck as a different unix user.
|
||||
# Useful if mariadb@localhost user exists with unix socket authentication
|
||||
# Using this option disregards previous options set, so should usually be the
|
||||
# first option.
|
||||
#
|
||||
# Some tests require SQL privileges.
|
||||
#
|
||||
# TEST MINIMUM GRANTS REQUIRED
|
||||
# connect none*
|
||||
# innodb_initialized USAGE
|
||||
# innodb_buffer_pool_loaded USAGE
|
||||
# galera_online USAGE
|
||||
# galera_ready USAGE
|
||||
# replication REPLICATION_CLIENT (<10.5)or REPLICA MONITOR (10.5+)
|
||||
# mariadbupgrade none, however unix user permissions on datadir
|
||||
#
|
||||
# The SQL user used is the default for the mariadb client. This can be the unix user
|
||||
# if no user(or password) is set in the [mariadb-client] section of a configuration
|
||||
# file. --defaults-{file,extra-file,group-suffix} can specify a file/configuration
|
||||
# different from elsewhere.
|
||||
#
|
||||
# Note * though denied error message will result in error log without
|
||||
# any permissions.
|
||||
|
||||
set -eo pipefail
|
||||
|
||||
_process_sql()
|
||||
{
|
||||
mariadb ${nodefaults:+--no-defaults} \
|
||||
${def['file']:+--defaults-file=${def['file']}} \
|
||||
${def['extra_file']:+--defaults-extra-file=${def['extra_file']}} \
|
||||
${def['group_suffix']:+--defaults-group-suffix=${def['group_suffix']}} \
|
||||
--skip-ssl --skip-ssl-verify-server-cert \
|
||||
-B "$@"
|
||||
}
|
||||
|
||||
# TESTS
|
||||
|
||||
|
||||
# CONNECT
|
||||
#
|
||||
# Tests that a connection can be made over TCP, the final state
|
||||
# of the entrypoint and is listening. The authentication used
|
||||
# isn't tested.
|
||||
connect()
|
||||
{
|
||||
set +e +o pipefail
|
||||
# (on second extra_file)
|
||||
# shellcheck disable=SC2086
|
||||
mariadb ${nodefaults:+--no-defaults} \
|
||||
${def['file']:+--defaults-file=${def['file']}} \
|
||||
${def['extra_file']:+--defaults-extra-file=${def['extra_file']}} \
|
||||
${def['group_suffix']:+--defaults-group-suffix=${def['group_suffix']}} \
|
||||
--skip-ssl --skip-ssl-verify-server-cert \
|
||||
-h localhost --protocol tcp -e 'select 1' 2>&1 \
|
||||
| grep -qF "Can't connect"
|
||||
local ret=${PIPESTATUS[1]}
|
||||
set -eo pipefail
|
||||
if (( "$ret" == 0 )); then
|
||||
# grep Matched "Can't connect" so we fail
|
||||
return 1
|
||||
fi
|
||||
return 0
|
||||
}
|
||||
|
||||
# INNODB_INITIALIZED
|
||||
#
|
||||
# This tests that the crash recovery of InnoDB has completed
|
||||
# along with all the other things required to make it to a healthy
|
||||
# operational state. Note this may return true in the early
|
||||
# states of initialization. Use with a connect test to avoid
|
||||
# these false positives.
|
||||
innodb_initialized()
|
||||
{
|
||||
local s
|
||||
s=$(_process_sql --skip-column-names -e "select 1 from information_schema.ENGINES WHERE engine='innodb' AND support in ('YES', 'DEFAULT', 'ENABLED')")
|
||||
[ "$s" == 1 ]
|
||||
}
|
||||
|
||||
# INNODB_BUFFER_POOL_LOADED
|
||||
#
|
||||
# Tests the load of the innodb buffer pool as been complete
|
||||
# implies innodb_buffer_pool_load_at_startup=1 (default), or if
|
||||
# manually SET innodb_buffer_pool_load_now=1
|
||||
innodb_buffer_pool_loaded()
|
||||
{
|
||||
local s
|
||||
s=$(_process_sql --skip-column-names -e "select VARIABLE_VALUE from information_schema.GLOBAL_STATUS WHERE VARIABLE_NAME='Innodb_buffer_pool_load_status'")
|
||||
if [[ $s =~ 'load completed' ]]; then
|
||||
return 0
|
||||
fi
|
||||
return 1
|
||||
}
|
||||
|
||||
# GALERA_ONLINE
|
||||
#
|
||||
# Tests that the galera node is in the SYNCed state
|
||||
galera_online()
|
||||
{
|
||||
local s
|
||||
s=$(_process_sql --skip-column-names -e "select VARIABLE_VALUE from information_schema.GLOBAL_STATUS WHERE VARIABLE_NAME='WSREP_LOCAL_STATE'")
|
||||
# 4 from https://galeracluster.com/library/documentation/node-states.html#node-state-changes
|
||||
# not https://xkcd.com/221/
|
||||
if [[ $s -eq 4 ]]; then
|
||||
return 0
|
||||
fi
|
||||
return 1
|
||||
}
|
||||
|
||||
# GALERA_READY
|
||||
#
|
||||
# Tests that the Galera provider is ready.
|
||||
galera_ready()
|
||||
{
|
||||
local s
|
||||
s=$(_process_sql --skip-column-names -e "select VARIABLE_VALUE from information_schema.GLOBAL_STATUS WHERE VARIABLE_NAME='WSREP_READY'")
|
||||
if [ "$s" = "ON" ]; then
|
||||
return 0
|
||||
fi
|
||||
return 1
|
||||
}
|
||||
|
||||
# REPLICATION
|
||||
#
|
||||
# Tests the replication has the required set of functions:
|
||||
# --replication_all -> Checks all replication sources
|
||||
# --replication_name=n -> sets the multisource connection name tested
|
||||
# --replication_io -> IO thread is running
|
||||
# --replication_sql -> SQL thread is running
|
||||
# --replication_seconds_behind_master=n -> less than or equal this seconds of delay
|
||||
# --replication_sql_remaining_delay=n -> less than or equal this seconds of remaining delay
|
||||
# (ref: https://mariadb.com/kb/en/delayed-replication/)
|
||||
replication()
|
||||
{
|
||||
# SHOW REPLICA available 10.5+
|
||||
# https://github.com/koalaman/shellcheck/issues/2383
|
||||
# shellcheck disable=SC2016,SC2026
|
||||
_process_sql -e "SHOW ${repl['all']:+all} REPLICA${repl['all']:+S} ${repl['name']:+'${repl['name']}'} STATUS\G" | \
|
||||
{
|
||||
# required for trim of leading space.
|
||||
shopt -s extglob
|
||||
# Row header
|
||||
read -t 5 -r
|
||||
# read timeout
|
||||
[ $? -gt 128 ] && return 1
|
||||
while IFS=":" read -t 1 -r n v; do
|
||||
# Trim leading space
|
||||
n=${n##+([[:space:]])}
|
||||
# Leading space on all values by the \G format needs to be trimmed.
|
||||
v=${v:1}
|
||||
case "$n" in
|
||||
Slave_IO_Running)
|
||||
if [ -n "${repl['io']}" ] && [ "$v" = 'No' ]; then
|
||||
return 1
|
||||
fi
|
||||
;;
|
||||
Slave_SQL_Running)
|
||||
if [ -n "${repl['sql']}" ] && [ "$v" = 'No' ]; then
|
||||
return 1
|
||||
fi
|
||||
;;
|
||||
Seconds_Behind_Master)
|
||||
# A NULL value is the IO thread not running:
|
||||
if [ -n "${repl['seconds_behind_master']}" ] &&
|
||||
{ [ "$v" = NULL ] ||
|
||||
(( "${repl['seconds_behind_master']}" < "$v" )); }; then
|
||||
return 1
|
||||
fi
|
||||
;;
|
||||
SQL_Remaining_Delay)
|
||||
# Unlike Seconds_Behind_Master, sql_remaining_delay will hit NULL
|
||||
# once replication is caught up - https://mariadb.com/kb/en/delayed-replication/
|
||||
if [ -n "${repl['sql_remaining_delay']}" ] &&
|
||||
[ "$v" != NULL ] &&
|
||||
(( "${repl['sql_remaining_delay']}" < "$v" )); then
|
||||
return 1
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
done
|
||||
# read timeout
|
||||
[ $? -gt 128 ] && return 1
|
||||
return 0
|
||||
}
|
||||
# reachable in command not found(?)
|
||||
# shellcheck disable=SC2317
|
||||
return $?
|
||||
}
|
||||
|
||||
# mariadbupgrade
|
||||
#
|
||||
# Test the lock on the file $datadir/mariadb_upgrade_info
|
||||
# https://jira.mariadb.org/browse/MDEV-27068
|
||||
mariadbupgrade()
|
||||
{
|
||||
local f="$datadir/mariadb_upgrade_info"
|
||||
if [ -r "$f" ]; then
|
||||
flock --exclusive --nonblock -n 9 9<"$f"
|
||||
return $?
|
||||
fi
|
||||
return 0
|
||||
}
|
||||
|
||||
|
||||
# MAIN
|
||||
|
||||
if [ $# -eq 0 ]; then
|
||||
echo "At least one argument required" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
#ENDOFSUBSTITUTIONS
|
||||
# Marks the end of mysql -> mariadb name changes in 10.6+
|
||||
# Global variables used by tests
|
||||
declare -A repl
|
||||
declare -A def
|
||||
nodefaults=
|
||||
datadir=/var/lib/mysql
|
||||
if [ -f $datadir/.my-healthcheck.cnf ]; then
|
||||
def['extra_file']=$datadir/.my-healthcheck.cnf
|
||||
fi
|
||||
|
||||
_repl_param_check()
|
||||
{
|
||||
case "$1" in
|
||||
seconds_behind_master) ;&
|
||||
sql_remaining_delay)
|
||||
if [ -z "${repl['io']}" ]; then
|
||||
repl['io']=1
|
||||
echo "Forcing --replication_io=1, $1 requires IO thread to be running" >&2
|
||||
fi
|
||||
;;
|
||||
all)
|
||||
if [ -n "${repl['name']}" ]; then
|
||||
unset 'repl[name]'
|
||||
echo "Option --replication_all incompatible with specified source --replication_name, clearing replication_name" >&2
|
||||
fi
|
||||
;;
|
||||
name)
|
||||
if [ -n "${repl['all']}" ]; then
|
||||
unset 'repl[all]'
|
||||
echo "Option --replication_name incompatible with --replication_all, clearing replication_all" >&2
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
_test_exists() {
|
||||
declare -F "$1" > /dev/null
|
||||
return $?
|
||||
}
|
||||
|
||||
while [ $# -gt 0 ]; do
|
||||
case "$1" in
|
||||
--su=*)
|
||||
u="${1#*=}"
|
||||
shift
|
||||
exec gosu "${u}" "${BASH_SOURCE[0]}" "$@"
|
||||
;;
|
||||
--su)
|
||||
shift
|
||||
u=$1
|
||||
shift
|
||||
exec gosu "$u" "${BASH_SOURCE[0]}" "$@"
|
||||
;;
|
||||
--su-mysql)
|
||||
shift
|
||||
exec gosu mysql "${BASH_SOURCE[0]}" "$@"
|
||||
;;
|
||||
--replication_*=*)
|
||||
# Change the n to what is between _ and = and make lower case
|
||||
n=${1#*_}
|
||||
n=${n%%=*}
|
||||
n=${n,,*}
|
||||
# v is after the =
|
||||
v=${1#*=}
|
||||
repl[$n]=$v
|
||||
_repl_param_check "$n"
|
||||
;;
|
||||
--replication_*)
|
||||
# Without =, look for a non --option next as the value,
|
||||
# otherwise treat it as an "enable", just equate to 1.
|
||||
# Clearing option is possible with "--replication_X="
|
||||
n=${1#*_}
|
||||
n=${n,,*}
|
||||
if [ "${2:0:2}" == '--' ]; then
|
||||
repl[$n]=1
|
||||
else
|
||||
repl[$n]=$2
|
||||
shift
|
||||
fi
|
||||
_repl_param_check "$n"
|
||||
;;
|
||||
--datadir=*)
|
||||
datadir=${1#*=}
|
||||
;;
|
||||
--datadir)
|
||||
shift
|
||||
datadir=${1}
|
||||
;;
|
||||
--no-defaults)
|
||||
def=()
|
||||
nodefaults=1
|
||||
;;
|
||||
--defaults-file=*|--defaults-extra-file=*|--defaults-group-suffix=*)
|
||||
n=${1:11} # length --defaults-
|
||||
n=${n%%=*}
|
||||
n=${n//-/_}
|
||||
# v is after the =
|
||||
v=${1#*=}
|
||||
def[$n]=$v
|
||||
nodefaults=
|
||||
;;
|
||||
--defaults-file|--defaults-extra-file|--defaults-group-suffix)
|
||||
n=${1:11} # length --defaults-
|
||||
n=${n//-/_}
|
||||
if [ "${2:0:2}" == '--' ]; then
|
||||
def[$n]=""
|
||||
else
|
||||
def[$n]=$2
|
||||
shift
|
||||
fi
|
||||
nodefaults=
|
||||
;;
|
||||
--*)
|
||||
test=${1#--}
|
||||
;;
|
||||
*)
|
||||
echo "Unknown healthcheck option $1" >&2
|
||||
exit 1
|
||||
esac
|
||||
if [ -n "$test" ]; then
|
||||
if ! _test_exists "$test" ; then
|
||||
echo "healthcheck unknown option or test '$test'" >&2
|
||||
exit 1
|
||||
elif ! "$test"; then
|
||||
echo "healthcheck $test failed" >&2
|
||||
exit 1
|
||||
fi
|
||||
test=
|
||||
fi
|
||||
shift
|
||||
done
|
145
mariadb-image.changes
Normal file
145
mariadb-image.changes
Normal file
@ -0,0 +1,145 @@
|
||||
-------------------------------------------------------------------
|
||||
Thu Aug 8 16:48:44 UTC 2024 - Dirk Mueller <dmueller@suse.com>
|
||||
|
||||
- fix PID 1 in mariadb container (patch from Daniel Black)
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Thu Aug 8 16:43:43 UTC 2024 - Dirk Mueller <dmueller@suse.com>
|
||||
|
||||
- remove oci reference annotation again
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Mon Aug 5 11:38:13 UTC 2024 - Dirk Mueller <dmueller@suse.com>
|
||||
|
||||
- add OCI reference annotation
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Sat Aug 3 08:56:51 UTC 2024 - Dirk Mueller <dmueller@suse.com>
|
||||
|
||||
- set OCI.authors attribute instead of deprecated MAINTAINER
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Wed Jul 31 12:06:44 UTC 2024 - Dirk Mueller <dmueller@suse.com>
|
||||
|
||||
- set specific lifecycle url for openSUSE BCI
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Mon Jul 1 18:47:17 UTC 2024 - Alexandre Vicenzi <alexandre.vicenzi@suse.com>
|
||||
|
||||
- add badges to README
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Mon Jun 24 07:10:18 UTC 2024 - Dirk Mueller <dmueller@suse.com>
|
||||
|
||||
- update template for new version
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Tue Jun 18 17:24:16 UTC 2024 - Dirk Mueller <dmueller@suse.com>
|
||||
|
||||
- use sentence style capitalization in READMEs
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Mon Jun 17 08:07:32 UTC 2024 - Dan Čermák <dcermak@suse.com>
|
||||
|
||||
- Use service to set version in docker-entrypoint.sh
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Thu Jun 13 14:30:53 UTC 2024 - Dirk Mueller <dmueller@suse.com>
|
||||
|
||||
- switch to the flavored entrypoint scripts from upstream
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Wed Jun 12 07:10:29 UTC 2024 - Dirk Mueller <dmueller@suse.com>
|
||||
|
||||
- sync entrypoint script with upstream
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Wed Jun 5 15:13:27 UTC 2024 - Dirk Mueller <dmueller@suse.com>
|
||||
|
||||
- Don't add artifacthub labels into labelprefix section
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Wed Jun 5 12:47:13 UTC 2024 - Dan Čermák <dcermak@suse.com>
|
||||
|
||||
- Avoid bashism version check
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Tue Jun 4 12:35:15 UTC 2024 - Alexandre Vicenzi <alexandre.vicenzi@suse.com>
|
||||
|
||||
- Fix grammar mistake in licensing footer
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Thu May 30 08:24:02 UTC 2024 - Dan Čermák <dcermak@suse.com>
|
||||
|
||||
- Fix version string in reference
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Tue May 21 07:34:23 UTC 2024 - Dan Čermák <dcermak@suse.com>
|
||||
|
||||
- Simplify _mariadb_version in entrypoint
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Sat May 18 17:56:27 UTC 2024 - Dan Čermák <dcermak@suse.com>
|
||||
|
||||
- Handle arguments with spaces in mysql_install_db
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Thu May 16 16:20:25 UTC 2024 - Dan Čermák <dcermak@suse.com>
|
||||
|
||||
- install findutils for the containers that need it explicitly
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Wed May 8 16:26:31 UTC 2024 - Dirk Mueller <dmueller@suse.com>
|
||||
|
||||
- README fixes - better titles and follow recommended document structure
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Tue May 7 19:07:24 UTC 2024 - Dirk Mueller <dmueller@suse.com>
|
||||
|
||||
- extend READMEs; correct eula for application images
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Tue May 7 19:03:42 UTC 2024 - Alexandre Vicenzi <alexandre.vicenzi@suse.com>
|
||||
|
||||
- extend README
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Fri Apr 12 12:03:53 UTC 2024 - Dirk Mueller <dmueller@suse.com>
|
||||
|
||||
- Don't wipe everything in /var/log, only remove log files (this omits directories owned by packages)
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Mon Mar 25 12:02:20 UTC 2024 - Alexandre Vicenzi <alexandre.vicenzi@suse.com>
|
||||
|
||||
- add healthcheck script
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Fri Mar 1 07:37:43 UTC 2024 - Dan Čermák <dcermak@suse.com>
|
||||
|
||||
- Update entrypoint: add support for setting memory limits and refactor healthcheck user creation
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Wed Jan 17 14:29:14 UTC 2024 - Dan Čermák <dcermak@suse.com>
|
||||
|
||||
- Add initial README stub
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Sat Jan 6 10:44:23 UTC 2024 - Dirk Mueller <dmueller@suse.com>
|
||||
|
||||
- use openssl to generate passwords securely
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Tue Jan 2 08:26:58 UTC 2024 - Dirk Mueller <dmueller@suse.com>
|
||||
|
||||
- update year to 2024
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Wed Dec 20 15:05:17 UTC 2023 - Dirk Mueller <dmueller@suse.com>
|
||||
|
||||
- set mariadbd as PID 1 in container
|
||||
- add pwgen for MARIADB_RANDOM_ROOT_PASSWORD support
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Mon Oct 16 09:06:38 UTC 2023 - SUSE Update Bot <bci-internal@suse.de>
|
||||
|
||||
- First version of the MariaDB Server BCI
|
Loading…
Reference in New Issue
Block a user