docker - 在 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 菜鸟,可以使用一些指导。
解决方案
从您的docker ps
输出中,您的图像被配置为仅运行一个 shell。由于您在没有任何输入的情况下将其作为后台进程运行,因此它处理了所有输入并成功退出(状态代码 0)。 docker logs 6adc34244350
将向您显示它产生的输出(如果有)。
Docker 有一个关于编写和运行自定义镜像的优秀教程,值得一读。特别是,你不应该复制官方的golang
Dockerfile;您自己的 Dockerfile 可以从它开始,FROM golang:1.10
它将继承该映像中的所有内容。您几乎肯定还想确保您有一个CMD
在容器启动时运行您的应用程序的命令(默认情况下)。
推荐阅读
- android - RecyclerView - 如何使用?
- django - socket.gaierror: [Errno 11004] getaddrinfo failed,django
- mysql - 带有 IF 语句的 MySQL 触发器
- asp.net-web-api - 在 Android 上使用 Restsharp 连接到 localhost
- racket - 分别计算每个子列表的匹配数
- javascript - 当屏幕宽度小于或大于
- java - 我的应用程序不断崩溃。我正在尝试像 instagram 一样做背景动画
- c++ - struct 是否比嵌入式系统中的类具有更好的性能
- python - Django:ModelForm 的 kwargs
- javascript - 一个组件中的表单被其他组件提交