【问题标题】:Problem with run docker container contains golang project运行 docker 容器的问题包含 golang 项目
【发布时间】:2020-03-19 08:55:20
【问题描述】:

我在尝试运行包含 golang 应用程序的 docker 映像时遇到了一些问题。 这是一个错误:enter code herestandard_init_linux.go:211: exec 用户进程导致“exec 格式错误”

这是我的环境:

GOARCH="amd64"
GOBIN="/home/nikolaj//home/nikolaj/go/bin"
GOCACHE="/home/nikolaj/.cache/go-build"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GOPATH="/home/nikolaj/go"
GOPROXY=""
GORACE=""
GOROOT="/snap/go/4765"
GOTMPDIR=""
GOTOOLDIR="/snap/go/4765/pkg/tool/linux_amd64"
GCCGO="gccgo"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD="/dev/null"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build908015468=/tmp/go-build -gno-record-gcc-switches"

go environment : GOARCH="amd64"
GOBIN="/home/nikolaj//home/nikolaj/go/bin"
GOCACHE="/home/nikolaj/.cache/go-build"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"

GOHOSTOS="linux"
GOOS="linux"
GOPATH="/home/nikolaj/go"
GOPROXY=""
GORACE=""
GOROOT="/snap/go/4765"
GOTMPDIR=""
GOTOOLDIR="/snap/go/4765/pkg/tool/linux_amd64"
GCCGO="gccgo"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD="/dev/null"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build838573681=/tmp/go-build -gno-record-gcc-switches"

码头文件:

FROM golang:1.12.0

WORKDIR /app

ENV SRC_DIR=/go/src/vk_acceptor/

ADD . $SRC_DIR

RUN cd $SRC_DIR; env; goenv; export GO111MODULE=on; go get -u; go build -o application; cp application /app/

RUN chmod +x application

ENTRYPOINT ["./application"]

格式化RUN command后看起来像这样:RUN cd $SRC_DIR && env && goenv && export GO111MODULE=on && go get -u && go build -o application && cp application /app/

docker build . 命令的输出:

Sending build context to Docker daemon  9.067MB
Step 1/7 : FROM golang:1.12.0
 ---> cee68f119e19
Step 2/7 : WORKDIR /app
 ---> Using cache
 ---> 5bffbbf8f161
Step 3/7 : ENV SRC_DIR=/go/src/vk_acceptor/
 ---> Using cache
 ---> bf145f38f8db
Step 4/7 : ADD . $SRC_DIR
 ---> 766466f20647
Step 5/7 : RUN cd $SRC_DIR && env && goenv && export GO111MODULE=on && go get -u && go build -o application && cp application /app/
 ---> Running in 7aeb8905c137
HOSTNAME=7aeb8905c137
SRC_DIR=/go/src/vk_acceptor/
HOME=/root
OLDPWD=/app
PATH=/go/bin:/usr/local/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
GOPATH=/go
PWD=/go/src/vk_acceptor
GOLANG_VERSION=1.12
/bin/sh: 1: goenv: not found
The command '/bin/sh -c cd $SRC_DIR && env && goenv && export GO111MODULE=on && go get -u && go build -o application && cp application /app/' returned a non-zero code: 127

【问题讨论】:

  • file ./application 打印什么?你在 amd64 系统上运行这个容器吗?
  • 是否在 Docker 之外构建 exe?如果是这样,我建议在 Docker 内部构建本身,以确保与已知 Linux 映像的库链接一致。
  • 应用程序在容器内构建,看起来没有任何问题。输出: docker build -t vkspotter 。将构建上下文发送到 Docker 守护进程 9.067MB 步骤 1/7:FROM golang:1.12.0 ---> cee68f119e19 ...(跳过一些步骤)步骤 7/7:ENTRYPOINT ["./application"] ---> 运行在 1feb2636c88f 删除中间容器 1feb2636c88f ---> 8c5011c23472 成功构建 8c5011c23472 成功标记 vkspotter:latest
  • @tkausl 是的,我确实在 amd64 系统上运行该应用程序,我的规格:Intel i5,Ubuntu 19.04。你能澄清一下我应该在哪里运行file ./application 命令吗?
  • 您不能确定没有问题,因为您忽略了长 RUN 标签中各个命令的返回值。使用&& 而不是;add the output to your question by editing it 连接每个命令

标签: linux docker go


【解决方案1】:

standard_init_linux.go:211: exec user process caused "exec format error" 错误的发生有多种原因,正如许多论坛所说,不仅是当您尝试使用与主机不同的架构启动映像时。 就我而言,这个错误是由于捆绑的程序被放置在 docker 容器中的错误目录中。

【讨论】:

    【解决方案2】:

    如果查看输出错误,可以清楚地看到错误信息:

    /bin/sh: 1: goenv: not found
    

    我猜你想在命令中输入go env

    【讨论】:

    • 是的,这是正确的,但在上面的线程中我得到了帮助。现在我有新问题了。错误是:standard_init_linux.go:211: exec user process caused "exec format error" ,我搜索了有关它的信息,我发现的只是当您尝试运行具有与您的主机架构不同的架构的容器时发生的。
    猜你喜欢
    • 1970-01-01
    • 2018-10-13
    • 2022-01-09
    • 1970-01-01
    • 2021-07-14
    • 2016-04-14
    • 1970-01-01
    • 2020-11-22
    • 1970-01-01
    相关资源
    最近更新 更多