Skip to content

Instantly share code, notes, and snippets.

Created October 11, 2016 21:35
Show Gist options
  • Save anonymous/62ca1bed63c16d4b15b5970fe6ed49c7 to your computer and use it in GitHub Desktop.
Save anonymous/62ca1bed63c16d4b15b5970fe6ed49c7 to your computer and use it in GitHub Desktop.
Add Plone to Official Images
diff --git a/plone_4.3.10/Dockerfile b/plone_4.3.10/Dockerfile
new file mode 100644
index 0000000..42d83d4
--- /dev/null
+++ b/plone_4.3.10/Dockerfile
@@ -0,0 +1,49 @@
+FROM python:2.7-slim
+MAINTAINER "Plone Community" http://community.plone.org
+
+RUN useradd --system -U -u 500 plone \
+ && mkdir -p /plone /data/filestorage /data/blobstorage \
+ && chown -R plone:plone /plone /data
+
+ENV PLONE_MAJOR=4.3
+ENV PLONE_VERSION=4.3.10
+ENV PLONE_MD5=df5c3b1affe8547cc7668318e93f78e2
+
+RUN buildDeps="curl sudo python-setuptools python-dev build-essential libssl-dev libxml2-dev libxslt1-dev libbz2-dev libjpeg62-turbo-dev" \
+ && runDeps="libxml2 libxslt1.1 libjpeg62 rsync" \
+ && apt-get update \
+ && apt-get install -y --no-install-recommends $buildDeps \
+ && curl -o Plone.tgz -SL 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 purge -y --auto-remove $buildDeps \
+ && apt-get install -y --no-install-recommends $runDeps \
+ && rm -rf /var/lib/apt/lists/* \
+ && 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/plone_4.3.10/docker-entrypoint.sh b/plone_4.3.10/docker-entrypoint.sh
new file mode 100755
index 0000000..5644bdb
--- /dev/null
+++ b/plone_4.3.10/docker-entrypoint.sh
@@ -0,0 +1,55 @@
+#!/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
+ 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/plone_4.3.10/docker-initialize.py b/plone_4.3.10/docker-initialize.py
new file mode 100755
index 0000000..087bde9
--- /dev/null
+++ b/plone_4.3.10/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/plone_4.3.7/Dockerfile b/plone_4.3.7/Dockerfile
new file mode 100644
index 0000000..d51a337
--- /dev/null
+++ b/plone_4.3.7/Dockerfile
@@ -0,0 +1,49 @@
+FROM python:2.7-slim
+MAINTAINER "Plone Community" http://community.plone.org
+
+RUN useradd --system -U -u 500 plone \
+ && mkdir -p /plone /data/filestorage /data/blobstorage \
+ && chown -R plone:plone /plone /data
+
+ENV PLONE_MAJOR=4.3
+ENV PLONE_VERSION=4.3.7
+ENV PLONE_MD5=b4ece39a6dda7a72c9084057d8faae4f
+
+RUN buildDeps="curl sudo python-setuptools python-dev build-essential libssl-dev libxml2-dev libxslt1-dev libbz2-dev libjpeg62-turbo-dev" \
+ && runDeps="libxml2 libxslt1.1 libjpeg62 rsync" \
+ && apt-get update \
+ && apt-get install -y --no-install-recommends $buildDeps \
+ && curl -o Plone.tgz -SL 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 purge -y --auto-remove $buildDeps \
+ && apt-get install -y --no-install-recommends $runDeps \
+ && rm -rf /var/lib/apt/lists/* \
+ && 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/plone_4.3.7/docker-entrypoint.sh b/plone_4.3.7/docker-entrypoint.sh
new file mode 100755
index 0000000..5644bdb
--- /dev/null
+++ b/plone_4.3.7/docker-entrypoint.sh
@@ -0,0 +1,55 @@
+#!/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
+ 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/plone_4.3.7/docker-initialize.py b/plone_4.3.7/docker-initialize.py
new file mode 100755
index 0000000..087bde9
--- /dev/null
+++ b/plone_4.3.7/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/plone_4.3.8/Dockerfile b/plone_4.3.8/Dockerfile
new file mode 100644
index 0000000..61f481e
--- /dev/null
+++ b/plone_4.3.8/Dockerfile
@@ -0,0 +1,49 @@
+FROM python:2.7-slim
+MAINTAINER "Plone Community" http://community.plone.org
+
+RUN useradd --system -U -u 500 plone \
+ && mkdir -p /plone /data/filestorage /data/blobstorage \
+ && chown -R plone:plone /plone /data
+
+ENV PLONE_MAJOR=4.3
+ENV PLONE_VERSION=4.3.8
+ENV PLONE_MD5=c308e7a2b37ff35825225afd982228aa
+
+RUN buildDeps="curl sudo python-setuptools python-dev build-essential libssl-dev libxml2-dev libxslt1-dev libbz2-dev libjpeg62-turbo-dev" \
+ && runDeps="libxml2 libxslt1.1 libjpeg62 rsync" \
+ && apt-get update \
+ && apt-get install -y --no-install-recommends $buildDeps \
+ && curl -o Plone.tgz -SL 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 purge -y --auto-remove $buildDeps \
+ && apt-get install -y --no-install-recommends $runDeps \
+ && rm -rf /var/lib/apt/lists/* \
+ && 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/plone_4.3.8/docker-entrypoint.sh b/plone_4.3.8/docker-entrypoint.sh
new file mode 100755
index 0000000..5644bdb
--- /dev/null
+++ b/plone_4.3.8/docker-entrypoint.sh
@@ -0,0 +1,55 @@
+#!/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
+ 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/plone_4.3.8/docker-initialize.py b/plone_4.3.8/docker-initialize.py
new file mode 100755
index 0000000..087bde9
--- /dev/null
+++ b/plone_4.3.8/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/plone_4.3.9/Dockerfile b/plone_4.3.9/Dockerfile
new file mode 100644
index 0000000..465d402
--- /dev/null
+++ b/plone_4.3.9/Dockerfile
@@ -0,0 +1,49 @@
+FROM python:2.7-slim
+MAINTAINER "Plone Community" http://community.plone.org
+
+RUN useradd --system -U -u 500 plone \
+ && mkdir -p /plone /data/filestorage /data/blobstorage \
+ && chown -R plone:plone /plone /data
+
+ENV PLONE_MAJOR=4.3
+ENV PLONE_VERSION=4.3.9
+ENV PLONE_MD5=fef5beaaf82692de601f558afa404d01
+
+RUN buildDeps="curl sudo python-setuptools python-dev build-essential libssl-dev libxml2-dev libxslt1-dev libbz2-dev libjpeg62-turbo-dev" \
+ && runDeps="libxml2 libxslt1.1 libjpeg62 rsync" \
+ && apt-get update \
+ && apt-get install -y --no-install-recommends $buildDeps \
+ && curl -o Plone.tgz -SL 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 purge -y --auto-remove $buildDeps \
+ && apt-get install -y --no-install-recommends $runDeps \
+ && rm -rf /var/lib/apt/lists/* \
+ && 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/plone_4.3.9/docker-entrypoint.sh b/plone_4.3.9/docker-entrypoint.sh
new file mode 100755
index 0000000..5644bdb
--- /dev/null
+++ b/plone_4.3.9/docker-entrypoint.sh
@@ -0,0 +1,55 @@
+#!/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
+ 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/plone_4.3.9/docker-initialize.py b/plone_4.3.9/docker-initialize.py
new file mode 100755
index 0000000..087bde9
--- /dev/null
+++ b/plone_4.3.9/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/plone_4/Dockerfile b/plone_4/Dockerfile
new file mode 100644
index 0000000..a7a7b01
--- /dev/null
+++ b/plone_4/Dockerfile
@@ -0,0 +1,49 @@
+FROM python:2.7-slim
+MAINTAINER "Plone Community" http://community.plone.org
+
+RUN useradd --system -U -u 500 plone \
+ && mkdir -p /plone /data/filestorage /data/blobstorage \
+ && chown -R plone:plone /plone /data
+
+ENV PLONE_MAJOR=4.3
+ENV PLONE_VERSION=4.3.11
+ENV PLONE_MD5=207cdf096869d11cee69339e95ace496
+
+RUN buildDeps="curl sudo python-setuptools python-dev build-essential libssl-dev libxml2-dev libxslt1-dev libbz2-dev libjpeg62-turbo-dev" \
+ && runDeps="libxml2 libxslt1.1 libjpeg62 rsync" \
+ && apt-get update \
+ && apt-get install -y --no-install-recommends $buildDeps \
+ && curl -o Plone.tgz -SL 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 purge -y --auto-remove $buildDeps \
+ && apt-get install -y --no-install-recommends $runDeps \
+ && rm -rf /var/lib/apt/lists/* \
+ && 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/plone_4/docker-entrypoint.sh b/plone_4/docker-entrypoint.sh
new file mode 100755
index 0000000..5644bdb
--- /dev/null
+++ b/plone_4/docker-entrypoint.sh
@@ -0,0 +1,55 @@
+#!/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
+ 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/plone_4/docker-initialize.py b/plone_4/docker-initialize.py
new file mode 100755
index 0000000..087bde9
--- /dev/null
+++ b/plone_4/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/plone_5.0.2/Dockerfile b/plone_5.0.2/Dockerfile
new file mode 100644
index 0000000..69f098e
--- /dev/null
+++ b/plone_5.0.2/Dockerfile
@@ -0,0 +1,49 @@
+FROM python:2.7-slim
+MAINTAINER "Plone Community" http://community.plone.org
+
+RUN useradd --system -U -u 500 plone \
+ && mkdir -p /plone /data/filestorage /data/blobstorage \
+ && chown -R plone:plone /plone /data
+
+ENV PLONE_MAJOR=5.0
+ENV PLONE_VERSION=5.0.2
+ENV PLONE_MD5=b141f65cef30e3e47456b7a6968616c5
+
+RUN buildDeps="curl sudo python-setuptools python-dev build-essential libssl-dev libxml2-dev libxslt1-dev libbz2-dev libjpeg62-turbo-dev" \
+ && runDeps="libxml2 libxslt1.1 libjpeg62 rsync" \
+ && apt-get update \
+ && apt-get install -y --no-install-recommends $buildDeps \
+ && curl -o Plone.tgz -SL 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 purge -y --auto-remove $buildDeps \
+ && apt-get install -y --no-install-recommends $runDeps \
+ && rm -rf /var/lib/apt/lists/* \
+ && 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/plone_5.0.2/docker-entrypoint.sh b/plone_5.0.2/docker-entrypoint.sh
new file mode 100755
index 0000000..5644bdb
--- /dev/null
+++ b/plone_5.0.2/docker-entrypoint.sh
@@ -0,0 +1,55 @@
+#!/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
+ 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/plone_5.0.2/docker-initialize.py b/plone_5.0.2/docker-initialize.py
new file mode 100755
index 0000000..087bde9
--- /dev/null
+++ b/plone_5.0.2/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/plone_5.0.3/Dockerfile b/plone_5.0.3/Dockerfile
new file mode 100644
index 0000000..947c820
--- /dev/null
+++ b/plone_5.0.3/Dockerfile
@@ -0,0 +1,49 @@
+FROM python:2.7-slim
+MAINTAINER "Plone Community" http://community.plone.org
+
+RUN useradd --system -U -u 500 plone \
+ && mkdir -p /plone /data/filestorage /data/blobstorage \
+ && chown -R plone:plone /plone /data
+
+ENV PLONE_MAJOR=5.0
+ENV PLONE_VERSION=5.0.3
+ENV PLONE_MD5=6c0f560c3c5f23d8838c2df9a3b380f9
+
+RUN buildDeps="curl sudo python-setuptools python-dev build-essential libssl-dev libxml2-dev libxslt1-dev libbz2-dev libjpeg62-turbo-dev" \
+ && runDeps="libxml2 libxslt1.1 libjpeg62 rsync" \
+ && apt-get update \
+ && apt-get install -y --no-install-recommends $buildDeps \
+ && curl -o Plone.tgz -SL 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 purge -y --auto-remove $buildDeps \
+ && apt-get install -y --no-install-recommends $runDeps \
+ && rm -rf /var/lib/apt/lists/* \
+ && 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/plone_5.0.3/docker-entrypoint.sh b/plone_5.0.3/docker-entrypoint.sh
new file mode 100755
index 0000000..5644bdb
--- /dev/null
+++ b/plone_5.0.3/docker-entrypoint.sh
@@ -0,0 +1,55 @@
+#!/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
+ 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/plone_5.0.3/docker-initialize.py b/plone_5.0.3/docker-initialize.py
new file mode 100755
index 0000000..087bde9
--- /dev/null
+++ b/plone_5.0.3/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/plone_5.0.4/Dockerfile b/plone_5.0.4/Dockerfile
new file mode 100644
index 0000000..c7578c5
--- /dev/null
+++ b/plone_5.0.4/Dockerfile
@@ -0,0 +1,49 @@
+FROM python:2.7-slim
+MAINTAINER "Plone Community" http://community.plone.org
+
+RUN useradd --system -U -u 500 plone \
+ && mkdir -p /plone /data/filestorage /data/blobstorage \
+ && chown -R plone:plone /plone /data
+
+ENV PLONE_MAJOR=5.0
+ENV PLONE_VERSION=5.0.4
+ENV PLONE_MD5=4cbef57b520e83126c2b2c4b0e55db51
+
+RUN buildDeps="curl sudo python-setuptools python-dev build-essential libssl-dev libxml2-dev libxslt1-dev libbz2-dev libjpeg62-turbo-dev" \
+ && runDeps="libxml2 libxslt1.1 libjpeg62 rsync" \
+ && apt-get update \
+ && apt-get install -y --no-install-recommends $buildDeps \
+ && curl -o Plone.tgz -SL 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 purge -y --auto-remove $buildDeps \
+ && apt-get install -y --no-install-recommends $runDeps \
+ && rm -rf /var/lib/apt/lists/* \
+ && 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/plone_5.0.4/docker-entrypoint.sh b/plone_5.0.4/docker-entrypoint.sh
new file mode 100755
index 0000000..5644bdb
--- /dev/null
+++ b/plone_5.0.4/docker-entrypoint.sh
@@ -0,0 +1,55 @@
+#!/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
+ 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/plone_5.0.4/docker-initialize.py b/plone_5.0.4/docker-initialize.py
new file mode 100755
index 0000000..087bde9
--- /dev/null
+++ b/plone_5.0.4/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/plone_5.0.5/Dockerfile b/plone_5.0.5/Dockerfile
new file mode 100644
index 0000000..3364c59
--- /dev/null
+++ b/plone_5.0.5/Dockerfile
@@ -0,0 +1,49 @@
+FROM python:2.7-slim
+MAINTAINER "Plone Community" http://community.plone.org
+
+RUN useradd --system -U -u 500 plone \
+ && mkdir -p /plone /data/filestorage /data/blobstorage \
+ && chown -R plone:plone /plone /data
+
+ENV PLONE_MAJOR=5.0
+ENV PLONE_VERSION=5.0.5
+ENV PLONE_MD5=4072f0dda7ecd31d4d19827fd2f06d67
+
+RUN buildDeps="curl sudo python-setuptools python-dev build-essential libssl-dev libxml2-dev libxslt1-dev libbz2-dev libjpeg62-turbo-dev" \
+ && runDeps="libxml2 libxslt1.1 libjpeg62 rsync" \
+ && apt-get update \
+ && apt-get install -y --no-install-recommends $buildDeps \
+ && curl -o Plone.tgz -SL 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 purge -y --auto-remove $buildDeps \
+ && apt-get install -y --no-install-recommends $runDeps \
+ && rm -rf /var/lib/apt/lists/* \
+ && 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/plone_5.0.5/docker-entrypoint.sh b/plone_5.0.5/docker-entrypoint.sh
new file mode 100755
index 0000000..5644bdb
--- /dev/null
+++ b/plone_5.0.5/docker-entrypoint.sh
@@ -0,0 +1,55 @@
+#!/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
+ 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/plone_5.0.5/docker-initialize.py b/plone_5.0.5/docker-initialize.py
new file mode 100755
index 0000000..087bde9
--- /dev/null
+++ b/plone_5.0.5/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/plone_latest/Dockerfile b/plone_latest/Dockerfile
new file mode 100644
index 0000000..86bfcf0
--- /dev/null
+++ b/plone_latest/Dockerfile
@@ -0,0 +1,49 @@
+FROM python:2.7-slim
+MAINTAINER "Plone Community" http://community.plone.org
+
+RUN useradd --system -U -u 500 plone \
+ && mkdir -p /plone /data/filestorage /data/blobstorage \
+ && chown -R plone:plone /plone /data
+
+ENV PLONE_MAJOR=5.0
+ENV PLONE_VERSION=5.0.6
+ENV PLONE_MD5=c6951b0f79be1bf12337d49f34afc524
+
+RUN buildDeps="curl sudo python-setuptools python-dev build-essential libssl-dev libxml2-dev libxslt1-dev libbz2-dev libjpeg62-turbo-dev" \
+ && runDeps="libxml2 libxslt1.1 libjpeg62 rsync" \
+ && apt-get update \
+ && apt-get install -y --no-install-recommends $buildDeps \
+ && curl -o Plone.tgz -SL 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 purge -y --auto-remove $buildDeps \
+ && apt-get install -y --no-install-recommends $runDeps \
+ && rm -rf /var/lib/apt/lists/* \
+ && 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/plone_latest/docker-entrypoint.sh b/plone_latest/docker-entrypoint.sh
new file mode 100755
index 0000000..5644bdb
--- /dev/null
+++ b/plone_latest/docker-entrypoint.sh
@@ -0,0 +1,55 @@
+#!/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
+ 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/plone_latest/docker-initialize.py b/plone_latest/docker-initialize.py
new file mode 100755
index 0000000..087bde9
--- /dev/null
+++ b/plone_latest/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()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment