|
|
@@ -362,7 +362,7 @@ func (s *composeService) getCreateOptions(ctx context.Context, p *types.Project,
|
|
|
return nil, nil, nil, err
|
|
|
}
|
|
|
|
|
|
- securityOpts, err := parseSecurityOpts(p, service.SecurityOpt)
|
|
|
+ securityOpts, unconfined, err := parseSecurityOpts(p, service.SecurityOpt)
|
|
|
if err != nil {
|
|
|
return nil, nil, nil, err
|
|
|
}
|
|
|
@@ -401,35 +401,50 @@ func (s *composeService) getCreateOptions(ctx context.Context, p *types.Project,
|
|
|
OomScoreAdj: int(service.OomScoreAdj),
|
|
|
}
|
|
|
|
|
|
+ if unconfined {
|
|
|
+ hostConfig.MaskedPaths = []string{}
|
|
|
+ hostConfig.ReadonlyPaths = []string{}
|
|
|
+ }
|
|
|
+
|
|
|
return &containerConfig, &hostConfig, networkConfig, nil
|
|
|
}
|
|
|
|
|
|
// copy/pasted from https://github.com/docker/cli/blob/9de1b162f/cli/command/container/opts.go#L673-L697 + RelativePath
|
|
|
// TODO find so way to share this code with docker/cli
|
|
|
-func parseSecurityOpts(p *types.Project, securityOpts []string) ([]string, error) {
|
|
|
- for key, opt := range securityOpts {
|
|
|
+func parseSecurityOpts(p *types.Project, securityOpts []string) ([]string, bool, error) {
|
|
|
+ var (
|
|
|
+ unconfined bool
|
|
|
+ parsed []string
|
|
|
+ )
|
|
|
+ for _, opt := range securityOpts {
|
|
|
+ if opt == "systempaths=unconfined" {
|
|
|
+ unconfined = true
|
|
|
+ continue
|
|
|
+ }
|
|
|
con := strings.SplitN(opt, "=", 2)
|
|
|
if len(con) == 1 && con[0] != "no-new-privileges" {
|
|
|
if strings.Contains(opt, ":") {
|
|
|
con = strings.SplitN(opt, ":", 2)
|
|
|
} else {
|
|
|
- return securityOpts, errors.Errorf("Invalid security-opt: %q", opt)
|
|
|
+ return securityOpts, false, errors.Errorf("Invalid security-opt: %q", opt)
|
|
|
}
|
|
|
}
|
|
|
if con[0] == "seccomp" && con[1] != "unconfined" {
|
|
|
f, err := os.ReadFile(p.RelativePath(con[1]))
|
|
|
if err != nil {
|
|
|
- return securityOpts, errors.Errorf("opening seccomp profile (%s) failed: %v", con[1], err)
|
|
|
+ return securityOpts, false, errors.Errorf("opening seccomp profile (%s) failed: %v", con[1], err)
|
|
|
}
|
|
|
b := bytes.NewBuffer(nil)
|
|
|
if err := json.Compact(b, f); err != nil {
|
|
|
- return securityOpts, errors.Errorf("compacting json for seccomp profile (%s) failed: %v", con[1], err)
|
|
|
+ return securityOpts, false, errors.Errorf("compacting json for seccomp profile (%s) failed: %v", con[1], err)
|
|
|
}
|
|
|
- securityOpts[key] = fmt.Sprintf("seccomp=%s", b.Bytes())
|
|
|
+ parsed = append(parsed, fmt.Sprintf("seccomp=%s", b.Bytes()))
|
|
|
+ } else {
|
|
|
+ parsed = append(parsed, opt)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- return securityOpts, nil
|
|
|
+ return parsed, unconfined, nil
|
|
|
}
|
|
|
|
|
|
func (s *composeService) prepareLabels(service types.ServiceConfig, number int) (map[string]string, error) {
|