Go应用程序失败并在使用docker-compose运行时退出,但可与docker run命令配合使用

时间:2018-10-29 05:40:53

标签: docker go docker-compose

我正在作为服务器的删除服务器上运行所有这些操作 运行Ubuntu 16.04.5 x64的VM

我的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:执行格式错误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 个答案:

答案 0 :(得分:2)

您的docker-compose.yml文件说:

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

表示您的主机系统的源目录已安装并隐藏Dockerfile构建的所有内容。 ./myappmyapp可执行文件的主机副本,如果有所不同(可能是MacOS或Windows主机),则会导致此错误。

这是一种流行的解释语言设置,开发人员希望在不运行正常的test-build-deploy序列的情况下运行其应用程序,但对于像Go这样的编译语言却没有任何意义,选择。我会完全删除该块。

答案 1 :(得分:0)

由于以下原因,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
相关问题