Skip to content

Commit b42a1b0

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

File tree

3 files changed

+270
-342
lines changed

3 files changed

+270
-342
lines changed

3.7/alpine/docker-entrypoint.sh

Lines changed: 90 additions & 114 deletions
Original file line numberDiff line numberDiff line change
@@ -175,88 +175,91 @@ 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}"
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'
183201
}
184-
indent() {
185-
if [ "$#" -gt 0 ]; then
186-
echo "$@"
187-
else
188-
cat
189-
fi | sed 's/^/\t/g'
202+
sed_escape_rhs() {
203+
echo "$@" | sed -e 's/[\/&]/\\&/g'
190204
}
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-
}
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"
247+
verify|fail_if_no_peer_cert|depth|hipe_compile)
248+
[ -n "$val" ] && rawVal='true' || rawVal='false'
224249
;;
225250

226-
hipe_compile)
227-
[ "$val" ] && rawVal='true' || rawVal='false'
228-
;;
229-
230-
cacertfile|certfile|keyfile)
231-
[ "$val" ] || continue
232-
rawVal="$(rabbit_string "$val")"
233-
;;
234-
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-
)
259-
260263
# determine whether to set "vm_memory_high_watermark" (based on cgroups)
261264
memTotalKb=
262265
if [ -r /proc/meminfo ]; then
@@ -277,12 +280,14 @@ if [ "$1" = 'rabbitmq-server' ] && [ "$shouldWriteConfig" ]; then
277280
if [ -n "$memLimitB" ]; then
278281
# if we have a cgroup memory limit, let's inform RabbitMQ of what it is (so it can calculate vm_memory_high_watermark properly)
279282
# https://github.com/rabbitmq/rabbitmq-server/pull/1234
280-
rabbitConfig+=( "{ total_memory_available_override_value, $memLimitB }" )
283+
:# TODO rabbit_set_config 'total_memory_available_override_value' "$memLimitB"
284+
# TODO https://github.com/rabbitmq/rabbitmq-server/issues/1445 (missing in 3.7.0)
281285
fi
286+
# https://www.rabbitmq.com/memory.html#memsup-usage
282287
if [ "${RABBITMQ_VM_MEMORY_HIGH_WATERMARK:-}" ]; then
283288
# https://github.com/docker-library/rabbitmq/pull/105#issuecomment-242165822
284289
vmMemoryHighWatermark="$(
285-
awk '
290+
echo "$RABBITMQ_VM_MEMORY_HIGH_WATERMARK" | awk '
286291
/^[0-9]*[.][0-9]+$|^[0-9]+([.][0-9]+)?%$/ {
287292
perc = $0;
288293
if (perc ~ /%$/) {
@@ -293,93 +298,64 @@ if [ "$1" = 'rabbitmq-server' ] && [ "$shouldWriteConfig" ]; then
293298
printf "error: invalid percentage for vm_memory_high_watermark: %s (must be > 0%%, <= 100%%)\n", $0 > "/dev/stderr";
294299
exit 1;
295300
}
296-
printf "%0.03f\n", perc;
301+
printf "vm_memory_high_watermark.relative %0.03f\n", perc;
297302
next;
298303
}
299304
/^[0-9]+$/ {
300-
printf "{ absolute, %s }\n", $0;
305+
printf "vm_memory_high_watermark.absolute %s\n", $0;
301306
next;
302307
}
303308
/^[0-9]+([.][0-9]+)?[a-zA-Z]+$/ {
304-
printf "{ absolute, \"%s\" }\n", $0;
309+
printf "vm_memory_high_watermark.absolute %s\n", $0;
305310
next;
306311
}
307312
{
308313
printf "error: unexpected input for vm_memory_high_watermark: %s\n", $0;
309314
exit 1;
310315
}
311-
' <(echo "$RABBITMQ_VM_MEMORY_HIGH_WATERMARK")
316+
'
312317
)"
313318
if [ "$vmMemoryHighWatermark" ]; then
314-
# https://www.rabbitmq.com/memory.html#memsup-usage
315-
rabbitConfig+=( "{ vm_memory_high_watermark, $vmMemoryHighWatermark }" )
319+
vmMemoryHighWatermarkKey="${vmMemoryHighWatermark%% *}"
320+
vmMemoryHighWatermarkVal="${vmMemoryHighWatermark#$vmMemoryHighWatermarkKey }"
321+
rabbit_set_config "$vmMemoryHighWatermarkKey" "$vmMemoryHighWatermarkVal"
322+
case "$vmMemoryHighWatermarkKey" in
323+
# make sure we only set one or the other
324+
'vm_memory_high_watermark.absolute') rabbit_comment_config 'vm_memory_high_watermark.relative' ;;
325+
'vm_memory_high_watermark.relative') rabbit_comment_config 'vm_memory_high_watermark.absolute' ;;
326+
esac
316327
fi
317328
fi
318329

319330
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-
)
331+
rabbit_set_config 'listeners.ssl.default' 5671
332+
rabbit_env_config 'ssl' "${sslConfigKeys[@]}"
329333
else
330-
rabbitConfig+=(
331-
"{ tcp_listeners, $(rabbit_array 5672) }"
332-
"{ ssl_listeners, $(rabbit_array) }"
333-
)
334+
rabbit_set_config 'listeners.tcp.default' 5672
334335
fi
335336

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

342339
# if management plugin is installed, generate config for it
343340
# https://www.rabbitmq.com/management.html#configuration
344341
if [ "$(rabbitmq-plugins list -m -e rabbitmq_management)" ]; then
345-
rabbitManagementConfig=()
346-
347342
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-
)
343+
rabbit_set_config 'management.listener.port' 15671
344+
rabbit_set_config 'management.listener.ssl' 'true'
345+
rabbit_env_config 'management_ssl' "${sslConfigKeys[@]}"
357346
else
358-
rabbitManagementListenerConfig+=(
359-
'{ port, 15672 }'
360-
'{ ssl, false }'
361-
)
347+
rabbit_set_config 'management.listener.port' 15672
348+
rabbit_set_config 'management.listener.ssl' 'false'
362349
fi
363-
rabbitManagementConfig+=(
364-
"{ listener, $(rabbit_array "${rabbitManagementListenerConfig[@]}") }"
365-
)
366350

367351
# if definitions file exists, then load it
368352
# https://www.rabbitmq.com/management.html#load-definitions
369353
managementDefinitionsFile='/etc/rabbitmq/definitions.json'
370-
if [ -f "${managementDefinitionsFile}" ]; then
354+
if [ -f "$managementDefinitionsFile" ]; then
371355
# see also https://github.com/docker-library/rabbitmq/pull/112#issuecomment-271485550
372-
rabbitManagementConfig+=(
373-
"{ load_definitions, \"$managementDefinitionsFile\" }"
374-
)
356+
rabbit_set_config 'management.load_definitions' "$managementDefinitionsFile"
375357
fi
376-
377-
fullConfig+=(
378-
"{ rabbitmq_management, $(rabbit_array "${rabbitManagementConfig[@]}") }"
379-
)
380358
fi
381-
382-
echo "$(rabbit_array "${fullConfig[@]}")." > /etc/rabbitmq/rabbitmq.config
383359
fi
384360

385361
combinedSsl='/tmp/combined.pem'

0 commit comments

Comments
 (0)