diff docker/base/Dockerfile @ 21:0e78c8a4626e

Added Dockerfiles to create Docker images for easy installation + scripts to manages them. see README for details.
author Goffi <goffi@goffi.org>
date Sun, 19 Oct 2014 15:14:40 +0200
parents
children 686a8c982c3f
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docker/base/Dockerfile	Sun Oct 19 15:14:40 2014 +0200
@@ -0,0 +1,161 @@
+###############################################################
+#                                                             #
+#                      Salut à Toi/base                       #
+#     This Dockerfile build a « Salut à Toi » base image      #
+# Salut à Toi is a multi-frontends multi-purposes XMPP client #
+#                                                             #
+###############################################################
+
+FROM debian:jessie
+
+MAINTAINER Goffi <goffi@goffi.org>
+
+########
+# BASE #
+########
+
+ENV DEBIAN_FRONTEND noninteractive
+
+RUN apt-get update
+RUN apt-get upgrade -y
+RUN apt-get install -y --no-install-recommends locales dbus-x11 python python-gobject-2 python-dbus python-lxml python-mutagen python-pil python-crypto python-feed python-potr python-twisted-core python-twisted-mail python-twisted-web python-twisted-words python-wokkel python-xdg python-xe python-zope.interface python-gi python-urwid python-markdown python-html2text mercurial
+RUN apt-get clean
+
+# we need UTF-8 locale
+RUN sed -i "s/# en_US.UTF-8/en_US.UTF-8/" /etc/locale.gen
+RUN locale-gen
+ENV LC_ALL en_US.UTF-8
+
+# it's better to have a dedicated user
+RUN useradd -m sat
+
+# will be used to put many SàT specific data
+RUN mkdir -p /usr/share/sat
+
+################
+# URWID SÀTEXT #
+################
+
+WORKDIR /tmp
+
+RUN hg clone http://repos.goffi.org/urwid-satext
+
+WORKDIR urwid-satext
+
+RUN python setup.py install --prefix /usr --install-lib /usr/lib/python2.7/dist-packages
+
+WORKDIR /tmp
+
+RUN rm -rf urwid-satext
+
+#####################
+# CORE INSTALLATION #
+#####################
+
+WORKDIR /tmp
+
+RUN hg clone http://repos.goffi.org/sat
+
+WORKDIR sat
+
+RUN SAT_INSTALL=nox python setup.py install --prefix /usr --install-lib /usr/lib/python2.7/dist-packages
+
+WORKDIR /tmp
+
+RUN rm -rf sat
+
+######################
+# SàT CONFIGURATION  #
+######################
+
+# Following scripts make the configuration as automatic and easy as possible
+
+# we auto-create libervia account if it doesn't exists in Libervia container
+# so we remove it from reserved_list in plugin account
+RUN echo '[plugin account]\nreserved_list=' >> /etc/sat.conf
+
+# This script set account domain in sat.conf is not already set
+# if not set, domain is gotted from prosody container or DOMAIN environment variable
+RUN echo '#!/usr/bin/env python2\n\
+import os, xmlrpclib, ConfigParser, socket, subprocess\n\
+from sat.core.constants import Const as C\n\
+from sat.tools import config as sat_config\n\
+SECTION = "plugin account"\n\
+OPTION = "new_account_domain"\n\
+CONFIG_PATH = "/home/sat/sat.conf"\n\
+config = ConfigParser.SafeConfigParser()\n\
+config.read(C.CONFIG_FILES)\n\
+domain = sat_config.getConfig(config, SECTION, OPTION)\n\
+if domain is None:\n\
+    os.getenv("DOMAIN")\n\
+    if domain is None:\n\
+        proxy = xmlrpclib.ServerProxy("http://prosody:9999/")\n\
+        try:\n\
+            if "prosody" not in open("/etc/hosts").read():\n\
+                raise socket.gaierror # this avoid waiting for timeout if prosody is not linked\n\
+            domain = proxy.getenv("DOMAIN")\n\
+        except socket.gaierror:\n\
+            print "No prosody container connected or known domain, using \"localhost\" for new domains"\n\
+            domain = "localhost"\n\
+    config = ConfigParser.SafeConfigParser()\n\
+    config.readfp(open(CONFIG_PATH, "a+"))\n\
+    try:\n\
+        config.add_section(SECTION)\n\
+    except ConfigParser.DuplicateSectionError:\n\
+        pass\n\
+    config.set(SECTION, OPTION, domain)\n\
+    config.write(open(CONFIG_PATH, "w"))\n\
+subprocess.call(["add_host", domain, "prosody"])\n\
+' > /usr/local/bin/set_account_domain && chmod 0555 /usr/local/bin/set_account_domain
+
+# account domain is set, then sat is launcher with D-Bus activated
+RUN echo '#!/bin/sh\n\
+chmod a+w /etc/hosts\n\
+su -c "set_account_domain && dbus-launch /usr/bin/sat $@" sat\n\
+'> /usr/local/bin/sat && chmod 0500 /usr/local/bin/sat
+
+# this script add aliases to /etc/hosts
+RUN echo '#!/usr/bin/env python2\n\
+import sys, re\n\
+if len(sys.argv) < 2 or len(sys.argv) > 3:\n\
+    sys.exit(1)\n\
+host = sys.argv[1]\n\
+alias = sys.argv[2] if len(sys.argv) == 3 else "localhost"\n\
+if host == "localhost" or host == alias:\n\
+    sys.exit(0)\n\
+print "Adding host {} as an alias of {}".format(host, alias)\n\
+with open("/etc/hosts", "r+") as f:\n\
+    buf = re.sub(r"\\b{}\\b".format(alias), "{}\\t{}".format(alias, host), f.read(), 1)\n\
+    f.seek(0)\n\
+    f.write(buf)\
+' > /usr/local/bin/add_host && chmod 0555 /usr/local/bin/add_host
+
+# This script simulate prosodyctl adduser/passwd/deluser and call it on the prosody container
+RUN echo '#!/usr/bin/env python2\n\
+import sys, xmlrpclib\n\
+proxy = xmlrpclib.ServerProxy("http://prosody:9999/")\n\
+def pwd():\n\
+    pwd1=raw_input(); pwd2=raw_input(); assert pwd1==pwd2\n\
+    return pwd1\n\
+password = pwd() if sys.argv[1] in ["adduser", "passwd"] else ""\n\
+sys.exit(proxy.prosodyctl(sys.argv[1], sys.argv[2], password))\n\
+' > /usr/local/bin/prosodyctl
+
+#########
+# D-Bus #
+#########
+
+# we need a TCP socket
+RUN sed -i "s&<listen>unix:tmpdir=/tmp</listen>&\0\n  <listen>tcp:host=localhost,bind=*,port=55555,family=ipv4</listen>\n  <auth>ANONYMOUS</auth>\n  <allow_anonymous/>&" /etc/dbus-1/session.conf
+
+# this script will launch the command with good D-BUS parameters
+# it needs to be copied and made executable by frontends
+RUN echo "#!/bin/sh\nexport DBUS_SESSION_BUS_ADDRESS=tcp:host=sat,port=55555,family=ipv4\nexec /usr/bin/\$(basename \$0) \$@" > /usr/local/bin/dbus_wrap
+
+##########
+# LAUNCH #
+##########
+
+WORKDIR /home/sat
+
+ENTRYPOINT ["/bin/bash"]