Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
开发将在Docker容器中运行的Golang应用程序的最佳实践/方法_Docker_Go_Development Environment - Fatal编程技术网

开发将在Docker容器中运行的Golang应用程序的最佳实践/方法

开发将在Docker容器中运行的Golang应用程序的最佳实践/方法,docker,go,development-environment,Docker,Go,Development Environment,基本上是标题所说的。。。是否有最佳实践或有效方法来开发将被停靠的Golang应用程序?我知道您可以装载指向源代码的卷,对于PHP等不需要编译代码的语言,它非常有用。但对于围棋来说,和Docker一起发展似乎是一件痛苦的事情,因为我想你们几乎只有两个选择 首先是有一个Dockerfile,它只是一个onbuild文件,所以当容器运行时,它会启动go应用程序,因此每次更改(无论大小)都必须构建一个新的映像。或者,您确实将源代码目录装载到容器目录,然后附加到容器本身,并像正常情况下一样自己进行手动构建

基本上是标题所说的。。。是否有最佳实践或有效方法来开发将被停靠的Golang应用程序?我知道您可以装载指向源代码的卷,对于PHP等不需要编译代码的语言,它非常有用。但对于围棋来说,和Docker一起发展似乎是一件痛苦的事情,因为我想你们几乎只有两个选择

首先是有一个Dockerfile,它只是一个onbuild文件,所以当容器运行时,它会启动go应用程序,因此每次更改(无论大小)都必须构建一个新的映像。或者,您确实将源代码目录装载到容器目录,然后附加到容器本身,并像正常情况下一样自己进行手动构建/运行


除非你不在docker容器中开发Go应用程序,否则这两种方式是我看到它发生的唯一方式。只需按常规进行开发,然后使用scratch-image方法,将Go预构建为二进制文件,然后在准备运行它时将其复制到容器中。我想这可能是最好的方法,但我想向更多的专业人士询问这个问题,或许可以得到一些关于这个话题的反馈。

不确定这是最好的做法,但我的方法是这样的

  • Makefile是必需的
  • 使用我的本地机器和go工具进行小迭代
  • 使用基于golang:{1.X,latest},mount code目录的专用构建容器来构建发行版,主要是为了确保我的代码将在CI上正确构建。(提示,这里是我发布版本的标准go build命令:
    CGO_ENABLED=0 GOGC=off go build-ldflags-s-w
  • 测试代码
  • 然后从头开始使用
    构建发布容器(复制bin+入口点)
  • 将图像推送到注册表
  • 步骤3至6是CI的任务

    重要注意事项:由于新的多级构建功能,这一点正在改变:,不再使用构建容器和发布容器

    Build容器和release容器将合并到一个多阶段构建中,因此一个Dockerfile具有(不确定正确的语法,但您会明白):


    据我从您的问题中了解,您希望有一个运行的容器来开发golang应用程序。同样的事情也可以在主机上完成。但好的是,如果你可以构建这样的应用程序,那么这将被视为云平台即服务(PaaS)。 容器的基本要求是:Ubuntu映像和其他包,如编辑器、golang编译器等

    我建议看看docker开发环境。

    docker开发环境在容器中运行,文件从一个主机目录装入。容器映像是从Ubuntu scratch映像构建的,并添加了编译docker源代码所需的必需包

    我希望你几乎得到了你想要的东西。

    最近,我一直在使用
    作为我所有项目的基础。该模板附带一个Makefile,用于在Docker中构建/测试应用程序

    为什么这会被否决?回答如果你有一个,不要粗鲁。这是一个合理的问题。不是每个人都知道关于新技术的一切。理想情况下,这就是它的要点。试图使开发人员和环境人员之间的开发变得相似,Docker就是这样吹捧的。到目前为止,我只使用过PHP和Docker,所以使用Docker容器进行开发是相当简单的。我想像Go这样的编译语言会有点烦人,这就是我为什么要问的原因。但我可能对你的回答有点困惑。您的答案是否更倾向于拥有一个您可以在其中完成所有工作的开发环境,而不仅仅是一个项目?我喜欢您的方法,而且它似乎是最快的方法。在每次源代码更改上构建新映像只会占用太多的开发时间。因此,使用主机开发大部分内容,然后在Docker中测试里程碑是有意义的。而且,多阶段构建看起来非常不错
    FROM golang:latest as build
    WORKDIR /go/src/myrepos/myproject
    RUN go build -o mybin
    
    FROM scratch
    COPY --from=build /go/src/myrepos/myproject/mybin /usr/local/bin/mybin
    ENTRYPOINT [ "/usr/local/bin/mybin" ]