我正在try 用Docker容器制作我的Golang API的生产版本.它在开发(与Air)中工作,但不断告诉我,可执行文件在生产一号中没有找到. 我测试了它,它被正确编译,并且它存在并且是可执行的.

为了确定,我将文本添加到了Dockerfile;

# first build the app binary
FROM golang:1.20-alpine

WORKDIR /app

COPY goapp/ .

RUN go mod download

RUN go build -o /app/executable

# check if the binary exists and is executable
RUN [ -f /app/executable -a -x /app/executable ]

CMD /app/executable

我使用docker-compose运行它:

version: '3.3'

services:
  # db...
  goapp:
    build:
      context: ./
      dockerfile: ./docker/go/Dockerfile_prod
    environment:
      - SECRET=${SECRET}
      - PORT=3000
      - GO_ENV=production
      - GIN_MODE=release
      - MYSQL_HOST=${MYSQL_HOST}
      - MYSQL_PORT=${MYSQL_PORT}
      - MYSQL_USER=${MYSQL_USER}
      - MYSQL_PASSWORD=${MYSQL_PASSWORD}
      - MYSQL_DATABASE=${MYSQL_DATABASE}
      - SMTP_HOST=${SMTP_HOST}
      - SMTP_USER=${SMTP_USER}
      - SMTP_PASSWORD=${SMTP_PASSWORD}
      - SENTRY_DSN=${SENTRY_DSN}
    ports:
      - 3000:3000
    volumes:
      - ./goapp:/app
      - ./data/goapp:/app/data
    depends_on:
      db:
        condition: service_healthy

我一直在用docker-compose -f ... build上的--no-cache面旗帜建造它

已try 将CMD更改为ENTRYPOINT,并带括号或不带括号.也试过了

ENTRYPOINT ["/bin/sh", "-c", "/app/executable"]

但我一直有这样的 idea :

goapp_1    | /bin/sh: /app/executable: not found
project_goapp_1 exited with code 127

为什么它不运行,我如何才能使它工作?谢谢.

推荐答案

volumes:
  - ./goapp:/app

主机上的./goapp安装到容器上的非空目录(/app)中./app目录的现有内容被绑定挂载遮挡.显然,这不是你想要的.

请参见Mount into a non-empty directory on the container.

您应该 Select 要挂载到容器中的文件和目录,并分别挂载它们.但如果你的应用程序依赖于这些文件和目录,一个更好的方法是修改Dockerfile,将它们复制到图像中.

Go相关问答推荐

出口上下文值密钥的安全方法?

Pulumi-S3-当策略依赖于访问点时,如何将AccesspintPolicy附加到访问点

Golang html/模板&需要错误数量的参数1在模板中使用';调用';获得0&q;

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

链自定义GRPC客户端拦截器/DialOptions

在整个SQL事务中将使用上下文作为默认设置吗?

可以';t从主机连接到ScyllaDB容器

如何在 zap 记录器库中使用自定义时间函数

仅使用公共 api 对 alexedwards/scs 进行简单测试

Fizz对Gin的OpenAPI生成器正在重命名类型

通过多阶段构建复制到 Docker 容器中时找不到文件

如何在 fyne-io/fyne 中设置文本的字母间距?

对所有标志进行 ORing 的简短方法

在 go 中将运行命令的标准输出发送到其标准输入

Golang - 使用正则表达式提取链接

如何在 Unmarshal 中使用泛型(转到 1.18)

Go:如何通过 GIN-Router 从 AWS S3 将文件作为二进制流发送到浏览器?

如何允许可转换为指针的泛型类型参数化另一种可转换为指针的泛型类型?

如何从应用程序调用谷歌云身份 API

将函数的值作为输入参数返回给另一个