Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Defining a mount point for volumes in GoLang Docker SDK

Tags:

docker

go

I am currently trying to create a Docker container using the official GoLang Docker SDK and am trying to mount a volume from my localhost to the docker container.

vol := map[string]struct{}{"/pathInDocker":{}}

// This was prepared using example at:
//https://docs.docker.com/develop/sdk/examples/#run-a-container
res, err := cli.ContainerCreate(ctx, &container.Config{
    Image: testImageName,
    Volumes: vol,
    Cmd: []string{"ls", "/"},
}, nil, nil, "")

This works at creating the container and adding the "/pathInDocker" to the docker container, however, I cannot figure out how to add the mount point for the localhost.

I have tried the following possible values for the vol variable

vol := map[string]struct{}{"localPath:/pathInDocker":{}}
vol := map[string]struct{}{"\"localPath\":\"/pathInDocker\"":{}}

And for each of these the resulting docker container attempts to mount the map key as the folder in docker with not mount point for localhost.

I've dug through the docs and the only line I can seem to find talking about how to configure volumes at all is this one:

Volumes         map[string]struct{} // List of volumes (mounts) used for the container

So my question is how to configure this so it mounts a local folder to the volume?

like image 948
Dragonman117 Avatar asked Jan 26 '18 22:01

Dragonman117


People also ask

Where are Docker volumes mounted?

Volumes are stored in a part of the host filesystem which is managed by Docker ( /var/lib/docker/volumes/ on Linux).

Can you mount a Docker volume on the host?

You can mount host volumes by using the -v flag and specifying the name of the host directory. Everything within the host directory is then available in the container. What's more, all the data generated inside the container and placed in the data volume is safely stored on the host directory.

What is bind mount a volume in Docker?

Bind mounts have been around since the early days of Docker. Bind mounts have limited functionality compared to volumes. When you use a bind mount, a file or directory on the host machine is mounted into a container. The file or directory is referenced by its absolute path on the host machine.


Video Answer


2 Answers

If you want to use bind mounts, you need to provide your mount information in HostConfig.

res, err := client.ContainerCreate(
    ctx,
    &container.Config{
        Image: "nginx",
        Cmd:   []string{"ls", "/"},
    },
    &container.HostConfig{
        Mounts: []mount.Mount{
            {
                Type:   mount.TypeBind,
                Source: "/localPath",
                Target: "/pathInDocker",
            },
        },
    },
    nil,
    "",
)

And if you want to use volume, 1st you need to create a volume with mount path, then you need to use this volume name as Source.

like image 62
Shahriar Avatar answered Oct 09 '22 10:10

Shahriar


The accepted answer worked great for directories, but it did not work for single files. It ends up getting mounting the file as a directory inside the container even if the file exists on the host. Inspecting how it works in the Docker CLI, it uses the Binds instead of Mounts and then the Mounts ends up getting automatically populated. This is how it looks in the Go code to mount a single file:

res, err := client.ContainerCreate(
    ctx,
    &container.Config{
        Image: "nginx",
        Cmd:   []string{"ls", "/"},
    },
    &container.HostConfig{
        Binds: []string{
            "/localPath:/pathInDocker",
        },
    },
    nil,
    "",
)
like image 36
ryanbrainard Avatar answered Oct 09 '22 10:10

ryanbrainard