1
0
mirror of https://github.com/1Panel-dev/1Panel.git synced 2025-02-12 11:30:07 +08:00

feat: 运行环境支持选择镜像源 (#2441)

This commit is contained in:
zhengkunwang 2023-10-07 04:00:47 -05:00 committed by GitHub
parent e76d1e018e
commit 92c28b3ed1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 48 additions and 5 deletions

View File

@ -278,6 +278,9 @@ func (r *RuntimeService) Get(id uint) (*response.RuntimeDTO, error) {
res.Params[k] = v res.Params[k] = v
} }
} }
if v, ok := envs["CONTAINER_PACKAGE_URL"]; ok {
res.Source = v
}
} }
return &res, nil return &res, nil

View File

@ -310,6 +310,7 @@ func handleParams(create request.RuntimeCreate, projectDir string) (composeConte
} else { } else {
create.Params["RUN_INSTALL"] = "0" create.Params["RUN_INSTALL"] = "0"
} }
create.Params["CONTAINER_PACKAGE_URL"] = create.Source
} }
newMap := make(map[string]string) newMap := make(map[string]string)

View File

@ -1774,6 +1774,9 @@ const message = {
'The {0} operation will be performed on the selected operating environment. Do you want to continue? ', 'The {0} operation will be performed on the selected operating environment. Do you want to continue? ',
statusHelper: statusHelper:
'Status description: Starting - the container has been started, but the application is starting; abnormal - the container has been started, but the application status is abnormal', 'Status description: Starting - the container has been started, but the application is starting; abnormal - the container has been started, but the application status is abnormal',
taobao: 'Taobao',
tencent: 'Tencent',
imageSource: 'Image source',
}, },
process: { process: {
pid: 'Process ID', pid: 'Process ID',

View File

@ -1676,6 +1676,9 @@ const message = {
close: '關閉', close: '關閉',
operatorHelper: '將對選取的執行環境進行 {0} 操作是否繼續 ', operatorHelper: '將對選取的執行環境進行 {0} 操作是否繼續 ',
statusHelper: '狀態說明啟動中-容器已啟動但應用正在啟動異常-容器已啟動但應用狀態異常', statusHelper: '狀態說明啟動中-容器已啟動但應用正在啟動異常-容器已啟動但應用狀態異常',
taobao: 'Taobao',
tencent: 'Tencent',
imageSource: 'Image source',
}, },
process: { process: {
pid: '進程ID', pid: '進程ID',

View File

@ -1675,6 +1675,9 @@ const message = {
close: '关闭', close: '关闭',
operatorHelper: '将对选中的运行环境进行 {0} 操作是否继续', operatorHelper: '将对选中的运行环境进行 {0} 操作是否继续',
statusHelper: '状态说明启动中-容器已启动但应用正在启动异常-容器已启动但应用状态异常', statusHelper: '状态说明启动中-容器已启动但应用正在启动异常-容器已启动但应用状态异常',
taobao: '淘宝',
tencent: '腾讯',
imageSource: '镜像源',
}, },
process: { process: {
pid: '进程ID', pid: '进程ID',

View File

@ -82,20 +82,20 @@
<span class="input-help">{{ $t('runtime.runScriptHelper') }}</span> <span class="input-help">{{ $t('runtime.runScriptHelper') }}</span>
</el-form-item> </el-form-item>
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="10"> <el-col :span="9">
<el-form-item :label="$t('runtime.appPort')" prop="params.NODE_APP_PORT"> <el-form-item :label="$t('runtime.appPort')" prop="params.NODE_APP_PORT">
<el-input v-model.number="runtime.params['NODE_APP_PORT']" /> <el-input v-model.number="runtime.params['NODE_APP_PORT']" />
<span class="input-help">{{ $t('runtime.appPortHelper') }}</span> <span class="input-help">{{ $t('runtime.appPortHelper') }}</span>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="10"> <el-col :span="9">
<el-form-item :label="$t('runtime.externalPort')" prop="port"> <el-form-item :label="$t('runtime.externalPort')" prop="port">
<el-input v-model.number="runtime.port" /> <el-input v-model.number="runtime.port" />
<span class="input-help">{{ $t('runtime.externalPortHelper') }}</span> <span class="input-help">{{ $t('runtime.externalPortHelper') }}</span>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="4"> <el-col :span="6">
<el-form-item :label="$t('app.allowPort')" prop="params.HOST_IP"> <el-form-item :label="$t('app.allowPort')" prop="params.HOST_IP">
<el-select v-model="runtime.params['HOST_IP']"> <el-select v-model="runtime.params['HOST_IP']">
<el-option :label="$t('runtime.open')" value="0.0.0.0"></el-option> <el-option :label="$t('runtime.open')" value="0.0.0.0"></el-option>
@ -110,6 +110,19 @@
<el-option label="yarn" value="yarn"></el-option> <el-option label="yarn" value="yarn"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item :label="$t('runtime.imageSource')" prop="source">
<el-select v-model="runtime.source" filterable allow-create default-first-option>
<el-option
v-for="(source, index) in imageSources"
:key="index"
:label="source.label + ' [' + source.value + ']'"
:value="source.value"
></el-option>
</el-select>
<span class="input-help">
{{ $t('runtime.phpsourceHelper') }}
</span>
</el-form-item>
<el-form-item :label="$t('app.containerName')" prop="params.CONTAINER_NAME"> <el-form-item :label="$t('app.containerName')" prop="params.CONTAINER_NAME">
<el-input v-model.trim="runtime.params['CONTAINER_NAME']"></el-input> <el-input v-model.trim="runtime.params['CONTAINER_NAME']"></el-input>
</el-form-item> </el-form-item>
@ -171,24 +184,41 @@ const initData = (type: string) => ({
rebuild: false, rebuild: false,
codeDir: '/', codeDir: '/',
port: 3000, port: 3000,
source: 'https://registry.npmjs.org/',
}); });
let runtime = reactive<Runtime.RuntimeCreate>(initData('node')); let runtime = reactive<Runtime.RuntimeCreate>(initData('node'));
const rules = ref<any>({ const rules = ref<any>({
name: [Rules.appName], name: [Rules.requiredInput, Rules.appName],
appID: [Rules.requiredSelect], appID: [Rules.requiredSelect],
codeDir: [Rules.requiredInput], codeDir: [Rules.requiredInput],
port: [Rules.requiredInput, Rules.port], port: [Rules.requiredInput, Rules.port],
source: [Rules.requiredSelect],
params: { params: {
NODE_APP_PORT: [Rules.requiredInput, Rules.port], NODE_APP_PORT: [Rules.requiredInput, Rules.port],
PACKAGE_MANAGER: [Rules.requiredSelect], PACKAGE_MANAGER: [Rules.requiredSelect],
HOST_IP: [Rules.requiredSelect], HOST_IP: [Rules.requiredSelect],
EXEC_SCRIPT: [Rules.requiredSelect], EXEC_SCRIPT: [Rules.requiredSelect],
CONTAINER_NAME: [Rules.requiredInput], CONTAINER_NAME: [Rules.requiredInput, Rules.containerName],
}, },
}); });
const scripts = ref<Runtime.NodeScripts[]>([]); const scripts = ref<Runtime.NodeScripts[]>([]);
const em = defineEmits(['close']); const em = defineEmits(['close']);
const imageSources = [
{
label: i18n.global.t('runtime.default'),
value: 'https://registry.npmjs.org/',
},
{
label: i18n.global.t('runtime.taobao'),
value: 'https://registry.npmmirror.com',
},
{
label: i18n.global.t('runtime.tencent'),
value: 'https://mirrors.cloud.tencent.com/npm/',
},
];
watch( watch(
() => runtime.params['NODE_APP_PORT'], () => runtime.params['NODE_APP_PORT'],
(newVal) => { (newVal) => {