// links and mounts for service dependencies func connectToAService(srv *definitions.Service, ops *definitions.Operation, typ, name, internalName string, link, mount bool) { log.WithFields(log.Fields{ "=>": srv.Name, "type": typ, "name": name, "internal name": internalName, "link": link, "volumes from": mount, }).Debug("Connecting to service") containerName := util.ContainersName(typ, name, ops.ContainerNumber) if link { newLink := containerName + ":" + internalName srv.Links = append(srv.Links, newLink) } if mount { // Automagically mount VolumesFrom for serviceDeps so they can // easily pass files back and forth. note that this is opinionated // and will mount as read-write. we can revisit this if read-only // mounting required for specific use cases newVol := containerName + ":rw" srv.VolumesFrom = append(srv.VolumesFrom, newVol) } }
func configureDataContainer(srv *def.Service, ops *def.Operation, mainContOpts *docker.CreateContainerOptions) (docker.CreateContainerOptions, error) { // by default data containers will rely on the image used by // the base service. sometimes, tho, especially for testing // that base image will not be present. in such cases use // the base eris data container. if srv.Image == "" { srv.Image = "eris/data" } opts := docker.CreateContainerOptions{ Name: ops.DataContainerName, Config: &docker.Config{ Image: srv.Image, User: srv.User, AttachStdin: false, AttachStdout: false, AttachStderr: false, Tty: false, OpenStdin: false, NetworkDisabled: true, // data containers do not need to talk to the outside world. Entrypoint: []string{}, Cmd: []string{"false"}, // just gracefully exit. data containers just need to "exist" not run. }, HostConfig: &docker.HostConfig{}, } if mainContOpts != nil { mainContOpts.HostConfig.VolumesFrom = append(mainContOpts.HostConfig.VolumesFrom, ops.DataContainerName) } return opts, nil }
// links and mounts for service dependencies func connectToAService(srv *definitions.Service, ops *definitions.Operation, typ, name, internalName string, link, mount bool) { logger.Debugf("Connecting service %s to %s %s (%s) with link (%v) and volumes-from (%v)\n", srv.Name, typ, name, internalName, link, mount) containerName := util.ContainersName(typ, name, ops.ContainerNumber) if link { newLink := containerName + ":" + internalName srv.Links = append(srv.Links, newLink) } if mount { // Automagically mount VolumesFrom for serviceDeps so they can // easily pass files back and forth. note that this is opinionated // and will mount as read-write. we can revisit this if read-only // mounting required for specific use cases newVol := containerName + ":rw" srv.VolumesFrom = append(srv.VolumesFrom, newVol) } }
func configureDataContainer(srv *def.Service, ops *def.Operation, mainContOpts *docker.CreateContainerOptions) (docker.CreateContainerOptions, error) { // by default data containers will rely on the image used by // the base service. sometimes, tho, especially for testing // that base image will not be present. in such cases use // the base eris data container. if srv.Image == "" { srv.Image = "quay.io/eris/data" } // Manipulate labels locally. labels := make(map[string]string) for k, v := range ops.Labels { labels[k] = v } // If connected to a service. if mainContOpts != nil { // Set the service container's VolumesFrom pointing to the data container. mainContOpts.HostConfig.VolumesFrom = append(mainContOpts.HostConfig.VolumesFrom, ops.DataContainerName) // Operations are inherited from the service container. labels = util.SetLabel(labels, def.LabelType, def.TypeData) // Set the data container service label pointing to the service. labels = util.SetLabel(labels, def.LabelService, mainContOpts.Name) } opts := docker.CreateContainerOptions{ Name: ops.DataContainerName, Config: &docker.Config{ Image: srv.Image, User: srv.User, AttachStdin: false, AttachStdout: false, AttachStderr: false, Tty: false, OpenStdin: false, Labels: labels, // Data containers do not need to talk to the outside world. NetworkDisabled: true, // Just gracefully exit. Data containers just need to "exist" not run. Entrypoint: []string{"true"}, Cmd: []string{}, }, HostConfig: &docker.HostConfig{}, } return opts, nil }