wp/docker-entrypoint.sh
changeset 0 800e4a6ab128
child 1 79bc439970cd
equal deleted inserted replaced
-1:000000000000 0:800e4a6ab128
       
     1 #!/bin/bash
       
     2 set -euo pipefail
       
     3 
       
     4 # usage: file_env VAR [DEFAULT]
       
     5 #    ie: file_env 'XYZ_DB_PASSWORD' 'example'
       
     6 # (will allow for "$XYZ_DB_PASSWORD_FILE" to fill in the value of
       
     7 #  "$XYZ_DB_PASSWORD" from a file, especially for Docker's secrets feature)
       
     8 file_env() {
       
     9 	local var="$1"
       
    10 	local fileVar="${var}_FILE"
       
    11 	local def="${2:-}"
       
    12 	if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then
       
    13 		echo >&2 "error: both $var and $fileVar are set (but are exclusive)"
       
    14 		exit 1
       
    15 	fi
       
    16 	local val="$def"
       
    17 	if [ "${!var:-}" ]; then
       
    18 		val="${!var}"
       
    19 	elif [ "${!fileVar:-}" ]; then
       
    20 		val="$(< "${!fileVar}")"
       
    21 	fi
       
    22 	export "$var"="$val"
       
    23 	unset "$fileVar"
       
    24 }
       
    25 
       
    26 generate_rnd() {
       
    27 	head /dev/urandom | tr -dc A-Za-z0-9 | head -c 64
       
    28 }
       
    29 
       
    30 if [[ "$1" == apache2* ]] || [ "$1" == php-fpm ]; then
       
    31 	if [ "$(id -u)" = '0' ]; then
       
    32 		case "$1" in
       
    33 			apache2*)
       
    34 				user="${APACHE_RUN_USER:-www-data}"
       
    35 				group="${APACHE_RUN_GROUP:-www-data}"
       
    36 
       
    37 				# strip off any '#' symbol ('#1000' is valid syntax for Apache)
       
    38 				pound='#'
       
    39 				user="${user#$pound}"
       
    40 				group="${group#$pound}"
       
    41 				;;
       
    42 			*) # php-fpm
       
    43 				user='www-data'
       
    44 				group='www-data'
       
    45 				;;
       
    46 		esac
       
    47 	else
       
    48 		user="$(id -u)"
       
    49 		group="$(id -g)"
       
    50 	fi
       
    51 
       
    52 	# allow any of these "Authentication Unique Keys and Salts." to be specified via
       
    53 	# environment variables with a "WORDPRESS_" prefix (ie, "WORDPRESS_AUTH_KEY")
       
    54 	uniqueEnvs=(
       
    55 		AUTH_KEY
       
    56 		SECURE_AUTH_KEY
       
    57 		LOGGED_IN_KEY
       
    58 		NONCE_KEY
       
    59 		AUTH_SALT
       
    60 		SECURE_AUTH_SALT
       
    61 		LOGGED_IN_SALT
       
    62 		NONCE_SALT
       
    63 	)
       
    64 	envs=(
       
    65 		WORDPRESS_DB_HOST
       
    66 		WORDPRESS_DB_USER
       
    67 		WORDPRESS_DB_PASSWORD
       
    68 		WORDPRESS_DB_NAME
       
    69 		WORDPRESS_DB_CHARSET
       
    70 		WORDPRESS_DB_COLLATE
       
    71 		"${uniqueEnvs[@]/#/WORDPRESS_}"
       
    72 		WORDPRESS_TABLE_PREFIX
       
    73 		WORDPRESS_DEBUG
       
    74 		WORDPRESS_CONFIG_EXTRA
       
    75 	)
       
    76 	haveConfig=
       
    77 	for e in "${envs[@]}"; do
       
    78 		file_env "$e"
       
    79 		if [ -z "$haveConfig" ] && [ -n "${!e}" ]; then
       
    80 			haveConfig=1
       
    81 		fi
       
    82 	done
       
    83 
       
    84 	# linking backwards-compatibility
       
    85 	if [ -n "${!MYSQL_ENV_MYSQL_*}" ]; then
       
    86 		haveConfig=1
       
    87 		# host defaults to "mysql" below if unspecified
       
    88 		: "${WORDPRESS_DB_USER:=${MYSQL_ENV_MYSQL_USER:-root}}"
       
    89 		if [ "$WORDPRESS_DB_USER" = 'root' ]; then
       
    90 			: "${WORDPRESS_DB_PASSWORD:=${MYSQL_ENV_MYSQL_ROOT_PASSWORD:-}}"
       
    91 		else
       
    92 			: "${WORDPRESS_DB_PASSWORD:=${MYSQL_ENV_MYSQL_PASSWORD:-}}"
       
    93 		fi
       
    94 		: "${WORDPRESS_DB_NAME:=${MYSQL_ENV_MYSQL_DATABASE:-}}"
       
    95 	fi
       
    96 
       
    97 	# TODO : create .env file if needed
       
    98 	if [ ! -e .env ] && [ "$haveConfig" ]; then
       
    99 		: "${WORDPRESS_DB_HOST:=mysql}"
       
   100 		: "${WORDPRESS_DB_USER:=root}"
       
   101 		: "${WORDPRESS_DB_PASSWORD:=}"
       
   102 		: "${WORDPRESS_DB_NAME:=wordpress}"
       
   103 		: "${WORDPRESS_DB_CHARSET:=utf8}"
       
   104 		: "${WORDPRESS_DB_COLLATE:=}"
       
   105 		cat > .env <<-EOF
       
   106 				DB_NAME=${WORDPRESS_DB_NAME}
       
   107 				DB_USER=${WORDPRESS_DB_USER}
       
   108 				DB_PASSWORD=${WORDPRESS_DB_PASSWORD}
       
   109 				DB_HOST=db:3306
       
   110 				WP_HOME=http://localhost:8080
       
   111 				
       
   112 				WP_SITEURL=\${WP_HOME}/wp
       
   113 				WP_ENV=development
       
   114 				
       
   115 				AUTH_KEY='$(generate_rnd)'
       
   116 				SECURE_AUTH_KEY='$(generate_rnd)'
       
   117 				LOGGED_IN_KEY='$(generate_rnd)'
       
   118 				NONCE_KEY='$(generate_rnd)'
       
   119 				AUTH_SALT='$(generate_rnd)'
       
   120 				SECURE_AUTH_SALT='$(generate_rnd)'
       
   121 				LOGGED_IN_SALT='$(generate_rnd)'
       
   122 				NONCE_SALT='$(generate_rnd)'
       
   123 			EOF
       
   124 
       
   125 
       
   126 			chown "$user:$group" .env
       
   127 
       
   128 
       
   129 		if ! TERM=dumb php -- <<'EOPHP'
       
   130 <?php
       
   131 // database might not exist, so let's try creating it (just to be safe)
       
   132 
       
   133 $stderr = fopen('php://stderr', 'w');
       
   134 
       
   135 // https://codex.wordpress.org/Editing_wp-config.php#MySQL_Alternate_Port
       
   136 //   "hostname:port"
       
   137 // https://codex.wordpress.org/Editing_wp-config.php#MySQL_Sockets_or_Pipes
       
   138 //   "hostname:unix-socket-path"
       
   139 list($host, $socket) = explode(':', getenv('WORDPRESS_DB_HOST'), 2);
       
   140 $port = 0;
       
   141 if (is_numeric($socket)) {
       
   142 	$port = (int) $socket;
       
   143 	$socket = null;
       
   144 }
       
   145 $user = getenv('WORDPRESS_DB_USER');
       
   146 $pass = getenv('WORDPRESS_DB_PASSWORD');
       
   147 $dbName = getenv('WORDPRESS_DB_NAME');
       
   148 
       
   149 $maxTries = 10;
       
   150 do {
       
   151 	$mysql = new mysqli($host, $user, $pass, '', $port, $socket);
       
   152 	if ($mysql->connect_error) {
       
   153 		fwrite($stderr, "\n" . 'MySQL Connection Error: (' . $mysql->connect_errno . ') ' . $mysql->connect_error . "\n");
       
   154 		--$maxTries;
       
   155 		if ($maxTries <= 0) {
       
   156 			exit(1);
       
   157 		}
       
   158 		sleep(3);
       
   159 	}
       
   160 } while ($mysql->connect_error);
       
   161 
       
   162 if (!$mysql->query('CREATE DATABASE IF NOT EXISTS `' . $mysql->real_escape_string($dbName) . '`')) {
       
   163 	fwrite($stderr, "\n" . 'MySQL "CREATE DATABASE" Error: ' . $mysql->error . "\n");
       
   164 	$mysql->close();
       
   165 	exit(1);
       
   166 }
       
   167 
       
   168 $mysql->close();
       
   169 EOPHP
       
   170 		then
       
   171 			echo >&2
       
   172 			echo >&2 "WARNING: unable to establish a database connection to '$WORDPRESS_DB_HOST'"
       
   173 			echo >&2 '  continuing anyways (which might have unexpected results)'
       
   174 			echo >&2
       
   175 		fi
       
   176 	fi
       
   177 
       
   178 	# 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)
       
   179 	for e in "${envs[@]}"; do
       
   180 		unset "$e"
       
   181 	done
       
   182 fi
       
   183 
       
   184 #lauch composer if needed
       
   185 if [ ! -d vendor ]; then
       
   186 	composer install
       
   187 fi
       
   188 
       
   189 # first arg is `-f` or `--some-option`
       
   190 if [ "${1#-}" != "$1" ]; then
       
   191 	set -- composer exec wp "$@"
       
   192 fi
       
   193 
       
   194 # if our command is a valid wp-cli subcommand, let's invoke it through wp-cli instead
       
   195 # (this allows for "docker run wordpress:cli help", etc)
       
   196 if composer exec wp --path=/dev/null help "$1" > /dev/null 2>&1; then
       
   197 	set -- composer exec wp "$@"
       
   198 fi
       
   199 
       
   200 
       
   201 exec "$@"