From 18afafd96b3bff0bc687268613c0ad3549041b9a Mon Sep 17 00:00:00 2001 From: Tianon Gravi Date: Mon, 24 Jul 2023 16:08:25 -0700 Subject: [PATCH 1/3] Add very crude parsing of "repomd.xml" This gives us more accurate version scraping that's not reliant on the cache of the HTML file listing (which instead matches how `yum`/`dnf` query these version numbers, so should stay in sync better). This should fix our issues with CI sometimes returning a mismatch in 8.0 versions. **However**, this *causes* a mismatch in 5.7 versions because the latest 5.7 release (that we were not picking up before due to the aforementioned HTML caching but are now with this updated code) is apparently not built/released for Debian (https://dev.mysql.com/downloads/mysql/), so we also need to decide whether we're going to introduce Debian/Oracle version skew or perhaps deprecate/remove the Debian variants of 5.7 (which is ostensibly EOL in ~3 months). --- versions.sh | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/versions.sh b/versions.sh index 3f8fa0fc6..9814a3155 100755 --- a/versions.sh +++ b/versions.sh @@ -23,7 +23,28 @@ fetch_rpm_versions() { local oracleVersion="$1"; shift local package="$1"; shift - curl -fsSL "$repo/$arch/" 2>/dev/null \ + local baseurl="$repo/$arch" + + # *technically*, we should parse "repodata/repomd.xml", look for , and use the value out of it, but parsing XML is not trivial with only basic tools, it turns out, so instead we rely on MySQL's use of "*-primary.xml.*" as the filename we're after 👀 + local primaryLocation + primaryLocation="$( + # 2>/dev/null in case "$arch" doesn't exist in "$repo" 🙈 + curl -fsSL "$baseurl/repodata/repomd.xml" 2>/dev/null \ + | grep -oE 'href="[^"]+-primary[.]xml([.]gz)?"' \ + | cut -d'"' -f2 + )" || return 1 + [ -n "$primaryLocation" ] || return 1 + + local decompressor='cat' + case "$primaryLocation" in + *.gz) decompressor='gunzip' ;; + *.xml) ;; + *) echo >&2 "error: unknown compression (from '$baseurl'): $primaryLocation"; exit 1 ;; + esac + + # again, *technically* we should properly parse XML here, but y'know, it's complicated + curl -fsSL "$baseurl/$primaryLocation" \ + | "$decompressor" \ | grep -oE '"'"$package"'-[0-9][^"]+[.]el'"$oracleVersion"'[.]'"$arch"'[.]rpm"' \ | sed -r 's/^"'"$package-|[.]$arch[.]rpm"'"$//g' \ | sort -rV @@ -111,6 +132,10 @@ for version in "${versions[@]}"; do export bashbrewArch doc="$(jq <<<"$doc" -c '.oracle.architectures = (.oracle.architectures + [ env.bashbrewArch ] | sort)')" done + if [ -z "$rpmVersion" ]; then + echo >&2 "error: missing version for '$version'" + exit 1 + fi baseVersion="$(jq <<<"$doc" -r '.version // ""')" # example 8.0.22-1.el7 => 8.0.22 oracleBaseVersion="${rpmVersion%-*}" From eb1850601849ef7ef77a23f017a20debc95d597c Mon Sep 17 00:00:00 2001 From: Tianon Gravi Date: Thu, 27 Jul 2023 14:49:47 -0700 Subject: [PATCH 2/3] Add innovation (8.1.0) --- generate-stackbrew-library.sh | 12 +- innovation/Dockerfile.oracle | 122 +++++++++ innovation/docker-entrypoint.sh | 437 ++++++++++++++++++++++++++++++++ versions.json | 14 + versions.sh | 1 - 5 files changed, 580 insertions(+), 6 deletions(-) create mode 100644 innovation/Dockerfile.oracle create mode 100755 innovation/docker-entrypoint.sh diff --git a/generate-stackbrew-library.sh b/generate-stackbrew-library.sh index cbf4cecc1..8c01d4ac7 100755 --- a/generate-stackbrew-library.sh +++ b/generate-stackbrew-library.sh @@ -3,7 +3,7 @@ set -Eeuo pipefail declare -A aliases=( [5.7]='5' - [8.0]='8 latest' + [innovation]='latest' ) defaultDefaultVariant='oracle' @@ -73,13 +73,15 @@ for version; do versionAliases+=( $fullVersion ) fullVersion="${fullVersion%[.-]*}" done - versionAliases+=( - $version - ${aliases[$version]:-} - ) + versionAliases+=( $fullVersion ) + if [ "$version" != "$fullVersion" ]; then + versionAliases+=( $version ) + fi + versionAliases+=( ${aliases[$version]:-} ) for variant in oracle debian; do df="Dockerfile.$variant" + [ -s "$version/$df" ] || continue commit="$(dirCommit "$version" "$df")" variantAliases=( "${versionAliases[@]/%/-$variant}" ) diff --git a/innovation/Dockerfile.oracle b/innovation/Dockerfile.oracle new file mode 100644 index 000000000..f6cff6f6b --- /dev/null +++ b/innovation/Dockerfile.oracle @@ -0,0 +1,122 @@ +# +# NOTE: THIS DOCKERFILE IS GENERATED VIA "apply-templates.sh" +# +# PLEASE DO NOT EDIT IT DIRECTLY. +# + +FROM oraclelinux:8-slim + +RUN set -eux; \ + groupadd --system --gid 999 mysql; \ + useradd --system --uid 999 --gid 999 --home-dir /var/lib/mysql --no-create-home mysql + +# add gosu for easy step-down from root +# https://github.com/tianon/gosu/releases +ENV GOSU_VERSION 1.16 +RUN set -eux; \ +# TODO find a better userspace architecture detection method than querying the kernel + arch="$(uname -m)"; \ + case "$arch" in \ + aarch64) gosuArch='arm64' ;; \ + x86_64) gosuArch='amd64' ;; \ + *) echo >&2 "error: unsupported architecture: '$arch'"; exit 1 ;; \ + esac; \ + curl -fL -o /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$gosuArch.asc"; \ + curl -fL -o /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$gosuArch"; \ + export GNUPGHOME="$(mktemp -d)"; \ + gpg --batch --keyserver hkps://keys.openpgp.org --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4; \ + gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu; \ + rm -rf "$GNUPGHOME" /usr/local/bin/gosu.asc; \ + chmod +x /usr/local/bin/gosu; \ + gosu --version; \ + gosu nobody true + +RUN set -eux; \ + microdnf install -y \ + bzip2 \ + gzip \ + openssl \ + xz \ + zstd \ +# Oracle Linux 8+ is very slim :) + findutils \ + ; \ + microdnf clean all + +RUN set -eux; \ +# https://dev.mysql.com/doc/refman/8.0/en/checking-gpg-signature.html +# gpg: key 3A79BD29: public key "MySQL Release Engineering " imported + key='859BE8D7C586F538430B19C2467B942D3A79BD29'; \ + export GNUPGHOME="$(mktemp -d)"; \ + gpg --batch --keyserver keyserver.ubuntu.com --recv-keys "$key"; \ + gpg --batch --export --armor "$key" > /etc/pki/rpm-gpg/RPM-GPG-KEY-mysql; \ + rm -rf "$GNUPGHOME" + +ENV MYSQL_MAJOR innovation +ENV MYSQL_VERSION 8.1.0-1.el8 + +RUN set -eu; \ + . /etc/os-release; \ + { \ + echo '[mysqlinnovation-server-minimal]'; \ + echo 'name=MySQL innovation Server Minimal'; \ + echo 'enabled=1'; \ + echo "baseurl=https://repo.mysql.com/yum/mysql-innovation-community/docker/el/${VERSION_ID%%[.-]*}/\$basearch/"; \ + echo 'gpgcheck=1'; \ + echo 'gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql'; \ +# https://github.com/docker-library/mysql/pull/680#issuecomment-825930524 + echo 'module_hotfixes=true'; \ + } | tee /etc/yum.repos.d/mysql-community-minimal.repo + +RUN set -eux; \ + microdnf install -y "mysql-community-server-minimal-$MYSQL_VERSION"; \ + microdnf clean all; \ +# the "socket" value in the Oracle packages is set to "/var/lib/mysql" which isn't a great place for the socket (we want it in "/var/run/mysqld" instead) +# https://github.com/docker-library/mysql/pull/680#issuecomment-636121520 + grep -F 'socket=/var/lib/mysql/mysql.sock' /etc/my.cnf; \ + sed -i 's!^socket=.*!socket=/var/run/mysqld/mysqld.sock!' /etc/my.cnf; \ + grep -F 'socket=/var/run/mysqld/mysqld.sock' /etc/my.cnf; \ + { echo '[client]'; echo 'socket=/var/run/mysqld/mysqld.sock'; } >> /etc/my.cnf; \ + \ +# make sure users dumping files in "/etc/mysql/conf.d" still works + ! grep -F '!includedir' /etc/my.cnf; \ + { echo; echo '!includedir /etc/mysql/conf.d/'; } >> /etc/my.cnf; \ + mkdir -p /etc/mysql/conf.d; \ +# ensure these directories exist and have useful permissions +# the rpm package has different opinions on the mode of `/var/run/mysqld`, so this needs to be after install + mkdir -p /var/lib/mysql /var/run/mysqld; \ + chown mysql:mysql /var/lib/mysql /var/run/mysqld; \ +# ensure that /var/run/mysqld (used for socket and lock files) is writable regardless of the UID our mysqld instance ends up having at runtime + chmod 1777 /var/lib/mysql /var/run/mysqld; \ + \ + mkdir /docker-entrypoint-initdb.d; \ + \ + mysqld --version; \ + mysql --version + +RUN set -eu; \ + . /etc/os-release; \ + { \ + echo '[mysql-tools-community]'; \ + echo 'name=MySQL Tools Community'; \ + echo "baseurl=https://repo.mysql.com/yum/mysql-tools-community/el/${VERSION_ID%%[.-]*}/\$basearch/"; \ + echo 'enabled=1'; \ + echo 'gpgcheck=1'; \ + echo 'gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql'; \ +# https://github.com/docker-library/mysql/pull/680#issuecomment-825930524 + echo 'module_hotfixes=true'; \ + } | tee /etc/yum.repos.d/mysql-community-tools.repo +ENV MYSQL_SHELL_VERSION 8.0.34-1.el8 +RUN set -eux; \ + microdnf install -y "mysql-shell-$MYSQL_SHELL_VERSION"; \ + microdnf clean all; \ + \ + mysqlsh --version + +VOLUME /var/lib/mysql + +COPY docker-entrypoint.sh /usr/local/bin/ +ENTRYPOINT ["docker-entrypoint.sh"] + +EXPOSE 3306 33060 +CMD ["mysqld"] diff --git a/innovation/docker-entrypoint.sh b/innovation/docker-entrypoint.sh new file mode 100755 index 000000000..6ce3baea8 --- /dev/null +++ b/innovation/docker-entrypoint.sh @@ -0,0 +1,437 @@ +#!/bin/bash +set -eo pipefail +shopt -s nullglob + +# logging functions +mysql_log() { + local type="$1"; shift + # accept argument string or stdin + local text="$*"; if [ "$#" -eq 0 ]; then text="$(cat)"; fi + local dt; dt="$(date --rfc-3339=seconds)" + printf '%s [%s] [Entrypoint]: %s\n' "$dt" "$type" "$text" +} +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" +} + +# 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[@]}" + 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" + . "$f" + fi + ;; + *.sql) mysql_note "$0: running $f"; docker_process_sql < "$f"; echo ;; + *.sql.bz2) mysql_note "$0: running $f"; bunzip2 -c "$f" | docker_process_sql; 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 "mysqld --verbose --help" successfully (used for testing configuration validity and for extracting default/configured values) +_verboseHelpArgs=( + --verbose --help + --log-bin-index="$(mktemp -u)" # https://github.com/docker-library/mysql/issues/136 +) + +mysql_check_config() { + local toRun=( "$@" "${_verboseHelpArgs[@]}" ) errors + if ! errors="$("${toRun[@]}" 2>&1 >/dev/null)"; then + mysql_error $'mysqld failed while attempting to check config\n\tcommand was: '"${toRun[*]}"$'\n\t'"$errors" + fi +} + +# Fetch value from server config +# We use mysqld --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)" +} + +# Ensure that the package default socket can also be used +# since rpm packages are compiled with a different socket location +# and "mysqlsh --mysql" doesn't read the [client] config +# related to https://github.com/docker-library/mysql/issues/829 +mysql_socket_fix() { + local defaultSocket + defaultSocket="$(mysql_get_config 'socket' mysqld --no-defaults)" + if [ "$defaultSocket" != "$SOCKET" ]; then + ln -sfTv "$SOCKET" "$defaultSocket" || : + fi +} + +# Do a temporary startup of the MySQL server, for init purposes +docker_temp_server_start() { + if [ "${MYSQL_MAJOR}" = '5.7' ]; then + "$@" --skip-networking --default-time-zone=SYSTEM --socket="${SOCKET}" & + mysql_note "Waiting for server startup" + local i + for i in {30..0}; do + # 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 + if docker_process_sql "${extraArgs[@]}" --database=mysql <<<'SELECT 1' &> /dev/null; then + break + fi + sleep 1 + done + if [ "$i" = 0 ]; then + mysql_error "Unable to start server." + fi + else + # For 5.7+ the server is ready for use as soon as startup command unblocks + if ! "$@" --daemonize --skip-networking --default-time-zone=SYSTEM --socket="${SOCKET}"; then + mysql_error "Unable to start server." + fi + fi +} + +# Stop the server. When using a local socket file mysqladmin will block until +# the shutdown is complete. +docker_temp_server_stop() { + if ! mysqladmin --defaults-extra-file=<( _mysql_passfile ) shutdown -uroot --socket="${SOCKET}"; then + mysql_error "Unable to shut down server." + fi +} + +# Verify that the minimally required password settings are set for new databases. +docker_verify_minimum_env() { + if [ -z "$MYSQL_ROOT_PASSWORD" -a -z "$MYSQL_ALLOW_EMPTY_PASSWORD" -a -z "$MYSQL_RANDOM_ROOT_PASSWORD" ]; then + mysql_error <<-'EOF' + Database is uninitialized and password option is not specified + You need to specify one of the following as an environment variable: + - MYSQL_ROOT_PASSWORD + - MYSQL_ALLOW_EMPTY_PASSWORD + - MYSQL_RANDOM_ROOT_PASSWORD + EOF + fi + + # This will prevent the CREATE USER from failing (and thus exiting with a half-initialized database) + if [ "$MYSQL_USER" = 'root' ]; then + mysql_error <<-'EOF' + MYSQL_USER="root", MYSQL_USER and MYSQL_PASSWORD are for configuring a regular user and cannot be used for the root user + Remove MYSQL_USER="root" and use one of the following to control the root user password: + - MYSQL_ROOT_PASSWORD + - MYSQL_ALLOW_EMPTY_PASSWORD + - MYSQL_RANDOM_ROOT_PASSWORD + EOF + fi + + # warn when missing one of MYSQL_USER or MYSQL_PASSWORD + if [ -n "$MYSQL_USER" ] && [ -z "$MYSQL_PASSWORD" ]; then + mysql_warn 'MYSQL_USER specified, but missing MYSQL_PASSWORD; MYSQL_USER will not be created' + elif [ -z "$MYSQL_USER" ] && [ -n "$MYSQL_PASSWORD" ]; then + mysql_warn 'MYSQL_PASSWORD specified, but missing MYSQL_USER; MYSQL_PASSWORD will be ignored' + 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)" + + local -A dirs=( ["$DATADIR"]=1 ) + local dir + dir="$(dirname "$SOCKET")" + dirs["$dir"]=1 + + # "datadir" and "socket" are already handled above (since they were already queried previously) + local conf + for conf in \ + general-log-file \ + keyring_file_data \ + pid-file \ + secure-file-priv \ + slow-query-log-file \ + ; do + dir="$(mysql_get_config "$conf" "$@")" + + # skip empty values + if [ -z "$dir" ] || [ "$dir" = 'NULL' ]; then + continue + fi + case "$conf" in + secure-file-priv) + # already points at a directory + ;; + *) + # other config options point at a file, but we need the directory + dir="$(dirname "$dir")" + ;; + esac + + dirs["$dir"]=1 + done + + mkdir -p "${!dirs[@]}" + + if [ "$user" = "0" ]; then + # this will cause less disk access than `chown -R` + find "${!dirs[@]}" \! -user mysql -exec chown --no-dereference mysql '{}' + + fi +} + +# initializes the database directory +docker_init_database_dir() { + mysql_note "Initializing database files" + "$@" --initialize-insecure --default-time-zone=SYSTEM + 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 + DATADIR="$(mysql_get_config 'datadir' "$@")" + SOCKET="$(mysql_get_config 'socket' "$@")" + + # Initialize values that might be stored in a file + file_env 'MYSQL_ROOT_HOST' '%' + file_env 'MYSQL_DATABASE' + file_env 'MYSQL_USER' + file_env 'MYSQL_PASSWORD' + file_env 'MYSQL_ROOT_PASSWORD' + + declare -g DATABASE_ALREADY_EXISTS + if [ -d "$DATADIR/mysql" ]; then + DATABASE_ALREADY_EXISTS='true' + fi +} + +# 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 /dev/null + + docker_init_database_dir "$@" + + mysql_note "Starting temporary server" + docker_temp_server_start "$@" + mysql_note "Temporary server started." + + mysql_socket_fix + docker_setup_db + docker_process_init_files /docker-entrypoint-initdb.d/* + + mysql_expire_root_user + + mysql_note "Stopping temporary server" + docker_temp_server_stop + mysql_note "Temporary server stopped" + + echo + mysql_note "MySQL init process done. Ready for start up." + echo + else + mysql_socket_fix + fi + fi + exec "$@" +} + +# If we are sourced from elsewhere, don't perform any further actions +if ! _is_sourced; then + _main "$@" +fi diff --git a/versions.json b/versions.json index cc0ac3d47..4aa4457d5 100644 --- a/versions.json +++ b/versions.json @@ -39,5 +39,19 @@ "version": "8.0.34-1.el8" }, "version": "8.0.34" + }, + "innovation": { + "mysql-shell": { + "version": "8.0.34-1.el8" + }, + "oracle": { + "architectures": [ + "amd64", + "arm64v8" + ], + "variant": "8-slim", + "version": "8.1.0-1.el8" + }, + "version": "8.1.0" } } diff --git a/versions.sh b/versions.sh index 9814a3155..8f5a2054b 100755 --- a/versions.sh +++ b/versions.sh @@ -110,7 +110,6 @@ for version in "${versions[@]}"; do rpmRepo="https://repo.mysql.com/yum/mysql-$version-community/docker/el/$oracleVersion" archVersions="$( fetch_rpm_versions "$rpmRepo" "$rpmArch" "$oracleVersion" 'mysql-community-server-minimal' \ - | grep -E "^$version[.]" \ || : )" archVersion="$(head -1 <<<"$archVersions")" From c13cda9c2c9d836af9b3331e8681f8cc8e0a7803 Mon Sep 17 00:00:00 2001 From: Tianon Gravi Date: Thu, 27 Jul 2023 14:56:07 -0700 Subject: [PATCH 3/3] Update 5.7 to 5.7.43, dropping Debian support Upstream no longer supports Debian for the 5.7 series, so we follow suit. --- 5.7/Dockerfile.debian | 100 ------------------------------------------ 5.7/Dockerfile.oracle | 2 +- apply-templates.sh | 2 + versions.json | 11 +---- versions.sh | 5 ++- 5 files changed, 8 insertions(+), 112 deletions(-) delete mode 100644 5.7/Dockerfile.debian diff --git a/5.7/Dockerfile.debian b/5.7/Dockerfile.debian deleted file mode 100644 index 8153f43d7..000000000 --- a/5.7/Dockerfile.debian +++ /dev/null @@ -1,100 +0,0 @@ -# -# NOTE: THIS DOCKERFILE IS GENERATED VIA "apply-templates.sh" -# -# PLEASE DO NOT EDIT IT DIRECTLY. -# - -FROM debian:buster-slim - -# add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added -RUN groupadd -r mysql && useradd -r -g mysql mysql - -RUN apt-get update && apt-get install -y --no-install-recommends gnupg && rm -rf /var/lib/apt/lists/* - -# add gosu for easy step-down from root -# https://github.com/tianon/gosu/releases -ENV GOSU_VERSION 1.16 -RUN set -eux; \ - savedAptMark="$(apt-mark showmanual)"; \ - apt-get update; \ - apt-get install -y --no-install-recommends ca-certificates wget; \ - rm -rf /var/lib/apt/lists/*; \ - dpkgArch="$(dpkg --print-architecture | awk -F- '{ print $NF }')"; \ - wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch"; \ - wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch.asc"; \ - export GNUPGHOME="$(mktemp -d)"; \ - gpg --batch --keyserver hkps://keys.openpgp.org --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4; \ - gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu; \ - gpgconf --kill all; \ - rm -rf "$GNUPGHOME" /usr/local/bin/gosu.asc; \ - apt-mark auto '.*' > /dev/null; \ - [ -z "$savedAptMark" ] || apt-mark manual $savedAptMark > /dev/null; \ - apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; \ - chmod +x /usr/local/bin/gosu; \ - gosu --version; \ - gosu nobody true - -RUN mkdir /docker-entrypoint-initdb.d - -RUN set -eux; \ - apt-get update; \ - apt-get install -y --no-install-recommends \ - bzip2 \ - openssl \ -# FATAL ERROR: please install the following Perl modules before executing /usr/local/mysql/scripts/mysql_install_db: -# File::Basename -# File::Copy -# Sys::Hostname -# Data::Dumper - perl \ - xz-utils \ - zstd \ - ; \ - rm -rf /var/lib/apt/lists/* - -RUN set -eux; \ -# gpg: key 3A79BD29: public key "MySQL Release Engineering " imported - key='859BE8D7C586F538430B19C2467B942D3A79BD29'; \ - export GNUPGHOME="$(mktemp -d)"; \ - gpg --batch --keyserver keyserver.ubuntu.com --recv-keys "$key"; \ - mkdir -p /etc/apt/keyrings; \ - gpg --batch --export "$key" > /etc/apt/keyrings/mysql.gpg; \ - gpgconf --kill all; \ - rm -rf "$GNUPGHOME" - -ENV MYSQL_MAJOR 5.7 -ENV MYSQL_VERSION 5.7.42-1debian10 - -RUN echo 'deb [ signed-by=/etc/apt/keyrings/mysql.gpg ] http://repo.mysql.com/apt/debian/ buster mysql-5.7' > /etc/apt/sources.list.d/mysql.list - -# the "/var/lib/mysql" stuff here is because the mysql-server postinst doesn't have an explicit way to disable the mysql_install_db codepath besides having a database already "configured" (ie, stuff in /var/lib/mysql/mysql) -# also, we set debconf keys to make APT a little quieter -RUN { \ - echo mysql-community-server mysql-community-server/data-dir select ''; \ - echo mysql-community-server mysql-community-server/root-pass password ''; \ - echo mysql-community-server mysql-community-server/re-root-pass password ''; \ - echo mysql-community-server mysql-community-server/remove-test-db select false; \ - } | debconf-set-selections \ - && apt-get update \ - && apt-get install -y \ - mysql-server="${MYSQL_VERSION}" \ -# comment out a few problematic configuration values - && find /etc/mysql/ -name '*.cnf' -print0 \ - | xargs -0 grep -lZE '^(bind-address|log)' \ - | xargs -rt -0 sed -Ei 's/^(bind-address|log)/#&/' \ -# don't reverse lookup hostnames, they are usually another container - && echo '[mysqld]\nskip-host-cache\nskip-name-resolve' > /etc/mysql/conf.d/docker.cnf \ - && rm -rf /var/lib/apt/lists/* \ - && rm -rf /var/lib/mysql && mkdir -p /var/lib/mysql /var/run/mysqld \ - && chown -R mysql:mysql /var/lib/mysql /var/run/mysqld \ -# ensure that /var/run/mysqld (used for socket and lock files) is writable regardless of the UID our mysqld instance ends up having at runtime - && chmod 1777 /var/run/mysqld /var/lib/mysql - -VOLUME /var/lib/mysql - -COPY docker-entrypoint.sh /usr/local/bin/ -RUN ln -s usr/local/bin/docker-entrypoint.sh /entrypoint.sh # backwards compat -ENTRYPOINT ["docker-entrypoint.sh"] - -EXPOSE 3306 33060 -CMD ["mysqld"] diff --git a/5.7/Dockerfile.oracle b/5.7/Dockerfile.oracle index 38169b98e..07a3a703f 100644 --- a/5.7/Dockerfile.oracle +++ b/5.7/Dockerfile.oracle @@ -53,7 +53,7 @@ RUN set -eux; \ rm -rf "$GNUPGHOME" ENV MYSQL_MAJOR 5.7 -ENV MYSQL_VERSION 5.7.42-1.el7 +ENV MYSQL_VERSION 5.7.43-1.el7 RUN set -eu; \ . /etc/os-release; \ diff --git a/apply-templates.sh b/apply-templates.sh index 05db7e521..ee553ff8f 100755 --- a/apply-templates.sh +++ b/apply-templates.sh @@ -32,6 +32,8 @@ generated_warning() { for version; do export version + rm -f "$version"/Dockerfile.* + for variant in oracle debian; do export variant diff --git a/versions.json b/versions.json index 4aa4457d5..b5a8fad25 100644 --- a/versions.json +++ b/versions.json @@ -1,12 +1,5 @@ { "5.7": { - "debian": { - "architectures": [ - "amd64" - ], - "suite": "buster", - "version": "5.7.42-1debian10" - }, "mysql-shell": { "version": "8.0.34-1.el7" }, @@ -15,9 +8,9 @@ "amd64" ], "variant": "7-slim", - "version": "5.7.42-1.el7" + "version": "5.7.43-1.el7" }, - "version": "5.7.42" + "version": "5.7.43" }, "8.0": { "debian": { diff --git a/versions.sh b/versions.sh index 8f5a2054b..a76f2b1a7 100755 --- a/versions.sh +++ b/versions.sh @@ -54,7 +54,7 @@ cd "$(dirname "$(readlink -f "$BASH_SOURCE")")" versions=( "$@" ) if [ ${#versions[@]} -eq 0 ]; then - versions=( *.*/ ) + versions=( */ ) json='{}' else json="$(< versions.json)" @@ -62,11 +62,12 @@ fi versions=( "${versions[@]%/}" ) for version in "${versions[@]}"; do + [ "$version" != 'template' ] || continue export version doc='{}' - if [[ "$version" == 5.* ]] || [ "$version" = '8.0' ]; then + if [ "$version" = '8.0' ]; then debianSuite="${debianSuites[$version]:-$defaultDebianSuite}" debianVersion="$( curl -fsSL "https://repo.mysql.com/apt/debian/dists/$debianSuite/mysql-$version/binary-amd64/Packages.gz" \