diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..4287f6d --- /dev/null +++ b/Dockerfile @@ -0,0 +1,25 @@ +FROM wordpress:4-php7.2-apache + +# install the PHP extensions we need +RUN set -ex; \ + \ + apt-get update; \ + apt-get install -y \ + libsqlite3-dev \ + unzip \ + ; \ + rm -rf /var/lib/apt/lists/*; \ + \ + docker-php-ext-install gd pdo pdo_sqlite +# TODO consider removing the *-dev deps and only keeping the necessary lib* packages + + +ADD https://downloads.wordpress.org/plugin/sqlite-integration.1.8.1.zip /usr/src/wordpress/wp-content/plugins/ + +RUN unzip /usr/src/wordpress/wp-content/plugins/sqlite-integration.1.8.1.zip -d /usr/src/wordpress/wp-content/plugins/ && \ + rm /usr/src/wordpress/wp-content/plugins/sqlite-integration.1.8.1.zip && \ + cp /usr/src/wordpress/wp-content/plugins/sqlite-integration/db.php /usr/src/wordpress/wp-content/ + +COPY docker-entrypoint.sh /usr/local/bin/ + +ENV WORDPRESS_DB_FILE=database.sqlite diff --git a/Dockerfile.arm32v7 b/Dockerfile.arm32v7 new file mode 100644 index 0000000..8481a74 --- /dev/null +++ b/Dockerfile.arm32v7 @@ -0,0 +1,25 @@ +FROM arm32v7/wordpress:4-php7.2-apache + +# install the PHP extensions we need +RUN set -ex; \ + \ + apt-get update; \ + apt-get install -y \ + libsqlite3-dev \ + unzip \ + ; \ + rm -rf /var/lib/apt/lists/*; \ + \ + docker-php-ext-install gd pdo pdo_sqlite +# TODO consider removing the *-dev deps and only keeping the necessary lib* packages + + +ADD https://downloads.wordpress.org/plugin/sqlite-integration.1.8.1.zip /usr/src/wordpress/wp-content/plugins/ + +RUN unzip /usr/src/wordpress/wp-content/plugins/sqlite-integration.1.8.1.zip -d /usr/src/wordpress/wp-content/plugins/ && \ + rm /usr/src/wordpress/wp-content/plugins/sqlite-integration.1.8.1.zip && \ + cp /usr/src/wordpress/wp-content/plugins/sqlite-integration/db.php /usr/src/wordpress/wp-content/ + +COPY docker-entrypoint.sh /usr/local/bin/ + +ENV WORDPRESS_DB_FILE=database.sqlite diff --git a/Dockerfile.arm64v8 b/Dockerfile.arm64v8 new file mode 100644 index 0000000..7f99c53 --- /dev/null +++ b/Dockerfile.arm64v8 @@ -0,0 +1,25 @@ +FROM arm64v8/wordpress:4-php7.2-apache + +# install the PHP extensions we need +RUN set -ex; \ + \ + apt-get update; \ + apt-get install -y \ + libsqlite3-dev \ + unzip \ + ; \ + rm -rf /var/lib/apt/lists/*; \ + \ + docker-php-ext-install gd pdo pdo_sqlite +# TODO consider removing the *-dev deps and only keeping the necessary lib* packages + + +ADD https://downloads.wordpress.org/plugin/sqlite-integration.1.8.1.zip /usr/src/wordpress/wp-content/plugins/ + +RUN unzip /usr/src/wordpress/wp-content/plugins/sqlite-integration.1.8.1.zip -d /usr/src/wordpress/wp-content/plugins/ && \ + rm /usr/src/wordpress/wp-content/plugins/sqlite-integration.1.8.1.zip && \ + cp /usr/src/wordpress/wp-content/plugins/sqlite-integration/db.php /usr/src/wordpress/wp-content/ + +COPY docker-entrypoint.sh /usr/local/bin/ + +ENV WORDPRESS_DB_FILE=database.sqlite diff --git a/README.md b/README.md index c87f59f..cd2c8f0 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,22 @@ # docker-wordpress-sqlite -Fork from official wordpress-php7-apache, with sqlite plugin. For dev purpose or small memory device like Raspberrypi +Fork from official wordpress4-php7.2-apache, with [sqlite plugin](https://wordpress.org/plugins/sqlite-integration/). For dev purpose or small memory device like Raspberrypi. + +### Tags + +- `latest`: amd64 +- `arm32v7`: Raspberry Pi v2 (not tested) +- `arm64v8`: Raspberry Pi v3 (not tested) + +### How to use this image ? + +Read [official Readme](https://hub.docker.com/r/_/wordpress/). + +Deleted environment variables: `WORDPRESS_DB_*` +Added environment variables: + +- `WORDPRESS_DB_DIR`: location of sqlite file, relative to /var/www/html (default to "database", ie "/var/www/html/database") +- `WORDPRESS_DB_FILE`: name of sqlite file (default to "database.sqlite") + +### MySQL vs SQLite + +Read this article https://darryldias.me/12/my-experience-with-wordpress-sqlite/ \ No newline at end of file diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh new file mode 100755 index 0000000..07611f9 --- /dev/null +++ b/docker-entrypoint.sh @@ -0,0 +1,169 @@ +#!/bin/bash +set -euo pipefail + + +########################################################################################################## +## COPY FROM https://github.com/docker-library/wordpress/blob/master/php7.2/apache/docker-entrypoint.sh ## +########################################################################################################## + + +# 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 + echo >&2 "error: both $var and $fileVar are set (but are exclusive)" + exit 1 + fi + local val="$def" + if [ "${!var:-}" ]; then + val="${!var}" + elif [ "${!fileVar:-}" ]; then + val="$(< "${!fileVar}")" + fi + export "$var"="$val" + unset "$fileVar" +} + +if [[ "$1" == apache2* ]] || [ "$1" == php-fpm ]; then + if ! [ -e index.php -a -e wp-includes/version.php ]; then + echo >&2 "WordPress not found in $PWD - copying now..." + if [ "$(ls -A)" ]; then + echo >&2 "WARNING: $PWD is not empty - press Ctrl+C now if this is an error!" + ( set -x; ls -A; sleep 10 ) + fi + tar cf - --one-file-system -C /usr/src/wordpress . | tar xf - + echo >&2 "Complete! WordPress has been successfully copied to $PWD" + if [ ! -e .htaccess ]; then + # NOTE: The "Indexes" option is disabled in the php:apache base image + cat > .htaccess <<-'EOF' + # BEGIN WordPress + + RewriteEngine On + RewriteBase / + RewriteRule ^index\.php$ - [L] + RewriteCond %{REQUEST_FILENAME} !-f + RewriteCond %{REQUEST_FILENAME} !-d + RewriteRule . /index.php [L] + + # END WordPress + EOF + chown www-data:www-data .htaccess + fi + fi + + # TODO handle WordPress upgrades magically in the same way, but only if wp-includes/version.php's $wp_version is less than /usr/src/wordpress/wp-includes/version.php's $wp_version + + # allow any of these "Authentication Unique Keys and Salts." to be specified via + # environment variables with a "WORDPRESS_" prefix (ie, "WORDPRESS_AUTH_KEY") + uniqueEnvs=( + AUTH_KEY + SECURE_AUTH_KEY + LOGGED_IN_KEY + NONCE_KEY + AUTH_SALT + SECURE_AUTH_SALT + LOGGED_IN_SALT + NONCE_SALT + ) + envs=( + WORDPRESS_DB_DIR + WORDPRESS_DB_FILE + "${uniqueEnvs[@]/#/WORDPRESS_}" + WORDPRESS_DEBUG + ) + haveConfig= + for e in "${envs[@]}"; do + file_env "$e" + if [ -z "$haveConfig" ] && [ -n "${!e}" ]; then + haveConfig=1 + fi + done + # only touch "wp-config.php" if we have environment-supplied configuration values + if [ "$haveConfig" ]; then + : "${WORDPRESS_DB_DIR:=database}" + : "${WORDPRESS_DB_FILE:=database.sqlite}" + + # version 4.4.1 decided to switch to windows line endings, that breaks our seds and awks + # https://github.com/docker-library/wordpress/issues/116 + # https://github.com/WordPress/WordPress/commit/1acedc542fba2482bab88ec70d4bea4b997a92e4 + sed -ri -e 's/\r$//' wp-config* + + if [ ! -e wp-config.php ]; then + awk '/^\/\*.*stop editing.*\*\/$/ && c == 0 { c = 1; system("cat") } { print }' wp-config-sample.php > wp-config.php <<'EOPHP' +// If we're behind a proxy server and using HTTPS, we need to alert Wordpress of that fact +// see also http://codex.wordpress.org/Administration_Over_SSL#Using_a_Reverse_Proxy +if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') { + $_SERVER['HTTPS'] = 'on'; +} +EOPHP + chown www-data:www-data wp-config.php + fi + + # see http://stackoverflow.com/a/2705678/433558 + sed_escape_lhs() { + echo "$@" | sed -e 's/[]\/$*.^|[]/\\&/g' + } + sed_escape_rhs() { + echo "$@" | sed -e 's/[\/&]/\\&/g' + } + php_escape() { + local escaped="$(php -r 'var_export(('"$2"') $argv[1]);' -- "$1")" + if [ "$2" = 'string' ] && [ "${escaped:0:1}" = "'" ]; then + escaped="${escaped//$'\n'/"' + \"\\n\" + '"}" + fi + echo "$escaped" + } + set_config() { + key="$1" + value="$2" + var_type="${3:-string}" + start="(['\"])$(sed_escape_lhs "$key")\2\s*," + end="\);" + if [ "${key:0:1}" = '$' ]; then + start="^(\s*)$(sed_escape_lhs "$key")\s*=" + end=";" + fi + sed -ri -e "s/($start\s*).*($end)$/\1$(sed_escape_rhs "$(php_escape "$value" "$var_type")")\3/" wp-config.php + if (! grep "'$key'" wp-config.php) > /dev/null ; then + SETTINGS_LINE=$(grep wp-settings wp-config.php) + sed -i "s/$SETTINGS_LINE/define('$key',$(sed_escape_rhs "$(php_escape "$value" "$var_type")"));\n$SETTINGS_LINE/g" wp-config.php + fi + } + + set_config 'DB_DIR' "$WORDPRESS_DB_DIR" + set_config 'DB_FILE' "$WORDPRESS_DB_FILE" + set_config 'USE_MYSQL' "0" "integer" + + + for unique in "${uniqueEnvs[@]}"; do + uniqVar="WORDPRESS_$unique" + if [ -n "${!uniqVar}" ]; then + set_config "$unique" "${!uniqVar}" + else + # if not specified, let's generate a random value + currentVal="$(sed -rn -e "s/define\((([\'\"])$unique\2\s*,\s*)(['\"])(.*)\3\);/\4/p" wp-config.php)" + if [ "$currentVal" = 'put your unique phrase here' ]; then + set_config "$unique" "$(head -c1m /dev/urandom | sha1sum | cut -d' ' -f1)" + fi + fi + done + + + if [ "$WORDPRESS_DEBUG" ]; then + set_config 'WP_DEBUG' 1 boolean + fi + + fi + + # now that we're definitely done writing configuration, let's clear out the relevant envrionment variables (so that stray "phpinfo()" calls don't leak secrets from our code) + for e in "${envs[@]}"; do + unset "$e" + done +fi + +exec "$@" \ No newline at end of file