【问题标题】:Reflex golang with docker, docker-compose and makefile使用 docker、docker-compose 和 makefile 反射 golang
【发布时间】:2020-09-18 21:15:15
【问题描述】:

希望你们一切都好!

我读了很多关于这个问题的文章,但没有找到适合我的东西..

解释上下文: 我正在用 go 制作一个 rest api,但这里显示的代码是假代码,以提高可读性。 我将 docker 与 docker-compose 一起使用,他们构建了一个 dockerfile,该 dockerfile 是 CMD 一个 makefile,我对 dev env 的反射有问题。反射启动,但更改后不重新加载。 我可能错过了一些东西,我是 Go 和 Docker 的新手 :)

确定代码时间:

我的 docker-compose.yaml:

version: "3"
services:
  app:
    build: .
    ports:
      - "80:8000"
    volumes:
      - appsrc:/app
    environment:
      CODE_ENV: dev
    networks:
      - apbp-network

networks:
  apbp-network:
    driver: bridge
volumes:
  appsrc:

谁调用了我的 Dockerfile:

FROM golang:latest

WORKDIR /app

COPY . .

RUN make --no-print-directory install

CMD make --no-print-directory run

谁调用了我的 Makefile

GO_PROJECT_NAME := test

go_prep_build:
    @echo "\n....Preparing installation environment for $(GO_PROJECT_NAME)...."
    go get github.com/cespare/reflex

go_dep_install:
    @echo "\n....Installing dependencies for $(GO_PROJECT_NAME)...."
    go mod download

go_build:
    @echo "\n....Building $(GO_PROJECT_NAME)...."
    go build -o test ./cmd/test

go_run:
    @echo "\n....Running $(GO_PROJECT_NAME)...."
    ./test


# Project rules
install:
    $(MAKE) go_prep_build
    $(MAKE) go_dep_install
    $(MAKE) go_build

run:
    reflex --start-service -r '\.go$$' make restart


restart:
    @$(MAKE) go_build
    @$(MAKE) go_run

.PHONY: go_prep_build go_dep_install go_build go_run install run restart reflex

我的 ./cmd/test 文件:

package main

import (
    "fmt"
    "net/http"
)

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "hello world")
    })

    http.ListenAndServe(":8000", nil)
}

一切正常,只是我的 reflex 命令在更改后没有重新加载,例如将 hello world 更改为 hello world 2 不会重建。

我的输出:

app_1  | reflex --start-service -r '\.go$' make restart
app_1  | [00] Starting service
app_1  | [00] 
app_1  | [00] ....Building apbp....
app_1  | [00] go build -o test ./cmd/test
app_1  | [00] 
app_1  | [00] ....Running apbp....
app_1  | [00] ./test

我真的坚持下去了

感谢阅读,如果您需要更多信息,请咨询我:)

【问题讨论】:

  • 您可能会发现使用实际的本地开发环境比尝试说服 Docker 模拟一个更容易。让你的 Dockerfile RUN make install,然后让它的默认命令是启动构建的应用程序CMD ./test,并从 Dockerfile 中删除 volumes:
  • 嗨,大卫,感谢您的宝贵时间!对不起,但我不明白你想解释什么。我的代码比我的真实代码更简单,我有多个容器和多个构建,以便像迁移等一样运行。但是是的,没有码头工人的反射工作。你能解释一下你想说什么吗?对不起,我真的很陌生
  • 查看这个 repo github.com/acim/go-reflex 并检查他们的重启命令。是-sr '\.go$' -- /usr/local/bin/build.sh
  • 感谢 mh-cbon,但我已经读过了。 -sr '\.go$' -- /usr/local/bin/build.sh /usr/local/bin/build.sh 部分只是当反射看到变化时运行的命令。但在我的情况下,反射没有看到变化,我的命令只是一个 makefile 命令。也许我错了,这只是我阅读文档的方式..
  • 只是一个鼓励你的评论:我只使用本地 Docker 开发环境(安装属于 90 年代的东西!)我在添加 Go API 时遇到问题,你的问题/答案为我解决了这个问题.谢谢。

标签: docker go makefile docker-compose dockerfile


【解决方案1】:

好的,只是我的音量阻止了重新加载,但我不明白为什么,如果有人能解释一下,欢迎!

我只是将 docker-compose.yaml 更改为:

version: "3"
services:
  app:
    build: .
    ports:
      - "80:8000"
    volumes:
      - .:/app
    environment:
      CODE_ENV: dev
    networks:
      - apbp-network

networks:
  apbp-network:
    driver: bridge

感谢您的回复和时间!

【讨论】:

  • 原始表单是在named volume 中复制您的应用程序代码。第一次运行时,代码会从映像复制到卷中;在以后的运行中,卷中的(旧)内容将替换图像中的内容。除了初始映像构建之外,没有任何东西与您的主机文件系统有任何联系。
  • Ohhhhh 说清楚,好吧,我误解了那部分,好吧,现在是合理的逻辑!谢谢大卫!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-22
  • 1970-01-01
  • 2019-11-22
  • 1970-01-01
  • 2019-12-25
相关资源
最近更新 更多