Skip to content

Commit 946a6d2

Browse files
committed
Refactor 3.7/docker-entrypoint.sh to use new sysctl-style config
1 parent b8baad2 commit 946a6d2

File tree

3 files changed

+273
-339
lines changed

3 files changed

+273
-339
lines changed

3.7/alpine/docker-entrypoint.sh

Lines changed: 91 additions & 113 deletions
Original file line numberDiff line numberDiff line change
@@ -175,87 +175,92 @@ if [ "${RABBITMQ_ERLANG_COOKIE:-}" ]; then
175175
chmod 600 "$cookieFile"
176176
fi
177177

178-
# prints "$2$1$3$1...$N"
179-
join() {
180-
local sep="$1"; shift
181-
local out; printf -v out "${sep//%/%%}%s" "$@"
182-
echo "${out#$sep}"
183-
}
184-
indent() {
185-
if [ "$#" -gt 0 ]; then
186-
echo "$@"
187-
else
188-
cat
189-
fi | sed 's/^/\t/g'
178+
configBase="${RABBITMQ_CONFIG_FILE:-/etc/rabbitmq/rabbitmq}"
179+
oldConfigFile="$configBase.config"
180+
newConfigFile="$configBase.conf"
181+
182+
shouldWriteConfig="$haveConfig"
183+
if [ -n "$shouldWriteConfig" ] && [ -f "$oldConfigFile" ]; then
184+
{
185+
echo "error: Docker configuration environment variables specified, but old-style (Erlang syntax) configuration file '$oldConfigFile' exists"
186+
echo " Suggested fixes: (choose one)"
187+
echo " - remove '$oldConfigFile'"
188+
echo " - remove any Docker-specific 'RABBITMQ_...' environment variables"
189+
echo " - convert '$oldConfigFile' to the newer sysctl format ('$newConfigFile'); see https://www.rabbitmq.com/configure.html#config-file"
190+
} >&2
191+
exit 1
192+
fi
193+
if [ -z "$shouldWriteConfig" ] && [ ! -f "$oldConfigFile" ] && [ ! -f "$newConfigFile" ]; then
194+
# no config files, we should write one
195+
shouldWriteConfig=1
196+
fi
197+
198+
# http://stackoverflow.com/a/2705678/433558
199+
sed_escape_lhs() {
200+
echo "$@" | sed -e 's/[]\/$*.^|[]/\\&/g'
190201
}
191-
rabbit_array() {
192-
echo -n '['
193-
case "$#" in
194-
0) echo -n ' ' ;;
195-
1) echo -n " $1 " ;;
196-
*)
197-
local vals="$(join $',\n' "$@")"
198-
echo
199-
indent "$vals"
200-
esac
201-
echo -n ']'
202+
sed_escape_rhs() {
203+
echo "$@" | sed -e 's/[\/&]/\\&/g'
202204
}
203-
rabbit_string() {
205+
rabbit_set_config() {
206+
local key="$1"; shift
204207
local val="$1"; shift
205-
# fire up erlang directly to have it do the proper escaping for us
206-
erl -noinput -eval 'io:format("~p\n", init:get_plain_arguments()), init:stop().' -- "$val"
208+
209+
[ -e "$newConfigFile" ] || touch "$newConfigFile"
210+
211+
local sedKey="$(sed_escape_lhs "$key")"
212+
local sedVal="$(sed_escape_rhs "$val")"
213+
sed -ri \
214+
"s/^[[:space:]]*(${sedKey}[[:space:]]*=[[:space:]]*)\S.*\$/\1${sedVal}/" \
215+
"$newConfigFile"
216+
if ! grep -qE "^${sedKey}[[:space:]]*=" "$newConfigFile"; then
217+
echo "$key = $val" >> "$newConfigFile"
218+
fi
219+
}
220+
rabbit_comment_config() {
221+
local key="$1"; shift
222+
223+
[ -e "$newConfigFile" ] || touch "$newConfigFile"
224+
225+
local sedKey="$(sed_escape_lhs "$key")"
226+
sed -ri \
227+
"s/^[[:space:]]*#?[[:space:]]*(${sedKey}[[:space:]]*=[[:space:]]*\S.*)\$/# \1/" \
228+
"$newConfigFile"
207229
}
208230
rabbit_env_config() {
209231
local prefix="$1"; shift
210232

211-
local ret=()
212233
local conf
213234
for conf; do
214235
local var="rabbitmq${prefix:+_$prefix}_$conf"
215236
var="${var^^}"
216237

217-
local val="${!var:-}"
238+
local key="$conf"
239+
case "$prefix" in
240+
ssl) key="ssl_options.$key" ;;
241+
management_ssl) key="management.listener.ssl_opts.$key" ;;
242+
esac
218243

