1
0
mirror of https://github.com/1Panel-dev/1Panel.git synced 2025-03-15 02:04:46 +08:00

fix(runtime): fix issue with install extensions failed in php runtime (#8071)

This commit is contained in:
zhengkunwang 2025-03-05 19:20:58 +08:00 committed by GitHub
parent d3efd02d69
commit 7f7731a52e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 69 additions and 15 deletions

View File

@ -235,7 +235,7 @@ func (n NginxService) Build(req request.NginxBuildReq) error {
return err return err
} }
buildTask.AddSubTask("", func(t *task.Task) error { buildTask.AddSubTask("", func(t *task.Task) error {
if err = cmd2.ExecWithLogFile(fmt.Sprintf("docker compose -f %s build", nginxInstall.GetComposePath()), 15*time.Minute, t.Task.LogFile); err != nil { if err = cmd2.ExecWithLogger(fmt.Sprintf("docker compose -f %s build", nginxInstall.GetComposePath()), t.Logger, 15*time.Minute); err != nil {
return err return err
} }
_, err = compose.DownAndUp(nginxInstall.GetComposePath()) _, err = compose.DownAndUp(nginxInstall.GetComposePath())

View File

@ -739,7 +739,7 @@ func (r *RuntimeService) InstallPHPExtension(req request.PHPExtensionInstallReq)
} }
installTask.AddSubTask("", func(t *task.Task) error { installTask.AddSubTask("", func(t *task.Task) error {
installCmd := fmt.Sprintf("docker exec -i %s %s %s", runtime.ContainerName, "install-ext", req.Name) installCmd := fmt.Sprintf("docker exec -i %s %s %s", runtime.ContainerName, "install-ext", req.Name)
err = cmd2.ExecWithLogFile(installCmd, 15*time.Minute, t.Task.LogFile) err = cmd2.ExecWithLogger(installCmd, t.Logger, 15*time.Minute)
if err != nil { if err != nil {
return err return err
} }
@ -751,7 +751,7 @@ func (r *RuntimeService) InstallPHPExtension(req request.PHPExtensionInstallReq)
return err return err
} }
commitCmd := fmt.Sprintf("docker commit %s %s", runtime.ContainerName, runtime.Image) commitCmd := fmt.Sprintf("docker commit %s %s", runtime.ContainerName, runtime.Image)
err = cmd2.ExecWithLogFile(commitCmd, 15*time.Minute, t.Task.LogFile) err = cmd2.ExecWithLogger(commitCmd, t.Logger, 15*time.Minute)
if err != nil { if err != nil {
return err return err
} }

View File

@ -574,7 +574,7 @@ func unInstallPHPExtension(runtime *model.Runtime, delExtensions []string) error
delMap := make(map[string]struct{}) delMap := make(map[string]struct{})
for _, ext := range phpExtensions { for _, ext := range phpExtensions {
for _, del := range delExtensions { for _, del := range delExtensions {
if ext.Check == del { if ext.Name == del {
delMap[ext.Check] = struct{}{} delMap[ext.Check] = struct{}{}
_ = fileOP.DeleteFile(path.Join(dir, "extensions", ext.File)) _ = fileOP.DeleteFile(path.Join(dir, "extensions", ext.File))
_ = fileOP.DeleteFile(path.Join(dir, "conf", "conf.d", "docker-php-ext-"+ext.Check+".ini")) _ = fileOP.DeleteFile(path.Join(dir, "conf", "conf.d", "docker-php-ext-"+ext.Check+".ini"))

View File

@ -1,6 +1,7 @@
package cmd package cmd
import ( import (
"bufio"
"bytes" "bytes"
"context" "context"
"errors" "errors"
@ -100,6 +101,50 @@ func ExecWithLogFile(cmdStr string, timeout time.Duration, outputFile string) er
return nil return nil
} }
func ExecWithLogger(cmdStr string, logger *log.Logger, timeout time.Duration) error {
cmd := exec.Command("bash", "-c", cmdStr)
stdoutPipe, err := cmd.StdoutPipe()
if err != nil {
return err
}
stderrPipe, err := cmd.StderrPipe()
if err != nil {
return err
}
if err := cmd.Start(); err != nil {
return err
}
go func() {
scanner := bufio.NewScanner(stdoutPipe)
for scanner.Scan() {
logger.Print(scanner.Text())
}
}()
go func() {
scanner := bufio.NewScanner(stderrPipe)
for scanner.Scan() {
logger.Print(scanner.Text())
}
}()
done := make(chan error, 1)
go func() {
done <- cmd.Wait()
}()
after := time.After(timeout)
select {
case <-after:
_ = cmd.Process.Kill()
return buserr.New("ErrCmdTimeout")
case err := <-done:
return err
}
}
func ExecContainerScript(containerName, cmdStr string, timeout time.Duration) error { func ExecContainerScript(containerName, cmdStr string, timeout time.Duration) error {
cmdStr = fmt.Sprintf("docker exec -i %s bash -c '%s'", containerName, cmdStr) cmdStr = fmt.Sprintf("docker exec -i %s bash -c '%s'", containerName, cmdStr)
out, err := ExecWithTimeOut(cmdStr, timeout) out, err := ExecWithTimeOut(cmdStr, timeout)

View File

@ -127,13 +127,6 @@
<span> <span>
{{ $t('runtime.extendHelper') }} {{ $t('runtime.extendHelper') }}
</span> </span>
<!-- <el-link
target="_blank"
type="primary"
:href="globalStore.docsUrl + '/user_manual/websites/php/#php_1'"
>
{{ $t('php.toExtensionsList') }}
</el-link> -->
<span <span
class="custom-link" class="custom-link"
@click="openLink(globalStore.docsUrl + '/user_manual/websites/php/#php_1')" @click="openLink(globalStore.docsUrl + '/user_manual/websites/php/#php_1')"
@ -225,7 +218,7 @@ const phpSources = globalStore.isIntl
? [ ? [
{ {
label: i18n.global.t('runtime.default'), label: i18n.global.t('runtime.default'),
value: 'https://dl-cdn.alpinelinux.org', value: 'https://deb.debian.org',
}, },
{ {
label: i18n.global.t('runtime.xtom'), label: i18n.global.t('runtime.xtom'),
@ -259,7 +252,7 @@ const phpSources = globalStore.isIntl
}, },
{ {
label: i18n.global.t('commons.table.default'), label: i18n.global.t('commons.table.default'),
value: 'https://dl-cdn.alpinelinux.org', value: 'https://deb.debian.org',
}, },
]; ];

View File

@ -5,6 +5,9 @@
<el-tag v-for="(ext, index) in extensions" :key="index" type="info" class="mr-1 mt-1">{{ ext }}</el-tag> <el-tag v-for="(ext, index) in extensions" :key="index" type="info" class="mr-1 mt-1">{{ ext }}</el-tag>
</el-descriptions-item> </el-descriptions-item>
</el-descriptions> </el-descriptions>
<div class="mt-5">
<TableSearch @search="searchByName()" v-model:searchName="searchName" />
</div>
<div class="mt-5"> <div class="mt-5">
<el-text>{{ $t('runtime.popularExtension') }}</el-text> <el-text>{{ $t('runtime.popularExtension') }}</el-text>
</div> </div>
@ -44,6 +47,8 @@ const extensions = ref([]);
const supportExtensions = ref([]); const supportExtensions = ref([]);
const loading = ref(false); const loading = ref(false);
const taskLogRef = ref(); const taskLogRef = ref();
const searchName = ref('');
const data = ref([]);
const handleClose = () => { const handleClose = () => {
open.value = false; open.value = false;
@ -113,10 +118,21 @@ const search = async () => {
try { try {
const res = await GetPHPExtensions(runtime.value.id); const res = await GetPHPExtensions(runtime.value.id);
extensions.value = res.data.extensions; extensions.value = res.data.extensions;
supportExtensions.value = res.data.supportExtensions; data.value = res.data.supportExtensions;
searchByName();
} catch (error) {} } catch (error) {}
}; };
const searchByName = () => {
if (searchName.value === '') {
supportExtensions.value = data.value;
return;
}
supportExtensions.value = data.value.filter((ext) =>
ext.name.toLowerCase().includes(searchName.value.toLowerCase()),
);
};
const acceptParams = (req: Runtime.Runtime): void => { const acceptParams = (req: Runtime.Runtime): void => {
open.value = true; open.value = true;
runtime.value = req; runtime.value = req;

View File

@ -98,7 +98,7 @@
<CreateRuntime ref="createRef" @close="search" @submit="openCreateLog" /> <CreateRuntime ref="createRef" @close="search" @submit="openCreateLog" />
<OpDialog ref="opRef" @search="search" /> <OpDialog ref="opRef" @search="search" />
<Log ref="logRef" @close="search" /> <Log ref="logRef" @close="search" :heightDiff="280" />
<Extensions ref="extensionsRef" @close="search" /> <Extensions ref="extensionsRef" @close="search" />
<AppResources ref="checkRef" @close="search" /> <AppResources ref="checkRef" @close="search" />
<ExtManagement ref="extManagementRef" @close="search" /> <ExtManagement ref="extManagementRef" @close="search" />