"go install" command fails while running inside s390x docker container on x86_64 host using qemu
Affects | Status | Importance | Assigned to | Milestone | |
---|---|---|---|---|---|
QEMU |
Expired
|
Undecided
|
Unassigned |
Bug Description
Steps to reproduce the issue:
Register x86_64 host with the latest qemu-user-static.
docker run --rm --privileged multiarch/
Build the following Docker Image using following Dockerfile.s390x using command docker build -t test/crossbuild
Dockerfile.s390x
#######
FROM alpine:3.11 as qemu
ARG QEMU_VERSION=
ARG QEMU_ARCHS="s390x"
RUN apk --update add curl
#Enable non-native runs on amd64 architecture hosts
RUN for i in ${QEMU_ARCHS}; do curl -L https:/
RUN chmod +x /usr/bin/qemu-*
FROM s390x/golang:
MAINTAINER LoZ Open Source Ecosystem (https:/
ARG MANIFEST_
#Enable non-native builds of this image on an amd64 hosts.
#This must be the first RUN command in this file!
COPY --from=qemu /usr/bin/
#Install su-exec for use in the entrypoint.sh (so processes run as the right user)
#Install bash for the entry script (and because it's generally useful)
#Install curl to download glide
#Install git for fetching Go dependencies
#Install ssh for fetching Go dependencies
#Install mercurial for fetching go dependencies
#Install wget since it's useful for fetching
#Install make for building things
#Install util-linux for column command (used for output formatting).
#Install grep and sed for use in some Makefiles (e.g. pulling versions out of glide.yaml)
#Install shadow for useradd (it allows to use big UID)
RUN apk update && apk add --no-cache su-exec curl bash git openssh mercurial make wget util-linux tini file grep sed shadow
RUN apk upgrade --no-cache
#Disable ssh host key checking
RUN echo 'Host *' >> /etc/ssh/ssh_config \
&& echo ' StrictHostKeyCh
#Disable cgo so that binaries we build will be fully static.
ENV CGO_ENABLED=0
#Recompile the standard library with cgo disabled. This prevents the standard library from being
#marked stale, causing full rebuilds every time.
RUN go install -v std
#Install glide
RUN go get github.
ENV GLIDE_HOME /home/user/.glide
#Install dep
RUN go get github.
#Install ginkgo CLI tool for running tests
RUN go get github.
#Install linting tools.
RUN wget -O - -q https:/
RUN golangci-lint --version
#Install license checking tool.
RUN go get github.
#Install tool to merge coverage reports.
RUN go get github.
#Install CLI tool for working with yaml files
RUN go get github.
#Delete all the Go sources that were downloaded, we only rely on the binaries
RUN rm -rf /go/src/*
#Install vgo (should be removed once we take Go 1.11)
RUN go get -u golang.org/x/vgo
#Ensure that everything under the GOPATH is writable by everyone
RUN chmod -R 777 $GOPATH
RUN curl -sSL https:/
chmod +x manifest-tool && \
mv manifest-tool /usr/bin/
COPY entrypoint.sh /usr/local/
ENTRYPOINT ["/sbin/tini", "--", "/usr/local/
#######
The build just hangs at RUN go install -v std
Also, while running the same command inside s390x container on x86_64 host, error Illegal instruction (core dumped) is thrown.
Register x86_64 host with the latest qemu-user-static.
docker run --rm --privileged multiarch/
docker run -it -v /home/test/
Inside s390x container:
apk update && apk add --no-cache su-exec curl bash git openssh mercurial make wget util-linux tini file grep sed shadow
apk upgrade --no-cache
#Disable cgo so that binaries we build will be fully static.
export CGO_ENABLED=0
go install -v std
This gives the following error:
Illegal instruction (core dumped)
Environment:
x86_64 Ub18.04 4.15.0-101-generic Ubuntu SMP x86_64 GNU/Linux
QEMU user static version: 5.0.0-2
Container application: Docker
Client: Docker Engine - Community
Version: 19.03.11
API version: 1.40
Go version: go1.13.10
Git commit: 42e35e61f3
Built: Mon Jun 1 09:12:22 2020
OS/Arch: linux/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 19.03.11
API version: 1.40 (minimum version 1.12)
Go version: go1.13.10
Git commit: 42e35e61f3
Built: Mon Jun 1 09:10:54 2020
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.2.13
GitCommit: 7ad184331fa3e55
runc:
Version: 1.0.0-rc10
GitCommit: dc9208a3303feef
docker-init:
Version: 0.18.0
GitCommit: fec3683
Additional information optionally:
When I build the same Dockerfile.s390x on an s390x machine, it is built successfully.
Changed in qemu: | |
status: | New → Incomplete |
One more thing which I tried:
I installed qemu on x86 Ubuntu host with apt-get install.
Extracted s390x go 1.14.2 binaries on the same. Ran the following commands:
root:~ wget -q https:/ /storage. googleapis. com/golang/ go1.14. 2.linux- s390x.tar. gz 2.linux- s390x.tar. gz 2.linux- s390x.tar. gz go/bin/ go /usr/bin/ go/bin/ gofmt /usr/bin/ s390x-linux- gnu-gcc
root@:~# chmod ugo+r go1.14.
root@:~# rm -rf /usr/local/go /usr/bin/go
root@:~# tar -C /usr/local -xzf go1.14.
root@:~# ln -sf /usr/local/
root@:~# ln -sf /usr/local/
root@:~# ln -sf /usr/bin/gcc /usr/bin/
root@:~# go version
/lib/ld64.so.1: No such file or directory
root@:~# qemu-s390x /usr/bin/go version
/lib/ld64.so.1: No such file or directory