代码之家  ›  专栏  ›  技术社区  ›  Emptyless

将RUN更改为CMD将停止容器的工作

  •  1
  • Emptyless  · 技术社区  · 6 年前

    我正在尝试将Glide添加到我的Golang项目中,但我的容器无法正常工作。我目前正在使用:

    # create image from the official Go image
    FROM golang:alpine
    
    RUN apk add --update tzdata bash wget curl git;
    
    # Create binary directory, install glide and fresh
    RUN mkdir -p $$GOPATH/bin
    RUN curl https://glide.sh/get | sh
    RUN go get github.com/pilu/fresh
    
    # define work directory
    ADD . /go
    WORKDIR /go/src
    
    RUN glide update && fresh -c ../runner.conf main.go
    

    根据 @craigchilds94 的帖子。当我跑步时

    docker build -t docker_test .
    

    一切正常。但是,当我将最后一行从 RUN glide ... CMD glide ... 然后用以下命令启动容器:

    docker run -it --volume=$(PWD):/go docker_test
    

    这给了我一个错误: /bin/sh: glide: not found .忽略 glide update 并直接以同样的方式开始新的结果: /bin/sh fresh: not found.

    最终目标是能够装载一个卷(用于实时重新加载),并能够在docker compose中使用它,因此我希望能够构建它,但我不知道到底出了什么问题。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Abdullah Al Maruf - Tuhin    6 年前

    这可能适合您的目的:

    # create image from the official Go image
    FROM golang:alpine
    
    RUN apk add --update tzdata bash wget curl git;
    
    # Create binary directory, install glide and fresh
    RUN go get -u github.com/Masterminds/glide
    RUN go get -u github.com/pilu/fresh
    
    # define work directory
    ADD . /go
    WORKDIR /go/src
    
    
    ENTRYPOINT $GOPATH/bin/fresh -c /go/src/runner.conf /go/src/main.go
    

    据我所知,在安装glide之后,您不需要运行glide更新。您可以查看我编写的使用glide的Dockerfile: https://github.com/timogoosen/dockerfiles/blob/master/btcd/Dockerfile 这是REAMDE: https://github.com/timogoosen/dockerfiles/blob/master/btcd/README.md

    本文很好地概述了CMD、RUN和entrypoint之间的区别: http://goinbigdata.com/docker-run-vs-cmd-vs-entrypoint/ 引用文章: RUN在新层中执行命令并创建新映像。例如,它通常用于安装软件包 在我看来,安装包和库可以通过RUN来完成。 要启动二进制文件或命令,我建议使用ENTRYPOINT,请参阅:“ENTRYPOINT配置一个将作为可执行文件运行的容器。”您也可以使用CMD来运行:

    $GOPATH/bin/fresh -c /go/src/runner.conf /go/src/main.go
    

    像这样的东西可能有用,我没有测试这个部分:

    CMD ["$GOPATH/bin/fresh", "-c", "/go/src/runner.conf /go/src/main.go"]