219-
local rawVal=
244+
local val="${!var:-}"
245+
local rawVal="$val"
220246
case "$conf" in
221-
verify|fail_if_no_peer_cert|depth)
222-
[ "$val" ] || continue
223-
rawVal="$val"
224-
;;
225-
226-
hipe_compile)
227-
[ "$val" ] && rawVal='true' || rawVal='false'
228-
;;
229-
230-
cacertfile|certfile|keyfile)
231-
[ "$val" ] || continue
232-
rawVal="$(rabbit_string "$val")"
247+
verify|fail_if_no_peer_cert|depth|hipe_compile)
248+
[ -n "$val" ] && rawVal='true' || rawVal='false'
233249
;;
234250

235-
*)
236-
[ "$val" ] || continue
237-
rawVal="<<$(rabbit_string "$val")>>"
238-
;;
251+
vm_memory_high_watermark) continue ;; # handled separately
239252
esac
240-
[ "$rawVal" ] || continue
241253

242-
ret+=( "{ $conf, $rawVal }" )
254+
if [ -n "$rawVal" ]; then
255+
rabbit_set_config "$key" "$rawVal"
256+
else
257+
rabbit_comment_config "$key"
258+
fi
243259
done
244-
245-
join $'\n' "${ret[@]}"
246260
}
247261

248-
shouldWriteConfig="$haveConfig"
249-
if [ ! -f /etc/rabbitmq/rabbitmq.config ]; then
250-
shouldWriteConfig=1
251-
fi
252-
253262
if [ "$1" = 'rabbitmq-server' ] && [ "$shouldWriteConfig" ]; then
254-
fullConfig=()
255-
256-
rabbitConfig=(
257-
"{ loopback_users, $(rabbit_array) }"
258-
)
263+
rabbit_set_config 'loopback_users.guest' 'false'
259264

260265
# determine whether to set "vm_memory_high_watermark" (based on cgroups)
261266
memTotalKb=
@@ -277,12 +282,14 @@ if [ "$1" = 'rabbitmq-server' ] && [ "$shouldWriteConfig" ]; then
277282
if [ -n "$memLimitB" ]; then
278283
# if we have a cgroup memory limit, let's inform RabbitMQ of what it is (so it can calculate vm_memory_high_watermark properly)
279284
# https://github.com/rabbitmq/rabbitmq-server/pull/1234
280-
rabbitConfig+=( "{ total_memory_available_override_value, $memLimitB }" )
285+
:# TODO rabbit_set_config 'total_memory_available_override_value' "$memLimitB"
286+
# TODO https://github.com/rabbitmq/rabbitmq-server/issues/1445 (missing in 3.7.0)
281287
fi
288+
# https://www.rabbitmq.com/memory.html#memsup-usage
282289
if [ "${RABBITMQ_VM_MEMORY_HIGH_WATERMARK:-}" ]; then
283290
# https://github.com/docker-library/rabbitmq/pull/105#issuecomment-242165822
284291
vmMemoryHighWatermark="$(
285-
awk '
292+
echo "$RABBITMQ_VM_MEMORY_HIGH_WATERMARK" | awk '
286293
/^[0-9]*[.][0-9]+$|^[0-9]+([.][0-9]+)?%$/ {
287294
perc = $0;
288295
if (perc ~ /%$/) {
@@ -293,93 +300,64 @@ if [ "$1" = 'rabbitmq-server' ] && [ "$shouldWriteConfig" ]; then
293300
printf "error: invalid percentage for vm_memory_high_watermark: %s (must be > 0%%, <= 100%%)\n", $0 > "/dev/stderr";
294301
exit 1;
295302
}
296-
printf "%0.03f\n", perc;
303+
printf "vm_memory_high_watermark.relative %0.03f\n", perc;
297304
next;
298305
}
299306
/^[0-9]+$/ {
300-
printf "{ absolute, %s }\n", $0;
307+
printf "vm_memory_high_watermark.absolute %s\n", $0;
301308
next;
302309
}
303310
/^[0-9]+([.][0-9]+)?[a-zA-Z]+$/ {
304-
printf "{ absolute, \"%s\" }\n", $0;
311+
printf "vm_memory_high_watermark.absolute %s\n", $0;
305312
next;
306313
}
307314
{
308315
printf "error: unexpected input for vm_memory_high_watermark: %s\n", $0;
309316
exit 1;
310317
}
311-
' <(echo "$RABBITMQ_VM_MEMORY_HIGH_WATERMARK")
318+
'
312319
)"
313320
if [ "$vmMemoryHighWatermark" ]; then
314-
# https://www.rabbitmq.com/memory.html#memsup-usage
315-
rabbitConfig+=( "{ vm_memory_high_watermark, $vmMemoryHighWatermark }" )
321+
vmMemoryHighWatermarkKey="${vmMemoryHighWatermark%% *}"
322+
vmMemoryHighWatermarkVal="${vmMemoryHighWatermark#$vmMemoryHighWatermarkKey }"
323+
rabbit_set_config "$vmMemoryHighWatermarkKey" "$vmMemoryHighWatermarkVal"
324+
case "$vmMemoryHighWatermarkKey" in
325+
# make sure we only set one or the other
326+
'vm_memory_high_watermark.absolute') rabbit_comment_config 'vm_memory_high_watermark.relative' ;;
327+
'vm_memory_high_watermark.relative') rabbit_comment_config 'vm_memory_high_watermark.absolute' ;;
328+
esac
316329
fi
317330
fi
318331

