Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions agent/app/dto/request/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ type AppContainerConfig struct {
WebUI string `json:"webUI"`
Type string `json:"type"`
SpecifyIP string `json:"specifyIP"`
RestartPolicy string `json:"restartPolicy" validate:"omitempty,oneof=always unless-stopped no on-failure"`
}

type AppInstalledSearch struct {
Expand Down
1 change: 1 addition & 0 deletions agent/app/service/app_install.go
Original file line number Diff line number Diff line change
Expand Up @@ -788,6 +788,7 @@ func (a *AppInstallService) GetParams(id uint) (*response.AppConfig, error) {
}
res.AppContainerConfig = config
res.HostMode = isHostModel(install.DockerCompose)
res.RestartPolicy = getRestartPolicy(install.DockerCompose)
res.WebUI = install.WebUI
res.Type = install.App.Type
return &res, nil
Expand Down
26 changes: 24 additions & 2 deletions agent/app/service/app_utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -357,7 +357,7 @@ func deleteAppInstall(deleteReq request.AppInstallDelete) error {
if err != nil {
return err
}
images, err := composeV2.GetDockerComposeImagesV2(content, []byte(install.DockerCompose))
images, err := composeV2.GetImagesFromDockerCompose(content, []byte(install.DockerCompose))
if err != nil {
return err
}
Expand Down Expand Up @@ -540,6 +540,9 @@ func handleUpgradeCompose(install model.AppInstall, detail model.AppDetail) (map
if oldServiceValue["deploy"] != nil {
serviceValue["deploy"] = oldServiceValue["deploy"]
}
if oldServiceValue["restart"] != nil {
serviceValue["restart"] = oldServiceValue["restart"]
}
servicesMap[install.ServiceName] = serviceValue
composeMap["services"] = servicesMap
return composeMap, nil
Expand Down Expand Up @@ -659,7 +662,7 @@ func upgradeInstall(req request.AppInstallUpgrade) error {
if req.DockerCompose != "" {
composeContent = []byte(req.DockerCompose)
}
images, err := composeV2.GetDockerComposeImagesV2(content, composeContent)
images, err := composeV2.GetImagesFromDockerCompose(content, composeContent)
if err != nil {
return err
}
Expand Down Expand Up @@ -1658,6 +1661,14 @@ func addDockerComposeCommonParam(composeMap map[string]interface{}, serviceName
deploy["resources"] = resource
serviceValue["deploy"] = deploy

if req.RestartPolicy != "" {
if req.RestartPolicy == "on-failure" {
serviceValue["restart"] = "on-failure:5"
} else {
serviceValue["restart"] = req.RestartPolicy
}
}

ports, ok := serviceValue["ports"].([]interface{})
if ok {
for i, port := range ports {
Expand Down Expand Up @@ -1760,6 +1771,17 @@ func isHostModel(dockerCompose string) bool {
return false
}

func getRestartPolicy(yml string) string {
var project docker.ComposeProject
if err := yaml.Unmarshal([]byte(yml), &project); err != nil {
return ""
}
for _, service := range project.Services {
return service.Restart
}
return ""
}

func getMajorVersion(version string) string {
parts := strings.Split(version, ".")
if len(parts) >= 2 {
Expand Down
64 changes: 1 addition & 63 deletions agent/utils/docker/compose.go
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ type Service struct {
Image string `yaml:"image"`
Environment Environment `yaml:"environment"`
Volumes []string `json:"volumes"`
Restart string `json:"restart"`
}

type Environment struct {
Expand Down Expand Up @@ -92,69 +93,6 @@ func (e *Environment) UnmarshalYAML(value *yaml.Node) error {
return nil
}

func replaceEnvVariables(input string, envVars map[string]string) string {
for key, value := range envVars {
placeholder := fmt.Sprintf("${%s}", key)
input = strings.ReplaceAll(input, placeholder, value)
}
return input
}
func GetDockerComposeImagesV2(env, yml []byte) ([]string, error) {
var (
compose ComposeProject
err error
images []string
)
err = yaml.Unmarshal(yml, &compose)
if err != nil {
return nil, err
}
envMap, err := godotenv.UnmarshalBytes(env)
if err != nil {
return nil, err
}
for _, service := range compose.Services {
image := replaceEnvVariables(service.Image, envMap)
images = append(images, image)
}
return images, nil
}

func GetDockerComposeImages(projectName string, env, yml []byte) ([]string, error) {
var (
configFiles []types.ConfigFile
images []string
imagesMap = make(map[string]struct{})
)
configFiles = append(configFiles, types.ConfigFile{
Filename: "docker-compose.yml",
Content: yml},
)
envMap, err := godotenv.UnmarshalBytes(env)
if err != nil {
return nil, err
}
details := types.ConfigDetails{
ConfigFiles: configFiles,
Environment: envMap,
}

project, err := loader.LoadWithContext(context.Background(), details, func(options *loader.Options) {
options.SetProjectName(projectName, true)
options.ResolvePaths = true
})
if err != nil {
return nil, err
}
for _, service := range project.AllServices() {
imagesMap[service.Image] = struct{}{}
}
for image := range imagesMap {
images = append(images, image)
}
return images, nil
}

func GetImagesFromDockerCompose(env, yml []byte) ([]string, error) {
envVars, err := loadEnvFile(env)
if err != nil {
Expand Down
1 change: 1 addition & 0 deletions frontend/src/api/interface/app.ts
Original file line number Diff line number Diff line change
Expand Up @@ -276,6 +276,7 @@ export namespace App {
type: string;
webUI: string;
specifyIP: string;
restartPolicy: string;
}

export interface IgnoredApp {
Expand Down
9 changes: 3 additions & 6 deletions frontend/src/api/modules/app.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,9 @@ export const searchApp = (req: App.AppReq) => {
return http.post<App.AppResPage>('apps/search', req);
};

export const getAppByKey = (key: string) => {
return http.get<App.AppDTO>('apps/' + key);
};

export const getAppByKeyWithNode = (key: string, node: string) => {
return http.get<App.AppDTO>('apps/' + key + `?operateNode=${node}`);
export const getAppByKey = (key: string, node?: string) => {
const params = node ? `?operateNode=${node}` : '';
return http.get<App.AppDTO>('apps/' + key + `${params}`);
};

export const getAppTags = () => {
Expand Down
Loading
Loading