Initial version of the new Docker Build scripts

Successfully builds the container, places the files, scripts and links
we need so fart into the right places using a rootfs tar file so that we
don't pollute the container unneccessarily and keep the Dockerfile
simple.

Any in-container scripting is missing so far, so the whole thing does
not yet start up successfully or popluate the config share in any way.
That is for another day.
This commit is contained in:
Torben Nehmer 2018-10-24 22:45:58 +02:00
parent ea2db6e2f4
commit d3ed55ffb6
8 changed files with 378 additions and 0 deletions

6
.gitignore vendored
View File

@ -1,3 +1,9 @@
# Docker Build Process
/build/**
/tmp/**
/old/**
test-image.sh
# ---> Linux # ---> Linux
*~ *~

66
Dockerfile Normal file
View File

@ -0,0 +1,66 @@
FROM php:7.1-apache
LABEL maintainer="Torben Nehmer <torben@nehmer.net>"
RUN set -ex; \
apt-get update; \
\
savedAptMark="$(apt-mark showmanual)"; \
\
apt-get install -y --no-install-recommends \
libfreetype6-dev \
libicu-dev \
libjpeg62-turbo-dev \
libldap2-dev \
libpng-dev \
libpq-dev \
libsqlite3-dev \
zlib1g-dev \
# ISPConfig requirement
libxml2-dev \
; \
\
debMultiarch="$(dpkg-architecture --query DEB_BUILD_MULTIARCH)"; \
docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-png-dir=/usr --with-jpeg-dir=/usr; \
docker-php-ext-configure ldap --with-libdir="lib/$debMultiarch"; \
docker-php-ext-install \
exif \
gd \
intl \
ldap \
pdo_mysql \
pdo_pgsql \
pdo_sqlite \
zip \
# ISPConfig requirement
soap \
; \
\
# reset apt-mark's "manual" list so that "purge --auto-remove" will remove all build dependencies
apt-mark auto '.*' > /dev/null; \
apt-mark manual $savedAptMark; \
ldd "$(php -r 'echo ini_get("extension_dir");')"/*.so \
| awk '/=>/ { print $3 }' \
| sort -u \
| xargs -r dpkg-query -S \
| cut -d: -f1 \
| sort -u \
| xargs -rt apt-mark manual; \
\
apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; \
rm -rf /var/lib/apt/lists/* ;\
\
# enable mod_rewrite
a2enmod rewrite
# expose these volumes
VOLUME /var/roundcube/config
VOLUME /tmp/roundcube-temp
# Define Roundcubemail version
ENV ROUNDCUBEMAIL_VERSION 1.3.7
# Publish the rootfs file into the container
ADD rootfs.tar.gz /
ENTRYPOINT ["/docker-entrypoint.sh"]
CMD ["apache2-foreground"]

5
build-container.sh Executable file
View File

@ -0,0 +1,5 @@
#!/bin/bash
set -ex
docker build --force-rm -t nathan/roundcube -f Dockerfile build

148
build-rootfs.sh Executable file
View File

@ -0,0 +1,148 @@
#!/bin/bash
set -ex
# Configuration options you usually edit go here
ROUNDCUBEMAIL_VERSION=1.3.7
CHECK_GPG=false
CLEAN_INTERMEDIATES=false
CONTAINER_VOLUME_CONFIG=/var/roundcube/config
CONTAINER_WEBROOT=/var/www/html
CONTAINER_PHP_CONFD=/usr/local/etc/php/conf.d/
CONTAINER_SCRIPTS=/usr/local/sbin
# This is internal stuff used to build everything
# Be aware, that several of these paths are used with rm -rf!
SRCDIR=$(pwd)/src
TMPDIR=$(pwd)/tmp
BUILDDIR=$(pwd)/build
SCRIPTS_SRC=${SRCDIR}/scripts
ROUNDCUBE_DOWNLOAD=${TMPDIR}/roundcubemail.tar.gz
ROUNDCUBE_ASC_DOWNLOAD=${ROUDCUBE_DOWNLOAD}.asc
ROUNDCUBE_SRC=${TMPDIR}/roundcubemail
ISPCONFIG_DOWNLOAD=${TMPDIR}/ispconfig3_roundcube.zip
ISPCONFIG_SRC=${TMPDIR}/ispconfig3_roundcube
ROOTFSTREE=${TMPDIR}/tree
ROOTFSFILE=${BUILDDIR}/rootfs.tar.gz
CONFIG_DST=${ROOTFSTREE}${CONTAINER_VOLUME_CONFIG}
WEBROOT_DST=${ROOTFSTREE}${CONTAINER_WEBROOT}
PHP_CONFD_DST=${ROOTFSTREE}${CONTAINER_PHP_CONFD}
SCRIPTS_DST=${ROOTFSTREE}${CONTAINER_SCRIPTS}
#### Sanitize Build Enviornment
if [ -d ${TMPDIR} ]; then
rm -rf ${TMPDIR}
fi
mkdir ${TMPDIR}
if [ -d ${BUILDDIR} ]; then
rm -rf ${BUILDDIR}
fi
mkdir ${BUILDDIR}
#### Prepare the roundcube source
# Download Roundcube and verify GPG if configured to do so:
if [ -f ${ROUNDCUBE_DOWNLOAD} ]; then
rm -f ${ROUNDCUBE_DOWNLOAD}
fi
curl -o ${ROUNDCUBE_DOWNLOAD} \
-SL https://github.com/roundcube/roundcubemail/releases/download/${ROUNDCUBEMAIL_VERSION}/roundcubemail-${ROUNDCUBEMAIL_VERSION}-complete.tar.gz
if [ "$CHECK_GPG" = true ]; then
export GNUPGHOME="$(mktemp -d)"
if [ -f ${ROUNDCUBE_ASC_DOWNLOAD} ]; then
rm -f ${ROUNDCUBE_ASC_DOWNLOAD}
fi
curl -o ${ROUNDCUBE_ASC_DOWNLOAD} \
-SL https://github.com/roundcube/roundcubemail/releases/download/${ROUNDCUBEMAIL_VERSION}/roundcubemail-${ROUNDCUBEMAIL_VERSION}-complete.tar.gz.asc
# ha.pool.sks-keyservers.net seems to be unreliable, use pgp.mit.edu as fallback
gpg --keyserver ha.pool.sks-keyservers.net --recv-keys F3E4C04BB3DB5D4215C45F7F5AB2BAA141C4F7D5 \
|| gpg --keyserver pgp.mit.edu --recv-keys F3E4C04BB3DB5D4215C45F7F5AB2BAA141C4F7D5
gpg --batch --verify ${ROUNDCUBE_ASC_DOWNLOAD} ${ROUNDCUBE_DOWNLOAD}
# Clean up behind us
if [ "$CLEAN_INTERMEDIATES" = true ]; then
gpgconf --kill all
rm -rf "$GNUPGHOME" ${ROUNDCUBE_ASC_DOWNLOAD}
fi
fi
# Extract the file into a temporary location and clean up behind us
tar -xzf ${ROUNDCUBE_DOWNLOAD} -C ${TMPDIR}
# upstream tarballs include ./roundcubemail-${ROUNDCUBEMAIL_VERSION}/ so this gives us TMPDIR/roundcubemail-${ROUNDCUBEMAIL_VERSION}
mv ${TMPDIR}/roundcubemail-${ROUNDCUBEMAIL_VERSION} ${ROUNDCUBE_SRC}
# Clean up the source tree for later use
rm -rf ${ROUNDCUBE_SRC}/installer
# Clean up behind us
if [ "$CLEAN_INTERMEDIATES" = true ]; then
rm -f ${ROUNDCUBE_DOWNLOAD}
fi
#### Prepare the ISPConfig Stuff
if [ -f ${ISPCONFIG_DOWNLOAD} ]; then
rm -f ${ISPCONFIG_DOWNLOAD}
fi
curl -o ${ISPCONFIG_DOWNLOAD} -SL https://github.com/w2c/ispconfig3_roundcube/archive/master.zip
unzip -q ${ISPCONFIG_DOWNLOAD} -d ${TMPDIR}
# This gives us a dir ispconfig3_roundcube-master, which we normalize
mv ${TMPDIR}/ispconfig3_roundcube-master ${ISPCONFIG_SRC}
# Clean up the source tree for later use
rm -f ${ISPCONFIG_SRC}/.gitignore ${ISPCONFIG_SRC}/README.md
#### Create the ROOT FS TREE
mkdir -p ${ROOTFSTREE}
# Prepare the Webroot directory with the source tree, then create some links, which we'll
# need during runtime, they will be created by our entry point script.
mkdir -p ${WEBROOT_DST}
tar -c --one-file-system -C ${ROUNDCUBE_SRC} . | tar -x -C ${WEBROOT_DST}
ln -s ${CONTAINER_VOLUME_CONFIG}/config.inc.php ${WEBROOT_DST}/config/config.inc.php
cp ${SRCDIR}/db.inc.php ${WEBROOT_DST}/config/db.inc.php
# Setup PHP
mkdir -p ${PHP_CONFD_DST}
cp ${SRCDIR}/php.ini ${PHP_CONFD_DST}/php.ini
# Move the ISPConfig Plugins into place, again create some links which we'll need during
# runtime. These too will be created by our entry point script
tar -c --one-file-system -C ${ISPCONFIG_SRC} . | tar -x -C ${WEBROOT_DST}/plugins
ln -s ${CONTAINER_VOLUME_CONFIG}/ispconfig3_account.inc.php ${WEBROOT_DST}/plugins/ispconfig3_account/config/config.inc.php
# Add Entry Point
cp -a ${SRCDIR}/docker-entrypoint.sh ${ROOTFSTREE}
# Add all helper scripts
mkdir -p ${SCRIPTS_DST}
curl -o ${SCRIPTS_DST}/wait-for-it.sh \
-SL https://raw.githubusercontent.com/vishnubob/wait-for-it/master/wait-for-it.sh
chmod +x ${SCRIPTS_DST}/wait-for-it.sh
cp -a ${SCRIPTS_SRC}/* ${SCRIPTS_DST}
# Clean up behind us
if [ "$CLEAN_INTERMEDIATES" = true ]; then
rm -rf ${ROUNDCUBE_SRC}
rm -rf ${ISPCONFIG_SRC}
fi
#### Now we tar everything together, so that the Dockerfile can put everything in place in one run
tar -czf ${ROOTFSFILE} -C ${ROOTFSTREE} .
# Clean up behind us
if [ "$CLEAN_INTERMEDIATES" = true ]; then
rm -rf ${ROOTFSTREE}
fi

15
src/db.inc.php Normal file
View File

@ -0,0 +1,15 @@
<?php
include_once("/var/roundcube/config/db.inc.php");
switch ($dbtype) {
case "sqlite":
$config['db_dsnw'] = "sqlite:///$basepath/$dbname?mode=0640";
break;
default:
if ($dbport != '') $dbport=":$dbport";
if ($dbserver == '') $dbserver="localhost";
$config['db_dsnw'] = "$dbtype://$dbuser:$dbpass@$dbserver$dbport/$dbname";
break;
}
?>

101
src/docker-entrypoint.sh Executable file
View File

@ -0,0 +1,101 @@
#!/bin/bash
# set -ex
# PWD=`pwd`
if [[ "$1" == apache2* ]] || [ "$1" == php-fpm ]; then
if ! [ -e index.php -a -e bin/installto.sh ]; then
#### TODO SUPERSEEDED BY container build
echo >&2 "roundcubemail 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/roundcubemail . | tar xf -
echo >&2 "Complete! ROUNDCUBEMAIL has been successfully copied to $PWD"
fi
if [ ! -z "${!POSTGRES_ENV_POSTGRES_*}" ] || [ "$ROUNDCUBEMAIL_DB_TYPE" == "pgsql" ]; then
: "${ROUNDCUBEMAIL_DB_TYPE:=pgsql}"
: "${ROUNDCUBEMAIL_DB_HOST:=postgres}"
: "${ROUNDCUBEMAIL_DB_USER:=${POSTGRES_ENV_POSTGRES_USER}}"
: "${ROUNDCUBEMAIL_DB_PASSWORD:=${POSTGRES_ENV_POSTGRES_PASSWORD}}"
: "${ROUNDCUBEMAIL_DB_NAME:=${POSTGRES_ENV_POSTGRES_DB:-roundcubemail}}"
: "${ROUNDCUBEMAIL_DSNW:=${ROUNDCUBEMAIL_DB_TYPE}://${ROUNDCUBEMAIL_DB_USER}:${ROUNDCUBEMAIL_DB_PASSWORD}@${ROUNDCUBEMAIL_DB_HOST}/${ROUNDCUBEMAIL_DB_NAME}}"
/wait-for-it.sh ${ROUNDCUBEMAIL_DB_HOST}:5432 -t 30
elif [ ! -z "${!MYSQL_ENV_MYSQL_*}" ] || [ "$ROUNDCUBEMAIL_DB_TYPE" == "mysql" ]; then
: "${ROUNDCUBEMAIL_DB_TYPE:=mysql}"
: "${ROUNDCUBEMAIL_DB_HOST:=mysql}"
: "${ROUNDCUBEMAIL_DB_USER:=${MYSQL_ENV_MYSQL_USER:-root}}"
if [ "$ROUNDCUBEMAIL_DB_USER" = 'root' ]; then
: "${ROUNDCUBEMAIL_DB_PASSWORD:=${MYSQL_ENV_MYSQL_ROOT_PASSWORD}}"
else
: "${ROUNDCUBEMAIL_DB_PASSWORD:=${MYSQL_ENV_MYSQL_PASSWORD}}"
fi
: "${ROUNDCUBEMAIL_DB_NAME:=${MYSQL_ENV_MYSQL_DATABASE:-roundcubemail}}"
: "${ROUNDCUBEMAIL_DSNW:=${ROUNDCUBEMAIL_DB_TYPE}://${ROUNDCUBEMAIL_DB_USER}:${ROUNDCUBEMAIL_DB_PASSWORD}@${ROUNDCUBEMAIL_DB_HOST}/${ROUNDCUBEMAIL_DB_NAME}}"
/wait-for-it.sh ${ROUNDCUBEMAIL_DB_HOST}:3306 -t 30
else
# use local SQLite DB in /var/www/html/db
: "${ROUNDCUBEMAIL_DB_TYPE:=sqlite}"
: "${ROUNDCUBEMAIL_DB_DIR:=$PWD/db}"
: "${ROUNDCUBEMAIL_DB_NAME:=sqlite}"
: "${ROUNDCUBEMAIL_DSNW:=${ROUNDCUBEMAIL_DB_TYPE}:///$ROUNDCUBEMAIL_DB_DIR/${ROUNDCUBEMAIL_DB_NAME}.db?mode=0646}"
mkdir -p $ROUNDCUBEMAIL_DB_DIR
chown www-data:www-data $ROUNDCUBEMAIL_DB_DIR
fi
: "${ROUNDCUBEMAIL_DEFAULT_HOST:=localhost}"
: "${ROUNDCUBEMAIL_DEFAULT_PORT:=143}"
: "${ROUNDCUBEMAIL_SMTP_SERVER:=localhost}"
: "${ROUNDCUBEMAIL_SMTP_PORT:=587}"
: "${ROUNDCUBEMAIL_PLUGINS:=archive,zipdownload}"
: "${ROUNDCUBEMAIL_TEMP_DIR:=/tmp/roundcube-temp}"
if [ ! -e config/config.inc.php ]; then
#### TODO SUPERSEEDED BY write-config.sh
ROUNDCUBEMAIL_PLUGINS_PHP=`echo "${ROUNDCUBEMAIL_PLUGINS}" | sed -E "s/[, ]+/', '/g"`
mkdir -p ${ROUNDCUBEMAIL_TEMP_DIR} && chown www-data ${ROUNDCUBEMAIL_TEMP_DIR}
touch config/config.inc.php
echo "Write config to $PWD/config/config.inc.php"
echo "<?php
\$config['db_dsnw'] = '${ROUNDCUBEMAIL_DSNW}';
\$config['db_dsnr'] = '${ROUNDCUBEMAIL_DSNR}';
\$config['default_host'] = '${ROUNDCUBEMAIL_DEFAULT_HOST}';
\$config['default_port'] = '${ROUNDCUBEMAIL_DEFAULT_PORT}';
\$config['smtp_server'] = '${ROUNDCUBEMAIL_SMTP_SERVER}';
\$config['smtp_port'] = '${ROUNDCUBEMAIL_SMTP_PORT}';
\$config['smtp_user'] = '%u';
\$config['smtp_pass'] = '%p';
\$config['temp_dir'] = '${ROUNDCUBEMAIL_TEMP_DIR}';
\$config['plugins'] = ['${ROUNDCUBEMAIL_PLUGINS_PHP}'];
\$config['zipdownload_selection'] = true;
\$config['log_driver'] = 'stdout';
" > config/config.inc.php
for fn in `ls /var/roundcube/config/*.php 2>/dev/null || true`; do
echo "include('$fn');" >> config/config.inc.php
done
# initialize DB if not SQLite
echo "${ROUNDCUBEMAIL_DSNW}" | grep -q 'sqlite:' || bin/initdb.sh --dir=$PWD/SQL || bin/updatedb.sh --dir=$PWD/SQL --package=roundcube || echo "Failed to initialize databse. Please run $PWD/bin/initdb.sh manually."
else
echo "WARNING: $PWD/config/config.inc.php already exists."
echo "ROUNDCUBEMAIL_* environment variables have been ignored."
fi
if [ ! -z "${ROUNDCUBEMAIL_UPLOAD_MAX_FILESIZE}" ]; then
echo "upload_max_filesize=${ROUNDCUBEMAIL_UPLOAD_MAX_FILESIZE}" >> /usr/local/etc/php/conf.d/roundcube-override.ini
echo "post_max_size=${ROUNDCUBEMAIL_UPLOAD_MAX_FILESIZE}" >> /usr/local/etc/php/conf.d/roundcube-override.ini
fi
fi
exec "$@"

10
src/php.ini Normal file
View File

@ -0,0 +1,10 @@
memory_limit=64M
display_errors=Off
log_errors=On
upload_max_filesize=5M
post_max_size=6M
zlib.output_compression=Off
session.auto_start=Off
session.gc_maxlifetime=21600
session.gc_divisor=500
session.gc_probability=1

27
src/scripts/write-config.sh Executable file
View File

@ -0,0 +1,27 @@
#!/bin/bash
# set -ex
CONFIG=/var/roundcube/config/config.inc.php
ROUNDCUBEMAIL_PLUGINS_PHP=`echo "${ROUNDCUBEMAIL_PLUGINS}" | sed -E "s/[, ]+/', '/g"`
mkdir -p ${ROUNDCUBEMAIL_TEMP_DIR} && chown www-data ${ROUNDCUBEMAIL_TEMP_DIR}
touch $CONFIG
echo "Write config to $PWD/config/config.inc.php"
echo "<?php
\$config['db_dsnw'] = '${ROUNDCUBEMAIL_DSNW}';
\$config['db_dsnr'] = '${ROUNDCUBEMAIL_DSNR}';
\$config['default_host'] = '${ROUNDCUBEMAIL_DEFAULT_HOST}';
\$config['default_port'] = '${ROUNDCUBEMAIL_DEFAULT_PORT}';
\$config['smtp_server'] = '${ROUNDCUBEMAIL_SMTP_SERVER}';
\$config['smtp_port'] = '${ROUNDCUBEMAIL_SMTP_PORT}';
\$config['smtp_user'] = '%u';
\$config['smtp_pass'] = '%p';
\$config['temp_dir'] = '${ROUNDCUBEMAIL_TEMP_DIR}';
\$config['plugins'] = ['${ROUNDCUBEMAIL_PLUGINS_PHP}'];
\$config['zipdownload_selection'] = true;
\$config['log_driver'] = 'stdout';
" > $CONFIG