36 lines
1,017 B
Go
36 lines
1,017 B
Go
|
package project
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
|
||
|
"golang.org/x/net/context"
|
||
|
|
||
|
"github.com/docker/libcompose/project/events"
|
||
|
"github.com/docker/libcompose/project/options"
|
||
|
)
|
||
|
|
||
|
// Run executes a one off command (like `docker run image command`).
|
||
|
func (p *Project) Run(ctx context.Context, serviceName string, commandParts []string, opts options.Run) (int, error) {
|
||
|
if !p.ServiceConfigs.Has(serviceName) {
|
||
|
return 1, fmt.Errorf("%s is not defined in the template", serviceName)
|
||
|
}
|
||
|
|
||
|
if err := p.initialize(ctx); err != nil {
|
||
|
return 1, err
|
||
|
}
|
||
|
var exitCode int
|
||
|
err := p.forEach([]string{}, wrapperAction(func(wrapper *serviceWrapper, wrappers map[string]*serviceWrapper) {
|
||
|
wrapper.Do(wrappers, events.ServiceRunStart, events.ServiceRun, func(service Service) error {
|
||
|
if service.Name() == serviceName {
|
||
|
code, err := service.Run(ctx, commandParts, opts)
|
||
|
exitCode = code
|
||
|
return err
|
||
|
}
|
||
|
return nil
|
||
|
})
|
||
|
}), func(service Service) error {
|
||
|
return service.Create(ctx, options.Create{})
|
||
|
})
|
||
|
return exitCode, err
|
||
|
}
|