mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
dynamic service binding.
Signed-off-by: Dong Chen <dongluo.chen@docker.com>
This commit is contained in:
parent
c5ceb0f945
commit
ca81f6ee7c
5 changed files with 61 additions and 0 deletions
|
@ -27,6 +27,8 @@ type Backend interface {
|
||||||
ContainerStart(name string, hostConfig *container.HostConfig, validateHostname bool, checkpoint string, checkpointDir string) error
|
ContainerStart(name string, hostConfig *container.HostConfig, validateHostname bool, checkpoint string, checkpointDir string) error
|
||||||
ContainerStop(name string, seconds *int) error
|
ContainerStop(name string, seconds *int) error
|
||||||
ConnectContainerToNetwork(containerName, networkName string, endpointConfig *network.EndpointSettings) error
|
ConnectContainerToNetwork(containerName, networkName string, endpointConfig *network.EndpointSettings) error
|
||||||
|
ActivateContainerServiceBinding(containerName string) error
|
||||||
|
DeactivateContainerServiceBinding(containerName string) error
|
||||||
UpdateContainerServiceConfig(containerName string, serviceConfig *clustertypes.ServiceConfig) error
|
UpdateContainerServiceConfig(containerName string, serviceConfig *clustertypes.ServiceConfig) error
|
||||||
ContainerInspectCurrent(name string, size bool) (*types.ContainerJSON, error)
|
ContainerInspectCurrent(name string, size bool) (*types.ContainerJSON, error)
|
||||||
ContainerWaitWithContext(ctx context.Context, name string) error
|
ContainerWaitWithContext(ctx context.Context, name string) error
|
||||||
|
|
|
@ -331,6 +331,14 @@ func (c *containerAdapter) createVolumes(ctx context.Context) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *containerAdapter) activateServiceBinding() error {
|
||||||
|
return c.backend.ActivateContainerServiceBinding(c.container.name())
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *containerAdapter) deactivateServiceBinding() error {
|
||||||
|
return c.backend.DeactivateContainerServiceBinding(c.container.name())
|
||||||
|
}
|
||||||
|
|
||||||
// todo: typed/wrapped errors
|
// todo: typed/wrapped errors
|
||||||
func isContainerCreateNameConflict(err error) bool {
|
func isContainerCreateNameConflict(err error) bool {
|
||||||
return strings.Contains(err.Error(), "Conflict. The name")
|
return strings.Contains(err.Error(), "Conflict. The name")
|
||||||
|
|
|
@ -183,6 +183,10 @@ func (r *controller) Start(ctx context.Context) error {
|
||||||
|
|
||||||
// no health check
|
// no health check
|
||||||
if ctnr.Config == nil || ctnr.Config.Healthcheck == nil {
|
if ctnr.Config == nil || ctnr.Config.Healthcheck == nil {
|
||||||
|
if err := r.adapter.activateServiceBinding(); err != nil {
|
||||||
|
log.G(ctx).WithError(err).Errorf("failed to activate service binding for container %s which has no healthcheck config", r.adapter.container.name())
|
||||||
|
return err
|
||||||
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -225,6 +229,10 @@ func (r *controller) Start(ctx context.Context) error {
|
||||||
// set health check error, and wait for container to fully exit ("die" event)
|
// set health check error, and wait for container to fully exit ("die" event)
|
||||||
healthErr = ErrContainerUnhealthy
|
healthErr = ErrContainerUnhealthy
|
||||||
case "health_status: healthy":
|
case "health_status: healthy":
|
||||||
|
if err := r.adapter.activateServiceBinding(); err != nil {
|
||||||
|
log.G(ctx).WithError(err).Errorf("failed to activate service binding for container %s after healthy event", r.adapter.container.name())
|
||||||
|
return err
|
||||||
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
case <-ctx.Done():
|
case <-ctx.Done():
|
||||||
|
@ -290,6 +298,12 @@ func (r *controller) Shutdown(ctx context.Context) error {
|
||||||
r.cancelPull()
|
r.cancelPull()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// remove container from service binding
|
||||||
|
if err := r.adapter.deactivateServiceBinding(); err != nil {
|
||||||
|
log.G(ctx).WithError(err).Errorf("failed to deactivate service binding for container %s", r.adapter.container.name())
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
if err := r.adapter.shutdown(ctx); err != nil {
|
if err := r.adapter.shutdown(ctx); err != nil {
|
||||||
if isUnknownContainer(err) || isStoppedContainer(err) {
|
if isUnknownContainer(err) || isStoppedContainer(err) {
|
||||||
return nil
|
return nil
|
||||||
|
|
|
@ -719,6 +719,13 @@ func (daemon *Daemon) connectToNetwork(container *container.Container, idOrName
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if !container.Managed {
|
||||||
|
// add container name/alias to DNS
|
||||||
|
if err := daemon.ActivateContainerServiceBinding(container.Name); err != nil {
|
||||||
|
return fmt.Errorf("Activate container service binding for %s failed: %v", container.Name, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if err := container.UpdateJoinInfo(n, ep); err != nil {
|
if err := container.UpdateJoinInfo(n, ep); err != nil {
|
||||||
return fmt.Errorf("Updating join info failed: %v", err)
|
return fmt.Errorf("Updating join info failed: %v", err)
|
||||||
}
|
}
|
||||||
|
@ -987,3 +994,29 @@ func (daemon *Daemon) DisconnectFromNetwork(container *container.Container, netw
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ActivateContainerServiceBinding puts this container into load balancer active rotation and DNS response
|
||||||
|
func (daemon *Daemon) ActivateContainerServiceBinding(containerName string) error {
|
||||||
|
container, err := daemon.GetContainer(containerName)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
sb := daemon.getNetworkSandbox(container)
|
||||||
|
if sb == nil {
|
||||||
|
return fmt.Errorf("network sandbox not exists for container %s", containerName)
|
||||||
|
}
|
||||||
|
return sb.EnableService()
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeactivateContainerServiceBinding remove this container fromload balancer active rotation, and DNS response
|
||||||
|
func (daemon *Daemon) DeactivateContainerServiceBinding(containerName string) error {
|
||||||
|
container, err := daemon.GetContainer(containerName)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
sb := daemon.getNetworkSandbox(container)
|
||||||
|
if sb == nil {
|
||||||
|
return fmt.Errorf("network sandbox not exists for container %s", containerName)
|
||||||
|
}
|
||||||
|
return sb.DisableService()
|
||||||
|
}
|
||||||
|
|
|
@ -178,6 +178,10 @@ func (daemon *Daemon) SetupIngress(create clustertypes.NetworkCreateRequest, nod
|
||||||
if err := ep.Join(sb, nil); err != nil {
|
if err := ep.Join(sb, nil); err != nil {
|
||||||
logrus.Errorf("Failed joining ingress sandbox to ingress endpoint: %v", err)
|
logrus.Errorf("Failed joining ingress sandbox to ingress endpoint: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if err := sb.EnableService(); err != nil {
|
||||||
|
logrus.WithError(err).Error("Failed enabling service for ingress sandbox")
|
||||||
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|
Loading…
Add table
Reference in a new issue