22# Create a data container for the configuration volume:
33# docker run -v /config --name volume-config.<service-name> busybox /bin/true
44#
5- # Optional configuration volume install:
6- # mkdir -p /etc/services-config/<service-name>/{httpd,supervisor,ssl/{certs,private}}
7- # cp <container-path>/etc/services-config/supervisor/supervisord.conf /etc/services-config/<service-name>/supervisor/supervisord.conf
8- # cp <container-path>/etc/services-config/httpd/conf/httpd.conf /etc/services-config/<service-name>/httpd/conf/httpd.conf
9- # cp <container-path>/etc/services-config/httpd/conf.d/php.conf /etc/services-config/<service-name>/httpd/conf.d/php.conf
10- # cp <container-path>/etc/services-config/httpd/conf.d/ssl.conf /etc/services-config/<service-name>/httpd/conf.d/ssl.conf
11- #
125# To install:
136# sudo cp <container-path>/<service-name>@<port>.service /etc/systemd/system/
147# sudo systemctl daemon-reload
158# sudo systemctl enable /etc/systemd/system/<service-name>@<port>.service
169#
1710# Start using:
18- # sudo systemctl restart <service-name>@<port>.service
11+ # sudo systemctl [start|stop|restart|kill|status] <service-name>@<port>.service
12+ #
13+ # Debugging:
14+ # journalctl -fn 50 u <service-name>@<port>.service
1915# -----------------------------------------------------------------------------
2016
2117[Unit]
@@ -29,59 +25,70 @@ Requires=etcd2.service
2925Restart =on-failure
3026RestartSec =30
3127TimeoutStartSec =1200
32- Environment ="MOUNT_PATH_CONFIG=/etc/services-config"
33- Environment ="MOUNT_PATH_DATA=/var/services-data"
28+ Environment ="DOCKER_IMAGE_PACKAGE_PATH=/var/services-packages"
3429Environment ="DOCKER_IMAGE_NAME=jdeathe/centos-ssh-apache-php-fcgi"
3530Environment ="DOCKER_IMAGE_TAG=centos-6-1.4.1"
3631Environment ="SERVICE_UNIT_APP_GROUP=app-1"
3732Environment ="SERVICE_UNIT_LOCAL_ID=1"
3833Environment ="SERVICE_UNIT_INSTANCE=1"
34+ Environment ="VOLUME_CONFIG_ENABLED=false"
35+ Environment ="VOLUME_CONFIG_NAMED=false"
36+ Environment ="VOLUME_CONFIG_NAME=volume-config.%p"
37+ Environment ="VOLUME_DATA_NAME=volume-data.%p"
3938Environment ="APACHE_SERVER_ALIAS=app-1"
4039Environment ="APACHE_SERVER_NAME=app-1.local"
4140Environment ="DATE_TIMEZONE=UTC"
4241
43- # Create a data container for the configuration volume
42+ # Initialisation: Load image from local storage if available, otherwise pull.
4443ExecStartPre =/bin/sudo /bin/bash -c \
45- "if [[ busybox != $(/usr/bin/docker images | /bin/grep -e '^busybox [ ]\{1,\}' | /bin/grep -o 'busybox ') ]]; then \
46- if [[ -f /var/services-packages/busybox.latest-1.0.0 .tar.xz ]]; then \
47- /usr/bin/xz /var/services-packages/busybox.latest-1.0.0 .tar.xz | /usr/bin/docker load; \
44+ "if [[ ${DOCKER_IMAGE_NAME}:${DOCKER_IMAGE_TAG} != $(/usr/bin/docker images | awk -v FS=' [ ]+' -v pattern=\" ^${DOCKER_IMAGE_NAME}[ ]+${DOCKER_IMAGE_TAG} \ " '$0 ~ pattern { print $1\" :\ "$2; } ') ]]; then \
45+ if [[ -f ${DOCKER_IMAGE_PACKAGE_PATH}/${DOCKER_IMAGE_NAME}.${DOCKER_IMAGE_TAG} .tar.xz ]]; then \
46+ /usr/bin/xz -dc ${DOCKER_IMAGE_PACKAGE_PATH}/${DOCKER_IMAGE_NAME}.${DOCKER_IMAGE_TAG} .tar.xz | /usr/bin/docker load; \
4847 else \
49- /usr/bin/docker pull busybox:latest; \
50- fi; \
51- fi; \
52- if [[ -n $(/usr/bin/find ${MOUNT_PATH_CONFIG}/%p/supervisor -maxdepth 1 -type f) ]] && [[ -n $(/usr/bin/find ${MOUNT_PATH_CONFIG}/%p/httpd -maxdepth 1 -type f) ]]; then \
53- if [[ volume-config.%p != $(/usr/bin/docker ps -a | /bin/awk -v pattern='^volume-config.%p$' '$NF ~ pattern { print $NF; }') ]]; then \
54- /usr/bin/docker run \
55- --name volume-config.%p \
56- -v ${MOUNT_PATH_CONFIG}/ssh.pool-1/ssh:/etc/services-config/ssh \
57- -v ${MOUNT_PATH_CONFIG}/%p/supervisor:/etc/services-config/supervisor \
58- -v ${MOUNT_PATH_CONFIG}/%p/httpd:/etc/services-config/httpd \
59- -v ${MOUNT_PATH_CONFIG}/%p/ssl/certs:/etc/services-config/ssl/certs \
60- -v ${MOUNT_PATH_CONFIG}/%p/ssl/private:/etc/services-config/ssl/private \
61- busybox:latest \
62- /bin/true; \
48+ /usr/bin/docker pull ${DOCKER_IMAGE_NAME}:${DOCKER_IMAGE_TAG}; \
6349 fi; \
6450 fi"
6551
66- # Initialisation: Pull or build image if required
52+ # Create a data container for the configuration volume
6753ExecStartPre =/bin/sudo /bin/bash -c \
68- "if [[ ${DOCKER_IMAGE_NAME} != $(/usr/bin/docker images | /bin/grep -e \\\" ^${DOCKER_IMAGE_NAME}[ ]\{1,\}\\\" | /bin/grep -o \\\" ${DOCKER_IMAGE_NAME}\\\") ]]; then \
69- if [[ -f /var/services-packages/${DOCKER_IMAGE_NAME}.${DOCKER_IMAGE_TAG}.tar.xz ]]; then \
70- /usr/bin/xz -dc /var/services-packages/${DOCKER_IMAGE_NAME}.${DOCKER_IMAGE_TAG}.tar.xz | /usr/bin/docker load; \
71- else \
72- /usr/bin/docker pull ${DOCKER_IMAGE_NAME}:${DOCKER_IMAGE_TAG}; \
54+ "if [[ ${VOLUME_CONFIG_ENABLED} == true ]] && [[ ${VOLUME_CONFIG_NAMED} == true ]]; then \
55+ if [[ ${VOLUME_CONFIG_NAME} != $(/usr/bin/docker ps -a | /bin/awk -v pattern=\" ^${VOLUME_CONFIG_NAME}$\" '$NF ~ pattern { print $NF; }') ]]; then \
56+ /usr/bin/docker run \
57+ --name ${VOLUME_CONFIG_NAME}.tmp \
58+ ${DOCKER_IMAGE_NAME}:${DOCKER_IMAGE_TAG} \
59+ /bin/sh -c 'while true; do echo -ne .; sleep 1; done'; \
60+ /usr/bin/docker run \
61+ --name ${VOLUME_CONFIG_NAME} \
62+ -v ${VOLUME_CONFIG_NAME}:/etc/services-config \
63+ ${DOCKER_IMAGE_NAME}:${DOCKER_IMAGE_TAG} \
64+ /bin/true; \
65+ /usr/bin/docker cp ${VOLUME_CONFIG_NAME}.tmp:/etc/services-config/. \
66+ /var/lib/docker/volumes/${VOLUME_CONFIG_NAME}/_data; \
67+ /usr/bin/docker kill ${VOLUME_CONFIG_NAME}.tmp; \
68+ fi; \
69+ elif [[ ${VOLUME_CONFIG_ENABLED} == true ]] && [[ ${VOLUME_CONFIG_NAMED} != true ]]; then \
70+ if [[ ${VOLUME_CONFIG_NAME} != $(/usr/bin/docker ps -a | /bin/awk -v pattern=\" ^${VOLUME_CONFIG_NAME}$\" '$NF ~ pattern { print $NF; }') ]]; then \
71+ /usr/bin/docker run \
72+ --name ${VOLUME_CONFIG_NAME} \
73+ -v /etc/services-config \
74+ ${DOCKER_IMAGE_NAME}:${DOCKER_IMAGE_TAG} \
75+ /bin/true; \
7376 fi; \
7477 fi"
7578
76- # Startup: Remove existing container (and stop if running) so it is re-created on startup but not removed on exit - to allow debugging if required
77- ExecStart =/bin/sudo /bin/bash -c \
79+ # Remove existing container (and stop if running). This allows it to
80+ # be re-created on startup but not removed on exit as with --rm.
81+ ExecStartPre =/bin/sudo /bin/bash -c \
7882 "if [[ %p == $(/usr/bin/docker ps -a | /bin/awk -v pattern='^%p$' '$NF ~ pattern { print $NF; }') ]]; then \
7983 if [[ %p == $(/usr/bin/docker ps | /bin/awk -v pattern='^%p$' '$NF ~ pattern { print $NF; }') ]]; then \
8084 /usr/bin/docker stop %p; \
8185 fi; \
8286 /usr/bin/docker rm %p; \
83- fi; \
84- if [[ volume-config.%p == $(/usr/bin/docker ps -a | /bin/awk -v pattern='^volume-config.%p$' '$NF ~ pattern { print $NF; }') ]]; then \
87+ fi"
88+
89+ # Startup
90+ ExecStart =/bin/sudo /bin/bash -c \
91+ "if [[ ${VOLUME_CONFIG_NAME} == $(/usr/bin/docker ps -a | /bin/awk -v pattern=\" ^${VOLUME_CONFIG_NAME}$\" '$NF ~ pattern { print $NF; }') ]]; then \
8592 /usr/bin/docker run \
8693 --name %p \
8794 -p %i:80 \
@@ -93,7 +100,7 @@ ExecStart=/bin/sudo /bin/bash -c \
93100 --env APACHE_SERVER_NAME=${APACHE_SERVER_NAME} \
94101 --env DATE_TIMEZONE=${DATE_TIMEZONE} \
95102 --volumes-from volume-config.%p \
96- -v ${MOUNT_PATH_DATA}/apache-php/${SERVICE_UNIT_APP_GROUP }:/var/www/app \
103+ -v ${VOLUME_DATA_NAME }:/var/www/app \
97104 ${DOCKER_IMAGE_NAME}:${DOCKER_IMAGE_TAG}; \
98105 else \
99106 /usr/bin/docker run \
@@ -115,7 +122,7 @@ ExecStart=/bin/sudo /bin/bash -c \
115122 --env SERVICE_USER_GROUP=app-www \
116123 --env SERVICE_USER_PASSWORD= \
117124 --env SUEXECUSERGROUP=false \
118- -v ${MOUNT_PATH_DATA}/apache-php/${SERVICE_UNIT_APP_GROUP }:/var/www/app \
125+ -v ${VOLUME_DATA_NAME }:/var/www/app \
119126 ${DOCKER_IMAGE_NAME}:${DOCKER_IMAGE_TAG}; \
120127 fi"
121128
0 commit comments