Docker和makefile如何修复

mfuanj7w  于 2022-11-02  发布在  Docker
关注(0)|答案(1)|浏览(177)

我有去网络应用程序,我试图部署在Docker上,但我一直得到这个消息。我运行这个在Windows 10企业第11代英特尔(R)酷睿(TM)i7- 1185G7@3. 00 GHz 64位Docker文件

  1. FROM golang:latest
  2. RUN mkdir /app
  3. COPY bin/main /app/main
  4. WORKDIR /app
  5. CMD ["/app/main"]

生成文件

  1. GOOS=linux
  2. GOARCH=amd64
  3. build:
  4. go build -o bin/main main.go
  5. run:
  6. go run main.go
  7. compile:
  8. echo "Compiling for every OS and Platform"
  9. GOOS=linux GOARCH=arm go build -o bin/main-linux-arm main.go
  10. GOOS=linux GOARCH=arm64 go build -o bin/main-linux-arm64 main.go
  11. GOOS=freebsd GOARCH=386 go build -o bin/main-freebsd-386 main.go

我正在运行此命令

  1. go build -o bin/main main.go
  2. docker build -t tiny .
  3. docker run -p 127.0.0.1:8080:8080 tiny

获取时出错:执行/应用程序/主目录:执行格式错误

日志文件。严重错误(http.listenAndServe(“:8080”,nil))

brjng4g3

brjng4g31#

当你的Dockerfile说

  1. COPY bin/main /app/main

您正在将一个构建在Windows主机系统上的main二进制文件复制到Linux Docker映像中。由于操作系统不匹配,您将收到“exec format error”(执行格式错误)消息。
在构建Docker映像时,通常会在Docker文件中执行编译步骤。在Go语言这样的编译语言中,更常见的方法是使用multi-stage build,这样Go工具链本身就不是最终映像的一部分;这会给您一个小得多的映像,并且不会将源代码重新发布给最终用户。

  1. FROM golang:1.19-bullseye AS build
  2. WORKDIR /app
  3. COPY ./ ./
  4. RUN go build -o main ./
  5. FROM debian:bullseye
  6. COPY --from=build /app/main /usr/local/bin/main
  7. CMD ["main"]

这种方法忽略了Makefile,它实际上并没有使用任何Make特性(例如,没有任何地方一个规则依赖于另一个规则,如果规则的输出文件已经存在,也没有任何地方可以跳过规则的执行)。这个特定的Dockerfile构建一个动态链接的二进制文件,并确保构建和执行阶段使用相同Linux发行版的相同主版本,因此使用相同的SystemC库。

展开查看全部

相关问题