[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Bug 1886793] Re: "go install" command fails while running inside s390x
From: |
Laurent Vivier |
Subject: |
[Bug 1886793] Re: "go install" command fails while running inside s390x docker container on x86_64 host using qemu |
Date: |
Fri, 10 Jul 2020 12:21:35 -0000 |
If you install go directly in your host system you must also install the
libraries of s390x somewhere (except if it statically linked).
The easiest way to test this is to install debian chroot, with something
like:
Check binftm_misc is configured:
# cat /proc/sys/fs/binfmt_misc/qemu-s390x
enabled
interpreter //qemu-s390x
flags: OC
offset 0
magic 7f454c4602020100000000000000000000020016
mask ffffffffffffff00fffffffffffffffffffeffff
Then you can install a debian sid system into a directory:
# debootstrap --arch=s390x --foreign sid chroot-s390x/
# cp .../qemu-s390x chroot-s390x/
# sudo chroot chroot-s390x/ /debootstrap/debootstrap --second-stage
And then you can use it with:
# sudo chroot s390x-chroot/
# uname -m
s390x
# apt install golang-go
...
--
You received this bug notification because you are a member of qemu-
devel-ml, which is subscribed to QEMU.
https://bugs.launchpad.net/bugs/1886793
Title:
"go install" command fails while running inside s390x docker container
on x86_64 host using qemu
Status in QEMU:
New
Bug description:
Steps to reproduce the issue:
Register x86_64 host with the latest qemu-user-static.
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
Build the following Docker Image using following Dockerfile.s390x
using command docker build -t test/crossbuild:latest-s390x -f
Dockerfile.s390x .
Dockerfile.s390x
##############################################
FROM alpine:3.11 as qemu
ARG QEMU_VERSION=5.0.0-2
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://github.com/multiarch/qemu-user-static/releases/download/v${QEMU_VERSION}/qemu-${i}-static.tar.gz
| tar zxvf - -C /usr/bin; done
RUN chmod +x /usr/bin/qemu-*
FROM s390x/golang:1.14.2-alpine3.11
MAINTAINER LoZ Open Source Ecosystem
(https://www.ibm.com/developerworks/community/groups/community/lozopensource)
ARG MANIFEST_TOOL_VERSION=v1.0.2
#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/qemu-*-static /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 ' StrictHostKeyChecking no' >> /etc/ssh/ssh_config
#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.com/Masterminds/glide
ENV GLIDE_HOME /home/user/.glide
#Install dep
RUN go get github.com/golang/dep/cmd/dep
#Install ginkgo CLI tool for running tests
RUN go get github.com/onsi/ginkgo/ginkgo
#Install linting tools.
RUN wget -O - -q
https://install.goreleaser.com/github.com/golangci/golangci-lint.sh | sh -s
v1.20.0
RUN golangci-lint --version
#Install license checking tool.
RUN go get github.com/pmezard/licenses
#Install tool to merge coverage reports.
RUN go get github.com/wadey/gocovmerge
#Install CLI tool for working with yaml files
RUN go get github.com/mikefarah/yaml
#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://github.com/estesp/manifest-tool/releases/download/${MANIFEST_TOOL_VERSION}/manifest-tool-linux-s390x
> manifest-tool && \
chmod +x manifest-tool && \
mv manifest-tool /usr/bin/
COPY entrypoint.sh /usr/local/bin/entrypoint.sh
ENTRYPOINT ["/sbin/tini", "--", "/usr/local/bin/entrypoint.sh"]
##################################################################
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/qemu-user-static --reset -p yes
docker run -it -v /home/test/qemu-s390x-static:/usr/bin/qemu-s390x-
static s390x/golang:1.14.2-alpine3.11
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: 7ad184331fa3e55e52b890ea95e65ba581ae3429
runc:
Version: 1.0.0-rc10
GitCommit: dc9208a3303feef5b3839f4323d9beb36df0a9dd
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.
To manage notifications about this bug go to:
https://bugs.launchpad.net/qemu/+bug/1886793/+subscriptions
- [Bug 1886793] [NEW] "go install" command fails while running inside s390x docker container on x86_64 host using qemu, Nirman Narang, 2020/07/08
- [Bug 1886793] Re: "go install" command fails while running inside s390x docker container on x86_64 host using qemu, Nirman Narang, 2020/07/08
- [Bug 1886793] Re: "go install" command fails while running inside s390x docker container on x86_64 host using qemu, Laurent Vivier, 2020/07/08
- [Bug 1886793] Re: "go install" command fails while running inside s390x docker container on x86_64 host using qemu, Nirman Narang, 2020/07/10
- [Bug 1886793] Re: "go install" command fails while running inside s390x docker container on x86_64 host using qemu,
Laurent Vivier <=
- [Bug 1886793] Re: "go install" command fails while running inside s390x docker container on x86_64 host using qemu, Nirman Narang, 2020/07/14
- [Bug 1886793] Re: "go install" command fails while running inside s390x docker container on x86_64 host using qemu, Nirman Narang, 2020/07/23