plone.docker/master: Refs #75 - Prepare release 4.3.15
Alin Voinea <jenkins-z4DKO/[email protected]> Tue, 01 Aug 2017 02:45:17 -0700 (PDT)
| Newsgroups | gmane.comp.web.zope.plone.cvs |
|---|---|
| Message-ID | <[email protected]> |
Repository: plone.docker Branch: refs/heads/master Date: 2017-08-01T12:38:40+03:00 Author: Alin Voinea (avoinea) <[email protected]> Commit: https://github.com/plone/plone.docker/commit/4385d530b79ff8d38727145d68f17aed9a6b4c5f Refs #75 - Prepare release 4.3.15 Files changed: A 4.3/4.3.15/alpine/Dockerfile A 4.3/4.3.15/alpine/docker-entrypoint.sh A 4.3/4.3.15/alpine/docker-initialize.py A 4.3/4.3.15/debian/Dockerfile A 4.3/4.3.15/debian/docker-entrypoint.sh A 4.3/4.3.15/debian/docker-initialize.py diff --git a/4.3/4.3.15/alpine/Dockerfile b/4.3/4.3.15/alpine/Dockerfile new file mode 100644 index 0000000..72fd6f8 --- /dev/null +++ b/4.3/4.3.15/alpine/Dockerfile @@ -0,0 +1,70 @@ +FROM python:2.7-alpine + +ENV PLONE_MAJOR=4.3 \ + PLONE_VERSION=4.3.14 \ + PLONE_MD5=e10c55a870735b90e7a82c2f2a39d123 + +LABEL plone=$PLONE_VERSION \ + os="alpine" \ + os.version="3.4" \ + name="Plone 4" \ + description="Plone image, based on Unified Installer" \ + maintainer="Plone Community" + +RUN addgroup -g 500 plone \ + && adduser -S -D -G plone -u 500 -h /plone plone \ + && mkdir -p /data/filestorage /data/blobstorage \ + && chown -R plone:plone /data \ + && apk add --no-cache --virtual .build-deps \ + curl \ + bzip2-dev \ + gcc \ + libc-dev \ + ncurses-dev \ + openssl-dev \ + readline-dev \ + zlib-dev \ + sudo \ + make \ + libxml2-dev \ + libxslt-dev \ + libjpeg-turbo-dev \ + libpng-dev openssl \ + && curl -SL -o Plone.tgz https://launchpad.net/plone/$PLONE_MAJOR/$PLONE_VERSION/+download/Plone-$PLONE_VERSION-UnifiedInstaller.tgz \ + && tar -zxvf Plone.tgz \ + && curl -SL -o /Plone-$PLONE_VERSION-UnifiedInstaller/helper_scripts/user_group_utilities.sh https://raw.githubusercontent.com/plone/Installers-UnifiedInstaller/master/helper_scripts/user_group_utilities.sh \ + && ./Plone-$PLONE_VERSION-UnifiedInstaller/install.sh \ + --password=admin \ + --daemon-user=plone \ + --owner=plone \ + --group=plone \ + --target=/plone \ + --instance=instance \ + --var=/data \ + none \ + && cd /plone/instance \ + && sed -i 's/parts =/parts =\n zeoserver/g' buildout.cfg \ + && echo -e '\n[zeoserver]\n<= zeoserver_base\nrecipe = plone.recipe.zeoserver' >> buildout.cfg \ + && sudo -u plone LIBRARY_PATH=/lib:/usr/lib bin/buildout \ + && chown -R plone:plone /plone /data \ + && apk del .build-deps \ + && apk add --no-cache --virtual .run-deps \ + bash \ + libxml2 \ + libxslt \ + libjpeg-turbo \ + rsync \ + && rm -rf /Plone* \ + && rm -rf /plone/buildout-cache/downloads/* \ + && find /plone \( -type f -a -name '*.pyc' -o -name '*.pyo' \) -exec rm -rf '{}' + + +VOLUME /data + +COPY docker-initialize.py docker-entrypoint.sh / + +EXPOSE 8080 +USER plone +WORKDIR /plone/instance + +ENTRYPOINT ["/docker-entrypoint.sh"] +CMD ["start"] diff --git a/4.3/4.3.15/alpine/docker-entrypoint.sh b/4.3/4.3.15/alpine/docker-entrypoint.sh new file mode 100755 index 0000000..72bd07c --- /dev/null +++ b/4.3/4.3.15/alpine/docker-entrypoint.sh @@ -0,0 +1,56 @@ +#!/bin/bash +set -e + +COMMANDS="debug help logtail show stop adduser fg kill quit run wait console foreground logreopen reload shell status" +START="start restart zeoserver" +CMD="bin/instance" + +python /docker-initialize.py + +if [ -e "custom.cfg" ]; then + if [ ! -e "bin/develop" ]; then + bin/buildout -c custom.cfg + python /docker-initialize.py + fi +fi + +if [[ "$1" == "zeo"* ]]; then + CMD="bin/zeoserver" +fi + +if [ -z "$HEALTH_CHECK_TIMEOUT" ]; then + HEALTH_CHECK_TIMEOUT=1 +fi + +if [ -z "$HEALTH_CHECK_INTERVAL" ]; then + HEALTH_CHECK_INTERVAL=1 +fi + +if [[ $START == *"$1"* ]]; then + _stop() { + $CMD stop + kill -TERM $child 2>/dev/null + } + + trap _stop SIGTERM SIGINT + $CMD start + $CMD logtail & + child=$! + + pid=`$CMD status | sed 's/[^0-9]*//g'` + if [ ! -z "$pid" ]; then + echo "Application running on pid=$pid" + sleep "$HEALTH_CHECK_TIMEOUT" + while kill -0 "$pid" 2> /dev/null; do + sleep "$HEALTH_CHECK_INTERVAL" + done + else + echo "Application didn't start normally. Shutting down!" + _stop + fi +else + if [[ $COMMANDS == *"$1"* ]]; then + exec bin/instance "$@" + fi + exec "$@" +fi diff --git a/4.3/4.3.15/alpine/docker-initialize.py b/4.3/4.3.15/alpine/docker-initialize.py new file mode 100755 index 0000000..087bde9 --- /dev/null +++ b/4.3/4.3.15/alpine/docker-initialize.py @@ -0,0 +1,178 @@ +#!/plone/instance/bin/python + +import re +import os +import warnings +warnings.simplefilter('always', DeprecationWarning) + +class Environment(object): + """ Configure container via environment variables + """ + def __init__(self, env=os.environ, + zope_conf="/plone/instance/parts/instance/etc/zope.conf", + custom_conf="/plone/instance/custom.cfg", + zeopack_conf="/plone/instance/bin/zeopack", + zeoserver_conf="/plone/instance/parts/zeoserver/etc/zeo.conf" + ): + self.env = env + self.zope_conf = zope_conf + self.custom_conf = custom_conf + self.zeopack_conf = zeopack_conf + self.zeoserver_conf = zeoserver_conf + + def zeoclient(self): + """ ZEO Client + """ + server = self.env.get("ZEO_ADDRESS", None) + if not server: + return + + config = "" + with open(self.zope_conf, "r") as cfile: + config = cfile.read() + + # Already initialized + if "<blobstorage>" not in config: + return + + read_only = self.env.get("ZEO_READ_ONLY", "false") + zeo_ro_fallback = self.env.get("ZEO_CLIENT_READ_ONLY_FALLBACK", "false") + shared_blob_dir=self.env.get("ZEO_SHARED_BLOB_DIR", "off") + zeo_storage=self.env.get("ZEO_STORAGE", "1") + zeo_client_cache_size=self.env.get("ZEO_CLIENT_CACHE_SIZE", "128MB") + zeo_conf = ZEO_TEMPLATE.format( + zeo_address=server, + read_only=read_only, + zeo_client_read_only_fallback=zeo_ro_fallback, + shared_blob_dir=shared_blob_dir, + zeo_storage=zeo_storage, + zeo_client_cache_size=zeo_client_cache_size + ) + + pattern = re.compile(r"<blobstorage>.+</blobstorage>", re.DOTALL) + config = re.sub(pattern, zeo_conf, config) + + with open(self.zope_conf, "w") as cfile: + cfile.write(config) + + def zeopack(self): + """ ZEO Pack + """ + server = self.env.get("ZEO_ADDRESS", None) + if not server: + return + + if ":" in server: + host, port = server.split(":") + else: + host, port = (server, "8100") + + with open(self.zeopack_conf, 'r') as cfile: + text = cfile.read() + text = text.replace('address = "8100"', 'address = "%s"' % server) + text = text.replace('host = "127.0.0.1"', 'host = "%s"' % host) + text = text.replace('port = "8100"', 'port = "%s"' % port) + + with open(self.zeopack_conf, 'w') as cfile: + cfile.write(text) + + def zeoserver(self): + """ ZEO Server + """ + pack_keep_old = self.env.get("ZEO_PACK_KEEP_OLD", '') + if pack_keep_old.lower() in ("false", "no", "0", "n", "f"): + with open(self.zeoserver_conf, 'r') as cfile: + text = cfile.read() + if 'pack-keep-old' not in text: + text = text.replace( + '</filestorage>', + ' pack-keep-old false\n</filestorage>' + ) + + with open(self.zeoserver_conf, 'w') as cfile: + cfile.write(text) + + def buildout(self): + """ Buildout from environment variables + """ + # Already configured + if os.path.exists(self.custom_conf): + return + + eggs = self.env.get("PLONE_ADDONS", + self.env.get("ADDONS", "")).strip().split() + if not eggs: + eggs = self.env.get("BUILDOUT_EGGS", "").strip().split() + if eggs: + warnings.warn( + "BUILDOUT_EGGS is deprecated. Please use " + "PLONE_ADDONS instead !!!", DeprecationWarning) + + zcml = self.env.get("PLONE_ZCML", + self.env.get("ZCML", "")).strip().split() + if not zcml: + zcml = self.env.get("BUILDOUT_ZCML", "").strip().split() + if zcml: + warnings.warn( + "BUILDOUT_ZCML is deprecated. Please use " + "PLONE_ZCML instead !!!", DeprecationWarning) + + develop = self.env.get("PLONE_DEVELOP", + self.env.get("DEVELOP", "")).strip().split() + if not develop: + develop = self.env.get("BUILDOUT_DEVELOP", "").strip().split() + if develop: + warnings.warn( + "BUILDOUT_DEVELOP is deprecated. Please use " + "PLONE_DEVELOP instead !!!", DeprecationWarning) + + if not (eggs or zcml or develop): + return + + buildout = BUILDOUT_TEMPLATE.format( + eggs="\n\t".join(eggs), + zcml="\n\t".join(zcml), + develop="\n\t".join(develop) + ) + + with open(self.custom_conf, 'w') as cfile: + cfile.write(buildout) + + def setup(self, **kwargs): + self.buildout() + self.zeoclient() + self.zeopack() + self.zeoserver() + + __call__ = setup + +ZEO_TEMPLATE = """ + <zeoclient> + read-only {read_only} + read-only-fallback {zeo_client_read_only_fallback} + blob-dir /data/blobstorage + shared-blob-dir {shared_blob_dir} + server {zeo_address} + storage {zeo_storage} + name zeostorage + var /plone/instance/parts/instance/var + cache-size {zeo_client_cache_size} + </zeoclient> +""".strip() + +BUILDOUT_TEMPLATE = """ +[buildout] +extends = develop.cfg +develop += {develop} +eggs += {eggs} +zcml += {zcml} +""" + +def initialize(): + """ Configure Plone instance as ZEO Client + """ + environment = Environment() + environment.setup() + +if __name__ == "__main__": + initialize() diff --git a/4.3/4.3.15/debian/Dockerfile b/4.3/4.3.15/debian/Dockerfile new file mode 100644 index 0000000..293034f --- /dev/null +++ b/4.3/4.3.15/debian/Dockerfile @@ -0,0 +1,55 @@ +FROM python:2.7-slim + +ENV PLONE_MAJOR=4.3 \ + PLONE_VERSION=4.3.14 \ + PLONE_MD5=e10c55a870735b90e7a82c2f2a39d123 + +LABEL plone=$PLONE_VERSION \ + os="debian" \ + os.version="8" \ + name="Plone 4" \ + description="Plone image, based on Unified Installer" \ + maintainer="Plone Community" + +RUN useradd --system -m -d /plone -U -u 500 plone \ + && mkdir -p /data/filestorage /data/blobstorage \ + && chown -R plone:plone /data \ + && buildDeps="wget sudo python-setuptools python-dev build-essential libssl-dev libxml2-dev libxslt1-dev libbz2-dev libjpeg62-turbo-dev libtiff5-dev libopenjp2-7-dev" \ + && runDeps="libxml2 libxslt1.1 libjpeg62 rsync lynx wv libtiff5 libopenjp2-7 poppler-utils" \ + && apt-get update \ + && apt-get install -y --no-install-recommends $buildDeps \ + && wget -O Plone.tgz https://launchpad.net/plone/$PLONE_MAJOR/$PLONE_VERSION/+download/Plone-$PLONE_VERSION-UnifiedInstaller.tgz \ + && echo "$PLONE_MD5 Plone.tgz" | md5sum -c - \ + && tar -xzf Plone.tgz \ + && ./Plone-$PLONE_VERSION-UnifiedInstaller/install.sh \ + --password=admin \ + --daemon-user=plone \ + --owner=plone \ + --group=plone \ + --target=/plone \ + --instance=instance \ + --var=/data \ + none \ + && cd /plone/instance \ + && sed -i 's/parts =/parts =\n zeoserver/g' buildout.cfg \ + && echo '\n[zeoserver]\n<= zeoserver_base\nrecipe = plone.recipe.zeoserver' >> buildout.cfg \ + && sudo -u plone bin/buildout \ + && chown -R plone:plone /plone /data \ + && rm -rf /Plone* \ + && SUDO_FORCE_REMOVE=yes apt-get remove --purge -y $buildDeps \ + && apt-get install -y --no-install-recommends $runDeps \ + && rm -rf /var/lib/apt/lists/* \ + && rm -rf /plone/buildout-cache/downloads/* \ + && rm -rf /plone/Plone-docs \ + && find /plone \( -type f -a -name '*.pyc' -o -name '*.pyo' \) -exec rm -rf '{}' + + +VOLUME /data + +COPY docker-initialize.py docker-entrypoint.sh / + +EXPOSE 8080 +USER plone +WORKDIR /plone/instance + +ENTRYPOINT ["/docker-entrypoint.sh"] +CMD ["start"] diff --git a/4.3/4.3.15/debian/docker-entrypoint.sh b/4.3/4.3.15/debian/docker-entrypoint.sh new file mode 100755 index 0000000..72bd07c --- /dev/null +++ b/4.3/4.3.15/debian/docker-entrypoint.sh @@ -0,0 +1,56 @@ +#!/bin/bash +set -e + +COMMANDS="debug help logtail show stop adduser fg kill quit run wait console foreground logreopen reload shell status" +START="start restart zeoserver" +CMD="bin/instance" + +python /docker-initialize.py + +if [ -e "custom.cfg" ]; then + if [ ! -e "bin/develop" ]; then + bin/buildout -c custom.cfg + python /docker-initialize.py + fi +fi + +if [[ "$1" == "zeo"* ]]; then + CMD="bin/zeoserver" +fi + +if [ -z "$HEALTH_CHECK_TIMEOUT" ]; then + HEALTH_CHECK_TIMEOUT=1 +fi + +if [ -z "$HEALTH_CHECK_INTERVAL" ]; then + HEALTH_CHECK_INTERVAL=1 +fi + +if [[ $START == *"$1"* ]]; then + _stop() { + $CMD stop + kill -TERM $child 2>/dev/null + } + + trap _stop SIGTERM SIGINT + $CMD start + $CMD logtail & + child=$! + + pid=`$CMD status | sed 's/[^0-9]*//g'` + if [ ! -z "$pid" ]; then + echo "Application running on pid=$pid" + sleep "$HEALTH_CHECK_TIMEOUT" + while kill -0 "$pid" 2> /dev/null; do + sleep "$HEALTH_CHECK_INTERVAL" + done + else + echo "Application didn't start normally. Shutting down!" + _stop + fi +else + if [[ $COMMANDS == *"$1"* ]]; then + exec bin/instance "$@" + fi + exec "$@" +fi diff --git a/4.3/4.3.15/debian/docker-initialize.py b/4.3/4.3.15/debian/docker-initialize.py new file mode 100755 index 0000000..087bde9 --- /dev/null +++ b/4.3/4.3.15/debian/docker-initialize.py @@ -0,0 +1,178 @@ +#!/plone/instance/bin/python + +import re +import os +import warnings +warnings.simplefilter('always', DeprecationWarning) + +class Environment(object): + """ Configure container via environment variables + """ + def __init__(self, env=os.environ, + zope_conf="/plone/instance/parts/instance/etc/zope.conf", + custom_conf="/plone/instance/custom.cfg", + zeopack_conf="/plone/instance/bin/zeopack", + zeoserver_conf="/plone/instance/parts/zeoserver/etc/zeo.conf" + ): + self.env = env + self.zope_conf = zope_conf + self.custom_conf = custom_conf + self.zeopack_conf = zeopack_conf + self.zeoserver_conf = zeoserver_conf + + def zeoclient(self): + """ ZEO Client + """ + server = self.env.get("ZEO_ADDRESS", None) + if not server: + return + + config = "" + with open(self.zope_conf, "r") as cfile: + config = cfile.read() + + # Already initialized + if "<blobstorage>" not in config: + return + + read_only = self.env.get("ZEO_READ_ONLY", "false") + zeo_ro_fallback = self.env.get("ZEO_CLIENT_READ_ONLY_FALLBACK", "false") + shared_blob_dir=self.env.get("ZEO_SHARED_BLOB_DIR", "off") + zeo_storage=self.env.get("ZEO_STORAGE", "1") + zeo_client_cache_size=self.env.get("ZEO_CLIENT_CACHE_SIZE", "128MB") + zeo_conf = ZEO_TEMPLATE.format( + zeo_address=server, + read_only=read_only, + zeo_client_read_only_fallback=zeo_ro_fallback, + shared_blob_dir=shared_blob_dir, + zeo_storage=zeo_storage, + zeo_client_cache_size=zeo_client_cache_size + ) + + pattern = re.compile(r"<blobstorage>.+</blobstorage>", re.DOTALL) + config = re.sub(pattern, zeo_conf, config) + + with open(self.zope_conf, "w") as cfile: + cfile.write(config) + + def zeopack(self): + """ ZEO Pack + """ + server = self.env.get("ZEO_ADDRESS", None) + if not server: + return + + if ":" in server: + host, port = server.split(":") + else: + host, port = (server, "8100") + + with open(self.zeopack_conf, 'r') as cfile: + text = cfile.read() + text = text.replace('address = "8100"', 'address = "%s"' % server) + text = text.replace('host = "127.0.0.1"', 'host = "%s"' % host) + text = text.replace('port = "8100"', 'port = "%s"' % port) + + with open(self.zeopack_conf, 'w') as cfile: + cfile.write(text) + + def zeoserver(self): + """ ZEO Server + """ + pack_keep_old = self.env.get("ZEO_PACK_KEEP_OLD", '') + if pack_keep_old.lower() in ("false", "no", "0", "n", "f"): + with open(self.zeoserver_conf, 'r') as cfile: + text = cfile.read() + if 'pack-keep-old' not in text: + text = text.replace( + '</filestorage>', + ' pack-keep-old false\n</filestorage>' + ) + + with open(self.zeoserver_conf, 'w') as cfile: + cfile.write(text) + + def buildout(self): + """ Buildout from environment variables + """ + # Already configured + if os.path.exists(self.custom_conf): + return + + eggs = self.env.get("PLONE_ADDONS", + self.env.get("ADDONS", "")).strip().split() + if not eggs: + eggs = self.env.get("BUILDOUT_EGGS", "").strip().split() + if eggs: + warnings.warn( + "BUILDOUT_EGGS is deprecated. Please use " + "PLONE_ADDONS instead !!!", DeprecationWarning) + + zcml = self.env.get("PLONE_ZCML", + self.env.get("ZCML", "")).strip().split() + if not zcml: + zcml = self.env.get("BUILDOUT_ZCML", "").strip().split() + if zcml: + warnings.warn( + "BUILDOUT_ZCML is deprecated. Please use " + "PLONE_ZCML instead !!!", DeprecationWarning) + + develop = self.env.get("PLONE_DEVELOP", + self.env.get("DEVELOP", "")).strip().split() + if not develop: + develop = self.env.get("BUILDOUT_DEVELOP", "").strip().split() + if develop: + warnings.warn( + "BUILDOUT_DEVELOP is deprecated. Please use " + "PLONE_DEVELOP instead !!!", DeprecationWarning) + + if not (eggs or zcml or develop): + return + + buildout = BUILDOUT_TEMPLATE.format( + eggs="\n\t".join(eggs), + zcml="\n\t".join(zcml), + develop="\n\t".join(develop) + ) + + with open(self.custom_conf, 'w') as cfile: + cfile.write(buildout) + + def setup(self, **kwargs): + self.buildout() + self.zeoclient() + self.zeopack() + self.zeoserver() + + __call__ = setup + +ZEO_TEMPLATE = """ + <zeoclient> + read-only {read_only} + read-only-fallback {zeo_client_read_only_fallback} + blob-dir /data/blobstorage + shared-blob-dir {shared_blob_dir} + server {zeo_address} + storage {zeo_storage} + name zeostorage + var /plone/instance/parts/instance/var + cache-size {zeo_client_cache_size} + </zeoclient> +""".strip() + +BUILDOUT_TEMPLATE = """ +[buildout] +extends = develop.cfg +develop += {develop} +eggs += {eggs} +zcml += {zcml} +""" + +def initialize(): + """ Configure Plone instance as ZEO Client + """ + environment = Environment() + environment.setup() + +if __name__ == "__main__": + initialize() ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot