mirror of
https://github.com/1Panel-dev/1Panel.git
synced 2025-10-09 23:17:21 +08:00
feat: 优化应用升级逻辑 支持 docker-compose.yml 文件的 image 值中包含参数 (#3681)
This commit is contained in:
parent
115b9c58b0
commit
4ce50328ba
2 changed files with 45 additions and 23 deletions
|
@ -492,23 +492,6 @@ func upgradeInstall(installId uint, detailId uint, backup bool) error {
|
||||||
detailDir = path.Join(constant.ResourceDir, "apps", "local", strings.TrimPrefix(install.App.Key, "local"), detail.Version)
|
detailDir = path.Join(constant.ResourceDir, "apps", "local", strings.TrimPrefix(install.App.Key, "local"), detail.Version)
|
||||||
}
|
}
|
||||||
|
|
||||||
images, err := composeV2.GetDockerComposeImages([]byte(detail.DockerCompose))
|
|
||||||
if err != nil {
|
|
||||||
upErr = err
|
|
||||||
return
|
|
||||||
}
|
|
||||||
dockerCli, err := composeV2.NewClient()
|
|
||||||
if err != nil {
|
|
||||||
upErr = err
|
|
||||||
return
|
|
||||||
}
|
|
||||||
for _, image := range images {
|
|
||||||
if err = dockerCli.PullImage(image, true); err != nil {
|
|
||||||
upErr = buserr.WithNameAndErr("ErrDockerPullImage", "", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
command := exec.Command("/bin/bash", "-c", fmt.Sprintf("cp -rn %s/* %s || true", detailDir, install.GetPath()))
|
command := exec.Command("/bin/bash", "-c", fmt.Sprintf("cp -rn %s/* %s || true", detailDir, install.GetPath()))
|
||||||
stdout, _ := command.CombinedOutput()
|
stdout, _ := command.CombinedOutput()
|
||||||
if stdout != nil {
|
if stdout != nil {
|
||||||
|
@ -592,6 +575,29 @@ func upgradeInstall(installId uint, detailId uint, backup bool) error {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
content, err := fileOp.GetContent(install.GetEnvPath())
|
||||||
|
if err != nil {
|
||||||
|
upErr = err
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
images, err := composeV2.GetDockerComposeImages(install.Name, content, []byte(detail.DockerCompose))
|
||||||
|
if err != nil {
|
||||||
|
upErr = err
|
||||||
|
return
|
||||||
|
}
|
||||||
|
dockerCli, err := composeV2.NewClient()
|
||||||
|
if err != nil {
|
||||||
|
upErr = err
|
||||||
|
return
|
||||||
|
}
|
||||||
|
for _, image := range images {
|
||||||
|
if err = dockerCli.PullImage(image, true); err != nil {
|
||||||
|
upErr = buserr.WithNameAndErr("ErrDockerPullImage", "", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if upErr = fileOp.WriteFile(install.GetComposePath(), strings.NewReader(install.DockerCompose), 0775); upErr != nil {
|
if upErr = fileOp.WriteFile(install.GetComposePath(), strings.NewReader(install.DockerCompose), 0775); upErr != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,6 @@ import (
|
||||||
"github.com/compose-spec/compose-go/types"
|
"github.com/compose-spec/compose-go/types"
|
||||||
"github.com/docker/compose/v2/pkg/api"
|
"github.com/docker/compose/v2/pkg/api"
|
||||||
"github.com/joho/godotenv"
|
"github.com/joho/godotenv"
|
||||||
"gopkg.in/yaml.v3"
|
|
||||||
"path"
|
"path"
|
||||||
"regexp"
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
|
@ -116,15 +115,32 @@ type Service struct {
|
||||||
Image string `yaml:"image"`
|
Image string `yaml:"image"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetDockerComposeImages(data []byte) ([]string, error) {
|
func GetDockerComposeImages(projectName string, env, yml []byte) ([]string, error) {
|
||||||
var dc ComposeProject
|
var (
|
||||||
err := yaml.Unmarshal(data, &dc)
|
configFiles []types.ConfigFile
|
||||||
|
images []string
|
||||||
|
)
|
||||||
|
configFiles = append(configFiles, types.ConfigFile{
|
||||||
|
Filename: "docker-compose.yml",
|
||||||
|
Content: yml},
|
||||||
|
)
|
||||||
|
envMap, err := godotenv.UnmarshalBytes(env)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
details := types.ConfigDetails{
|
||||||
|
ConfigFiles: configFiles,
|
||||||
|
Environment: envMap,
|
||||||
|
}
|
||||||
|
|
||||||
var images []string
|
project, err := loader.LoadWithContext(context.Background(), details, func(options *loader.Options) {
|
||||||
for _, service := range dc.Services {
|
options.SetProjectName(projectName, true)
|
||||||
|
options.ResolvePaths = true
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
for _, service := range project.AllServices() {
|
||||||
images = append(images, service.Image)
|
images = append(images, service.Image)
|
||||||
}
|
}
|
||||||
return images, nil
|
return images, nil
|
||||||
|
|
Loading…
Add table
Reference in a new issue