Go应用程序在使用docker compose运行时失败并退出,但使用docker run命令可以正常工作
我正在一个作为服务器的删除服务器上运行所有这些操作 运行Ubuntu 16.04.5 x64的虚拟机 我的Go项目的Dockerfile看起来像:Go应用程序在使用docker compose运行时失败并退出,但使用docker run命令可以正常工作,docker,go,docker-compose,Docker,Go,Docker Compose,我正在一个作为服务器的删除服务器上运行所有这些操作 运行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 ENTRYPOI
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"]
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
当我使用docker compose-d运行docker容器时,Go应用程序退出,我在docker日志中看到:
myapp_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看起来像:
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"]
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
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
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
您的
docker compose.yml
文件显示:
volumes:
- /home/deploy/apps/myapp:/go/src/example.com/myapp
这意味着您的主机系统的源目录被装载到Dockerfile构建的所有内容上,并隐藏这些内容/myapp
是主机的myapp
可执行文件的副本,如果存在会导致此错误的其他内容(可能是您有MacOS或Windows主机)
这是一种流行的解释语言设置,开发人员希望在不运行正常测试构建部署序列的情况下运行其应用程序,但对于像Go这样没有选择余地的编译语言来说,这是没有意义的。我将完全删除此块。您的
docker compose.yml
文件显示:
volumes:
- /home/deploy/apps/myapp:/go/src/example.com/myapp
这意味着您的主机系统的源目录被装载到Dockerfile构建的所有内容上,并隐藏这些内容/myapp
是主机的myapp
可执行文件的副本,如果存在会导致此错误的其他内容(可能是您有MacOS或Windows主机)
这是一种流行的解释语言设置,开发人员希望在不运行正常测试构建部署序列的情况下运行其应用程序,但对于像Go这样没有选择余地的编译语言来说,这是没有意义的。我将完全删除此块。谢谢David!我一直到凌晨2点才想明白。醒来后,在你的帮助下,5分钟内就可以工作了。谢谢大卫!我一直到凌晨2点才想明白。醒来后,在你的帮助下,5分钟内就可以工作了。