Error response from daemon: oci runtime error: container_linux.go
Error response from daemon: oci runtime error: container_linux.go
我有这么简单的Docker文件:
FROM alpine
ADD ./service /
RUN chmod +x /service
EXPOSE 8000
ENTRYPOINT ["./service"]
使用这个 Docker 文件我成功地创建了图像,但是在尝试创建容器时出现错误。
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
命令return我下一个:
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
我哪里出错了,如何解决这个问题?
我还尝试在 docker 中使用这样的 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
什么是SRC_DIR
值,而且./service
是否有可执行权限。
尝试 运行 chmod +x ./service
在主机上或 Dockerfile
.
最后我明白编译 Goland
应用程序的 linux/amd64
二进制文件在 Windows OS 中使用 CGO
包不是个好主意。我试图在 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"]
希望这篇post对你有用!
我有这么简单的Docker文件:
FROM alpine
ADD ./service /
RUN chmod +x /service
EXPOSE 8000
ENTRYPOINT ["./service"]
使用这个 Docker 文件我成功地创建了图像,但是在尝试创建容器时出现错误。
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
命令return我下一个:
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
我哪里出错了,如何解决这个问题?
我还尝试在 docker 中使用这样的 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
什么是SRC_DIR
值,而且./service
是否有可执行权限。
尝试 运行 chmod +x ./service
在主机上或 Dockerfile
.
最后我明白编译 Goland
应用程序的 linux/amd64
二进制文件在 Windows OS 中使用 CGO
包不是个好主意。我试图在 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"]
希望这篇post对你有用!