1
0
mirror of https://github.com/rancher/os.git synced 2025-09-02 15:24:32 +00:00

Services in compose format

This commit is contained in:
Darren Shepherd
2015-04-15 22:57:59 -07:00
parent adc6825ee6
commit 0b5eb352ba
12 changed files with 328 additions and 141 deletions

View File

@@ -71,6 +71,7 @@ func NewContainerFromService(dockerHost string, name string, service *project.Se
Service: service,
},
}
return c.Parse()
}
@@ -174,34 +175,53 @@ func (c *Container) requiresSyslog() bool {
return (c.ContainerCfg.Service.LogDriver == "" || c.ContainerCfg.Service.LogDriver == "syslog")
}
func (c *Container) requiresUserDocker() bool {
if c.dockerHost == config.DOCKER_HOST {
return true
}
for _, v := range c.ContainerCfg.Service.Volumes {
if strings.Index(v, "/var/run/docker.sock") != -1 {
return true
}
}
return false
}
func (c *Container) hasLink(link string) bool {
return util.Contains(c.ContainerCfg.Service.Links, link)
}
func (c *Container) addLink(link string) {
if c.hasLink(link) {
return
}
log.Debugf("Adding %s link to %s", link, c.Name)
c.ContainerCfg.Service.Links = append(c.ContainerCfg.Service.Links, link)
}
func (c *Container) parseService() {
client, err := NewClient(c.dockerHost)
if err != nil {
c.Err = err
return
if c.requiresSyslog() {
c.addLink("syslog")
}
if c.ContainerCfg.Service.Image != "" {
if c.requiresUserDocker() {
c.addLink("userdockerwait")
} else if c.ContainerCfg.Service.Image != "" {
client, err := NewClient(c.dockerHost)
if err != nil {
c.Err = err
return
}
i, _ := client.InspectImage(c.ContainerCfg.Service.Image)
if i == nil && !c.hasLink("network") {
log.Debugf("Adding network link to %s", c.Name)
if i == nil {
c.addLink("network")
}
}
if c.requiresSyslog() && !c.hasLink("syslog") {
log.Debugf("Adding syslog link to %s\n", c.Name)
c.addLink("syslog")
}
cfg, hostConfig, err := docker.Convert(c.ContainerCfg.Service)
if err != nil {
c.Err = err
@@ -215,7 +235,6 @@ func (c *Container) parseService() {
c.remove = c.Config.Labels[config.REMOVE] != "false"
c.ContainerCfg.CreateOnly = c.Config.Labels[config.CREATE_ONLY] == "true"
c.ContainerCfg.ReloadConfig = c.Config.Labels[config.RELOAD_CONFIG] == "true"
}
func (c *Container) parseCmd() {

View File

@@ -38,6 +38,8 @@ func (c *containerBasedService) Up() error {
var event project.Event
c.project.Notify(project.CONTAINER_STARTING, c, map[string]string{})
if create {
container.Create()
event = project.CONTAINER_CREATED
@@ -71,8 +73,17 @@ func (c *containerBasedService) Name() string {
return c.name
}
func isSystemService(serviceConfig *project.ServiceConfig) bool {
return util.GetValue(serviceConfig.Labels, config.SCOPE) == config.SYSTEM
}
func (c *ContainerFactory) Create(project *project.Project, name string, serviceConfig *project.ServiceConfig) (project.Service, error) {
container := NewContainerFromService(config.DOCKER_SYSTEM_HOST, name, serviceConfig)
host := config.DOCKER_HOST
if isSystemService(serviceConfig) {
host = config.DOCKER_SYSTEM_HOST
}
container := NewContainerFromService(host, name, serviceConfig)
if container.Err != nil {
return nil, container.Err

123
docker/services.go Normal file
View File

@@ -0,0 +1,123 @@
package docker
import (
"fmt"
log "github.com/Sirupsen/logrus"
"github.com/rancherio/os/config"
"github.com/rancherio/os/util"
"github.com/rancherio/rancher-compose/project"
)
type configEnvironemnt struct {
cfg *config.Config
}
func (c *configEnvironemnt) Lookup(key, serviceName string, serviceConfig *project.ServiceConfig) []string {
result := ""
fullKey := fmt.Sprintf("%s/%s", serviceName, key)
if value, ok := c.cfg.Environment[fullKey]; ok {
result = value
} else if value, ok := c.cfg.Environment[key]; ok {
result = value
}
if result == "" {
return []string{}
} else {
return []string{fmt.Sprintf("%s=%s", key, result)}
}
}
func RunServices(name string, cfg *config.Config, configs map[string]*project.ServiceConfig) error {
network := false
projectEvents := make(chan project.ProjectEvent)
p := project.NewProject(name, NewContainerFactory(cfg))
p.EnvironmentLookup = &configEnvironemnt{cfg: cfg}
p.AddListener(projectEvents)
enabled := make(map[string]bool)
for name, serviceConfig := range configs {
if err := p.AddConfig(name, serviceConfig); err != nil {
log.Infof("Failed loading service %s", name)
}
}
p.ReloadCallback = func() error {
err := cfg.Reload()
if err != nil {
return err
}
for service, serviceEnabled := range cfg.ServicesInclude {
if !serviceEnabled {
continue
}
if _, ok := enabled[service]; ok {
continue
}
//if config, ok := cfg.BundledServices[service]; ok {
// for name, s := range config.SystemContainers {
// if err := p.AddConfig(name, s); err != nil {
// log.Errorf("Failed to load %s : %v", name, err)
// }
// }
//} else {
bytes, err := LoadServiceResource(service, network, cfg)
if err != nil {
if err == util.ErrNoNetwork {
log.Debugf("Can not load %s, networking not enabled", service)
} else {
log.Errorf("Failed to load %s : %v", service, err)
}
continue
}
err = p.Load(bytes)
if err != nil {
log.Errorf("Failed to load %s : %v", service, err)
continue
}
//}
enabled[service] = true
}
for service, config := range cfg.Services {
if _, ok := enabled[service]; ok {
continue
}
err = p.AddConfig(service, config)
if err != nil {
log.Errorf("Failed to load %s : %v", service, err)
continue
}
enabled[service] = true
}
return nil
}
go func() {
for event := range projectEvents {
if event.Event == project.CONTAINER_STARTED && event.Service.Name() == "network" {
network = true
}
}
}()
err := p.ReloadCallback()
if err != nil {
log.Errorf("Failed to reload %s : %v", name, err)
return err
}
return p.Up()
}
func LoadServiceResource(name string, network bool, cfg *config.Config) ([]byte, error) {
return util.LoadResource(name, network, cfg.Repositories.ToArray())
}