Repository navigation
FreeWilly 1.0.12
The first full release since 1.0.10. Everything in the 1.0.11 pre-release is here, and the two
defects that pre-release turned up are fixed.
A container that succeeded is no longer reported as a failure
docker compose run, docker start -a and docker exec all returned 1 over a container that had
exited 0. The output arrived in full and only the ending was wrong, which is what made this look
like the container's own failure rather than something on the Windows side.
The pipe was the difference. Over the distribution's unix socket the same daemon and the same
container answered 0, so what changed the result was the relay tearing an upgraded connection down
with DisconnectNamedPipe. That call discards whatever the pipe still holds and answers the
client's next read with "no process is on the other end of the pipe". A response carrying a
Content-Length had been read whole long before that, so the error landed after the client already
had its answer and nothing ever noticed. On a hijacked stream the end of the stream is the result,
so every client that reads to the end reported a failure instead.
The teardown now drains and closes, and never disconnects. The drain returns once the client has
taken every byte, and closing the handle after it ends the pipe with ERROR_BROKEN_PIPE, which is
the ending every client reads as a stream that finished.
An upgrade no longer needs a second start
Installing 1.0.11 over a running 1.0.10 left the engine down. The journal said wsl.exe exited 126 without a word, and the cause was that the installer was still writing the engine into the
distribution when the new tray asked for a start: a shell cannot execute a file another process
holds open for writing, and it exits 126 saying so. Nothing tried again, so the engine stayed down
until it was started by hand.
A start now launches the daemon again where the launcher could not execute it, up to three
times, pausing between. The condition clears in well under a second, so the whole event becomes
invisible. Where it took a relaunch the line says so, because a retry that hides a failure should
not also hide itself.
A launch that failed quietly now says why
The same event proved a sentence wrong. The host reported the launcher as exiting "without a word"
while the words were sitting in /var/log/dockerd.log, which is where the launch command's own
redirection puts them, so the one failure that is always silent was also the one the host declined
to name a file for.
A silent launcher now has that log's last line read and quoted:
the daemon exited while starting: wsl.exe exited 126, and /var/log/dockerd.log ends:
/bin/sh: exec: line 0: /usr/local/bin/dockerd: Text file busy
A launcher that named its own cause is still not sent to the log, because handing a reader both a
cause and a file sends them to the file.
Nothing this product starts holds the directory it was launched from
A process holds a lock on its working directory for as long as it lives, and this product starts
children that live a long time: the engine host, the daemon's launcher, a VM hold, a terminal you
are about to work in. Given no directory of its own, each one held whichever directory its caller
happened to be in. For the engine host that is the install's own, so an update or an uninstall could
fail to replace a file, and the failure said nothing about a child process.
Every one of them now names its own. The single exception is the docker on your PATH, which has to
inherit yours: docker build ., -f compose.yaml and -v .\data:/data all resolve against the
directory you typed them in.
The relay says what it is still holding
The sentence the journal quotes when the engine has gone quiet gained a clause naming how many
channels to the daemon the relay has open, and it is silent at zero. A quiet engine holding forty
channels is this process; a quiet engine holding none is the daemon. Those two read identically
before, and every one of those channels is a wsl.exe attached to the daemon's socket.
What the suite drives now
The first defect on this page shipped with the suite green, because every check the relay had sent a
request carrying a Content-Length, which is the one shape it spared. So there is now a live drill:
it serves a relay built from the working tree, points a real docker at it, and asserts the exit
code each client reports across compose run, start -a, exec, attach and logs --follow,
including a container that fails. It also asserts that a client walking away from a follow takes its
channel with it rather than leaving one attached for the life of the host.
Install
Download FreeWilly-Setup-1.0.12.exe and check it against SHA256SUMS.txt. Upgrading keeps the
distribution and everything in it.