Rather than bind mounting binfmt_misc filesystem, mount a copy.

For some reason, bind mounting does not always seem to work,
sometimes the filesystem is empty. Mounting a fresh copy seems
a better solution, and simplifies things. The container does
need `CAP_SYS_ADMIN` but only on boot.

Signed-off-by: Justin Cormack <justin.cormack@docker.com>
This commit is contained in:
Justin Cormack 2018-06-22 13:41:34 +01:00
parent ccfdc71a2f
commit a6dbe8ceba
No known key found for this signature in database
GPG Key ID: 609102888A2EE3F9
3 changed files with 9 additions and 6 deletions

View File

@ -12,13 +12,10 @@ ENV GOPATH=/go PATH=$PATH:/go/bin
COPY main.go /go/src/binfmt/
RUN go-compile.sh /go/src/binfmt
RUN mkdir /binfmt_misc
FROM scratch
ENTRYPOINT []
WORKDIR /
COPY --from=qemu usr/bin/qemu-* usr/bin/
COPY --from=mirror /go/bin/binfmt usr/bin/binfmt
COPY --from=mirror /binfmt_misc /binfmt_misc/
COPY etc/binfmt.d/00_linuxkit.conf etc/binfmt.d/00_linuxkit.conf
CMD ["/usr/bin/binfmt", "-dir", "/etc/binfmt.d/", "-mount", "/binfmt_misc"]
CMD ["/usr/bin/binfmt"]

View File

@ -1,9 +1,10 @@
image: binfmt
network: true
arches:
- amd64
config:
binds:
- /proc/sys/fs/binfmt_misc:/binfmt_misc
capabilities:
- CAP_SYS_ADMIN
readonly: true
net: new
ipc: new

View File

@ -69,6 +69,11 @@ func binfmt(line []byte) error {
func main() {
flag.Parse()
if err := syscall.Mount("binfmt_misc", mount, "binfmt_misc", 0, ""); err != nil {
log.Fatalf("Cannot mount binfmt_misc filesystem at %s: %v", mount, err)
}
defer syscall.Unmount(mount, 0)
files, err := ioutil.ReadDir(dir)
if err != nil {
log.Fatalf("Cannot read directory %s: %s", dir, err)