From 1befa1bb8cf3f692d0cd06ae4a648ae6efed5350 Mon Sep 17 00:00:00 2001 From: whyour Date: Wed, 23 Apr 2025 02:10:39 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BC=93=E5=AD=98=20node=20=E5=92=8C=20python?= =?UTF-8?q?=20=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- back/config/const.ts | 2 ++ back/config/util.ts | 34 +++++++++++++++++++++++++++++++++- back/data/dependence.ts | 12 ------------ back/services/dependence.ts | 25 ++++++++++--------------- docker/310.Dockerfile | 24 ++++++++++++++++-------- docker/Dockerfile | 24 ++++++++++++++++-------- 6 files changed, 77 insertions(+), 44 deletions(-) diff --git a/back/config/const.ts b/back/config/const.ts index ebecea4e..1a696604 100644 --- a/back/config/const.ts +++ b/back/config/const.ts @@ -23,3 +23,5 @@ export const SAMPLE_FILES = [ target: 'data/scripts/notify.py', }, ]; + +export const PYTHON_INSTALL_DIR = process.env.PYTHON_HOME; diff --git a/back/config/util.ts b/back/config/util.ts index 7b822403..cb0e199e 100644 --- a/back/config/util.ts +++ b/back/config/util.ts @@ -8,9 +8,10 @@ import psTreeFun from 'pstree.remy'; import { promisify } from 'util'; import { load } from 'js-yaml'; import config from './index'; -import { TASK_COMMAND } from './const'; +import { PYTHON_INSTALL_DIR, TASK_COMMAND } from './const'; import Logger from '../loaders/logger'; import { writeFileWithLock } from '../shared/utils'; +import { DependenceTypes } from '../data/dependence'; export * from './share'; @@ -558,3 +559,34 @@ export async function setSystemTimezone(timezone: string): Promise { return false; } } + +export function getInstallCommand(type: DependenceTypes, name: string): string { + const baseCommands = { + [DependenceTypes.nodejs]: 'pnpm add -g', + [DependenceTypes.python3]: + 'pip3 install --disable-pip-version-check --root-user-action=ignore', + [DependenceTypes.linux]: 'apk add --no-check-certificate', + }; + + let command = baseCommands[type]; + + if (type === DependenceTypes.python3 && PYTHON_INSTALL_DIR) { + command = `${command} --prefix=${PYTHON_INSTALL_DIR}`; + } + + return `${command} ${name.trim()}`; +} + +export function getUninstallCommand( + type: DependenceTypes, + name: string, +): string { + const baseCommands = { + [DependenceTypes.nodejs]: 'pnpm remove -g', + [DependenceTypes.python3]: + 'pip3 uninstall --disable-pip-version-check --root-user-action=ignore -y', + [DependenceTypes.linux]: 'apk del', + }; + + return `${baseCommands[type]} ${name.trim()}`; +} diff --git a/back/data/dependence.ts b/back/data/dependence.ts index 765ce63c..49dfe167 100644 --- a/back/data/dependence.ts +++ b/back/data/dependence.ts @@ -41,12 +41,6 @@ export enum DependenceTypes { 'linux', } -export enum InstallDependenceCommandTypes { - 'pnpm add -g', - 'pip3 install --disable-pip-version-check --root-user-action=ignore', - 'apk add --no-check-certificate', -} - export enum GetDependenceCommandTypes { 'pnpm ls -g ', 'pip3 show --disable-pip-version-check', @@ -59,12 +53,6 @@ export enum versionDependenceCommandTypes { '=', } -export enum unInstallDependenceCommandTypes { - 'pnpm remove -g', - 'pip3 uninstall --disable-pip-version-check --root-user-action=ignore -y', - 'apk del', -} - export interface DependenceInstance extends Model, Dependence {} diff --git a/back/services/dependence.ts b/back/services/dependence.ts index a6e2f1f1..28f0ac89 100644 --- a/back/services/dependence.ts +++ b/back/services/dependence.ts @@ -3,10 +3,8 @@ import winston from 'winston'; import config from '../config'; import { Dependence, - InstallDependenceCommandTypes, DependenceStatus, DependenceTypes, - unInstallDependenceCommandTypes, DependenceModel, GetDependenceCommandTypes, versionDependenceCommandTypes, @@ -19,6 +17,8 @@ import { getPid, killTask, promiseExecSuccess, + getInstallCommand, + getUninstallCommand, } from '../config/util'; import dayjs from 'dayjs'; import taskLimit from '../shared/pLimit'; @@ -153,8 +153,8 @@ export default class DependenceService { const docs = await DependenceModel.findAll({ where: { id: ids } }); for (const doc of docs) { taskLimit.removeQueuedDependency(doc); - const depInstallCommand = InstallDependenceCommandTypes[doc.type]; - const depUnInstallCommand = unInstallDependenceCommandTypes[doc.type]; + const depInstallCommand = getInstallCommand(doc.type, doc.name); + const depUnInstallCommand = getUninstallCommand(doc.type, doc.name); const installCmd = `${depInstallCommand} ${doc.name.trim()}`; const unInstallCmd = `${depUnInstallCommand} ${doc.name.trim()}`; const pids = await Promise.all([ @@ -226,11 +226,9 @@ export default class DependenceService { ? 'installDependence' : 'uninstallDependence'; let depName = dependency.name.trim(); - const depRunCommand = ( - isInstall - ? InstallDependenceCommandTypes - : unInstallDependenceCommandTypes - )[dependency.type]; + const command = isInstall + ? getInstallCommand(dependency.type, depName) + : getUninstallCommand(dependency.type, depName); const actionText = isInstall ? '安装' : '删除'; const startTime = dayjs(); @@ -304,12 +302,9 @@ export default class DependenceService { const proxyStr = dependenceProxyFileExist ? `source ${config.dependenceProxyFile} &&` : ''; - const cp = spawn( - `${proxyStr} ${depRunCommand} ${dependency.name.trim()}`, - { - shell: '/bin/bash', - }, - ); + const cp = spawn(`${proxyStr} ${command}`, { + shell: '/bin/bash', + }); cp.stdout.on('data', async (data) => { this.sockService.sendMessage({ diff --git a/docker/310.Dockerfile b/docker/310.Dockerfile index c15c5ed6..338430fb 100644 --- a/docker/310.Dockerfile +++ b/docker/310.Dockerfile @@ -14,14 +14,13 @@ LABEL maintainer="${QL_MAINTAINER}" ARG QL_URL=https://github.com/${QL_MAINTAINER}/qinglong.git ARG QL_BRANCH=develop -ENV PNPM_HOME=/root/.local/share/pnpm \ - PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/root/.local/share/pnpm:/root/.local/share/pnpm/global/5/node_modules \ - NODE_PATH=/usr/local/bin:/usr/local/pnpm-global/5/node_modules:/usr/local/lib/node_modules:/root/.local/share/pnpm/global/5/node_modules \ +ENV QL_DIR=/ql \ + QL_BRANCH=${QL_BRANCH} \ LANG=C.UTF-8 \ SHELL=/bin/bash \ PS1="\u@\h:\w \$ " \ - QL_DIR=/ql \ - QL_BRANCH=${QL_BRANCH} + PYTHONPATH= \ + PYTHON_SHORT_VERSION= VOLUME /ql/data @@ -56,11 +55,9 @@ RUN set -x \ && git config --global user.email "qinglong@@users.noreply.github.com" \ && git config --global user.name "qinglong" \ && git config --global http.postBuffer 524288000 \ - && rm -rf /root/.pnpm-store \ - && rm -rf /root/.local/share/pnpm/store \ && rm -rf /root/.cache \ && ulimit -c 0 \ - && pip3 install requests + && PYTHON_SHORT_VERSION=$(echo ${PYTHON_VERSION} | cut -d. -f1,2) ARG SOURCE_COMMIT RUN git clone --depth=1 -b ${QL_BRANCH} ${QL_URL} ${QL_DIR} \ @@ -73,6 +70,17 @@ RUN git clone --depth=1 -b ${QL_BRANCH} ${QL_URL} ${QL_DIR} \ && cp -rf /static/* ${QL_DIR}/static \ && rm -rf /static +ENV PNPM_HOME=${QL_DIR}/data/dep_cache/node \ + PYTHON_HOME=${QL_DIR}/data/dep_cache/python3 \ + PYTHONUSERBASE=${QL_DIR}/data/dep_cache/python3 + +ENV PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:${PNPM_HOME} \ + NODE_PATH=/usr/local/bin:/usr/local/lib/node_modules:${PNPM_HOME}/global/5/node_modules \ + PIP_CACHE_DIR=${PYTHON_HOME}/pip \ + PYTHONPATH=${PYTHON_HOME}:${PYTHON_HOME}/lib/python${PYTHON_SHORT_VERSION}:${PYTHON_HOME}/lib/python${PYTHON_SHORT_VERSION}/site-packages:${PYTHONPATH} + +RUN pip3 install --prefix ${PYTHON_HOME} requests + COPY --from=builder /tmp/build/node_modules/. /ql/node_modules/ WORKDIR ${QL_DIR} diff --git a/docker/Dockerfile b/docker/Dockerfile index 733919a5..33569ea8 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -14,14 +14,13 @@ LABEL maintainer="${QL_MAINTAINER}" ARG QL_URL=https://github.com/${QL_MAINTAINER}/qinglong.git ARG QL_BRANCH=develop -ENV PNPM_HOME=/root/.local/share/pnpm \ - PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/root/.local/share/pnpm:/root/.local/share/pnpm/global/5/node_modules \ - NODE_PATH=/usr/local/bin:/usr/local/pnpm-global/5/node_modules:/usr/local/lib/node_modules:/root/.local/share/pnpm/global/5/node_modules \ +ENV QL_DIR=/ql \ + QL_BRANCH=${QL_BRANCH} \ LANG=C.UTF-8 \ SHELL=/bin/bash \ PS1="\u@\h:\w \$ " \ - QL_DIR=/ql \ - QL_BRANCH=${QL_BRANCH} + PYTHONPATH= \ + PYTHON_SHORT_VERSION= VOLUME /ql/data @@ -56,11 +55,9 @@ RUN set -x \ && git config --global user.email "qinglong@@users.noreply.github.com" \ && git config --global user.name "qinglong" \ && git config --global http.postBuffer 524288000 \ - && rm -rf /root/.pnpm-store \ - && rm -rf /root/.local/share/pnpm/store \ && rm -rf /root/.cache \ && ulimit -c 0 \ - && pip3 install requests + && PYTHON_SHORT_VERSION=$(echo ${PYTHON_VERSION} | cut -d. -f1,2) ARG SOURCE_COMMIT RUN git clone --depth=1 -b ${QL_BRANCH} ${QL_URL} ${QL_DIR} \ @@ -73,6 +70,17 @@ RUN git clone --depth=1 -b ${QL_BRANCH} ${QL_URL} ${QL_DIR} \ && cp -rf /static/* ${QL_DIR}/static \ && rm -rf /static +ENV PNPM_HOME=${QL_DIR}/data/dep_cache/node \ + PYTHON_HOME=${QL_DIR}/data/dep_cache/python3 \ + PYTHONUSERBASE=${QL_DIR}/data/dep_cache/python3 + +ENV PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:${PNPM_HOME} \ + NODE_PATH=/usr/local/bin:/usr/local/lib/node_modules:${PNPM_HOME}/global/5/node_modules \ + PIP_CACHE_DIR=${PYTHON_HOME}/pip \ + PYTHONPATH=${PYTHON_HOME}:${PYTHON_HOME}/lib/python${PYTHON_SHORT_VERSION}:${PYTHON_HOME}/lib/python${PYTHON_SHORT_VERSION}/site-packages:${PYTHONPATH} + +RUN pip3 install --prefix ${PYTHON_HOME} requests + COPY --from=builder /tmp/build/node_modules/. /ql/node_modules/ WORKDIR ${QL_DIR}