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:
@@ -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() {
|
||||
|
@@ -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
123
docker/services.go
Normal 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())
|
||||
}
|
Reference in New Issue
Block a user