Skip to content
This repository was archived by the owner on Jul 2, 2024. It is now read-only.

Commit 86dd6b4

Browse files
committed
ISSUE 60: Revised method of installating systemd service.
1 parent b2afb62 commit 86dd6b4

File tree

2 files changed

+63
-69
lines changed

2 files changed

+63
-69
lines changed

apache-php.app-1.1.1@8080.service

Lines changed: 47 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,16 @@
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
2925
Restart=on-failure
3026
RestartSec=30
3127
TimeoutStartSec=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"
3429
Environment="DOCKER_IMAGE_NAME=jdeathe/centos-ssh-apache-php-fcgi"
3530
Environment="DOCKER_IMAGE_TAG=centos-6-1.4.1"
3631
Environment="SERVICE_UNIT_APP_GROUP=app-1"
3732
Environment="SERVICE_UNIT_LOCAL_ID=1"
3833
Environment="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"
3938
Environment="APACHE_SERVER_ALIAS=app-1"
4039
Environment="APACHE_SERVER_NAME=app-1.local"
4140
Environment="DATE_TIMEZONE=UTC"
4241

43-
# Create a data container for the configuration volume
42+
# Initialisation: Load image from local storage if available, otherwise pull.
4443
ExecStartPre=/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
6753
ExecStartPre=/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

systemd-install.sh

Lines changed: 16 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@ remove_docker_container_name ()
4040
{
4141
local NAME=$1
4242

43-
if have_docker_container_name ${NAME} ; then
44-
if is_docker_container_name_running ${NAME} ; then
43+
if have_docker_container_name ${NAME}; then
44+
if is_docker_container_name_running ${NAME}; then
4545
echo "Stopping container ${NAME}"
4646
(docker stop ${NAME})
4747
fi
@@ -50,43 +50,30 @@ remove_docker_container_name ()
5050
fi
5151
}
5252

53-
loading_counter ()
54-
{
55-
local COUNTER=${1:-10}
56-
57-
while [[ ${COUNTER} -ge 1 ]]; do
58-
echo -ne "Loading in: ${COUNTER} \r"
59-
sleep 1
60-
COUNTER=$[${COUNTER}-1]
61-
done
62-
}
63-
6453
OPT_SERVICE_NAME_FULL=${SERVICE_NAME_FULL:-apache-php.app-1.1.1@8080.service}
6554
OPT_SERVICE_NAME_SHORT=$(cut -d '@' -f1 <<< "${OPT_SERVICE_NAME_FULL}")
6655

67-
# Add required configuration directories
68-
mkdir -p /etc/services-config/${OPT_SERVICE_NAME_SHORT}/{httpd,supervisor,ssl/{certs,private}}
69-
70-
if [[ -z $(find /etc/services-config/${OPT_SERVICE_NAME_SHORT}/supervisor -maxdepth 1 -type f) ]]; then
71-
cp -R etc/services-config/supervisor /etc/services-config/${OPT_SERVICE_NAME_SHORT}/
72-
fi
73-
74-
if [[ -z $(find /etc/services-config/${OPT_SERVICE_NAME_SHORT}/httpd -maxdepth 1 -type f) ]]; then
75-
cp -R etc/services-config/httpd /etc/services-config/${OPT_SERVICE_NAME_SHORT}/
76-
fi
77-
78-
# Force
56+
# Stop the service and remove containers.
7957
sudo systemctl stop ${OPT_SERVICE_NAME_FULL} &> /dev/null
8058
remove_docker_container_name volume-config.${OPT_SERVICE_NAME_SHORT}
8159
remove_docker_container_name ${OPT_SERVICE_NAME_SHORT}
8260

61+
# Copy systemd definition into place and enable it.
8362
sudo cp ${OPT_SERVICE_NAME_FULL} /etc/systemd/system/
8463
sudo systemctl daemon-reload
8564
sudo systemctl enable /etc/systemd/system/${OPT_SERVICE_NAME_FULL}
8665

87-
echo "WARNING: This may take a while if pulling large container images for the first time."
88-
sudo systemctl restart ${OPT_SERVICE_NAME_FULL}
66+
echo "This may take a while if pulling large container images."
67+
sudo systemctl restart ${OPT_SERVICE_NAME_FULL} &
68+
69+
# If we have the timeout command then use it, otherwise wait for use to cancel
70+
TIMEOUT=
71+
if type "timeout" &> /dev/null; then
72+
TIMEOUT="timeout 30 "
73+
fi
8974

90-
loading_counter 10
75+
# Tail the systemd unit logs to check progress.
76+
${TIMEOUT}journalctl -fu ${OPT_SERVICE_NAME_FULL}
9177

92-
docker logs ${OPT_SERVICE_NAME_SHORT}
78+
# Final service status report.
79+
sudo systemctl status -l ${OPT_SERVICE_NAME_FULL}

0 commit comments

Comments
 (0)