When using Varnish Cache in an Alpine Linux 3.11 container, I discovered that the reload functionality does not work.
$ /etc/init.d/varnishd reload
* Reloading varnish ...
* varnishd cannot load configuration
The system log had the following entries:
Jul 14 06:55:08 varnish local0.info varnishd[22976]: CLI telnet 127.0.0.1 52642 127.0.0.1 6082 Rd vcl.load reload_2020-07-14T06:55:08 /etc/varnish/default.vcl
Jul 14 06:55:08 varnish local0.info varnishd[22976]: CLI telnet 127.0.0.1 52642 127.0.0.1 6082 Wr 106 Illegal character in VCL name (':')
Jul 14 06:55:08 varnish daemon.err /etc/init.d/varnishd[23713]: varnishd cannot load configuration
The “Illegal character in VCL name” error was confusing to me: I know I didn’t use any colons in file names nor procedure names. To find out what is wrong, I looked at the init script. The reload() function was:
reload() {
checkconfig || return 1
ebegin "Reloading varnish"
$VARNISHADM vcl.list >/dev/null 2>&1
ret=$?
if [ $ret -ne 0 ]; then
eerror "${SVCNAME} cannot list configuration"
return 1
fi
new_config="reload_$(date +%FT%H:%M:%S)"
$VARNISHADM vcl.load $new_config $CONFIGFILE >/dev/null 2>&1
ret=$?
if [ $ret -ne 0 ]; then
eerror "${SVCNAME} cannot load configuration"
return 1
fi
$VARNISHADM vcl.use $new_config >/dev/null 2>&1
ret=$?
if [ $ret -ne 0 ]; then
eerror "${SVCNAME} cannot switch configuration"
return 1
fi
eend 0
}
To see what exactly happens, I added set -x to the function and ran /etc/init.d/varnishd reload. The output was:
+ checkconfig
+ /usr/sbin/varnishd -C -f /etc/varnish/default.vcl
+ ret=0
+ '[' 0 -ne 0 ]
+ return 0
+ ebegin 'Reloading varnish'
* Reloading varnish ...
+ /usr/bin/varnishadm vcl.list
+ ret=0
+ '[' 0 -ne 0 ]
+ date '+%FT%H:%M:%S'
+ new_config=reload_2020-07-14T07:00:41
+ /usr/bin/varnishadm vcl.load reload_2020-07-14T07:00:41 /etc/varnish/default.vcl
+ ret=1
+ '[' 1 -ne 0 ]
+ eerror 'varnishd cannot load configuration'
* varnishd cannot load configuration
+ return 1
+ exit 1
And if you look at this line:
/usr/bin/varnishadm vcl.load reload_2020-07-14T07:00:41 /etc/varnish/default.vcl
You will see the colons. I reran that command manually and got the error:
$ /usr/bin/varnishadm vcl.load reload_2020-07-14T07:00:41 /etc/varnish/default.vcl
Illegal character in VCL name (':')
Command failed with error code 106
OK, so the suspected issue is that the parameter to varnish.load contains colons. Let us try the same command but without colons:
$ /usr/bin/varnishadm vcl.load reload_2020-07-14T070041 /etc/varnish/default.vcl
VCL compiled.
The issue is confirmed. Now, let us fix the code. We need to change the call to date +%FT%H:%M:%S. We can replace it with date +%s. The %s format specifier means “seconds since 1970-01-01 00:00:00 UTC”.
Here is the patch:
--- /etc/init.d/varnishd.orig
+++ /etc/init.d/varnishd
@@ -58,7 +58,7 @@
return 1
fi
- new_config="reload_$(date +%FT%H:%M:%S)"
+ new_config="reload_$(date +%s)"
$VARNISHADM vcl.load $new_config $CONFIGFILE >/dev/null 2>&1
ret=$?
if [ $ret -ne 0 ]; then