1
0
mirror of https://github.com/1Panel-dev/1Panel.git synced 2025-01-19 16:29:17 +08:00

fix: docker 关闭增加 socket、service 选项

This commit is contained in:
ssongliu 2023-03-11 23:44:16 +08:00 committed by ssongliu
parent c4e54b2f0f
commit c86822fd3d
7 changed files with 69 additions and 2 deletions

View File

@ -14,5 +14,7 @@ type DaemonJsonConf struct {
} }
type DockerOperation struct { type DockerOperation struct {
Operation string `json:"operation" validate:"required,oneof=start restart stop"` StopSocket bool `json:"stopSocket"`
StopService bool `json:"stopService"`
Operation string `json:"operation" validate:"required,oneof=start restart stop"`
} }

View File

@ -180,7 +180,14 @@ func (u *DockerService) UpdateConfByFile(req dto.DaemonJsonUpdateByFile) error {
} }
func (u *DockerService) OperateDocker(req dto.DockerOperation) error { func (u *DockerService) OperateDocker(req dto.DockerOperation) error {
stdout, err := cmd.Execf("systemctl %s docker ", req.Operation) service := "docker"
if req.Operation == "stop" {
service = "docker.service"
if req.StopSocket {
service = "docker.socket"
}
}
stdout, err := cmd.Execf("systemctl %s %s ", req.Operation, service)
if err != nil { if err != nil {
return errors.New(string(stdout)) return errors.New(string(stdout))
} }

View File

@ -19,6 +19,7 @@ declare module 'vue' {
ContainerLog: typeof import('./src/components/container-log/index.vue')['default'] ContainerLog: typeof import('./src/components/container-log/index.vue')['default']
DrawerHeader: typeof import('./src/components/drawer-header/index.vue')['default'] DrawerHeader: typeof import('./src/components/drawer-header/index.vue')['default']
ElAlert: typeof import('element-plus/es')['ElAlert'] ElAlert: typeof import('element-plus/es')['ElAlert']
ElAlter: typeof import('element-plus/es')['ElAlter']
ElAside: typeof import('element-plus/es')['ElAside'] ElAside: typeof import('element-plus/es')['ElAside']
ElAvatar: typeof import('element-plus/es')['ElAvatar'] ElAvatar: typeof import('element-plus/es')['ElAvatar']
ElBadge: typeof import('element-plus/es')['ElBadge'] ElBadge: typeof import('element-plus/es')['ElBadge']

View File

@ -241,6 +241,8 @@ export namespace Container {
file: string; file: string;
} }
export interface DockerOperate { export interface DockerOperate {
stopSocket: boolean;
stopService: boolean;
operation: string; operation: string;
} }
export interface DaemonJsonConf { export interface DaemonJsonConf {

View File

@ -529,6 +529,10 @@ export default {
composeOperatorHelper: '{1} operation will be performed on {0}. Do you want to continue?', composeOperatorHelper: '{1} operation will be performed on {0}. Do you want to continue?',
setting: 'Setting', setting: 'Setting',
stopHelper: 'docker service includes docker.service and docker.socket: ',
stopHelper2:
'When docker.service is stopped, Docker.socket will keep listening state. When docker command request is listened, The docker.service will be pulled up again.',
stopHelper3: 'Stopping docker.socket will make the docker.service service unavailable',
dockerStatus: 'Docker Service', dockerStatus: 'Docker Service',
daemonJsonPathHelper: 'Ensure that the configuration path is the same as that specified in docker.service.', daemonJsonPathHelper: 'Ensure that the configuration path is the same as that specified in docker.service.',
mirrors: 'Registry mirrors', mirrors: 'Registry mirrors',

View File

@ -541,6 +541,10 @@ export default {
composeOperatorHelper: '将对 {0} 进行 {1} 操作是否继续', composeOperatorHelper: '将对 {0} 进行 {1} 操作是否继续',
setting: '配置', setting: '配置',
stopHelper: 'docker 服务包括 docker.service docker.socket 两部分: ',
stopHelper2:
'停止 docker.service docker.socket 将保持监听状态当监听到 docker 命令请求时会将 docker.service 重新拉起',
stopHelper3: '停止 docker.socket 将导致 docker.service 服务不可用',
dockerStatus: 'Docker 服务', dockerStatus: 'Docker 服务',
daemonJsonPathHelper: '请保证配置路径与 docker.service 中指定的配置路径保持一致', daemonJsonPathHelper: '请保证配置路径与 docker.service 中指定的配置路径保持一致',
mirrors: '镜像加速', mirrors: '镜像加速',

View File

@ -102,6 +102,24 @@
</template> </template>
</LayoutContent> </LayoutContent>
<el-dialog v-model="stopVisiable" :title="$t('app.checkTitle')" width="50%" :destroy-on-close="true">
<el-alert :closable="false">
{{ $t('container.stopHelper') }}
<li>{{ $t('container.stopHelper2') }}</li>
<li>{{ $t('container.stopHelper3') }}</li>
</el-alert>
<div style="margin-top: 10px">
<el-checkbox v-model="stopService" label="docker.service" />
</div>
<div class="stopCheckbox"><el-checkbox v-model="stopSocket" label="docker.socket" /></div>
<template #footer>
<span class="dialog-footer">
<el-button @click="stopVisiable = false">{{ $t('commons.button.cancel') }}</el-button>
<el-button type="primary" @click="submitStop">{{ $t('commons.button.confirm') }}</el-button>
</span>
</template>
</el-dialog>
<ConfirmDialog ref="confirmDialogRef" @confirm="onSubmitSave"></ConfirmDialog> <ConfirmDialog ref="confirmDialogRef" @confirm="onSubmitSave"></ConfirmDialog>
</div> </div>
</template> </template>
@ -142,6 +160,10 @@ const formRef = ref<FormInstance>();
const dockerConf = ref(); const dockerConf = ref();
const confirmDialogRef = ref(); const confirmDialogRef = ref();
const stopVisiable = ref();
const stopSocket = ref();
const stopService = ref();
const onSave = async (formEl: FormInstance | undefined) => { const onSave = async (formEl: FormInstance | undefined) => {
if (!formEl) return; if (!formEl) return;
formEl.validate(async (valid) => { formEl.validate(async (valid) => {
@ -165,7 +187,13 @@ const onSaveFile = async () => {
}; };
const onOperator = async (operation: string) => { const onOperator = async (operation: string) => {
if (operation === 'stop') {
stopVisiable.value = true;
return;
}
let param = { let param = {
stopService: false,
stopSocket: false,
operation: operation, operation: operation,
}; };
loading.value = true; loading.value = true;
@ -181,6 +209,25 @@ const onOperator = async (operation: string) => {
}); });
}; };
const submitStop = async () => {
let param = {
stopService: stopService.value,
stopSocket: stopSocket.value,
operation: 'stop',
};
loading.value = true;
await dockerOperate(param)
.then(() => {
loading.value = false;
search();
changeMode();
MsgSuccess(i18n.global.t('commons.msg.operationSuccess'));
})
.catch(() => {
loading.value = false;
});
};
const onSubmitSave = async () => { const onSubmitSave = async () => {
if (confShowType.value === 'all') { if (confShowType.value === 'all') {
let param = { file: dockerConf.value }; let param = { file: dockerConf.value };