docker-entrypoint.sh 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. #!/bin/bash
  2. set -e
  3. if [[ "$1" == apache2* ]] || [ "$1" == php-fpm ]; then
  4. : "${WORDPRESS_DB_HOST:=mysql}"
  5. # if we're linked to MySQL and thus have credentials already, let's use them
  6. : ${WORDPRESS_DB_USER:=${MYSQL_ENV_MYSQL_USER:-root}}
  7. if [ "$WORDPRESS_DB_USER" = 'root' ]; then
  8. : ${WORDPRESS_DB_PASSWORD:=$MYSQL_ENV_MYSQL_ROOT_PASSWORD}
  9. fi
  10. : ${WORDPRESS_DB_PASSWORD:=$MYSQL_ENV_MYSQL_PASSWORD}
  11. : ${WORDPRESS_DB_NAME:=${MYSQL_ENV_MYSQL_DATABASE:-wordpress}}
  12. if [ -z "$WORDPRESS_DB_PASSWORD" ]; then
  13. echo >&2 'error: missing required WORDPRESS_DB_PASSWORD environment variable'
  14. echo >&2 ' Did you forget to -e WORDPRESS_DB_PASSWORD=... ?'
  15. echo >&2
  16. echo >&2 ' (Also of interest might be WORDPRESS_DB_USER and WORDPRESS_DB_NAME.)'
  17. exit 1
  18. fi
  19. if ! [ -e index.php -a -e wp-includes/version.php ]; then
  20. echo >&2 "WordPress not found in $(pwd) - copying now..."
  21. if [ "$(ls -A)" ]; then
  22. echo >&2 "WARNING: $(pwd) is not empty - press Ctrl+C now if this is an error!"
  23. ( set -x; ls -A; sleep 10 )
  24. fi
  25. tar cf - --one-file-system -C /usr/src/wordpress . | tar xf -
  26. echo >&2 "Complete! WordPress has been successfully copied to $(pwd)"
  27. if [ ! -e .htaccess ]; then
  28. # NOTE: The "Indexes" option is disabled in the php:apache base image
  29. cat > .htaccess <<-'EOF'
  30. # BEGIN WordPress
  31. <IfModule mod_rewrite.c>
  32. RewriteEngine On
  33. RewriteBase /
  34. RewriteRule ^index\.php$ - [L]
  35. RewriteCond %{REQUEST_FILENAME} !-f
  36. RewriteCond %{REQUEST_FILENAME} !-d
  37. RewriteRule . /index.php [L]
  38. </IfModule>
  39. # END WordPress
  40. EOF
  41. chown www-data:www-data .htaccess
  42. fi
  43. fi
  44. # 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
  45. # version 4.4.1 decided to switch to windows line endings, that breaks our seds and awks
  46. # https://github.com/docker-library/wordpress/issues/116
  47. # https://github.com/WordPress/WordPress/commit/1acedc542fba2482bab88ec70d4bea4b997a92e4
  48. sed -ri -e 's/\r\n|\r/\n/g' wp-config*
  49. if [ ! -e wp-config.php ]; then
  50. awk '/^\/\*.*stop editing.*\*\/$/ && c == 0 { c = 1; system("cat") } { print }' wp-config-sample.php > wp-config.php <<'EOPHP'
  51. // If we're behind a proxy server and using HTTPS, we need to alert Wordpress of that fact
  52. // see also http://codex.wordpress.org/Administration_Over_SSL#Using_a_Reverse_Proxy
  53. if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
  54. $_SERVER['HTTPS'] = 'on';
  55. }
  56. // Automatically set the site URLs
  57. define( 'WP_SITEURL', 'http://' . $_SERVER['HTTP_HOST'] );
  58. define( 'WP_HOME', 'http://' . $_SERVER['HTTP_HOST'] );
  59. // Force default uploads directory
  60. define( 'UPLOADS', 'wp-content/uploads' );
  61. EOPHP
  62. chown www-data:www-data wp-config.php
  63. fi
  64. # see http://stackoverflow.com/a/2705678/433558
  65. sed_escape_lhs() {
  66. echo "$@" | sed -e 's/[]\/$*.^|[]/\\&/g'
  67. }
  68. sed_escape_rhs() {
  69. echo "$@" | sed -e 's/[\/&]/\\&/g'
  70. }
  71. php_escape() {
  72. php -r 'var_export(('$2') $argv[1]);' -- "$1"
  73. }
  74. set_config() {
  75. key="$1"
  76. value="$2"
  77. var_type="${3:-string}"
  78. start="(['\"])$(sed_escape_lhs "$key")\2\s*,"
  79. end="\);"
  80. if [ "${key:0:1}" = '$' ]; then
  81. start="^(\s*)$(sed_escape_lhs "$key")\s*="
  82. end=";"
  83. fi
  84. sed -ri -e "s/($start\s*).*($end)$/\1$(sed_escape_rhs "$(php_escape "$value" "$var_type")")\3/" wp-config.php
  85. }
  86. set_config 'DB_HOST' "$WORDPRESS_DB_HOST"
  87. set_config 'DB_USER' "$WORDPRESS_DB_USER"
  88. set_config 'DB_PASSWORD' "$WORDPRESS_DB_PASSWORD"
  89. set_config 'DB_NAME' "$WORDPRESS_DB_NAME"
  90. # allow any of these "Authentication Unique Keys and Salts." to be specified via
  91. # environment variables with a "WORDPRESS_" prefix (ie, "WORDPRESS_AUTH_KEY")
  92. UNIQUES=(
  93. AUTH_KEY
  94. SECURE_AUTH_KEY
  95. LOGGED_IN_KEY
  96. NONCE_KEY
  97. AUTH_SALT
  98. SECURE_AUTH_SALT
  99. LOGGED_IN_SALT
  100. NONCE_SALT
  101. )
  102. for unique in "${UNIQUES[@]}"; do
  103. eval unique_value=\$WORDPRESS_$unique
  104. if [ "$unique_value" ]; then
  105. set_config "$unique" "$unique_value"
  106. else
  107. # if not specified, let's generate a random value
  108. current_set="$(sed -rn -e "s/define\((([\'\"])$unique\2\s*,\s*)(['\"])(.*)\3\);/\4/p" wp-config.php)"
  109. if [ "$current_set" = 'put your unique phrase here' ]; then
  110. set_config "$unique" "$(head -c1M /dev/urandom | sha1sum | cut -d' ' -f1)"
  111. fi
  112. fi
  113. done
  114. if [ "$WORDPRESS_TABLE_PREFIX" ]; then
  115. set_config '$table_prefix' "$WORDPRESS_TABLE_PREFIX"
  116. fi
  117. if [ "$WORDPRESS_DEBUG" ]; then
  118. set_config 'WP_DEBUG' 1 boolean
  119. fi
  120. TERM=dumb php -- "$WORDPRESS_DB_HOST" "$WORDPRESS_DB_USER" "$WORDPRESS_DB_PASSWORD" "$WORDPRESS_DB_NAME" <<'EOPHP'
  121. <?php
  122. // database might not exist, so let's try creating it (just to be safe)
  123. $stderr = fopen('php://stderr', 'w');
  124. // https://codex.wordpress.org/Editing_wp-config.php#MySQL_Alternate_Port
  125. // "hostname:port"
  126. // https://codex.wordpress.org/Editing_wp-config.php#MySQL_Sockets_or_Pipes
  127. // "hostname:unix-socket-path"
  128. list($host, $socket) = explode(':', $argv[1], 2);
  129. $port = 0;
  130. if (is_numeric($socket)) {
  131. $port = (int) $socket;
  132. $socket = null;
  133. }
  134. $maxTries = 10;
  135. do {
  136. $mysql = new mysqli($host, $argv[2], $argv[3], '', $port, $socket);
  137. if ($mysql->connect_error) {
  138. fwrite($stderr, "\n" . 'MySQL Connection Error: (' . $mysql->connect_errno . ') ' . $mysql->connect_error . "\n");
  139. --$maxTries;
  140. if ($maxTries <= 0) {
  141. exit(1);
  142. }
  143. sleep(3);
  144. }
  145. } while ($mysql->connect_error);
  146. if (!$mysql->query('CREATE DATABASE IF NOT EXISTS `' . $mysql->real_escape_string($argv[4]) . '`')) {
  147. fwrite($stderr, "\n" . 'MySQL "CREATE DATABASE" Error: ' . $mysql->error . "\n");
  148. $mysql->close();
  149. exit(1);
  150. }
  151. $mysql->close();
  152. EOPHP
  153. fi
  154. chown -R 1000:www-data /var/www/html
  155. chmod -R 775 /var/www/html
  156. exec "$@"