插件窝 干货文章 Go语言如何实现Swoole代码修改后自动重启Docker容器?

Go语言如何实现Swoole代码修改后自动重启Docker容器?

Docker err fsnotify watcher 509    来源:    2025-03-15

在Go语言中实现Swoole代码修改后自动重启Docker容器的功能,可以通过以下步骤来实现:

1. 监控文件变化

首先,你需要监控Swoole代码文件的变化。可以使用Go的fsnotify库来监控文件系统的变化。

package main

import (
    "log"
    "github.com/fsnotify/fsnotify"
)

func main() {
    watcher, err := fsnotify.NewWatcher()
    if err != nil {
        log.Fatal(err)
    }
    defer watcher.Close()

    done := make(chan bool)
    go func() {
        for {
            select {
            case event, ok := <-watcher.Events:
                if !ok {
                    return
                }
                if event.Op&fsnotify.Write == fsnotify.Write {
                    log.Println("Modified file:", event.Name)
                    // 在这里触发Docker容器的重启
                    restartDockerContainer()
                }
            case err, ok := <-watcher.Errors:
                if !ok {
                    return
                }
                log.Println("Error:", err)
            }
        }
    }()

    err = watcher.Add("/path/to/swoole/code")
    if err != nil {
        log.Fatal(err)
    }
    <-done
}

2. 重启Docker容器

当检测到文件变化时,你需要重启Docker容器。可以使用Go的os/exec包来执行Docker命令。

func restartDockerContainer() {
    cmd := exec.Command("docker", "restart", "your_container_name")
    err := cmd.Run()
    if err != nil {
        log.Println("Error restarting Docker container:", err)
    } else {
        log.Println("Docker container restarted successfully")
    }
}

3. 整合代码

将上述两部分代码整合在一起,完整的Go程序如下:

package main

import (
    "log"
    "os/exec"
    "github.com/fsnotify/fsnotify"
)

func restartDockerContainer() {
    cmd := exec.Command("docker", "restart", "your_container_name")
    err := cmd.Run()
    if err != nil {
        log.Println("Error restarting Docker container:", err)
    } else {
        log.Println("Docker container restarted successfully")
    }
}

func main() {
    watcher, err := fsnotify.NewWatcher()
    if err != nil {
        log.Fatal(err)
    }
    defer watcher.Close()

    done := make(chan bool)
    go func() {
        for {
            select {
            case event, ok := <-watcher.Events:
                if !ok {
                    return
                }
                if event.Op&fsnotify.Write == fsnotify.Write {
                    log.Println("Modified file:", event.Name)
                    restartDockerContainer()
                }
            case err, ok := <-watcher.Errors:
                if !ok {
                    return
                }
                log.Println("Error:", err)
            }
        }
    }()

    err = watcher.Add("/path/to/swoole/code")
    if err != nil {
        log.Fatal(err)
    }
    <-done
}

4. 运行程序

将上述代码保存为main.go,然后运行:

go run main.go

5. 注意事项

  • 确保Docker容器名称正确。
  • 确保Go程序有权限执行Docker命令。
  • 监控的路径/path/to/swoole/code需要替换为实际的Swoole代码路径。

通过这种方式,当Swoole代码文件发生变化时,Go程序会自动检测到并重启Docker容器。