Reputation: 3774
I want to run the below docker command
docker run ajaycs14/hello-world -p 1527:80 -d
.
How to achieve above using Docker Go SDK?
Sample code to run an image is below, which from official document, how to modify below code to take the options for port and detached mode etc. Please help me in modifying below code to work for above command(docker run ajaycs14/hello-world -p 1527:80 -d
) ?
package main
import (
"fmt"
"io"
"os"
"github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/container"
"github.com/docker/docker/client"
"golang.org/x/net/context"
)
func main() {
ctx := context.Background()
cli, err := client.NewEnvClient()
if err != nil {
panic(err)
}
imageName := "bfirsh/reticulate-splines"
out, err := cli.ImagePull(ctx, imageName, types.ImagePullOptions{})
if err != nil {
panic(err)
}
io.Copy(os.Stdout, out)
resp, err := cli.ContainerCreate(ctx, &container.Config{
Image: imageName,
}, nil, nil, "")
if err != nil {
panic(err)
}
if err := cli.ContainerStart(ctx, resp.ID, types.ContainerStartOptions{}); err != nil {
panic(err)
}
fmt.Println(resp.ID)
}
Upvotes: 7
Views: 12397
Reputation: 2087
In the method ContainerCreate
the third parameter is HostConfig that you need to use. If you are interested in setting ports then you should take a look at PortBindings
field. Also you need to specify exposed ports for container. You can do this by providing ExposedPorts
into container configuration (second parameter).
And I assume that you container will be started in a daemon
mode by default because you are using API instead of cli
tool.
Here is a working example:
package main
import (
"context"
"github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/container"
"github.com/docker/docker/client"
"github.com/docker/go-connections/nat"
)
func main() {
cli, err := client.NewEnvClient()
if err != nil {
panic(err)
}
ctx := context.Background()
resp, err := cli.ContainerCreate(ctx, &container.Config{
Image: "mongo",
ExposedPorts: nat.PortSet{"8080": struct{}{}},
}, &container.HostConfig{
PortBindings: map[nat.Port][]nat.PortBinding{nat.Port("8080"): {{HostIP: "127.0.0.1", HostPort: "8080"}}},
}, nil, "mongo-go-cli")
if err != nil {
panic(err)
}
if err := cli.ContainerStart(ctx, resp.ID, types.ContainerStartOptions{}); err != nil {
panic(err)
}
}
And in the output for docker ps --all
I can see my port: PORTS 127.0.0.1:8080->8080/tcp, 27017/tcp
Upvotes: 14