diff --git a/backend/app/dto/request/app.go b/backend/app/dto/request/app.go
index 015470cfa..7a7fa461e 100644
--- a/backend/app/dto/request/app.go
+++ b/backend/app/dto/request/app.go
@@ -32,6 +32,7 @@ type AppContainerConfig struct {
EditCompose bool `json:"editCompose"`
DockerCompose string `json:"dockerCompose"`
HostMode bool `json:"hostMode"`
+ PullImage bool `json:"pullImage"`
}
type AppInstalledSearch struct {
@@ -67,6 +68,7 @@ type AppInstalledOperate struct {
DeleteBackup bool `json:"deleteBackup"`
DeleteDB bool `json:"deleteDB"`
Backup bool `json:"backup"`
+ PullImage bool `json:"pullImage"`
}
type AppInstalledUpdate struct {
diff --git a/backend/app/service/app.go b/backend/app/service/app.go
index 1f1798334..da911590c 100644
--- a/backend/app/service/app.go
+++ b/backend/app/service/app.go
@@ -459,7 +459,7 @@ func (a AppService) Install(ctx context.Context, req request.AppInstallCreate) (
if err = runScript(appInstall, "init"); err != nil {
return
}
- upApp(appInstall)
+ upApp(appInstall, req.PullImage)
}()
go updateToolApp(appInstall)
return
diff --git a/backend/app/service/app_install.go b/backend/app/service/app_install.go
index 6a39e73d7..8d7206d25 100644
--- a/backend/app/service/app_install.go
+++ b/backend/app/service/app_install.go
@@ -263,7 +263,7 @@ func (a *AppInstallService) Operate(req request.AppInstalledOperate) error {
case constant.Sync:
return syncByID(install.ID)
case constant.Upgrade:
- return upgradeInstall(install.ID, req.DetailId, req.Backup)
+ return upgradeInstall(install.ID, req.DetailId, req.Backup, req.PullImage)
case constant.Reload:
return opNginx(install.ContainerName, constant.NginxReload)
default:
diff --git a/backend/app/service/app_utils.go b/backend/app/service/app_utils.go
index 8232b3f28..529f76ce8 100644
--- a/backend/app/service/app_utils.go
+++ b/backend/app/service/app_utils.go
@@ -433,12 +433,12 @@ func deleteLink(ctx context.Context, install *model.AppInstall, deleteDB bool, f
return appInstallResourceRepo.DeleteBy(ctx, appInstallResourceRepo.WithAppInstallId(install.ID))
}
-func upgradeInstall(installId uint, detailId uint, backup bool) error {
- install, err := appInstallRepo.GetFirst(commonRepo.WithByID(installId))
+func upgradeInstall(installID uint, detailID uint, backup, pullImage bool) error {
+ install, err := appInstallRepo.GetFirst(commonRepo.WithByID(installID))
if err != nil {
return err
}
- detail, err := appDetailRepo.GetFirst(commonRepo.WithByID(detailId))
+ detail, err := appDetailRepo.GetFirst(commonRepo.WithByID(detailID))
if err != nil {
return err
}
@@ -556,7 +556,7 @@ func upgradeInstall(installId uint, detailId uint, backup bool) error {
install.DockerCompose = string(composeByte)
install.Version = detail.Version
- install.AppDetailId = detailId
+ install.AppDetailId = detailID
if out, err := compose.Down(install.GetComposePath()); err != nil {
if out != "" {
@@ -581,21 +581,23 @@ func upgradeInstall(installId uint, detailId uint, backup bool) error {
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)
+ if pullImage {
+ 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 {
@@ -839,14 +841,14 @@ func checkContainerNameIsExist(containerName, appDir string) (bool, error) {
return false, nil
}
-func upApp(appInstall *model.AppInstall) {
+func upApp(appInstall *model.AppInstall, pullImages bool) {
upProject := func(appInstall *model.AppInstall) (err error) {
if err == nil {
var (
out string
errMsg string
)
- if appInstall.App.Type != "php" {
+ if pullImages && appInstall.App.Type != "php" {
out, err = compose.Pull(appInstall.GetComposePath())
if err != nil {
if out != "" {
@@ -861,6 +863,7 @@ func upApp(appInstall *model.AppInstall) {
return err
}
}
+
out, err = compose.Up(appInstall.GetComposePath())
if err != nil {
if out != "" {
diff --git a/frontend/src/lang/modules/tw.ts b/frontend/src/lang/modules/tw.ts
index c92ae7ff9..4cad3bd9d 100644
--- a/frontend/src/lang/modules/tw.ts
+++ b/frontend/src/lang/modules/tw.ts
@@ -1698,7 +1698,7 @@ const message = {
disable: '未啟用',
disableLeechHelper: '是否禁用防盜鏈',
disableLeech: '禁用防盜鏈',
- ipv6: '監聽 IPV6 端口',
+ ipv6: '監聽 IPV6',
leechReturnError: '請填寫 HTTP 狀態碼',
selectAcme: '選擇 Acme 賬號',
imported: '手動創建',
diff --git a/frontend/src/lang/modules/zh.ts b/frontend/src/lang/modules/zh.ts
index b2564eb5e..313201a59 100644
--- a/frontend/src/lang/modules/zh.ts
+++ b/frontend/src/lang/modules/zh.ts
@@ -1698,7 +1698,7 @@ const message = {
disable: '未启用',
disableLeechHelper: '是否禁用防盗链',
disableLeech: '禁用防盗链',
- ipv6: '监听 IPV6 端口',
+ ipv6: '监听 IPV6',
leechReturnError: '请填写 HTTP 状态码',
selectAcme: '选择 acme 账号',
imported: '手动创建',
diff --git a/frontend/src/views/app-store/detail/install/index.vue b/frontend/src/views/app-store/detail/install/index.vue
index c6e88f7fd..4241c4f25 100644
--- a/frontend/src/views/app-store/detail/install/index.vue
+++ b/frontend/src/views/app-store/detail/install/index.vue
@@ -103,11 +103,14 @@
{{ $t('container.limitHelper', [limits.memory]) }}{{ req.memoryUnit }}B
-