为了账号安全,请及时绑定邮箱和手机立即绑定

Go 应用程序在使用 docker-compose 运行时失败并退出

Go 应用程序在使用 docker-compose 运行时失败并退出

Go
守着一只汪 2023-05-04 16:50:24
我在一个运行 Ubuntu 16.04.5 x64的虚拟机的删除服务器上运行所有这些操作 。我的 Go 项目的 Dockerfile 如下所示:FROM golang:latestADD . $GOPATH/src/example.com/myappWORKDIR $GOPATH/src/example.com/myappRUN go build#EXPOSE 80#ENTRYPOINT $GOPATH/src/example.com/myapp/myappENTRYPOINT ./myapp#CMD ["./myapp"]当我使用 运行 docker 容器时docker-compose up -d,Go 应用程序退出,我在 docker 日志中看到:我的应用_1 | /bin/sh: 1: ./myapp: Exec 格式错误 docker_myapp_1 已退出,代码为 2如果我使用以下方式定位图像docker images并运行图像: docker run -it 75d4a95ef5ec 我可以看到我的 golang 应用程序运行得很好:viper 环境是:开发 HTTP 服务器监听地址:“:3005”当我用谷歌搜索这个错误时,有些人建议使用一些特殊标志进行编译,但我在同一台 Ubuntu 主机上运行这个容器,所以我真的很困惑为什么这不能使用 docker。我的 docker-compose.yml 看起来像:version: "3"services:  openresty:    build: ./openresty    ports:     - "80:80"     - "443:443"    depends_on:      - myapp    env_file:     - '.env'    restart: always  myapp:    build: ../myapp    volumes:     - /home/deploy/apps/myapp:/go/src/example.com/myapp    ports:      - "3005:3005"    depends_on:      - db      - redis      - memcached    env_file:      - '.env'  redis:    image: redis:alpine    ports:    - "6379:6379"    volumes:     - "/home/deploy/v/redis:/data"    restart: always  memcached:    image: memcached    ports:      - "11211:11211"    restart: always  db:    image: postgres:9.4    volumes:      - "/home/deploy/v/pgdata:/var/lib/postgresql/data"    restart: always
查看完整描述

2 回答

?
MM们

TA贡献1886条经验 获得超2个赞

你的docker-compose.yml文件说:

volumes:
 - /home/deploy/apps/myapp:/go/src/example.com/myapp

这意味着您的主机系统的源目录已挂载并隐藏了 Dockerfile 构建的所有内容。 ./myapp主机的可执行文件副本myapp,如果有什么不同(也许您有 MacOS 或 Windows 主机)将导致此错误。

对于解释型语言,这是一种流行的设置,开发人员希望在不运行正常的测试-构建-部署序列的情况下运行他们的应用程序,但对于像 Go 这样您别无选择的编译型语言来说,它实际上没有意义。我会完全删除这个块。


查看完整回答
反对 回复 2023-05-04
?
神不在的星期二

TA贡献1963条经验 获得超6个赞

Go 容器因此停止运行:


WORKDIR $GOPATH/src/example.com/myapp

RUN go build


#EXPOSE 80


#ENTRYPOINT $GOPATH/src/example.com/myapp/myapp

ENTRYPOINT ./myapp

您正在将目录切换到构建应用程序的$GOPATH/src/example.com/myapp ,但是,您的入口点指向了错误的位置。


要解决此问题,您可以将应用程序复制到根目录并保留相同的ENTRYPOINT命令,或者将应用程序复制到其他位置并传递完整路径,例如:


ENTRYPOINT /my/go/app/location


查看完整回答
反对 回复 2023-05-04
  • 2 回答
  • 0 关注
  • 162 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信