【问题标题】:dockerfile simplest automationdockerfile 最简单的自动化
【发布时间】:2018-07-30 04:55:27
【问题描述】:

我正在学习 docker 并创建一个 Dockerfile 来用应用程序填充容器。 Step1是Dockerfile

FROM golang:alpine as builder

ADD /src/common $GOPATH/src/common
ADD /src/ins_signal_node $GOPATH/src/ins_signal_node
WORKDIR $GOPATH/src/ins_signal_node
RUN go build -o /go/bin/signal_server .

ADD /src/ins_full_node $GOPATH/src/ins_full_node
WORKDIR $GOPATH/src/ins_full_node
RUN go build -o /go/bin/full_node .

FROM alpine
COPY --from=builder /go/bin/signal_server     /go/bin/signal_server
COPY --from=builder /go/bin/full_node /go/bin/full_node
COPY run_test.sh /go/bin

这里没有问题 - 没关系。在此之后,我运行我的脚本来重建并运行这个容器并输入它的 bash - Step2:

#!/bin/bash
docker container rm -f full
docker image rm -f ss

docker build -t ss .
winpty docker run -it --name full ss

所以此刻我在容器控制台中。在编写脚本时,我运行了 2 个命令 - Step3

cd go/bin/
./run_test.sh

有效! 但。在第 2 步之后 - 当我在控制台中时 - 我想要第 3 步 - 运行启动脚本以实现自动化。因此,在步骤 1 的 Dockerfile 末尾,我添加了一行

CMD ["cd go/bin/ && ./run_test.sh"]

在我运行第 2 步之后 - 现在完全启动 - 我收到了错误消息:

docker:来自守护进程的错误响应:OCI 运行时创建失败:container_linux.go:348:启动容器进程导致“exec:\”cd go/bin/ && ./run_test.sh\”:stat cd go/bin/ && ./run_test .sh:没有这样的文件或目录”:未知。

如果我运行这个 CMD - cd go/bin/ && ./run_test.sh - 当我在容器的控制台中时手动运行 - 它可以工作! 所以我的问题 - 我的有什么不好的

CMD ["cd go/bin/ && ./run_test.sh"]

更新

好的。我现在尝试使用 ["/go/bin/run_test.sh"] 和 ["./go/bin/run_test.sh"] 并得到了

initializing…
/go/bin/run_test.sh: line 2: ./signal_server: not found
starting…
/go/bin/run_test.sh: line 10: ./full_node: not found
/go/bin/run_test.sh: line 9: ./full_node: not found
/go/bin/run_test.sh: line 8: ./full_node: not found
/go/bin/run_test.sh: line 7: ./full_node: not found

更新 2 所以在我的 Dockerfile 中我创建了

FROM alpine
COPY --from=builder /go/bin/signal_server /go/bin/signal_server
COPY --from=builder /go/bin/full_node /go/bin/full_node
COPY run_test.sh /go/bin
COPY entry_point.sh /
ENTRYPOINT ["./entry_point.sh"]

entry_point.sh - 在根目录中有 entry_point.sh。如果我使用 ENTRYPOINT - 它说

standard_init_linux.go:190: exec 用户进程导致“没有这样的文件或目录”

【问题讨论】:

    标签: linux docker


    【解决方案1】:

    在 Dockerfile 中使用 docker 入口点:

    使用以下命令创建 entrypoint.sh:

    #!/bin/bash
    set -e
    cd go/bin/
    ./run_test.sh
    exec "$@"
    

    在最后一行的 Dockerfile 中:

    ENTRYPOINT ["/entrypoint.sh"]
    

    【讨论】:

      【解决方案2】:

      只需将运行命令添加到您的入口点脚本:

      cd /go/bin \
      && ./run_test.sh
      

      【讨论】:

      • 好的。这是我在shebang之后唯一的一行。我得到 standard_init_linux.go:190: exec user process 导致“exec 格式错误”
      【解决方案3】:

      根据documentation,CMD 语法是

      CMD ["executable","param1","param2"] (exec form, this is the preferred form)
      CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
      CMD command param1 param2 (shell form)
      

      Docker 将您的复合命令视为可执行文件的名称,因为您在它周围使用了双引号。你可以很容易地解决这个问题,例如将所有命令放在一个脚本中,比如/bin/myscript.sh,然后你只需要CMD /bin/myscript.sh

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-09
        • 2013-05-22
        • 1970-01-01
        • 2011-06-10
        • 2020-07-19
        • 2013-05-12
        • 1970-01-01
        相关资源
        最近更新 更多