首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在容器中运行两次可执行文件

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

Stack Overflow用户
提问于 2018-06-21 19:07:45
回答 3查看 614关注 0票数 0

如何在码头容器中执行两次可执行文件?

例如,我需要运行我的应用程序两次,第一次是初始化一些东西,第二次是听环境变量中定义的给定端口。

来自shell的命令如下所示:

代码语言:javascript
复制
[j3d@gonzo test]$ kontrol -initial
[j3d@gongo test]$ kontrol
started... listening on port 6000...

下面是我的Dockerfile:

代码语言:javascript
复制
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"]

容器制造成功..。但是,当我启动它时,总是会收到以下错误消息:

代码语言:javascript
复制
kontrol    | standard_init_linux.go:190: exec user process caused "no such file or directory"

任何帮助都会很感激的。

编辑

感谢zero298帮助我解决了这个问题,下面是一个工作Dockerfile

代码语言:javascript
复制
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获取更多信息。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-06-21 19:40:50

我觉得你遇到的问题和你想的不一样。运行Dockerfile,然后执行:

代码语言:javascript
复制
docker build -t j3d .
docker run -it --rm --name j3d-test --entrypoint sh j3d

允许我在容器中运行自己的命令。

使用ls列出了PWD的内容:

代码语言:javascript
复制
-rwxr-xr-x    1 root     root       16.8M Jun 21 19:20 kontrol

一切看起来都很正常。但是,尝试自己运行时会生成以下错误:

代码语言:javascript
复制
sh: ./kontrol: not found

对我来说,这很可能类似于:Linux executable fails with “File not found” even though the file is there and in PATH

事实上,如果你:

  1. kontrol映像中复制已编译的builder可执行文件
  2. 使用复制的kontrol可执行文件docker run -it --rm -v $PWD:/mnt/go ubuntu sh运行ubuntu容器挂载目录
  3. 尝试运行kontrol

您将得到“正确”错误,该错误说明您没有正确设置键:

代码语言:javascript
复制
2018/06/21 19:56:57 cannot read public key file: open : no such file or directory

您的前进之路可能是找出您不能交叉编译的原因。

票数 1
EN

Stack Overflow用户

发布于 2018-06-21 19:26:45

如果在使用init标志运行kontrol时终止,则只需使用

代码语言:javascript
复制
RUN /opt/robotrader/kontrol -init
CMD ["./kontrol"]

如果它不终止,您将不得不找到另一种方法来架构您的appp。

票数 1
EN

Stack Overflow用户

发布于 2018-06-21 20:01:51

创建一个运行它两次的脚本:

例如在"startup.sh“中

代码语言:javascript
复制
#!/bin/bash

# Run kontrol twice
./kontrol -initial
./kontrol

然后将Dockerfile中的最后两行替换为:

代码语言:javascript
复制
COPY startup.sh .
CMD ["./startup.sh"]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50975933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档