diff options
-rw-r--r-- | Dockerfile.rpihub | 44 | ||||
-rw-r--r-- | docker/armhf/build.sh | 3 | ||||
-rwxr-xr-x | docker/armhf/qemu-arm-static | bin | 0 -> 3370216 bytes | |||
-rwxr-xr-x | docker/armhf/resin-xbuild | bin | 0 -> 1299072 bytes | |||
-rw-r--r-- | docker/armhf/resin-xbuild.go | 66 |
5 files changed, 113 insertions, 0 deletions
diff --git a/Dockerfile.rpihub b/Dockerfile.rpihub new file mode 100644 index 00000000..d20b1e9a --- /dev/null +++ b/Dockerfile.rpihub @@ -0,0 +1,44 @@ +FROM armhf/alpine:3.5 + +ENV GOGS_CUSTOM /data/gogs +ENV QEMU_EXECVE 1 + +# For cross compile on dockerhub +################################ + +COPY ./docker/armhf/qemu-arm-static /usr/bin/ +COPY ./docker/armhf/resin-xbuild /usr/bin/ + +RUN [ "/usr/bin/qemu-arm-static", "/bin/sh", "-c", "ln -s resin-xbuild /usr/bin/cross-build-start; ln -s resin-xbuild /usr/bin/cross-build-end; ln /bin/sh /bin/sh.real" ] + +RUN [ "cross-build-start" ] + +# Prepare the container +####################### + +# Install system utils & Gogs runtime dependencies +ADD https://github.com/tianon/gosu/releases/download/1.9/gosu-armhf /usr/sbin/gosu +RUN chmod +x /usr/sbin/gosu \ + && apk --no-cache --no-progress add ca-certificates bash git linux-pam s6 curl openssh socat tzdata + +COPY . /app/gogs/build +WORKDIR /app/gogs/build + +RUN ./docker/build-go.sh \ + && ./docker/build.sh \ + && ./docker/finalize.sh + +# Configure LibC Name Service +COPY docker/nsswitch.conf /etc/nsswitch.conf + +# For cross compile on dockerhub +################################ + +RUN [ "cross-build-end" ] + +# Configure Docker Container +############################ +VOLUME ["/data"] +EXPOSE 22 3000 +ENTRYPOINT ["/app/gogs/docker/start.sh"] +CMD ["/bin/s6-svscan", "/app/gogs/docker/s6/"] diff --git a/docker/armhf/build.sh b/docker/armhf/build.sh new file mode 100644 index 00000000..d864f4b3 --- /dev/null +++ b/docker/armhf/build.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +go build -ldflags "-w -s" resin-xbuild.go diff --git a/docker/armhf/qemu-arm-static b/docker/armhf/qemu-arm-static Binary files differnew file mode 100755 index 00000000..bf5897b1 --- /dev/null +++ b/docker/armhf/qemu-arm-static diff --git a/docker/armhf/resin-xbuild b/docker/armhf/resin-xbuild Binary files differnew file mode 100755 index 00000000..5471f249 --- /dev/null +++ b/docker/armhf/resin-xbuild diff --git a/docker/armhf/resin-xbuild.go b/docker/armhf/resin-xbuild.go new file mode 100644 index 00000000..e0fceddf --- /dev/null +++ b/docker/armhf/resin-xbuild.go @@ -0,0 +1,66 @@ +package main + +import ( + "log" + "os" + "os/exec" + "syscall" +) + +func crossBuildStart() { + err := os.Remove("/bin/sh") + if err != nil { + log.Fatal(err) + } + err = os.Link("/usr/bin/resin-xbuild", "/bin/sh") + if err != nil { + log.Fatal(err) + } +} + +func crossBuildEnd() { + err := os.Remove("/bin/sh") + if err != nil { + log.Fatal(err) + } + err = os.Link("/bin/sh.real", "/bin/sh") + if err != nil { + log.Fatal(err) + } +} + +func runShell() error { + cmd := exec.Command("/usr/bin/qemu-arm-static", append([]string{"-0", "/bin/sh", "/bin/sh"}, os.Args[1:]...)...) + cmd.Stdin = os.Stdin + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + return cmd.Run() +} + +func main() { + switch os.Args[0] { + case "cross-build-start": + crossBuildStart() + case "cross-build-end": + crossBuildEnd() + case "/bin/sh": + code := 0 + crossBuildEnd() + + if err := runShell(); err != nil { + code = 1 + if exiterr, ok := err.(*exec.ExitError); ok { + if status, ok := exiterr.Sys().(syscall.WaitStatus); ok { + code = status.ExitStatus() + } + } + } + + crossBuildStart() + + // Hack to bypass apk issues with triggering + code = 0 + + os.Exit(code) + } +}
\ No newline at end of file |