我在一個運行 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 這樣您別無選擇的編譯型語言來說,它實際上沒有意義。我會完全刪除這個塊。

神不在的星期二
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
- 2 回答
- 0 關注
- 225 瀏覽
添加回答
舉報
0/150
提交
取消