首页 > 解决方案 > 在 Docker 上部署 Golang 应用程序退出过程

问题描述

我对 Docker 很陌生。我有一个具有以下结构的 Golang 应用程序:

.
├── 404.html
├── Dockerfile
├── index.html
├── scripts
├── server.go
├── static
│   ├── jquery.min.js
│   ├── main.css
│   └── main.js
└── styles

我从 DockerHub 获得了 Dockerfile。它太大了,无法在此处发布,但完整版在这里。我认为可能相关的 Dockerfile 的最后几行是:

ENV GOPATH /go
ENV PATH $GOPATH/bin:/usr/local/go/bin:$PATH

RUN mkdir -p "$GOPATH/src" "$GOPATH/bin" && chmod -R 777 "$GOPATH"
WORKDIR $GOPATH

当我进入我的目录并输入时,docker build -t my-app .它会成功构建。当我输入 时docker run -d -p 80:80 url-shortener,它给了我一个字符串,我认为它是 ID。

但是当我这样做时docker ps,它不会显示进程正在运行。如果我这样做docker ps -a,它会显示该过程,但它会说,

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
6adc34244350        my-app       "/bin/sh"           6 minutes ago 
Exited (0) 6 minutes ago

如果这是一个非常愚蠢的问题,我深表歉意。我是一个完整的 Docker 菜鸟,可以使用一些指导。

标签: dockergo

解决方案


从您的docker ps输出中,您的图像被配置为仅运行一个 shell。由于您在没有任何输入的情况下将其作为后台进程运行,因此它处理了所有输入并成功退出(状态代码 0)。 docker logs 6adc34244350将向您显示它产生的输出(如果有)。

Docker 有一个关于编写和运行自定义镜像的优秀教程,值得一读。特别是,你不应该复制官方的golangDockerfile;您自己的 Dockerfile 可以从它开始,FROM golang:1.10它将继承该映像中的所有内容。您几乎肯定还想确保您有一个CMD在容器启动时运行您的应用程序的命令(默认情况下)。


推荐阅读