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

标签 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了解更多信息。

最佳答案

我认为您遇到的问题与您认为的不同。运行 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 中执行图片
  • 运行 ubuntu 容器,将复制的 kontrol 挂载到目录可执行docker run -it --rm -v $PWD:/mnt/go ubuntu sh
  • 尝试运行kontrol

  • 您将收到“正确”错误,说明您没有正确设置 key :
    2018/06/21 19:56:57 cannot read public key file: open : no such file or directory
    

    你前进的道路可能是弄清楚为什么你不能交叉编译

    关于docker - 如何在容器中运行两次可执行文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50975933/

    相关文章:

    java - Docker:运行Oracle并执行脚本后启动Tomcat

    mysql - 为什么我的 docker-entrypoint-initdb.d 脚本(在 docker-compose.yml 中指定)没有被执行来初始化一个新的 MySQL 实例?

    docker - 从 dockerfile 运行 OCI CLI 命令

    docker - 在 CI/CD 管道实现中为不同租户动态管理 Dockerfile

    r - 对R中使用mxnet软件包的应用进行Docker化

    docker - 在 Dockerfile 和 docker-compose 中编写什么来传递本地包

    Docker - 没有名为 'celery_worker' 的模块

    docker - 如何通过docker加载psql?

    visual-studio - 找不到docker容器

    linux - Docker 容器中 GUI 应用的 X11 转发