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?
Volumes are stored in a part of the host filesystem which is managed by Docker ( /var/lib/docker/volumes/ on Linux).
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.
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.
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.
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,
"",
)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With