代码之家  ›  专栏  ›  技术社区  ›  Oussama

docker用golang、nginx和postgres编写找不到/主要的

  •  0
  • Oussama  · 技术社区  · 1 年前

    我正在尝试用3个容器运行docker compose设置:golang-app(api)、postgres和nginx。 我为golang创建了docker compose文件和Dockerfile。 我尝试了不同的方法,但仍然有一个错误“来自守护程序的错误响应:无法创建填充程序任务:OCI运行时创建失败:运行库创建失败:无法启动容器进程:exec:”/main“:stat./main:no such file or directory:unknown”来自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的比赛中也打了很多球,但没有取得任何成功

    1 回复  |  直到 1 年前
        1
  •  0
  •   David Maze    1 年前

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

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

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