chore: build and pipeline
This commit is contained in:
parent
48ef99f502
commit
765f8a6a1a
29
pipeline/PersistentVolumeCDCI.yaml
Normal file
29
pipeline/PersistentVolumeCDCI.yaml
Normal file
@ -0,0 +1,29 @@
|
||||
kind: PersistentVolume
|
||||
apiVersion: v1
|
||||
metadata:
|
||||
name: cdci-wordpress-fpm-pvc-volume
|
||||
namespace: cdci-librecloud-online
|
||||
labels:
|
||||
type: local
|
||||
spec:
|
||||
storageClassName: manual
|
||||
persistentVolumeReclaimPolicy: Delete
|
||||
capacity:
|
||||
storage: 1Gi
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
hostPath:
|
||||
path: "/mnt/cdci"
|
||||
---
|
||||
kind: PersistentVolumeClaim
|
||||
apiVersion: v1
|
||||
metadata:
|
||||
name: cdci-wordpress-fpm-pvc
|
||||
namespace: cdci-librecloud-online
|
||||
spec:
|
||||
storageClassName: manual
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
resources:
|
||||
requests:
|
||||
storage: 1Gi
|
6
pipeline/down.sh
Executable file
6
pipeline/down.sh
Executable file
@ -0,0 +1,6 @@
|
||||
#/bin/bash
|
||||
kubectl delete -f pipeline-run.yaml 2>/dev/null
|
||||
kubectl delete -f pipeline.yaml 2>/dev/null
|
||||
kubectl delete -f task.yaml 2>/dev/null
|
||||
kubectl delete -f PersistentVolumeCDCI.yaml 2>/dev/null
|
||||
kubectl delete -f pipe-resource.yaml 2>/dev/null
|
24
pipeline/pipe-resource.yaml
Normal file
24
pipeline/pipe-resource.yaml
Normal file
@ -0,0 +1,24 @@
|
||||
apiVersion: tekton.dev/v1alpha1
|
||||
kind: PipelineResource
|
||||
metadata:
|
||||
name: librecloud-wordpress-fpm-img
|
||||
namespace: cdci-librecloud-online
|
||||
spec:
|
||||
type: image
|
||||
params:
|
||||
- name: url
|
||||
value: termas.librecloud.online/termas_librecloud/wordpress-fpm:8.0
|
||||
---
|
||||
apiVersion: tekton.dev/v1alpha1
|
||||
kind: PipelineResource
|
||||
metadata:
|
||||
name: librecloud-wordpress-fpm-git
|
||||
namespace: cdci-librecloud-online
|
||||
spec:
|
||||
type: git
|
||||
params:
|
||||
- name: revision
|
||||
value: master
|
||||
- name: url
|
||||
value: https://rlung.librecloud.online/Termas_LibreCloud/wordpress-fpm.git
|
||||
|
22
pipeline/pipeline-run.yaml
Normal file
22
pipeline/pipeline-run.yaml
Normal file
@ -0,0 +1,22 @@
|
||||
apiVersion: tekton.dev/v1alpha1
|
||||
kind: PipelineRun
|
||||
metadata:
|
||||
name: cdci-wordpress-fpm
|
||||
namespace: cdci-librecloud-online
|
||||
spec:
|
||||
serviceAccountName: build-bot
|
||||
pipelineRef:
|
||||
name: cdci-wordpress-fpm
|
||||
# podTemplate:
|
||||
#volumes:
|
||||
#- name: cdci-volume
|
||||
# #emptyDir: {}
|
||||
# persistentVolumeClaim:
|
||||
# claimName: cdci-wordpress-fpm-pvc
|
||||
resources:
|
||||
- name: source-repo
|
||||
resourceRef:
|
||||
name: librecloud-wordpress-fpm-git
|
||||
- name: target-image
|
||||
resourceRef:
|
||||
name: librecloud-wordpress-fpm-img
|
32
pipeline/pipeline.yaml
Normal file
32
pipeline/pipeline.yaml
Normal file
@ -0,0 +1,32 @@
|
||||
apiVersion: tekton.dev/v1alpha1
|
||||
kind: Pipeline
|
||||
metadata:
|
||||
name: cdci-wordpress-fpm
|
||||
namespace: cdci-librecloud-online
|
||||
spec:
|
||||
#serviceAccount: build-bot
|
||||
resources:
|
||||
- name: source-repo
|
||||
type: git
|
||||
#resourceRef:
|
||||
# name: librecloud-wordpress-fpm-git
|
||||
- name: target-image
|
||||
type: image
|
||||
#resourceRef:
|
||||
# name: librecloud-wordpress-fpm-img
|
||||
tasks:
|
||||
- name: build-wordpress-fpm-img
|
||||
taskRef:
|
||||
name: wordpress-fpm-build-image-from-git-source
|
||||
params:
|
||||
- name: pathToDockerFile
|
||||
value: /workspace/source/src
|
||||
- name: pathToContext
|
||||
value: /workspace/source/src #configure: may change according to your source
|
||||
resources:
|
||||
inputs:
|
||||
- name: source
|
||||
resource: source-repo
|
||||
outputs:
|
||||
- name: builtImage
|
||||
resource: target-image
|
91
pipeline/task.yaml
Normal file
91
pipeline/task.yaml
Normal file
@ -0,0 +1,91 @@
|
||||
apiVersion: tekton.dev/v1alpha1
|
||||
kind: Task
|
||||
metadata:
|
||||
name: wordpress-fpm-build-image-from-git-source
|
||||
namespace: cdci-librecloud-online
|
||||
spec:
|
||||
#serviceAccount: build-bot
|
||||
inputs:
|
||||
params:
|
||||
- name: pathToDockerFile
|
||||
type: string
|
||||
description: The path to the dockerfile to build
|
||||
default: /workspace/source/src/Dockerfile
|
||||
- name: pathToContext
|
||||
type: string
|
||||
description:
|
||||
The build context used by Kaniko
|
||||
(https://github.com/GoogleContainerTools/kaniko#kaniko-build-contexts)
|
||||
default: /workspace/source/src
|
||||
- name: DOCKERFILE
|
||||
type: string
|
||||
description: The name of the Dockerfile
|
||||
default: "Dockerfile"
|
||||
- name: BUILDKIT_CLIENT_IMAGE
|
||||
type: string
|
||||
description: The name of the BuildKit client (buildctl) image
|
||||
|
||||
default: "moby/buildkit:v0.6.2"
|
||||
- name: BUILDKIT_DAEMON_ADDRESS
|
||||
type: string
|
||||
description: The address of the BuildKit daemon (buildkitd) service
|
||||
default: "tcp://buildkitd:1234"
|
||||
resources:
|
||||
- name: source
|
||||
type: git
|
||||
outputs:
|
||||
resources:
|
||||
- name: builtImage
|
||||
type: image
|
||||
volumes:
|
||||
|
||||
- name: dckr-cfg-volume
|
||||
secret:
|
||||
secretName: regcred
|
||||
- name: ssh-volume
|
||||
secret:
|
||||
secretName: ssh-key
|
||||
- name: certs
|
||||
secret:
|
||||
secretName: buildkit-client-certs
|
||||
|
||||
steps:
|
||||
- name: build-and-push
|
||||
image: $(inputs.params.BUILDKIT_CLIENT_IMAGE)
|
||||
|
||||
|
||||
workingDir: /workspace/source
|
||||
|
||||
command: [ "buildctl" ]
|
||||
args:
|
||||
- --tlscacert
|
||||
- /certs/ca.pem
|
||||
- --tlscert
|
||||
- /certs/cert.pem
|
||||
- --tlskey
|
||||
- /certs/key.pem
|
||||
- --debug
|
||||
- --addr=$(inputs.params.BUILDKIT_DAEMON_ADDRESS)
|
||||
- build
|
||||
- --progress=plain
|
||||
- --frontend=dockerfile.v0
|
||||
- --opt
|
||||
- filename=$(inputs.params.DOCKERFILE)
|
||||
- --local
|
||||
- context=$(inputs.params.pathToContext)
|
||||
- --local
|
||||
- dockerfile=$(inputs.params.pathToDockerFile)
|
||||
- --output
|
||||
- type=image,name=$(outputs.resources.builtImage.url),push=true
|
||||
- --export-cache
|
||||
- type=inline
|
||||
- --import-cache
|
||||
- type=registry,ref=$(outputs.resources.builtImage.url)
|
||||
volumeMounts:
|
||||
- name: certs
|
||||
readOnly: true
|
||||
mountPath: /certs
|
||||
- name: ssh-volume
|
||||
readOnly: true
|
||||
mountPath: /.ssh
|
||||
|
24
pipeline/up.sh
Executable file
24
pipeline/up.sh
Executable file
@ -0,0 +1,24 @@
|
||||
#/bin/bash
|
||||
FOLLOW_UP="yes"
|
||||
NS_DOMAIN="cdci-librecloud-online"
|
||||
PIPELINE_NAME="cdci-wordpress-fpm"
|
||||
[ "$1" == "-s" ] && FOLLOW_UP=""
|
||||
is_running=`kubectl get pods -n $NS_DOMAIN | grep $PIPELINE_NAME 2>/dev/null`
|
||||
if [ -n "$is_running" ] ; then
|
||||
kubectl delete -f pipeline-run.yaml 2>/dev/null
|
||||
kubectl delete -f pipeline.yaml 2>/dev/null
|
||||
kubectl delete -f task.yaml 2>/dev/null
|
||||
kubectl delete -f pipe-resource.yaml 2>/dev/null
|
||||
fi
|
||||
kubectl delete -f PersistentVolumeCDCI.yaml 2>/dev/null
|
||||
kubectl create -f PersistentVolumeCDCI.yaml
|
||||
#. lib_dply.sh
|
||||
#make_host_alias task
|
||||
kubectl apply -f pipe-resource.yaml
|
||||
kubectl apply -f task.yaml
|
||||
kubectl apply -f pipeline.yaml
|
||||
kubectl apply -f pipeline-run.yaml
|
||||
if [ -n "$FOLLOW_UP" ] ; then
|
||||
has_tkn=`type tkn 2>/dev/null`
|
||||
[ -n "$has_tkn" ] && tkn pipelinerun logs -f $PIPELINE_NAME -n $NS_DOMAIN
|
||||
fi
|
17
repo-config.yaml
Normal file
17
repo-config.yaml
Normal file
@ -0,0 +1,17 @@
|
||||
Active: true
|
||||
# Active: false # to not follow up webhook workflow
|
||||
|
||||
# Sources for src file
|
||||
Repo: https://github.com/docker-library/wordpress.git
|
||||
Source: wordpress/php8.0/fpm-alpine
|
||||
|
||||
TargetGit: ssh://git@rlung.librecloud.online:32225/Termas.LibreCloud.online/wordpress-fpm.git
|
||||
|
||||
# Name - Version, etc
|
||||
Name: wordpress-fpm
|
||||
Version: 8.0
|
||||
|
||||
# To get latest
|
||||
IMAGE_NAME: wordpress
|
||||
IMAGE_MATCH: 8.
|
||||
|
136
src/Dockerfile
Normal file
136
src/Dockerfile
Normal file
@ -0,0 +1,136 @@
|
||||
FROM php:8.0-fpm-alpine
|
||||
|
||||
# docker-entrypoint.sh dependencies
|
||||
# persistent dependencies
|
||||
RUN apk add --no-cache \
|
||||
freetype \
|
||||
libpng \
|
||||
libjpeg \
|
||||
libjpeg-turbo \
|
||||
# in theory, docker-entrypoint.sh is POSIX-compliant, but priority is a working, consistent image
|
||||
bash \
|
||||
# BusyBox sed is not sufficient for some of our sed expressions
|
||||
sed \
|
||||
# Ghostscript is required for rendering PDF previews
|
||||
ghostscript \
|
||||
# Alpine package for "imagemagick" contains ~120 .so files, see: https://github.com/docker-library/wordpress/pull/497
|
||||
# imagemagick \
|
||||
;
|
||||
|
||||
# install the PHP extensions we need (https://make.wordpress.org/hosting/handbook/handbook/server-environment/#php-extensions)
|
||||
# --enable-gd-native-ttf \
|
||||
RUN set -ex; \
|
||||
\
|
||||
apk add --no-cache --virtual .build-deps \
|
||||
$PHPIZE_DEPS \
|
||||
freetype-dev \
|
||||
# imagemagick-dev \
|
||||
libjpeg-turbo-dev \
|
||||
libpng-dev \
|
||||
libzip-dev \
|
||||
gmp \
|
||||
gmp-dev \
|
||||
; \
|
||||
docker-php-ext-configure gmp \
|
||||
;\
|
||||
docker-php-ext-configure gd --with-freetype --with-jpeg \
|
||||
; \
|
||||
docker-php-ext-install -j "$(nproc)" \
|
||||
bcmath \
|
||||
exif \
|
||||
gd \
|
||||
gmp \
|
||||
mysqli \
|
||||
zip \
|
||||
; \
|
||||
# pecl install imagick-3.4.4; \
|
||||
# docker-php-ext-install gmp; \
|
||||
# docker-php-ext-enable imagick; \
|
||||
\
|
||||
runDeps="$( \
|
||||
scanelf --needed --nobanner --format '%n#p' --recursive /usr/local/lib/php/extensions \
|
||||
| tr ',' '\n' \
|
||||
| sort -u \
|
||||
| awk 'system("[ -e /usr/local/lib/" $1 " ]") == 0 { next } { print "so:" $1 }' \
|
||||
)"; \
|
||||
apk add --virtual .wordpress-phpexts-rundeps $runDeps; \
|
||||
apk del .build-deps
|
||||
|
||||
|
||||
# set recommended PHP.ini settings
|
||||
# see https://secure.php.net/manual/en/opcache.installation.php
|
||||
RUN set -eux; \
|
||||
docker-php-ext-enable opcache; \
|
||||
{ \
|
||||
echo 'opcache.memory_consumption=128'; \
|
||||
echo 'opcache.interned_strings_buffer=8'; \
|
||||
echo 'opcache.max_accelerated_files=4000'; \
|
||||
echo 'opcache.revalidate_freq=2'; \
|
||||
echo 'opcache.fast_shutdown=1'; \
|
||||
} > /usr/local/etc/php/conf.d/opcache-recommended.ini
|
||||
# https://wordpress.org/support/article/editing-wp-config-php/#configure-error-logging
|
||||
RUN { \
|
||||
# https://www.php.net/manual/en/errorfunc.constants.php
|
||||
# https://github.com/docker-library/wordpress/issues/420#issuecomment-517839670
|
||||
echo 'error_reporting = E_ERROR | E_WARNING | E_PARSE | E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_COMPILE_WARNING | E_RECOVERABLE_ERROR'; \
|
||||
echo 'display_errors = Off'; \
|
||||
echo 'display_startup_errors = Off'; \
|
||||
echo 'log_errors = On'; \
|
||||
echo 'error_log = /dev/stderr'; \
|
||||
echo 'log_errors_max_len = 1024'; \
|
||||
echo 'ignore_repeated_errors = On'; \
|
||||
echo 'ignore_repeated_source = Off'; \
|
||||
echo 'html_errors = Off'; \
|
||||
} > /usr/local/etc/php/conf.d/error-logging.ini
|
||||
|
||||
RUN set -eux; \
|
||||
version='5.7.2'; \
|
||||
sha1='c97c037d942e974eb8524213a505268033aff6c8'; \
|
||||
\
|
||||
curl -o wordpress.tar.gz -fL "https://wordpress.org/wordpress-$version.tar.gz"; \
|
||||
echo "$sha1 *wordpress.tar.gz" | sha1sum -c -; \
|
||||
\
|
||||
# upstream tarballs include ./wordpress/ so this gives us /usr/src/wordpress
|
||||
tar -xzf wordpress.tar.gz -C /usr/src/; \
|
||||
rm wordpress.tar.gz; \
|
||||
\
|
||||
# https://wordpress.org/support/article/htaccess/
|
||||
[ ! -e /usr/src/wordpress/.htaccess ]; \
|
||||
{ \
|
||||
echo '# BEGIN WordPress'; \
|
||||
echo ''; \
|
||||
echo 'RewriteEngine On'; \
|
||||
echo 'RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]'; \
|
||||
echo 'RewriteBase /'; \
|
||||
echo 'RewriteRule ^index\.php$ - [L]'; \
|
||||
echo 'RewriteCond %{REQUEST_FILENAME} !-f'; \
|
||||
echo 'RewriteCond %{REQUEST_FILENAME} !-d'; \
|
||||
echo 'RewriteRule . /index.php [L]'; \
|
||||
echo ''; \
|
||||
echo '# END WordPress'; \
|
||||
} > /usr/src/wordpress/.htaccess; \
|
||||
\
|
||||
chown -R www-data:www-data /usr/src/wordpress; \
|
||||
# pre-create wp-content (and single-level children) for folks who want to bind-mount themes, etc so permissions are pre-created properly instead of root:root
|
||||
# wp-content/cache: https://github.com/docker-library/wordpress/issues/534#issuecomment-705733507
|
||||
mkdir wp-content; \
|
||||
for dir in /usr/src/wordpress/wp-content/*/ cache; do \
|
||||
dir="$(basename "${dir%/}")"; \
|
||||
mkdir "wp-content/$dir"; \
|
||||
done; \
|
||||
chown -R www-data:www-data wp-content; \
|
||||
chmod -R 777 wp-content; \
|
||||
curl -o wp-cli.phar -fSL "https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar"; \
|
||||
chmod +x wp-cli.phar; \
|
||||
mv wp-cli.phar /usr/local/bin/wp
|
||||
|
||||
RUN apk add ssmtp
|
||||
|
||||
#VOLUME /var/www/html
|
||||
VOLUME /var/www
|
||||
|
||||
COPY --chown=www-data:www-data wp-config-docker.php /usr/src/wordpress/
|
||||
COPY docker-entrypoint.sh /usr/local/bin/
|
||||
|
||||
ENTRYPOINT ["docker-entrypoint.sh"]
|
||||
CMD ["php-fpm"]
|
292
src/ant_docker-entrypoint.sh
Executable file
292
src/ant_docker-entrypoint.sh
Executable file
@ -0,0 +1,292 @@
|
||||
#!/bin/bash
|
||||
set -euo pipefail
|
||||
|
||||
NO_COPY_IFNOT_EXISTS=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
|
||||
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 [ "$(id -u)" = '0' ]; then
|
||||
case "$1" in
|
||||
apache2*)
|
||||
user="${APACHE_RUN_USER:-www-data}"
|
||||
group="${APACHE_RUN_GROUP:-www-data}"
|
||||
|
||||
# strip off any '#' symbol ('#1000' is valid syntax for Apache)
|
||||
pound='#'
|
||||
user="${user#$pound}"
|
||||
group="${group#$pound}"
|
||||
;;
|
||||
*) # php-fpm
|
||||
user='www-data'
|
||||
group='www-data'
|
||||
;;
|
||||
esac
|
||||
else
|
||||
user="$(id -u)"
|
||||
group="$(id -g)"
|
||||
fi
|
||||
|
||||
if [ -z "$NO_COPY_IFNOT_EXISTS" ] && [ ! -e index.php ] && [ ! -e wp-includes/version.php ]; then
|
||||
# if the directory exists and WordPress doesn't appear to be installed AND the permissions of it are root:root, let's chown it (likely a Docker-created directory)
|
||||
if [ "$(id -u)" = '0' ] && [ "$(stat -c '%u:%g' .)" = '0:0' ]; then
|
||||
chown "$user:$group" .
|
||||
fi
|
||||
|
||||
echo >&2 "WordPress not found in $PWD - copying now..."
|
||||
if [ -n "$(ls -A)" ]; then
|
||||
echo >&2 "WARNING: $PWD is not empty! (copying anyhow)"
|
||||
fi
|
||||
sourceTarArgs=(
|
||||
--create
|
||||
--file -
|
||||
--directory /usr/src/wordpress
|
||||
--owner "$user" --group "$group"
|
||||
)
|
||||
targetTarArgs=(
|
||||
--extract
|
||||
--file -
|
||||
)
|
||||
if [ "$user" != '0' ]; then
|
||||
# avoid "tar: .: Cannot utime: Operation not permitted" and "tar: .: Cannot change mode to rwxr-xr-x: Operation not permitted"
|
||||
targetTarArgs+=( --no-overwrite-dir )
|
||||
fi
|
||||
tar "${sourceTarArgs[@]}" . | tar "${targetTarArgs[@]}"
|
||||
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
|
||||
<IfModule mod_rewrite.c>
|
||||
RewriteEngine On
|
||||
RewriteBase /
|
||||
RewriteRule ^index\.php$ - [L]
|
||||
RewriteCond %{REQUEST_FILENAME} !-f
|
||||
RewriteCond %{REQUEST_FILENAME} !-d
|
||||
RewriteRule . /index.php [L]
|
||||
</IfModule>
|
||||
# END WordPress
|
||||
EOF
|
||||
chown "$user:$group" .htaccess
|
||||
fi
|
||||
fi
|
||||
|
||||
# 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_HOST
|
||||
WORDPRESS_DB_USER
|
||||
WORDPRESS_DB_PASSWORD
|
||||
WORDPRESS_DB_NAME
|
||||
WORDPRESS_DB_CHARSET
|
||||
WORDPRESS_DB_COLLATE
|
||||
"${uniqueEnvs[@]/#/WORDPRESS_}"
|
||||
WORDPRESS_TABLE_PREFIX
|
||||
WORDPRESS_DEBUG
|
||||
WORDPRESS_CONFIG_EXTRA
|
||||
)
|
||||
haveConfig=
|
||||
for e in "${envs[@]}"; do
|
||||
file_env "$e"
|
||||
if [ -z "$haveConfig" ] && [ -n "${!e}" ]; then
|
||||
haveConfig=1
|
||||
fi
|
||||
done
|
||||
|
||||
# linking backwards-compatibility
|
||||
if [ -n "${!MYSQL_ENV_MYSQL_*}" ]; then
|
||||
haveConfig=1
|
||||
# host defaults to "mysql" below if unspecified
|
||||
: "${WORDPRESS_DB_USER:=${MYSQL_ENV_MYSQL_USER:-root}}"
|
||||
if [ "$WORDPRESS_DB_USER" = 'root' ]; then
|
||||
: "${WORDPRESS_DB_PASSWORD:=${MYSQL_ENV_MYSQL_ROOT_PASSWORD:-}}"
|
||||
else
|
||||
: "${WORDPRESS_DB_PASSWORD:=${MYSQL_ENV_MYSQL_PASSWORD:-}}"
|
||||
fi
|
||||
: "${WORDPRESS_DB_NAME:=${MYSQL_ENV_MYSQL_DATABASE:-}}"
|
||||
fi
|
||||
|
||||
# only touch "wp-config.php" if we have environment-supplied configuration values
|
||||
if [ "$haveConfig" ]; then
|
||||
: "${WORDPRESS_DB_HOST:=mysql}"
|
||||
: "${WORDPRESS_DB_USER:=root}"
|
||||
: "${WORDPRESS_DB_PASSWORD:=}"
|
||||
: "${WORDPRESS_DB_NAME:=wordpress}"
|
||||
: "${WORDPRESS_DB_CHARSET:=utf8}"
|
||||
: "${WORDPRESS_DB_COLLATE:=}"
|
||||
|
||||
# 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")
|
||||
if (ENVIRON["WORDPRESS_CONFIG_EXTRA"]) {
|
||||
print "// WORDPRESS_CONFIG_EXTRA"
|
||||
print ENVIRON["WORDPRESS_CONFIG_EXTRA"] "\n"
|
||||
}
|
||||
}
|
||||
{ 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 "$user:$group" wp-config.php
|
||||
elif [ -e wp-config.php ] && [ -n "$WORDPRESS_CONFIG_EXTRA" ] && [[ "$(< wp-config.php)" != *"$WORDPRESS_CONFIG_EXTRA"* ]]; then
|
||||
# (if the config file already contains the requested PHP code, don't print a warning)
|
||||
echo >&2
|
||||
echo >&2 'WARNING: environment variable "WORDPRESS_CONFIG_EXTRA" is set, but "wp-config.php" already exists'
|
||||
echo >&2 ' The contents of this variable will _not_ be inserted into the existing "wp-config.php" file.'
|
||||
echo >&2 ' (see https://github.com/docker-library/wordpress/issues/333 for more details)'
|
||||
echo >&2
|
||||
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
|
||||
}
|
||||
|
||||
set_config 'DB_HOST' "$WORDPRESS_DB_HOST"
|
||||
set_config 'DB_USER' "$WORDPRESS_DB_USER"
|
||||
set_config 'DB_PASSWORD' "$WORDPRESS_DB_PASSWORD"
|
||||
set_config 'DB_NAME' "$WORDPRESS_DB_NAME"
|
||||
set_config 'DB_CHARSET' "$WORDPRESS_DB_CHARSET"
|
||||
set_config 'DB_COLLATE' "$WORDPRESS_DB_COLLATE"
|
||||
|
||||
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\(\s*(([\'\"])$unique\2\s*,\s*)(['\"])(.*)\3\s*\);/\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_TABLE_PREFIX" ]; then
|
||||
set_config '$table_prefix' "$WORDPRESS_TABLE_PREFIX"
|
||||
fi
|
||||
|
||||
if [ "$WORDPRESS_DEBUG" ]; then
|
||||
set_config 'WP_DEBUG' 1 boolean
|
||||
fi
|
||||
|
||||
if ! TERM=dumb php -- <<'EOPHP'
|
||||
<?php
|
||||
// database might not exist, so let's try creating it (just to be safe)
|
||||
|
||||
$stderr = fopen('php://stderr', 'w');
|
||||
|
||||
// https://codex.wordpress.org/Editing_wp-config.php#MySQL_Alternate_Port
|
||||
// "hostname:port"
|
||||
// https://codex.wordpress.org/Editing_wp-config.php#MySQL_Sockets_or_Pipes
|
||||
// "hostname:unix-socket-path"
|
||||
list($host, $socket) = explode(':', getenv('WORDPRESS_DB_HOST'), 2);
|
||||
$port = 0;
|
||||
if (is_numeric($socket)) {
|
||||
$port = (int) $socket;
|
||||
$socket = null;
|
||||
}
|
||||
$user = getenv('WORDPRESS_DB_USER');
|
||||
$pass = getenv('WORDPRESS_DB_PASSWORD');
|
||||
$dbName = getenv('WORDPRESS_DB_NAME');
|
||||
|
||||
$maxTries = 10;
|
||||
do {
|
||||
$mysql = new mysqli($host, $user, $pass, '', $port, $socket);
|
||||
if ($mysql->connect_error) {
|
||||
fwrite($stderr, "\n" . 'MySQL Connection Error: (' . $mysql->connect_errno . ') ' . $mysql->connect_error . "\n");
|
||||
--$maxTries;
|
||||
if ($maxTries <= 0) {
|
||||
exit(1);
|
||||
}
|
||||
sleep(3);
|
||||
}
|
||||
} while ($mysql->connect_error);
|
||||
|
||||
if (!$mysql->query('CREATE DATABASE IF NOT EXISTS `' . $mysql->real_escape_string($dbName) . '`')) {
|
||||
fwrite($stderr, "\n" . 'MySQL "CREATE DATABASE" Error: ' . $mysql->error . "\n");
|
||||
$mysql->close();
|
||||
exit(1);
|
||||
}
|
||||
|
||||
$mysql->close();
|
||||
EOPHP
|
||||
then
|
||||
echo >&2
|
||||
echo >&2 "WARNING: unable to establish a database connection to '$WORDPRESS_DB_HOST'"
|
||||
echo >&2 ' continuing anyways (which might have unexpected results)'
|
||||
echo >&2
|
||||
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 "$@"
|
99
src/docker-entrypoint.sh
Executable file
99
src/docker-entrypoint.sh
Executable file
@ -0,0 +1,99 @@
|
||||
#!/usr/bin/env bash
|
||||
set -Eeuo pipefail
|
||||
|
||||
if [[ "$1" == apache2* ]] || [ "$1" = 'php-fpm' ]; then
|
||||
uid="$(id -u)"
|
||||
gid="$(id -g)"
|
||||
if [ "$uid" = '0' ]; then
|
||||
case "$1" in
|
||||
apache2*)
|
||||
user="${APACHE_RUN_USER:-www-data}"
|
||||
group="${APACHE_RUN_GROUP:-www-data}"
|
||||
|
||||
# strip off any '#' symbol ('#1000' is valid syntax for Apache)
|
||||
pound='#'
|
||||
user="${user#$pound}"
|
||||
group="${group#$pound}"
|
||||
;;
|
||||
*) # php-fpm
|
||||
user='www-data'
|
||||
group='www-data'
|
||||
;;
|
||||
esac
|
||||
else
|
||||
user="$uid"
|
||||
group="$gid"
|
||||
fi
|
||||
|
||||
if [ ! -e index.php ] && [ ! -e wp-includes/version.php ]; then
|
||||
# if the directory exists and WordPress doesn't appear to be installed AND the permissions of it are root:root, let's chown it (likely a Docker-created directory)
|
||||
if [ "$uid" = '0' ] && [ "$(stat -c '%u:%g' .)" = '0:0' ]; then
|
||||
chown "$user:$group" .
|
||||
fi
|
||||
|
||||
echo >&2 "WordPress not found in $PWD - copying now..."
|
||||
if [ -n "$(find -mindepth 1 -maxdepth 1 -not -name wp-content)" ]; then
|
||||
echo >&2 "WARNING: $PWD is not empty! (copying anyhow)"
|
||||
fi
|
||||
sourceTarArgs=(
|
||||
--create
|
||||
--file -
|
||||
--directory /usr/src/wordpress
|
||||
--owner "$user" --group "$group"
|
||||
)
|
||||
targetTarArgs=(
|
||||
--extract
|
||||
--file -
|
||||
)
|
||||
if [ "$uid" != '0' ]; then
|
||||
# avoid "tar: .: Cannot utime: Operation not permitted" and "tar: .: Cannot change mode to rwxr-xr-x: Operation not permitted"
|
||||
targetTarArgs+=( --no-overwrite-dir )
|
||||
fi
|
||||
# loop over "pluggable" content in the source, and if it already exists in the destination, skip it
|
||||
# https://github.com/docker-library/wordpress/issues/506 ("wp-content" persisted, "akismet" updated, WordPress container restarted/recreated, "akismet" downgraded)
|
||||
for contentPath in \
|
||||
/usr/src/wordpress/.htaccess \
|
||||
/usr/src/wordpress/wp-content/*/*/ \
|
||||
; do
|
||||
contentPath="${contentPath%/}"
|
||||
[ -e "$contentPath" ] || continue
|
||||
contentPath="${contentPath#/usr/src/wordpress/}" # "wp-content/plugins/akismet", etc.
|
||||
if [ -e "$PWD/$contentPath" ]; then
|
||||
echo >&2 "WARNING: '$PWD/$contentPath' exists! (not copying the WordPress version)"
|
||||
sourceTarArgs+=( --exclude "./$contentPath" )
|
||||
fi
|
||||
done
|
||||
tar "${sourceTarArgs[@]}" . | tar "${targetTarArgs[@]}"
|
||||
echo >&2 "Complete! WordPress has been successfully copied to $PWD"
|
||||
fi
|
||||
|
||||
wpEnvs=( "${!WORDPRESS_@}" )
|
||||
if [ ! -s wp-config.php ] && [ "${#wpEnvs[@]}" -gt 0 ]; then
|
||||
for wpConfigDocker in \
|
||||
wp-config-docker.php \
|
||||
/usr/src/wordpress/wp-config-docker.php \
|
||||
; do
|
||||
if [ -s "$wpConfigDocker" ]; then
|
||||
echo >&2 "No 'wp-config.php' found in $PWD, but 'WORDPRESS_...' variables supplied; copying '$wpConfigDocker' (${wpEnvs[*]})"
|
||||
# using "awk" to replace all instances of "put your unique phrase here" with a properly unique string (for AUTH_KEY and friends to have safe defaults if they aren't specified with environment variables)
|
||||
awk '
|
||||
/put your unique phrase here/ {
|
||||
cmd = "head -c1m /dev/urandom | sha1sum | cut -d\\ -f1"
|
||||
cmd | getline str
|
||||
close(cmd)
|
||||
gsub("put your unique phrase here", str)
|
||||
}
|
||||
{ print }
|
||||
' "$wpConfigDocker" > wp-config.php
|
||||
if [ "$uid" = '0' ]; then
|
||||
# attempt to ensure that wp-config.php is owned by the run user
|
||||
# could be on a filesystem that doesn't allow chown (like some NFS setups)
|
||||
chown "$user:$group" wp-config.php || true
|
||||
fi
|
||||
break
|
||||
fi
|
||||
done
|
||||
fi
|
||||
fi
|
||||
|
||||
exec "$@"
|
133
src/wp-config-docker.php
Normal file
133
src/wp-config-docker.php
Normal file
@ -0,0 +1,133 @@
|
||||
<?php
|
||||
/**
|
||||
* The base configuration for WordPress
|
||||
*
|
||||
* The wp-config.php creation script uses this file during the installation.
|
||||
* You don't have to use the web site, you can copy this file to "wp-config.php"
|
||||
* and fill in the values.
|
||||
*
|
||||
* This file contains the following configurations:
|
||||
*
|
||||
* * MySQL settings
|
||||
* * Secret keys
|
||||
* * Database table prefix
|
||||
* * ABSPATH
|
||||
*
|
||||
* This has been slightly modified (to read environment variables) for use in Docker.
|
||||
*
|
||||
* @link https://wordpress.org/support/article/editing-wp-config-php/
|
||||
*
|
||||
* @package WordPress
|
||||
*/
|
||||
|
||||
// IMPORTANT: this file needs to stay in-sync with https://github.com/WordPress/WordPress/blob/master/wp-config-sample.php
|
||||
// (it gets parsed by the upstream wizard in https://github.com/WordPress/WordPress/blob/f27cb65e1ef25d11b535695a660e7282b98eb742/wp-admin/setup-config.php#L356-L392)
|
||||
|
||||
// a helper function to lookup "env_FILE", "env", then fallback
|
||||
if (!function_exists('getenv_docker')) {
|
||||
// https://github.com/docker-library/wordpress/issues/588 (WP-CLI will load this file 2x)
|
||||
function getenv_docker($env, $default) {
|
||||
if ($fileEnv = getenv($env . '_FILE')) {
|
||||
return rtrim(file_get_contents($fileEnv), "\r\n");
|
||||
}
|
||||
else if (($val = getenv($env)) !== false) {
|
||||
return $val;
|
||||
}
|
||||
else {
|
||||
return $default;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ** MySQL settings - You can get this info from your web host ** //
|
||||
/** The name of the database for WordPress */
|
||||
define( 'DB_NAME', getenv_docker('WORDPRESS_DB_NAME', 'wordpress') );
|
||||
|
||||
/** MySQL database username */
|
||||
define( 'DB_USER', getenv_docker('WORDPRESS_DB_USER', 'example username') );
|
||||
|
||||
/** MySQL database password */
|
||||
define( 'DB_PASSWORD', getenv_docker('WORDPRESS_DB_PASSWORD', 'example password') );
|
||||
|
||||
/**
|
||||
* Docker image fallback values above are sourced from the official WordPress installation wizard:
|
||||
* https://github.com/WordPress/WordPress/blob/f9cc35ebad82753e9c86de322ea5c76a9001c7e2/wp-admin/setup-config.php#L216-L230
|
||||
* (However, using "example username" and "example password" in your database is strongly discouraged. Please use strong, random credentials!)
|
||||
*/
|
||||
|
||||
/** MySQL hostname */
|
||||
define( 'DB_HOST', getenv_docker('WORDPRESS_DB_HOST', 'mysql') );
|
||||
|
||||
/** Database charset to use in creating database tables. */
|
||||
define( 'DB_CHARSET', getenv_docker('WORDPRESS_DB_CHARSET', 'utf8') );
|
||||
|
||||
/** The database collate type. Don't change this if in doubt. */
|
||||
define( 'DB_COLLATE', getenv_docker('WORDPRESS_DB_COLLATE', '') );
|
||||
|
||||
/**#@+
|
||||
* Authentication unique keys and salts.
|
||||
*
|
||||
* Change these to different unique phrases! You can generate these using
|
||||
* the {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org secret-key service}.
|
||||
*
|
||||
* You can change these at any point in time to invalidate all existing cookies.
|
||||
* This will force all users to have to log in again.
|
||||
*
|
||||
* @since 2.6.0
|
||||
*/
|
||||
define( 'AUTH_KEY', getenv_docker('WORDPRESS_AUTH_KEY', 'put your unique phrase here') );
|
||||
define( 'SECURE_AUTH_KEY', getenv_docker('WORDPRESS_SECURE_AUTH_KEY', 'put your unique phrase here') );
|
||||
define( 'LOGGED_IN_KEY', getenv_docker('WORDPRESS_LOGGED_IN_KEY', 'put your unique phrase here') );
|
||||
define( 'NONCE_KEY', getenv_docker('WORDPRESS_NONCE_KEY', 'put your unique phrase here') );
|
||||
define( 'AUTH_SALT', getenv_docker('WORDPRESS_AUTH_SALT', 'put your unique phrase here') );
|
||||
define( 'SECURE_AUTH_SALT', getenv_docker('WORDPRESS_SECURE_AUTH_SALT', 'put your unique phrase here') );
|
||||
define( 'LOGGED_IN_SALT', getenv_docker('WORDPRESS_LOGGED_IN_SALT', 'put your unique phrase here') );
|
||||
define( 'NONCE_SALT', getenv_docker('WORDPRESS_NONCE_SALT', 'put your unique phrase here') );
|
||||
// (See also https://wordpress.stackexchange.com/a/152905/199287)
|
||||
|
||||
/**#@-*/
|
||||
|
||||
/**
|
||||
* WordPress database table prefix.
|
||||
*
|
||||
* You can have multiple installations in one database if you give each
|
||||
* a unique prefix. Only numbers, letters, and underscores please!
|
||||
*/
|
||||
$table_prefix = getenv_docker('WORDPRESS_TABLE_PREFIX', 'wp_');
|
||||
|
||||
/**
|
||||
* For developers: WordPress debugging mode.
|
||||
*
|
||||
* Change this to true to enable the display of notices during development.
|
||||
* It is strongly recommended that plugin and theme developers use WP_DEBUG
|
||||
* in their development environments.
|
||||
*
|
||||
* For information on other constants that can be used for debugging,
|
||||
* visit the documentation.
|
||||
*
|
||||
* @link https://wordpress.org/support/article/debugging-in-wordpress/
|
||||
*/
|
||||
define( 'WP_DEBUG', !!getenv_docker('WORDPRESS_DEBUG', '') );
|
||||
|
||||
/* Add any custom values between this line and the "stop editing" line. */
|
||||
|
||||
// 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';
|
||||
}
|
||||
// (we include this by default because reverse proxying is extremely common in container environments)
|
||||
|
||||
if ($configExtra = getenv_docker('WORDPRESS_CONFIG_EXTRA', '')) {
|
||||
eval($configExtra);
|
||||
}
|
||||
|
||||
/* That's all, stop editing! Happy publishing. */
|
||||
|
||||
/** Absolute path to the WordPress directory. */
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
define( 'ABSPATH', __DIR__ . '/' );
|
||||
}
|
||||
|
||||
/** Sets up WordPress vars and included files. */
|
||||
require_once ABSPATH . 'wp-settings.php';
|
Loading…
Reference in New Issue
Block a user