Advertisement
Guest User

Untitled

a guest
Jun 22nd, 2017
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.79 KB | None | 0 0
  1. /usr/local/bin# cat docker-entrypoint.sh
  2. #!/bin/bash
  3. set -euo pipefail
  4.  
  5. # usage: file_env VAR [DEFAULT]
  6. # ie: file_env 'XYZ_DB_PASSWORD' 'example'
  7. # (will allow for "$XYZ_DB_PASSWORD_FILE" to fill in the value of
  8. # "$XYZ_DB_PASSWORD" from a file, especially for Docker's secrets feature)
  9. file_env() {
  10. local var="$1"
  11. local fileVar="${var}_FILE"
  12. local def="${2:-}"
  13. if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then
  14. echo >&2 "error: both $var and $fileVar are set (but are exclusive)"
  15. exit 1
  16. fi
  17. local val="$def"
  18. if [ "${!var:-}" ]; then
  19. val="${!var}"
  20. elif [ "${!fileVar:-}" ]; then
  21. val="$(< "${!fileVar}")"
  22. fi
  23. export "$var"="$val"
  24. unset "$fileVar"
  25. }
  26.  
  27. if [[ "$1" == apache2* ]] || [ "$1" == php-fpm ]; then
  28. if ! [ -e index.php -a -e wp-includes/version.php ]; then
  29. echo >&2 "WordPress not found in $PWD - copying now..."
  30. if [ "$(ls -A)" ]; then
  31. echo >&2 "WARNING: $PWD is not empty - press Ctrl+C now if this is an error!"
  32. ( set -x; ls -A; sleep 10 )
  33. fi
  34. tar cf - --one-file-system -C /usr/src/wordpress . | tar xf -
  35. echo >&2 "Complete! WordPress has been successfully copied to $PWD"
  36. if [ ! -e .htaccess ]; then
  37. # NOTE: The "Indexes" option is disabled in the php:apache base image
  38. cat > .htaccess <<-'EOF'
  39. # BEGIN WordPress
  40. <IfModule mod_rewrite.c>
  41. RewriteEngine On
  42. RewriteBase /
  43. RewriteRule ^index\.php$ - [L]
  44. RewriteCond %{REQUEST_FILENAME} !-f
  45. RewriteCond %{REQUEST_FILENAME} !-d
  46. RewriteRule . /index.php [L]
  47. </IfModule>
  48. # END WordPress
  49. EOF
  50. chown www-data:www-data .htaccess
  51. fi
  52. fi
  53.  
  54. # 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
  55.  
  56. # allow any of these "Authentication Unique Keys and Salts." to be specified via
  57. # environment variables with a "WORDPRESS_" prefix (ie, "WORDPRESS_AUTH_KEY")
  58. uniqueEnvs=(
  59. AUTH_KEY
  60. SECURE_AUTH_KEY
  61. LOGGED_IN_KEY
  62. NONCE_KEY
  63. AUTH_SALT
  64. SECURE_AUTH_SALT
  65. LOGGED_IN_SALT
  66. NONCE_SALT
  67. )
  68. envs=(
  69. WORDPRESS_DB_HOST
  70. WORDPRESS_DB_USER
  71. WORDPRESS_DB_PASSWORD
  72. WORDPRESS_DB_NAME
  73. "${uniqueEnvs[@]/#/WORDPRESS_}"
  74. WORDPRESS_TABLE_PREFIX
  75. WORDPRESS_DEBUG
  76. )
  77. haveConfig=
  78. for e in "${envs[@]}"; do
  79. file_env "$e"
  80. if [ -z "$haveConfig" ] && [ -n "${!e}" ]; then
  81. haveConfig=1
  82. fi
  83. done
  84.  
  85. # linking backwards-compatibility
  86. if [ -n "${!MYSQL_ENV_MYSQL_*}" ]; then
  87. haveConfig=1
  88. # host defaults to "mysql" below if unspecified
  89. : "${WORDPRESS_DB_USER:=${MYSQL_ENV_MYSQL_USER:-root}}"
  90. if [ "$WORDPRESS_DB_USER" = 'root' ]; then
  91. : "${WORDPRESS_DB_PASSWORD:=${MYSQL_ENV_MYSQL_ROOT_PASSWORD:-}}"
  92. else
  93. : "${WORDPRESS_DB_PASSWORD:=${MYSQL_ENV_MYSQL_PASSWORD:-}}"
  94. fi
  95. : "${WORDPRESS_DB_NAME:=${MYSQL_ENV_MYSQL_DATABASE:-}}"
  96. fi
  97.  
  98. # only touch "wp-config.php" if we have environment-supplied configuration values
  99. if [ "$haveConfig" ]; then
  100. : "${WORDPRESS_DB_HOST:=mysql}"
  101. : "${WORDPRESS_DB_USER:=root}"
  102. : "${WORDPRESS_DB_PASSWORD:=}"
  103. : "${WORDPRESS_DB_NAME:=wordpress}"
  104.  
  105. # version 4.4.1 decided to switch to windows line endings, that breaks our seds and awks
  106. # https://github.com/docker-library/wordpress/issues/116
  107. # https://github.com/WordPress/WordPress/commit/1acedc542fba2482bab88ec70d4bea4b997a92e4
  108. sed -ri -e 's/\r$//' wp-config*
  109.  
  110. if [ ! -e wp-config.php ]; then
  111. awk '/^\/\*.*stop editing.*\*\/$/ && c == 0 { c = 1; system("cat") } { print }' wp-config-sample.php > wp-config.php <<'EOPHP'
  112. // If we're behind a proxy server and using HTTPS, we need to alert Wordpress of that fact
  113. // see also http://codex.wordpress.org/Administration_Over_SSL#Using_a_Reverse_Proxy
  114. if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
  115. $_SERVER['HTTPS'] = 'on';
  116. }
  117.  
  118. EOPHP
  119. chown www-data:www-data wp-config.php
  120. fi
  121.  
  122. # see http://stackoverflow.com/a/2705678/433558
  123. sed_escape_lhs() {
  124. echo "$@" | sed -e 's/[]\/$*.^|[]/\\&/g'
  125. }
  126. sed_escape_rhs() {
  127. echo "$@" | sed -e 's/[\/&]/\\&/g'
  128. }
  129. php_escape() {
  130. php -r 'var_export(('$2') $argv[1]);' -- "$1"
  131. }
  132. set_config() {
  133. key="$1"
  134. value="$2"
  135. var_type="${3:-string}"
  136. start="(['\"])$(sed_escape_lhs "$key")\2\s*,"
  137. end="\);"
  138. if [ "${key:0:1}" = '$' ]; then
  139. start="^(\s*)$(sed_escape_lhs "$key")\s*="
  140. end=";"
  141. fi
  142. sed -ri -e "s/($start\s*).*($end)$/\1$(sed_escape_rhs "$(php_escape "$value" "$var_type")")\3/" wp-config.php
  143. }
  144.  
  145. set_config 'DB_HOST' "$WORDPRESS_DB_HOST"
  146. set_config 'DB_USER' "$WORDPRESS_DB_USER"
  147. set_config 'DB_PASSWORD' "$WORDPRESS_DB_PASSWORD"
  148. set_config 'DB_NAME' "$WORDPRESS_DB_NAME"
  149.  
  150. for unique in "${uniqueEnvs[@]}"; do
  151. uniqVar="WORDPRESS_$unique"
  152. if [ -n "${!uniqVar}" ]; then
  153. set_config "$unique" "${!uniqVar}"
  154. else
  155. # if not specified, let's generate a random value
  156. currentVal="$(sed -rn -e "s/define\((([\'\"])$unique\2\s*,\s*)(['\"])(.*)\3\);/\4/p" wp-config.php)"
  157. if [ "$currentVal" = 'put your unique phrase here' ]; then
  158. set_config "$unique" "$(head -c1m /dev/urandom | sha1sum | cut -d' ' -f1)"
  159. fi
  160. fi
  161. done
  162.  
  163. if [ "$WORDPRESS_TABLE_PREFIX" ]; then
  164. set_config '$table_prefix' "$WORDPRESS_TABLE_PREFIX"
  165. fi
  166.  
  167. if [ "$WORDPRESS_DEBUG" ]; then
  168. set_config 'WP_DEBUG' 1 boolean
  169. fi
  170.  
  171. TERM=dumb php -- <<'EOPHP'
  172. <?php
  173. // database might not exist, so let's try creating it (just to be safe)
  174.  
  175. $stderr = fopen('php://stderr', 'w');
  176.  
  177. // https://codex.wordpress.org/Editing_wp-config.php#MySQL_Alternate_Port
  178. // "hostname:port"
  179. // https://codex.wordpress.org/Editing_wp-config.php#MySQL_Sockets_or_Pipes
  180. // "hostname:unix-socket-path"
  181. list($host, $socket) = explode(':', getenv('WORDPRESS_DB_HOST'), 2);
  182. $port = 0;
  183. if (is_numeric($socket)) {
  184. $port = (int) $socket;
  185. $socket = null;
  186. }
  187. $user = getenv('WORDPRESS_DB_USER');
  188. $pass = getenv('WORDPRESS_DB_PASSWORD');
  189. $dbName = getenv('WORDPRESS_DB_NAME');
  190.  
  191. $maxTries = 10;
  192. do {
  193. $mysql = new mysqli($host, $user, $pass, '', $port, $socket);
  194. if ($mysql->connect_error) {
  195. fwrite($stderr, "\n" . 'MySQL Connection Error: (' . $mysql->connect_errno . ') ' . $mysql->connect_error . "\n");
  196. --$maxTries;
  197. if ($maxTries <= 0) {
  198. exit(1);
  199. }
  200. sleep(3);
  201. }
  202. } while ($mysql->connect_error);
  203.  
  204. if (!$mysql->query('CREATE DATABASE IF NOT EXISTS `' . $mysql->real_escape_string($dbName) . '`')) {
  205. fwrite($stderr, "\n" . 'MySQL "CREATE DATABASE" Error: ' . $mysql->error . "\n");
  206. $mysql->close();
  207. exit(1);
  208. }
  209.  
  210. $mysql->close();
  211. EOPHP
  212. fi
  213.  
  214. # 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)
  215. for e in "${envs[@]}"; do
  216. unset "$e"
  217. done
  218. fi
  219.  
  220. exec "$@"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement