我正在try 使用3个容器运行docker-compose设置:golang app(api)、postquist和nginx. 我为golang创建了docker-compose文件和Dockerfile. 我try 了不同的方法,但仍然有一个错误"来 automorphic 护程序的错误响应:未能创建shim任务:OCI运行时创建失败:runc创建失败:无法启动容器进程:exec:"./ main":stat./ main:没有这样的文件或目录:未知"来自Dockerfile.一些RUN go build -o main .如何在不同的位置创建垃圾箱. 这是位于我项目根目录下的docker-compose文件:

version: '3.8'

services:
  apigateway:
    build:
      context: .
      dockerfile: .docker/go/Dockerfile
    ports:
      - "8080:8080"
    volumes:
      - ./apigateway:/apigateway
    depends_on:
      - postgres
    networks:
      - app-network

  nginx:
    image: nginx:1.26.0
    ports:
      - "80:80"
    volumes:
      - ./.docker/nginx/conf.d:/etc/nginx/conf.d
    depends_on:
      - apigateway
    networks:
      - app-network
  postgres:
    image: postgres:16.2
    ports:
      - "5210:5432"
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
      POSTGRES_DB: mydb
    volumes:
      - postgres_data:/var/lib/postgresql/data
    networks:
      - app-network
volumes:
  postgres_data:

networks:
  app-network:

Dockerfile位于.docker/go/Dockerfile中,它包含:

FROM golang:1.22-alpine

RUN apk update && apk upgrade && \
    apk add --no-cache bash openssh

WORKDIR /apigateway

COPY ./apigateway/go.mod ./apigateway/go.sum ./

RUN go mod download

COPY ./apigateway .

RUN go build -o main .

EXPOSE 8080

CMD ["./main"]

我们非常感谢任何帮助.

我试图创建bin并复制它以执行,但它不起作用,因为bin是在macos中构建的,无法在Linux中执行. 我也在Dockerfile中玩了很多次路径,但没有取得任何成功

推荐答案

您的Compose文件中的volumes:块会使用来自主机的内容覆盖您图像中的所有内容. 这包括已编译的二进制文件:您的图像应该有一个/apigateway/main二进制文件,但由于整个/apigateway目录被绑定装载隐藏,因此您看不到它.

您可以安全地删除volumes:块,然后使用图像中内置的二进制文件.

services:
  apigateway:
    # volumes:                      <-- delete
    #   - ./apigateway:/apigateway  <-- delete

Go相关问答推荐

golang父进程的副本无法进行https/tls调用并获得tls:未能验证证书""

为什么我不能使用Docker从本地访问我的Gin应用程序?

GitHub发布Golang子模块

GoLang:无法发送带有附件的邮箱

是不是有什么原因导致`Strings.EqualFold`不先进行长度比较?

从带有嵌套括号的字符串中提取值

有没有办法让sqlc生成可以使用pgxpool的代码

这是实现超时的常见方法,为什么 time.After 不起作用

如果值为 false,gRPC 不返回布尔值

如何使用 Docker 引擎 SDK 和 Golang 运行 docker 挂载卷

如果 transaction.Commit 对带有 postgres 连接的 SQL 失败,您是否需要调用 transaction.RollBack

通过 golang 中的 gremlin-go 库嵌入 gremlin 服务器

go:embed 文件扩展名模式

为什么 Go 被认为是部分抢占式的?

Go 泛型:自引用接口约束

Golang泛型在用作 map 元素时不起作用

如何使用 math/big 对 bigInt 进行取模?

Go lang - 惯用的默认后备

如何使用带有Electron 表格 ID、Electron 表格名称、表格 ID 和值的 golang 在 googlesheet 中插入数据

GOENV 只能使用 OS 环境设置