首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在使用docker -组合运行时,Go应用程序会失败并退出,但是使用docker run命令可以正常工作。

在使用docker -组合运行时,Go应用程序会失败并退出,但是使用docker run命令可以正常工作。
EN

Stack Overflow用户
提问于 2018-10-29 05:40:53
回答 2查看 356关注 0票数 0

我是在一个运行Ubuntu16.04.5 x64的remove服务器上运行所有这些操作的。

我的Go项目的Dockerfile看起来像:

代码语言:javascript
复制
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格式错误docker_myapp_1与代码2一起退出

如果我使用docker images定位图像并运行映像,如下所示:

代码语言:javascript
复制
 docker run -it 75d4a95ef5ec 

我可以看到我的golang应用程序运行得很好:

viper环境是:开发侦听地址:":3005“的HTTP服务器

当我在googled上搜索这个错误时,有些人建议用一些特殊的标志进行编译,但是我在同一个Ubuntu主机上运行这个容器,所以我真的很困惑为什么它不能使用docker。

我的船坞-Compose.yml看起来是:

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-29 10:24:46

您的docker-compose.yml文件说:

代码语言:javascript
复制
volumes:
 - /home/deploy/apps/myapp:/go/src/example.com/myapp

这意味着您的主机系统的源目录已经挂载并隐藏了Dockerfile构建的所有内容。./myappmyapp可执行文件的主机副本,如果有不同的东西(可能有MacOS或MacOS主机),则会导致此错误。

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

票数 2
EN

Stack Overflow用户

发布于 2018-10-29 07:19:48

Go容器因此停止运行:

代码语言:javascript
复制
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命令,要么将应用程序复制到不同的位置并传递完整的路径,如:

代码语言:javascript
复制
ENTRYPOINT /my/go/app/location
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53039381

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档