/
docker-entrypoint.sh
executable file
·184 lines (160 loc) · 3.98 KB
/
docker-entrypoint.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
#!/bin/bash
set -e
# Use root home folder
SSH_DIR="/root/.ssh"
SSH_KEY="${SSH_DIR}/docker"
KNOWN_HOSTS="${SSH_DIR}/known_hosts"
ENV_FILE_PATH="/root/.env"
login() {
echo "${PASSWORD}" | docker login "${REGISTRY}" -u "${USERNAME}" --password-stdin
}
configure_ssh() {
mkdir -p "${SSH_DIR}"
printf '%s' "UserKnownHostsFile=${KNOWN_HOSTS}" > "${SSH_DIR}/config"
chmod 600 "${SSH_DIR}/config"
}
configure_ssh_key() {
printf '%s' "$REMOTE_PRIVATE_KEY" > "${SSH_KEY}"
lastLine=$(tail -n 1 "${SSH_KEY}")
if [ "${lastLine}" != "" ]; then
printf '\n' >> "${SSH_KEY}";
fi
chmod 600 "${SSH_KEY}"
eval "$(ssh-agent)"
ssh-add "${SSH_KEY}"
}
configure_env_file() {
printf '%s' "$ENV_FILE" > "${ENV_FILE_PATH}"
env_file_len=$(grep -v '^#' ${ENV_FILE_PATH}|grep -v '^$' -c)
if [[ $env_file_len -gt 0 ]]; then
echo "Environment Variables: Additional values"
if [ "${DEBUG}" != "0" ]; then
echo "Environment vars before: $(env|wc -l)"
fi
# shellcheck disable=SC2046
export $(grep -v '^#' ${ENV_FILE_PATH} | grep -v '^$' | xargs -d '\n')
if [ "${DEBUG}" != "0" ]; then
echo "Environment vars after: $(env|wc -l)"
fi
fi
}
configure_ssh_host() {
ssh-keyscan -p "${REMOTE_PORT}" "${REMOTE_HOST}" > "${KNOWN_HOSTS}"
chmod 600 "${KNOWN_HOSTS}"
}
connect_ssh() {
cmd="ssh"
if [ "${SSH_VERBOSE}" != "" ]; then
cmd="ssh ${SSH_VERBOSE}"
fi
user=$(${cmd} -p "${REMOTE_PORT}" "${REMOTE_USER}@${REMOTE_HOST}" whoami)
if [ "${user}" != "${REMOTE_USER}" ]; then
exit 1;
fi
}
deploy() {
docker stack deploy --with-registry-auth -c "${STACK_FILE}" "${STACK_NAME}"
}
check_deploy() {
echo "Deploy: Checking status"
/stack-wait.sh -t "${DEPLOY_TIMEOUT}" "${STACK_NAME}"
}
[ -z ${DEBUG+x} ] && export DEBUG="0"
# ADDITIONAL ENV VARIABLES
if [[ -z "${ENV_FILE}" ]]; then
export ENV_FILE=""
else
configure_env_file;
fi
# SET DEBUG
if [ "${DEBUG}" != "0" ]; then
OUT=/dev/stdout;
SSH_VERBOSE="-vvv"
echo "Verbose logging"
else
OUT=/dev/null;
SSH_VERBOSE=""
fi
# PROCEED WITH LOGIN
if [ -z "${USERNAME+x}" ] || [ -z "${PASSWORD+x}" ]; then
echo "Container Registry: No authentication provided"
else
[ -z ${REGISTRY+x} ] && export REGISTRY=""
if login > /dev/null 2>&1; then
echo "Container Registry: Logged in ${REGISTRY} as ${USERNAME}"
else
echo "Container Registry: Login to ${REGISTRY} as ${USERNAME} failed"
exit 1
fi
fi
if [[ -z "${DEPLOY_TIMEOUT}" ]]; then
export DEPLOY_TIMEOUT=600
fi
# CHECK REMOTE VARIABLES
if [[ -z "${REMOTE_HOST}" ]]; then
echo "Input remote_host is required!"
exit 1
fi
if [[ -z "${REMOTE_PORT}" ]]; then
export REMOTE_PORT="22"
fi
if [[ -z "${REMOTE_USER}" ]]; then
echo "Input remote_user is required!"
exit 1
fi
if [[ -z "${REMOTE_PRIVATE_KEY}" ]]; then
echo "Input private_key is required!"
exit 1
fi
# CHECK STACK VARIABLES
if [[ -z "${STACK_FILE}" ]]; then
echo "Input stack_file is required!"
exit 1
else
if [ ! -f "${STACK_FILE}" ]; then
echo "${STACK_FILE} does not exist."
exit 1
fi
fi
if [[ -z "${STACK_NAME}" ]]; then
echo "Input stack_name is required!"
exit 1
fi
# CONFIGURE SSH CLIENT
if configure_ssh > $OUT 2>&1; then
echo "SSH client: Configured"
else
echo "SSH client: Configuration failed"
exit 1
fi
if configure_ssh_key > $OUT 2>&1; then
echo "SSH client: Added private key"
else
echo "SSH client: Private key failed"
exit 1
fi
if configure_ssh_host > $OUT 2>&1; then
echo "SSH remote: Keys added to ${KNOWN_HOSTS}"
else
echo "SSH remote: Server ${REMOTE_HOST} on port ${REMOTE_PORT} not available"
exit 1
fi
if connect_ssh > $OUT; then
echo "SSH connect: Success"
else
echo "SSH connect: Failed to connect to remote server"
exit 1
fi
export DOCKER_HOST="ssh://${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_PORT}"
if deploy > $OUT; then
echo "Deploy: Updated services"
else
echo "Deploy: Failed to deploy ${STACK_NAME} from file ${STACK_FILE}"
exit 1
fi
if check_deploy; then
echo "Deploy: Completed"
else
echo "Deploy: Failed"
exit 1
fi