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:
parent
d3efd02d69
commit
7f7731a52e
@ -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())
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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"))
|
||||||
|
@ -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)
|
||||||
|
@ -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',
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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" />
|
||||||
|
Loading…
x
Reference in New Issue
Block a user