2016-10-03 232 views
1

我創造了圍棋的一個項目,我同時使用「github.com/docker/docker/client」和「github.com/docker/docker/api/types」的時候,但當我嘗試創建容器我得到以下錯誤:錯誤創建與golang搬運工引擎容器

ERROR: 2016/10/03 22:39:26 containers.go:84: error during connect: Post https://%2Fvar%2Frun%2Fdocker.sock/v1.23/containers/create : http: server gave HTTP response to HTTPS client

我不明白爲什麼發生這種情況,並使用新golang泊塢窗引擎(舊的「github.com/docker/後只發生engine-api「現在已棄用)。

的代碼沒有什麼複雜的,所以我不知道如果我失去了一些東西:

resp, err := cli.Pcli.ContainerCreate(context.Background(), initConfig(), nil, nil, "") 
    if err != nil { 
      return err 
    } 

這就是所謂的initConfig執行以下操作:

func initConfig() (config *container.Config) { 
    mount := map[string]struct{}{"/root/host": {}} 
    return &container.Config{Image: "leadis_image", Volumes: mount, Cmd: strslice.StrSlice{"/root/server.py"}, AttachStdout: true}} 

而且,這裏是我的dockerfile

FROM debian

MAINTAINER Leadis Journey

LABEL Description="This docker image is used to compile and execute user's program."

LABEL Version="0.1"

VOLUME /root/host/

RUN apt-get update && yes | apt-get upgrade

RUN yes | apt-get install gcc g++ python3 make

COPY container.py /root/server.py

編輯

只是試圖用一個簡單的程序

package main 

import (
     "fmt" 
     "os" 
     "io/ioutil" 
     "github.com/docker/docker/client" 
     "github.com/docker/docker/api/types" 
     "github.com/docker/docker/api/types/container" 
     "github.com/docker/docker/api/types/strslice" 
     "golang.org/x/net/context" 
) 


func initConfig() (config *container.Config) { 
     mount := map[string]struct{}{"/root/host": {}} 
     return &container.Config{Image: "leadis_image", Volumes: mount, Cmd: strslice.StrSlice{"/root/server.py"}, AttachStdout: true} 
} 

func main() { 
     client, _ := client.NewEnvClient() 


     cwd, _ := os.Getwd() 
     ctx, err := os.Open(cwd+"/Dockerfile.tar.gz") 
     if err != nil { 
       fmt.Println(err) 
       return 
     } 
     build, err := client.ImageBuild(context.Background(), ctx, types.ImageBuildOptions{Tags: []string{"leadis_image"}, Context: ctx, SuppressOutput: false}) 
     if err != nil { 
       fmt.Println(err) 
       return 
     } 

     b, _ := ioutil.ReadAll(build.Body) 
     fmt.Println(string(b)) 
     _, err = client.ContainerCreate(context.Background(), initConfig(), nil, nil, "") 
     if err != nil { 
       fmt.Println(err) 
     } 
} 

同dockerfile測試它,但我仍然得到同樣的錯誤:

error during connect: Post https://%2Fvar%2Frun%2Fdocker.sock/v1.23/containers/create : http: server gave HTTP response to HTTPS client

+0

看起來您的項目已啓用https,但您的本地docker守護程序仍然處於純http狀態。也許這個文檔有助於https://docs.docker.com/engine/security/https/ –

+0

你傳遞給你的docker實例的命令行選項是什麼? ('PS英法| grep的docker'在'/等/泊塢窗/ daemon.json'你得到一個'捲曲--unix插座標準響應/var/run/docker.sock HTTP什麼:/ V1? 0.23 /集裝箱/ JSON?所有= 1' – Matt

回答

0
client.NewEnvClient() 

我最後一次嘗試,這個API預計環境像DOCKER_HOST這樣的變量的語法與普通的docker客戶端不同。

client.go

// NewEnvClient initializes a new API client based on environment variables. 
// Use DOCKER_HOST to set the url to the docker server. 
// Use DOCKER_API_VERSION to set the version of the API to reach, leave empty for latest. 
// Use DOCKER_CERT_PATH to load the TLS certificates from. 
// Use DOCKER_TLS_VERIFY to enable or disable TLS verification, off by default. 

要使用此,你需要DOCKER_HOST進行設置/導出這些格式之一:

  1. UNIX:/// var/run中/泊塢窗。襪子
  2. http://localhost:2375
  3. https://localhost:2376