I'm trying to run a FlexLM license server inside a docker container. I've done this before without any problems. But now I have a vendor (Synopsys) daemon (snpslmd) which doesn't seem to play nice with Docker. The daemon complains about not being able to open its lock file: /var/tmp/locksnpslmd
, but /var/tmp
exists and is writable.
Here is the strace from the vendor daemon in the Docker container:
munmap(0x7fa322830000, 167936) = 0
setsid() = 64
openat(AT_FDCWD, "/", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3
getdents(3, /* 22 entries */, 32768) = 568
getdents(3, /* 0 entries */, 32768) = 0
close(3) = 0
write(1, "17:35:24 (snpslmd) Cannot open d"..., 4817:35:24 (snpslmd) Cannot open daemon lock file
) = 48
write(1, "17:35:24 (snpslmd) EXITING DUE T"..., 5817:35:24 (snpslmd) EXITING DUE TO SIGNAL 41 Exit reason 9
) = 58
exit_group(41) = ?
+++ exited with 41 +++**
And Here's the same strace segment from the vendor daemon running normally outside of a container:
munmap(0x7f25da4db000, 4096) = 0
setsid() = 15808
openat(AT_FDCWD, "/", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3
getdents(3, /* 23 entries */, 32768) = 584
getdents(3, /* 0 entries */, 32768) = 0
close(3) = 0
open("/var/tmp/locksnpslmd", O_RDWR|O_CREAT, 0666) = 3
fcntl(3, F_SETLK, {l_type=F_WRLCK, l_whence=SEEK_CUR, l_start=0, l_len=0}) = 0
stat("/var/tmp/locksnpslmd", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
Any ideas?
Best Answer
It happens because getdents() returns differend inode numbers for "." and ".." subdirectories of "/". It can be fixed using LD_PRELOAD hack for snpslmd
Compile it using
Use wrapper script instead of original snpslmd: