如何在容器中运行两次可执行文件

时间:2018-06-21 19:07:45

标签: docker dockerfile

如何在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

3 个答案:

答案 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

实际上,如果您改为:

  1. kontrol映像中复制已编译的builder可执行文件
  2. 运行ubuntu容器,以复制的kontrol可执行文件docker run -it --rm -v $PWD:/mnt/go ubuntu sh的形式安装目录
  3. 尝试运行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"]