如何在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
构建-有关更多信息,请参见this post。
答案 0 :(得分:1)
如果kontrol在使用init标志运行时终止,那么您应该使用
RUN /opt/robotrader/kontrol -init
CMD ["./kontrol"]
如果它没有终止,您将不得不寻找另一种方法来构建您的appp。
答案 1 :(得分:1)
我认为您遇到的问题与您认为的不同。运行您的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 executable fails with “File not found” even though the file is there and in 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
您的前进之路很可能是弄清楚为什么您不能交叉编译
答案 2 :(得分:1)
创建一个运行两次的脚本:
例如在“ startup.sh”中
#!/bin/bash
# Run kontrol twice
./kontrol -initial
./kontrol
然后将Dockerfile中的最后两行替换为:
COPY startup.sh .
CMD ["./startup.sh"]