如何在Docker容器中执行两次可执行文件?
例如,我需要运行我的应用程序两次,第一次是初始化一些东西,第二次是侦听环境变量中定义的给定端口。
来自shell的命令如下所示:
[j3d@gonzo test]$ kontrol -initial
[j3d@gongo test]$ kontrol
started... listening on port 6000...
以下是我的Dockerfile:
FROM golang:1.8.3 as builder
RUN go get -u github.com/golang/dep/cmd/dep
RUN go get -d github.com/koding/kite
WORKDIR ${GOPATH}/src/github.com/koding/kite
RUN ${GOPATH}/bin/dep ensure
RUN go install ./kontrol/kontrol
RUN mv ${GOPATH}/bin/kontrol /tmp
FROM busybox
ENV APP_HOME /opt/robotrader
RUN mkdir -p ${APP_HOME}
WORKDIR ${APP_HOME}
COPY --from=builder /tmp/kontrol .
ENTRYPOINT ["./kontrol", "-initial"]
CMD ["./kontrol"]
容器构建成功...但是当我启动它时,我总是收到以下错误消息:
kontrol | standard_init_linux.go:190: exec user process caused "no such file or directory"
任何帮助将非常感激。
编辑
感谢zero298帮助我解决了这个问题,下面是一个可行的方法Dockerfile
:
FROM golang:1.8.3 as builder
RUN go get -u github.com/golang/dep/cmd/dep
RUN go get -d github.com/koding/kite
WORKDIR ${GOPATH}/src/github.com/koding/kite
RUN ${GOPATH}/bin/dep ensure
RUN CGO_ENABLED=0 go install ./kontrol/kontrol
RUN mv ${GOPATH}/bin/kontrol /tmp
FROM busybox
ENV APP_HOME /opt/robotrader
RUN mkdir -p ${APP_HOME}
WORKDIR ${APP_HOME}
COPY --from=builder /tmp/kontrol .
ENTRYPOINT ["./kontrol", "-initial"]
CMD ["./kontrol"]
该go
应用程序应使用以下版本构建CGO_ENABLED=0
-有关更多信息,请参见此帖子。
我认为您遇到的问题与您认为的不同。运行您的Dockerfile,然后执行:
docker build -t j3d .
docker run -it --rm --name j3d-test --entrypoint sh j3d
允许我从容器中运行自己的命令。
使用ls
列出了PWD内容:
-rwxr-xr-x 1 root root 16.8M Jun 21 19:20 kontrol
一切似乎正常。但是,尝试自己运行将产生以下错误:
sh: ./kontrol: not found
对我来说,这可能类似于:Linux可执行文件失败,显示“找不到文件”,即使该文件位于PATH中也是如此。
实际上,如果您改为:
kontrol
可执行文件复制出builder
映像kontrol
可执行文件挂载目录docker run -it --rm -v $PWD:/mnt/go ubuntu sh
kontrol
您将收到“正确”错误,提示您尚未正确设置密钥:
2018/06/21 19:56:57 cannot read public key file: open : no such file or directory
您的前进之路可能是弄清楚为什么您不能交叉编译
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句