DRYな備忘録

Don't Repeat Yourself.

GoのコードからDockerコンテナへのディスクボリュームのマウントを実装する

前々回、前回

で、GoのコードからDockerイメージのpullとDockerコンテナのrunを実装できたので、実践的なアプリケーションをつくっていきたいのだけれど、今回はdocker runにおける--volumeの指定がしたい。

実行するDockerイメージのサンプル

Dockerfile

FROM centos

ADD main.sh /bin/

ENTRYPOINT main.sh

main.sh

#!/bin/sh

dest="copy_`date`.txt"
cat /var/data/foo.txt > /var/data/${dest}

docker build . -t foo としてfooというtagのimageをつくる。

実行するGoのコード

   cc := &container.Config{
        Image: "foo",
        // Volumes: map[string]struct{}{"/var/data": struct{}{}},
        // これ要らんっぽいな... 🤔
    }
    hc := &container.HostConfig{
        // これが味噌
        Mounts: []mount.Mount{
            mount.Mount{
                Type:   mount.TypeBind,
                Source: "/Users/otiai10/tmp/hoge",
                Target: "/var/data",
            },
        },
        AutoRemove: true,
    }
    nc := &network.NetworkingConfig{}

    // あとは前回、前々回とおなじです。
    body, err := c.ContainerCreate(ctx, cc, hc, nc, "bar")
    if err != nil {
        panic(fmt.Errorf("ContainerCreate: %v", err))
    }
    fmt.Printf("Created Container:\n%+v\n", body)

    if err := c.ContainerStart(ctx, body.ID, types.ContainerStartOptions{}); err != nil {
        panic(fmt.Errorf("ContainerStart: %v", err))
    }

確認

% ls -l ~/tmp/hoge
total 8
-rw-r--r--  1 otiai10  staff  16  5 29 16:48 foo.txt
% go run main.go
Created Container:
{ID:e2b6e7aa7251f13d8e823dc4a4dddb327b3863e9632211698126b46d5975e724 Warnings:[]}
List of containers
 - e2b6e7aa7251f13d8e823dc4a4dddb327b3863e9632211698126b46d5975e724 (foo)
% ls -l ~/tmp/hoge
total 16
-rw-r--r--  1 otiai10  staff  16  5 30 11:59 copy_Tue May 30 02:59:06 UTC 2017.txt
-rw-r--r--  1 otiai10  staff  16  5 29 16:48 foo.txt
%

無事、ホスト(厳密にはGoのコードを実行する環境ではなく、このclient.Clientが向いてるdockerホストマシン)の/Uers/otiai10/tmp/hogeが、コンテナから見たときの/var/dataにマウントされていることが確認された。

参考と道のり

f:id:otiai10:20170530120709p:plain

雑感

  • ドキュメント散在してるなー、って思った
  • 急がず焦らず、じっくり読まないといけない

DRYな備忘録として

Docker

Docker

Dockerエキスパート養成読本[活用の基礎と実践ノウハウ満載!] (Software Design plus)

Dockerエキスパート養成読本[活用の基礎と実践ノウハウ満載!] (Software Design plus)