Docker Service Update Error: EOF
Docker Service Update Error: EOF
我们有一个 GO 应用程序,它监听代码回购更改和 Redis 消息,以便在 Docker Swarm 环境中应用 CD。该应用程序最近更新为使用 github.com/docker/docker
v1.13.1 客户端代码。它适用于我的 mac,它运行 Docker v1.13.1。当我将此代码部署到开发服务器 运行 Ubuntu 和 Docker v1.12.6 时,我在尝试调用 cli.ServiceUpdate(..)
时收到 "EOF" 错误。据我所知,CLI 客户端是向后兼容的(直到 v1.10.x 或其他)。查看代码和截图时,两者之间的联系是 "An error occurred while updating a service".
的日志消息
事件认为我们使用的是 v1.13.1 版本的 golang 库,我们在客户端初始化中指定 api 版本 v1.24:
func createClient() {
if cli == nil {
defaultHeaders := map[string]string{"User-Agent": "engine-api-cli-1.0"}
var err error
cli, err = client.NewClient("unix:///var/run/docker.sock", "v1.24", nil, defaultHeaders)
if err != nil {
panic(err)
}
}
}
这是有问题的代码:
func updateService(s configuration.Service, version string) {
createClient()
ctx := context.Background()
service, _, err := cli.ServiceInspectWithRaw(ctx, configuration.ServiceName(s))
if err != nil {
fmt.Println("could not find service", err)
return
}
serviceSpec := createServiceSpec(s, version)
encodedRegistryAuth := createEncodedRegistryAuth()
var resp types.ServiceUpdateResponse
resp, err = cli.ServiceUpdate(ctx, service.ID, service.Version, serviceSpec, types.ServiceUpdateOptions{EncodedRegistryAuth: encodedRegistryAuth})
if err != nil {
fmt.Println("An error occurred while updating a service: ", s.Service, "; ", err)
} else {
message := "SERVICE UPDATE - " + s.Service + "_" + s.Channel + " >> " + envName + ":" + s.Service + ":" + version
connections.SlackMessage(message)
connections.NewRelicDeploy(version, message)
connections.GrafanaDeploy(version, message)
fmt.Println("Updated service", s.Service, "and waiting", s.UpdateDelay)
fmt.Println("Warnings from service update", resp.Warnings)
}
}
这是系统日志中发生的事情的屏幕截图:
这是 docker info
的输出:
Client:
Version: 1.12.6
API version: 1.24
Go version: go1.6.4
Git commit: 78d1802
Built: Tue Jan 10 20:40:44 2017
OS/Arch: linux/amd64
Experimental: true
Server:
Version: 1.12.6
API version: 1.24
Go version: go1.6.4
Git commit: 78d1802
Built: Tue Jan 10 20:40:44 2017
OS/Arch: linux/amd64
Experimental: true
关于我可能做错了什么有什么想法吗?
原来是某处的侥幸。我们通过停止 docker 守护程序、删除 /var/lib/docker 并重新启动守护程序来重建 swarm。之后错误不再发生。
我们有一个 GO 应用程序,它监听代码回购更改和 Redis 消息,以便在 Docker Swarm 环境中应用 CD。该应用程序最近更新为使用 github.com/docker/docker
v1.13.1 客户端代码。它适用于我的 mac,它运行 Docker v1.13.1。当我将此代码部署到开发服务器 运行 Ubuntu 和 Docker v1.12.6 时,我在尝试调用 cli.ServiceUpdate(..)
时收到 "EOF" 错误。据我所知,CLI 客户端是向后兼容的(直到 v1.10.x 或其他)。查看代码和截图时,两者之间的联系是 "An error occurred while updating a service".
事件认为我们使用的是 v1.13.1 版本的 golang 库,我们在客户端初始化中指定 api 版本 v1.24:
func createClient() {
if cli == nil {
defaultHeaders := map[string]string{"User-Agent": "engine-api-cli-1.0"}
var err error
cli, err = client.NewClient("unix:///var/run/docker.sock", "v1.24", nil, defaultHeaders)
if err != nil {
panic(err)
}
}
}
这是有问题的代码:
func updateService(s configuration.Service, version string) {
createClient()
ctx := context.Background()
service, _, err := cli.ServiceInspectWithRaw(ctx, configuration.ServiceName(s))
if err != nil {
fmt.Println("could not find service", err)
return
}
serviceSpec := createServiceSpec(s, version)
encodedRegistryAuth := createEncodedRegistryAuth()
var resp types.ServiceUpdateResponse
resp, err = cli.ServiceUpdate(ctx, service.ID, service.Version, serviceSpec, types.ServiceUpdateOptions{EncodedRegistryAuth: encodedRegistryAuth})
if err != nil {
fmt.Println("An error occurred while updating a service: ", s.Service, "; ", err)
} else {
message := "SERVICE UPDATE - " + s.Service + "_" + s.Channel + " >> " + envName + ":" + s.Service + ":" + version
connections.SlackMessage(message)
connections.NewRelicDeploy(version, message)
connections.GrafanaDeploy(version, message)
fmt.Println("Updated service", s.Service, "and waiting", s.UpdateDelay)
fmt.Println("Warnings from service update", resp.Warnings)
}
}
这是系统日志中发生的事情的屏幕截图:
这是 docker info
的输出:
Client:
Version: 1.12.6
API version: 1.24
Go version: go1.6.4
Git commit: 78d1802
Built: Tue Jan 10 20:40:44 2017
OS/Arch: linux/amd64
Experimental: true
Server:
Version: 1.12.6
API version: 1.24
Go version: go1.6.4
Git commit: 78d1802
Built: Tue Jan 10 20:40:44 2017
OS/Arch: linux/amd64
Experimental: true
关于我可能做错了什么有什么想法吗?
原来是某处的侥幸。我们通过停止 docker 守护程序、删除 /var/lib/docker 并重新启动守护程序来重建 swarm。之后错误不再发生。