Go言語からDockerfileを使ってコンテナを作成するコードや情報があまり見受けられなかったのでまとめておきます。参考にしたサイトは下記
https://godoc.org/github.com/docker/docker/client
http://blog.hawksnowlog.cf/2017/02/control-docker-with-golang.html
#サンプルコード
package main
import (
"context"
"os"
"github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/container"
"github.com/docker/docker/client"
)
func main() {
dockerBuildContext, err := os.Open("images.tar")
ctx := context.Background()
defaultHeaders := map[string]string{"User-Agent": "engine-api-cli-1.0"}
cli, err := client.NewClient("unix:///var/run/docker.sock", "v1.24", nil, defaultHeaders)
if err != nil {
panic(err)
}
defer dockerBuildContext.Close()
buildOptions := types.ImageBuildOptions{
Dockerfile: "Dockerfile",
SuppressOutput: true,
PullParent: true,
Tags: []string{"hogehoge"},
}
buildResponse, err := cli.ImageBuild(ctx, dockerBuildContext, buildOptions)
if err != nil {
panic(err)
}
defer buildResponse.Body.Close()
resp, err := cli.ContainerCreate(ctx,
&container.Config{
Image: "hogehoge",
}, nil, nil, "")
if err != nil {
panic(err)
}
if err := cli.ContainerStart(ctx, resp.ID, types.ContainerStartOptions{}); err != nil {
panic(err)
}
}
このコードを実行して、下記エラーが出力された。
panic: Error response from daemon: {"message":"Cannot locate specified Dockerfile: Dockerfile"}
よくよく、tarファイルの中身を見てみると。。。
$tar tf images.tar
images/
images/Dockerfile
imagesフォルダの下にDockerfileがあることが原因だったようで、以下のように直下にするとエラーなく動作した。
tar tf images.tar.gz
Dockerfile
最後に
ImageBuildOptionsのSuppressOutputをtrueにしておかないとイメージが作成完了していないのに、次のコードを実行しようとする。trueにしておけば動作するのだが、気持ち悪い。。これについてはまた何か分かったらまとめておきます。