由于Docker Desktop for Windows无法实现Go(Air)的热重载,所以选择了watchexec来替代
首先
我在使用Docker Desktop for Windows和Air库进行Go语言开发时遇到了一个问题,即代码更改未在容器中自动反映。我在Web和X上搜索后发现很多人都遇到了类似的问题,所以我想共享一个解决方案。(在Mac上使用DockerDesktop,可以通过Air进行热加载)
結論 – 结论
通过使用watchexec来替代Air,问题得到了解决。
以下是此工具的链接:
https://github.com/watchexec/watchexec
大概来说,这是一个用Rust开发的文件监视工具,可以在文件更新时执行任意命令。
现有代码及其问题。
以前的设定如下所示。(稍有删减)
文件夹结构
current_directory
|
├── docker/
| └── app/
| └── Dockerfile
├── src/
| └── main.go
|
└── docker-compose.yml
Dockerfile-Docker 配置文件
FROM golang:1.18.3-alpine
WORKDIR /app
COPY ./src .
RUN apk upgrade --update && \
apk --no-cache add git && \
apk upgrade git
RUN go install github.com/cosmtrek/air@latest
RUN go mod download
CMD ["air", "-c", ".air.toml"]
docker-compose.yml可以被简化为Docker组合文件。
version: '3.9'
services:
app:
container_name: go_app
build:
context: .
dockerfile: ./docker/app/Dockerfile
ports:
- "8080:8080"
volumes:
- ./src/:/app
tty: true
environment:
# 環境変数の設定
启动命令如下所示。
使用Docker Compose构建
使用Docker Compose运行–rm app go mod tidy
使用Docker Compose启动-d
然而,在此设置中,Docker Desktop for Windows环境下的热加载功能无法运行。
解决方案:使用watchexec
为了解决问题,我使用watchexec创建了一个新的Dockerfile。
Dockerfile 的中文近义表达:
容器文件
FROM golang:1.18.3-alpine
WORKDIR /app
COPY ./src .
RUN apk upgrade --update && \
apk --no-cache add git && \
apk upgrade git
RUN go mod download
# watchexec のインストール
RUN apk add --no-cache -X http://dl-cdn.alpinelinux.org/alpine/edge/community watchexec
# ホットリロード用のコマンドを設定
CMD ["watchexec", "-w", ".", "--force-poll", "100", "-r", "go", "run", "main.go"]
行动的原理
watchexec 是一个监控文件系统变化的工具,当检测到变化时,会执行指定的命令(在这个例子中是 go run main.go)。
通过使用 –force-poll 选项,可以定期轮询文件系统,以解决在 Docker Desktop for Windows 上文件系统通知的延迟或故障问题。
确认热重载
应用此更改后,使用以下命令构建和启动容器。
使用Docker Compose进行构建:
1. 构建镜像:docker compose build
2. 运行并清理模块依赖:docker compose run –rm app go mod tidy
3. 启动容器并强制重新创建:docker compose up -d –force-recreate
当你对本地源代码进行更改时,watchexec 会检测到并自动重新启动 Golang 应用程序。这样一来,更改将立即生效,使得在 DockerDesktop for Windows 上的开发流程更加顺畅。
总结
在使用Docker Desktop for Windows进行Go语言开发时,为实现热重载,使用watchexec等工具是有效的。
通过使用 watchexec 工具,可以提高 Golang 应用程序的开发效率,并且代码的更改可以立即反映,在开发周期上实现更快速的迭代。
我建议其他面临类似问题的开发者也尝试这种方法。顺便一提,如果你能给个 ❤ ,这将非常鼓舞我的笑容。
另外,由于起初只在DockerDesktop for Mac上开发Golang应用程序,所以没有意识到在DockerDesktop for Windows上,由于文件系统的差异,有些工具可能无法正常工作,经过调查和研究,我学到了很多。