【问题标题】:Error response from daemon: oci runtime error: container_linux.go来自守护进程的错误响应:oci 运行时错误:container_linux.go
【发布时间】:2019-03-14 01:09:30
【问题描述】:

我有这么简单的Dockerfile

FROM alpine

ADD ./service /

RUN chmod +x /service

EXPOSE 8000

ENTRYPOINT ["./service"]

使用这个 Dockerfile 我成功创建了镜像,但是在尝试创建容器时出现错误。

standard_init_linux.go:178: exec user process caused "exec format error"

当二进制文件或 docker 容器的 OS/ARCH 出现问题时,可能会发生此错误。

service 是 Golang 应用的二进制文件。在我的例子中,Golang 应用程序使用 CGO 包。我在本地机器 Windows 10 上编译它。这是我的指令:

  • 安装tdm-gcc。基于 GNU 工具链的 32 位和 64 位 Windows 编译器套件。

  • POWERSHELL中执行命令:

set GOOS=linux
set GOARCH=amd64
go build -v -o questionnaire -ldflags="-extld=$CC"

go env 命令下一个返回我:

set GOARCH=amd64
set GOBIN=
set GOCACHE=C:\Users\NNogerbek\AppData\Local\go-build
set GOEXE=.exe
set GOFLAGS=
set GOHOSTARCH=amd64
set GOHOSTOS=windows
set GOOS=windows
set GOPATH=C:\Users\NNogerbek\go
set GOPROXY=
set GORACE=
set GOROOT=C:\Go
set GOTMPDIR=
set GOTOOLDIR=C:\Go\pkg\tool\windows_amd64
set GCCGO=gccgo
set CC=gcc
set CXX=g++
set CGO_ENABLED=1
set GOMOD=
set CGO_CFLAGS=-g -O2
set CGO_CPPFLAGS=
set CGO_CXXFLAGS=-g -O2
set CGO_FFLAGS=-g -O2
set CGO_LDFLAGS=-g -O2
set PKG_CONFIG=pkg-config
set GOGCCFLAGS=-m64 -mthreads -fmessage-length=0 -fdebug-prefix-map=C:\Users\NNOGER~1\AppData\Local\Temp\go-build371579938=/tmp/go-build -gno-record-gcc-switches

我在哪里出错以及如何解决这个问题?


我还尝试使用这样的 Dockerfile 在 docker 内编译二进制文件:

FROM golang:1.11

WORKDIR /go/src/application
ADD . .


RUN go get ./...
RUN go build -o /service .

ENV PORT=8000

CMD ["/service"]

我不知道为什么,但我有错误。不知何故 Docker 无法导入项目包:

package application/database: unrecognized import path "application/database" (import path does not begin with hostname)
package application/routes: unrecognized import path "application/routes" (import path does not begin with hostname)
package application/utils: unrecognized import path "application/utils" (import path does not begin with hostname)
package application/models: unrecognized import path "application/models" (import path does not begin with hostname)
package application/controllers: unrecognized import path "application/controllers" (import path does not begin with hostname)

顺便说一下项目结构:

- application
    - database
    - routes
    - utils
    - models
    - controllers
      main.go
      Dockerfile

【问题讨论】:

  • 已经告诉你permission denied,试试sudo docker运行吧
  • @FrankAK 我使用sude。例如,我尝试创建这样的容器:sudo docker run --name application_container -d -p 8000:8000 application_image。我还对二进制文件使用了sudo chmod 775 service 命令。错误信息是一样的。还有其他想法吗?
  • @FrankAK 正如您在我设置的 Dockerfile 顶部所看到的 FROM golang:1.11。据我所知,它是Debian。也许在 Debian 中我错误地启动了二进制文件(ENTRYPOINT Dockerfile 的一部分)?

标签: docker docker-container


【解决方案1】:

SRC_DIR 的值是什么,而且./service 具有可执行权限。 尝试在主机或Dockerfile 中运行chmod +x ./service

【讨论】:

  • 您好!我已经这样做了。你能再看看我的帖子吗?我尝试了很多方法来在 Docker 中运行我的 Golang 应用程序。但是在每个变体中我都有问题。你有什么想法吗?
【解决方案2】:

最后我明白,在 Windows 操作系统中编译使用 CGO 包的 Goland 应用程序的 linux/amd64 二进制文件并不是一个好主意。我尝试在 Docker 容器中启动的二进制文件总是引发错误standard_init_linux.go:178: exec user process caused "exec format error"。错误意味着OS/Arch 有问题或者您使用了损坏的文件。

最后我决定在 Docker 容器中编译二进制文件。我的Dockerfile 看起来像这样:

FROM golang:1.11

WORKDIR /go/src/application

ADD . .

RUN go get [your_dependencies]

RUN go build -o service

ENV PORT=8000

CMD ["./service"]

希望这篇文章对你有用!

【讨论】:

    猜你喜欢
    • 2018-05-28
    • 2021-02-20
    • 1970-01-01
    • 2019-04-30
    • 2020-01-11
    • 1970-01-01
    • 2020-04-19
    • 2021-10-08
    • 1970-01-01
    相关资源
    最近更新 更多