319332
if [ "$haveSslConfig" ]; then
320-
IFS=$'\n'
321-
rabbitSslOptions=( $(rabbit_env_config 'ssl' "${sslConfigKeys[@]}") )
322-
unset IFS
323-
324-
rabbitConfig+=(
325-
"{ tcp_listeners, $(rabbit_array) }"
326-
"{ ssl_listeners, $(rabbit_array 5671) }"
327-
"{ ssl_options, $(rabbit_array "${rabbitSslOptions[@]}") }"
328-
)
333+
rabbit_set_config 'listeners.ssl.default' 5671
334+
rabbit_env_config 'ssl' "${sslConfigKeys[@]}"
329335
else
330-
rabbitConfig+=(
331-
"{ tcp_listeners, $(rabbit_array 5672) }"
332-
"{ ssl_listeners, $(rabbit_array) }"
333-
)
336+
rabbit_set_config 'listeners.tcp.default' 5672
334337
fi
335338

336-
IFS=$'\n'
337-
rabbitConfig+=( $(rabbit_env_config '' "${rabbitConfigKeys[@]}") )
338-
unset IFS
339-
340-
fullConfig+=( "{ rabbit, $(rabbit_array "${rabbitConfig[@]}") }" )
339+
rabbit_env_config '' "${rabbitConfigKeys[@]}"
341340

342341
# if management plugin is installed, generate config for it
343342
# https://www.rabbitmq.com/management.html#configuration
344343
if [ "$(rabbitmq-plugins list -m -e rabbitmq_management)" ]; then
345-
rabbitManagementConfig=()
346-
347344
if [ "$haveManagementSslConfig" ]; then
348-
IFS=$'\n'
349-
rabbitManagementSslOptions=( $(rabbit_env_config 'management_ssl' "${sslConfigKeys[@]}") )
350-
unset IFS
351-
352-
rabbitManagementListenerConfig+=(
353-
'{ port, 15671 }'
354-
'{ ssl, true }'
355-
"{ ssl_opts, $(rabbit_array "${rabbitManagementSslOptions[@]}") }"
356-
)
345+
rabbit_set_config 'management.listener.port' 15671
346+
rabbit_set_config 'management.listener.ssl' 'true'
347+
rabbit_env_config 'management_ssl' "${sslConfigKeys[@]}"
357348
else
358-
rabbitManagementListenerConfig+=(
359-
'{ port, 15672 }'
360-
'{ ssl, false }'
361-
)
349+
rabbit_set_config 'management.listener.port' 15672
350+
rabbit_set_config 'management.listener.ssl' 'false'
362351
fi
363-
rabbitManagementConfig+=(
364-
"{ listener, $(rabbit_array "${rabbitManagementListenerConfig[@]}") }"
365-
)
366352

367353
# if definitions file exists, then load it
368354
# https://www.rabbitmq.com/management.html#load-definitions
369355
managementDefinitionsFile='/etc/rabbitmq/definitions.json'
370-
if [ -f "${managementDefinitionsFile}" ]; then
356+
if [ -f "$managementDefinitionsFile" ]; then
371357
# see also https://github.com/docker-library/rabbitmq/pull/112#issuecomment-271485550
372-
rabbitManagementConfig+=(
373-
"{ load_definitions, \"$managementDefinitionsFile\" }"
374-
)
358+
rabbit_set_config 'management.load_definitions' "$managementDefinitionsFile"
375359
fi
376-
377-
fullConfig+=(
378-
"{ rabbitmq_management, $(rabbit_array "${rabbitManagementConfig[@]}") }"
379-
)
380360
fi
381-
382-
echo "$(rabbit_array "${fullConfig[@]}")." > /etc/rabbitmq/rabbitmq.config
383361
fi
384362

385363
combinedSsl='/tmp/combined.pem'

0 commit comments

Comments
 (0)