使用 docker-compose 运行 Go 应用失败并退出, 但使用 docker run 命令可以正常工作

我正在一个运行 Ubuntu 16.04.5 x64 的远程服务器上进行所有操作。

我的 Go 项目的 Dockerfile 如下:

FROM golang:latest

ADD . $GOPATH/src/example.com/myapp
WORKDIR $GOPATH/src/example.com/myapp
RUN go build

#EXPOSE 80

#ENTRYPOINT $GOPATH/src/example.com/myapp/myapp
ENTRYPOINT ./myapp
#CMD ["./myapp"]

当我使用 docker-compose up -d 运行 docker 容器时,Go 应用程序会退出,我在 docker 日志中看到了这个:

myapp_1 | /bin/sh: 1: ./myapp: Exec format error docker_myapp_1 退出,代码为 2

如果我使用 docker images 定位到镜像并像下面这样运行镜像:

 docker run -it 75d4a95ef5ec

我可以看到我的 Golang 应用程序可以正常运行:

viper environment is: development HTTP server listening on address: ":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
点赞
用户4519500
用户4519500

这是 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
2018-10-29 07:19:48
用户10008173
用户10008173

你的 docker-compose.yml 文件如下:

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

这意味着你的主机系统的源目录被挂载,覆盖了 Dockerfile 构建的所有内容。./myapp 是主机上的 myapp 可执行文件的副本,如果有什么不同之处(也许你的主机是 MacOS 或 Windows),这会导致错误。

这是一种流行的设置,适用于那些想要运行应用程序而不运行正常测试-构建-部署过程的解释性语言的开发人员,但对于像 Go 这样的编译语言来说,这并不是很有意义。我建议删除这个块。

2018-10-29 10:24:46