@abtnode/docker-utils 1.17.8-beta-20260119-102944-6ba93a16 → 1.17.8-beta-20260121-102603-f9d0176f
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +1 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.mjs +1 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +2 -2
package/dist/index.cjs
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/docker-args.ts","../src/docker-parse-command.ts","../src/docker-args-validator.ts","../src/docker-args-to-camel-case.ts","../src/docker-cmd-validator.ts","../src/docker-args-schema.ts","../src/docker-parse-publish-ports.ts","../src/docker-parse-environments.ts","../src/get-obj-by-path.ts"],"sourcesContent":["export const whiteDockerArgs: Record<string, string> = {\n // 短参数映射\n '-a': '--attach', // 将标准输入、输出或错误流附加到容器(通常与 -i -t 一起使用)\n '-d': '--detach', // 以后台模式运行容器(分离模式)\n '-e': '--env', // 设置环境变量(例如:-e \"VAR=value\")\n '-h': '--hostname', // 设置容器的主机名\n '-i': '--interactive', // 保持 STDIN 为打开状态(与 -t 一起用可进入交互式模式)\n '-it': '-it',\n '-rm': '-rm',\n '-m': '--memory', // 限制容器可使用的内存大小(例如:-m 512m)\n '-p': '--publish', // 将容器的端口映射到主机(例如:-p 8080:80)\n '-P': '--publish-all', // 将容器暴露的所有端口随机映射到主机端口\n '-l': '--label', // 为容器添加自定义元数据标签(例如:-l \"key=value\")\n '-n': '--name', // 为容器指定名称,而不是自动分配\n '-q': '--quiet', // 静默模式,不输出日志信息(通常用于 docker build)\n '-x': '--x-registry', // 非标准参数(此处为自定义场景)可用于指定镜像注册表等\n '-t': '--tty', // 分配一个伪 TTY(终端),常与 -i 一起使用\n '-u': '--user', // 指定以哪个用户或 UID 运行容器内的进程\n '-v': '--volume', // 挂载宿主机目录或数据卷到容器中\n '-w': '--workdir', // 设置容器内的工作目录\n '-cgroupns': '--cgroupns', // 设置 cgroup 命名空间的模式(host 或 private)\n '-cpus': '--cpus', // 限制可用给容器的 CPU 数量\n '-g': '--gpus', // 分配 GPU 给容器(需要适配 NVIDIA runtime)\n '-ip6': '--ip6', // 设置容器的 IPv6 地址\n '--read-only': '--read-only', // 将容器的文件系统设置为只读\n\n // 长参数映射\n '--add-host': '--add-host', // 添加自定义主机名映射到 /etc/hosts 中(格式:host:IP)\n '--attach': '--attach', // 附加到容器的 STDIN/STDOUT/STDERR\n '--blkio-weight': '--blkio-weight', // 设置容器块 IO 相对权重(需要 cgroup 支持)\n '--blkio-weight-device': '--blkio-weight-device', // 针对指定设备设置块 IO 权重\n '--cap-add': '--cap-add', // 向容器添加 Linux 功能(Capabilities)\n '--cap-drop': '--cap-drop', // 从容器中移除特定 Linux 功能\n '--cgroup-parent': '--cgroup-parent', // 指定容器的 cgroup 父组\n '--cidfile': '--cidfile', // 将创建的容器 ID 写入到指定文件中\n '--cpu-period': '--cpu-period', // 限制 CPU CFS 调度周期\n '--cpu-quota': '--cpu-quota', // 限制 CPU CFS 配额,控制 CPU 时间的使用量\n '--cpu-rt-period': '--cpu-rt-period', // 调整 CPU 实时调度周期(需要特定权限)\n '--cpu-rt-runtime': '--cpu-rt-runtime', // 调整 CPU 实时调度运行时间(需要特定权限)\n '--cpu-shares': '--cpu-shares', // 设置 CPU 共享权重(相对值)\n '--cpus': '--cpus', // 限制容器可用 CPU 数量(例如:--cpus 2.5)\n '--cpuset-cpus': '--cpuset-cpus', // 指定容器能使用的 CPU 核心(例如:--cpuset-cpus=\"0-2,4\")\n '--cpuset-mems': '--cpuset-mems', // 指定容器能使用的内存节点(NUMA 节点)\n '--detach': '--detach', // 后台运行容器\n '--detach-keys': '--detach-keys', // 设置分离容器的键组合\n '--device': '--device', // 将主机设备映射到容器(例如:--device=/dev/sda:/dev/xvda)\n '--device-cgroup-rule': '--device-cgroup-rule', // 为设备访问添加 cgroup 规则\n '--device-read-bps': '--device-read-bps', // 限制设备读取速率(字节/秒)\n '--device-read-iops': '--device-read-iops', // 限制设备读取 IOPS\n '--device-write-bps': '--device-write-bps', // 限制设备写入速率(字节/秒)\n '--device-write-iops': '--device-write-iops', // 限制设备写入 IOPS\n '--disable-content-trust': '--disable-content-trust', // 禁用镜像拉取时的内容信任校验\n '--dns': '--dns', // 设置容器使用的 DNS 服务器\n '--dns-opt': '--dns-opt', // 为 DNS 配置添加选项\n '--dns-search': '--dns-search', // 为 DNS 搜索域配置添加域名\n '--domainname': '--domainname', // 设置容器的域名(FQDN)\n '--entrypoint': '--entrypoint', // 覆盖镜像的默认 ENTRYPOINT\n '--env': '--env', // 设置环境变量\n '--env-file': '--env-file', // 从文件中读取环境变量\n '--expose': '--expose', // 声明容器将会监听的端口(不做主机端口映射,只是元数据声明)\n '--gpus': '--gpus', // 分配 GPU 给容器\n '--group-add': '--group-add', // 向容器添加更多用户组(GID)\n '--health-cmd': '--health-cmd', // 容器健康检查命令\n '--health-interval': '--health-interval', // 健康检查的时间间隔\n '--health-retries': '--health-retries', // 健康检查的重试次数\n '--health-start-period': '--health-start-period', // 健康检查开始前的初始化等待时间\n '--health-timeout': '--health-timeout', // 健康检查的超时时间\n '--help': '--help', // 显示帮助信息\n '--hostname': '--hostname', // 设置容器主机名\n '--init': '--init', // 在容器内使用 init 进程(帮助处理僵尸进程)\n '--interactive': '--interactive', // 保持 STDIN 打开\n '--ip': '--ip', // 指定容器的 IPv4 地址(需自定义网络)\n '--ip6': '--ip6', // 指定容器的 IPv6 地址(需自定义网络)\n '--ipc': '--ipc', // 设置容器的 IPC 命名空间(shareable, container:id, 或 host)\n '--isolation': '--isolation', // 指定容器隔离级别(Windows 环境下使用,如 process 或 hyperv)\n '--kernel-memory': '--kernel-memory', // 限制内核内存使用(已弃用)\n '--label': '--label', // 为容器添加自定义元数据标签\n '--label-file': '--label-file', // 从文件中读取标签\n '--link': '--link', // 连接到另一个容器的网络别名(已弃用,建议用网络替代)\n '--link-local-ip': '--link-local-ip', // 为容器分配一个链接本地地址(IPv4/IPv6)\n '--log-driver': '--log-driver', // 设置容器日志驱动(例如 json-file、syslog 等)\n '--log-opt': '--log-opt', // 为日志驱动添加额外配置选项\n '--mac-address': '--mac-address', // 设置容器的 MAC 地址(需自定义网络)\n '--memory': '--memory', // 限制容器可使用的内存\n '--memory-reservation': '--memory-reservation', // 设置内存软限制(触发内存管理)\n '--memory-swap': '--memory-swap', // 设置内存+swap 的限制值\n '--memory-swappiness': '--memory-swappiness', // 调整内存交换行为(0-100)\n '--mount': '--mount', // 使用高级语法挂载数据卷或绑定宿主机目录\n '--name': '--name', // 指定容器名称\n '--network': '--network', // 指定容器使用的网络(默认 bridge)\n '--network-alias': '--network-alias', // 为容器添加网络别名(在用户定义网络中)\n '--no-healthcheck': '--no-healthcheck', // 禁用继承自镜像的健康检查\n '--oom-kill-disable': '--oom-kill-disable', // 禁用内存不足时对容器进程的杀死操作\n '--oom-score-adj': '--oom-score-adj', // 调整容器的 OOM 分数(影响 OOM 杀死优先级)\n '--pid': '--pid', // 设置 PID 命名空间(容器与主机共享进程视图)\n '--pids-limit': '--pids-limit', // 限制容器内可用的进程数\n '--platform': '--platform', // 指定镜像平台(如 linux/amd64)\n '--privileged': '--privileged', // 提升容器为特权模式(访问更多主机资源)\n '--publish': '--publish', // 映射容器端口到宿主机\n '--publish-all': '--publish-all', // 自动映射容器暴露的所有端口到宿主机随机端口\n '--pull': '--pull', // 指定拉取镜像策略(always, missing, never)\n '--restart': '--restart', // 容器退出后的重启策略(no, on-failure, always, unless-stopped)\n '--rm': '--rm', // 容器停止后自动删除容器\n '--runtime': '--runtime', // 指定运行时(如 runc, nvidia-container-runtime)\n '--security-opt': '--security-opt', // 设置安全选项(如 seccomp, apparmor 配置)\n '--shm-size': '--shm-size', // 设置 /dev/shm 的大小(默认 64M)\n '--stop-signal': '--stop-signal', // 设置停止容器时发送的信号(默认 SIGTERM)\n '--stop-timeout': '--stop-timeout', // 停止容器时等待指定秒数后发送 SIGKILL\n '--storage-opt': '--storage-opt', // 设置存储驱动的选项(如 devicemapper)\n '--sysctl': '--sysctl', // 设置内核参数(sysctl)\n '--tmpfs': '--tmpfs', // 挂载一个 tmpfs 临时文件系统\n '--tty': '--tty', // 分配一个伪终端 TTY\n '--ulimit': '--ulimit', // 设置容器的 ulimit 限制(如打开文件数)\n '--user': '--user', // 指定容器内运行进程的用户/组\n '--userns': '--userns', // 设置用户命名空间模式(host 或 private)\n '--uts': '--uts', // 设置 UTS 命名空间(host 或 container)\n '--volume': '--volume', // 挂载宿主机目录或数据卷到容器中\n '--volume-driver': '--volume-driver', // 指定数据卷驱动\n '--volumes-from': '--volumes-from', // 从另一个容器挂载数据卷\n '--workdir': '--workdir', // 设置容器内的工作目录\n};\n\nexport const allowDockerArgs: Record<string, boolean> = {\n '--env': true,\n '--publish': true,\n '--volume': true,\n '--attach': true,\n '--quiet': true,\n '--entrypoint': true,\n '--workdir': true,\n '--cidfile': true,\n '--detach-keys': true,\n '--disable-content-trust': true,\n '--domainname': true,\n '--expose': true,\n '--ip': true,\n '--link-local-ip': true,\n '--platform': true,\n};\n\nexport const autoSetDockerArgs: Record<string, boolean> = {\n '-rm': true,\n '--name': true,\n '--label': true,\n '--network': true,\n '--user': true,\n};\n\nexport const notAllowUseCustomDockerArgs: Record<string, boolean> = {\n '--volume': true,\n '--publish': true,\n};\n","/* eslint-disable no-continue */\n/* eslint-disable no-param-reassign */\n/* eslint-disable no-lonely-if */\nimport { whiteDockerArgs } from './docker-args';\n\nexport type DockerArgs = {\n key: string;\n value: string;\n type?: string;\n name?: string;\n path?: string;\n prefix?: string;\n protocol?: string;\n proxyBehavior?: string;\n}[];\n\nexport type DockerEnvs = {\n key: string;\n value: string;\n description?: string;\n secure?: boolean;\n shared?: boolean;\n required?: boolean;\n custom?: string;\n}[];\n\nconst needValueKeys = new Set(['--publish', '--volume']);\n\nexport const isVolumePath = (volume: string) => {\n const [hostPart] = volume.split(':');\n return (\n hostPart?.startsWith('/') ||\n hostPart?.startsWith('./') ||\n hostPart?.startsWith('../') ||\n hostPart?.startsWith('~') ||\n hostPart?.startsWith('$BLOCKLET')\n );\n};\n\nexport function addBlockletPrefixVolume(args: DockerArgs): DockerArgs {\n return args.map((arg) => {\n if (arg.key !== '--volume') return arg;\n\n // 已经带了 $BLOCKLET_APP_DIR / $BLOCKLET_DATA_DIR,直接返回\n if (arg.value.startsWith('$BLOCKLET_APP_DIR/') || arg.value.startsWith('$BLOCKLET_DATA_DIR/')) {\n return arg;\n }\n\n // 拆分 hostPart:containerPart[:options]\n const [hostPart, ...rest] = arg.value.split(':');\n if (!hostPart) {\n return arg;\n }\n\n if (!isVolumePath(arg.value)) {\n return arg;\n }\n\n // 路径 → 加 $BLOCKLET_DATA_DIR 前缀\n const newHostPart = hostPart.startsWith('/') ? `$BLOCKLET_DATA_DIR${hostPart}` : `$BLOCKLET_DATA_DIR/${hostPart}`;\n\n return { ...arg, value: [newHostPart, ...rest].join(':') };\n });\n}\n\nfunction parseFirstPublishWeb(args: DockerArgs): DockerArgs {\n let firstPublish = true;\n const hasWebType = args.find((arg) => arg.key === '--publish' && arg.type === 'web');\n if (hasWebType) {\n return args.map((arg) => {\n if (arg.key === '--publish') {\n const next = { ...arg, type: firstPublish ? 'docker' : arg.type };\n firstPublish = arg.type === 'web';\n return next;\n }\n\n return arg;\n });\n }\n return args.map((arg) => {\n if (arg.key === '--publish') {\n const next = { ...arg, type: firstPublish ? 'web' : 'docker' };\n firstPublish = false;\n return next;\n }\n\n return arg;\n });\n}\n\nexport function dockerParseCommand(command: string): {\n dockerArgs: DockerArgs;\n dockerEnvs: DockerEnvs;\n dockerImage: string;\n dockerCommand: string;\n} {\n if (!command) {\n return { dockerArgs: [], dockerEnvs: [], dockerImage: '', dockerCommand: '' };\n }\n\n command = command.trim();\n if (command.startsWith('$ docker run')) {\n command = command.replace('$ docker run', 'docker run');\n }\n if (!command.startsWith('docker run')) {\n return { dockerArgs: [], dockerEnvs: [], dockerImage: '', dockerCommand: '' };\n }\n\n // 移除续行符和换行符,将整个命令合并为单行\n const cleanedCommand = command.replace(/\\\\\\n/g, '').replace(/\\n/g, ' ').trim();\n\n // 匹配命令部分,同时处理单引号和双引号\n const parts = cleanedCommand.match(/(?:[^\\s\"']+|'[^']*'|\"[^\"]*\")+/g);\n\n if (!parts) {\n return { dockerArgs: [], dockerEnvs: [], dockerImage: '', dockerCommand: '' };\n }\n\n const dockerArgs: DockerArgs = [];\n const dockerEnvs: DockerEnvs = [];\n\n let i = 0;\n let dockerImage = '';\n let dockerCommand = '';\n const lastArgs: string[] = [];\n\n while (i < parts.length) {\n const part = parts[i];\n if (!part) {\n i++;\n continue;\n }\n\n // 忽略 'docker' 和 'run'\n if (part === 'docker' || part === 'run') {\n i++;\n continue;\n }\n\n // 处理环境变量参数 '-e' 或 '--env'\n if ((part === '-e' || part === '--env') && i + 1 < parts.length) {\n const envString = parts[i + 1] || '';\n const [envKey, ...envValueParts] = envString.split('=');\n if (envKey) {\n const envValue = envValueParts.join('=').replace(/^['\"]|['\"]$/g, '');\n dockerEnvs.push({ key: envKey, value: envValue });\n }\n i += 2;\n continue;\n }\n\n // 处理其他 Docker 参数\n if (part.startsWith('-') && lastArgs.length === 0) {\n const equalIndex = part.indexOf('=');\n let rawKey = part;\n let value: string | null = null;\n\n if (equalIndex !== -1) {\n // 处理类似 --expose=53 的情况\n rawKey = part.substring(0, equalIndex);\n value = part.substring(equalIndex + 1).replace(/^['\"]|['\"]$/g, '');\n }\n\n const fullKey = whiteDockerArgs[rawKey];\n if (!fullKey) {\n // 如果参数不在白名单中,直接跳过 (同时要跳过 value)\n i += 2;\n continue;\n }\n\n if (fullKey === '--publish') {\n // 处理 --publish 参数,不进行任何替换\n let publishValue = '';\n\n if (value) {\n // 处理类似 --publish=53:53/udp 的情况\n publishValue = value;\n dockerArgs.push({ key: fullKey, value: publishValue });\n } else {\n // 参数和值分开,或者布尔参数\n if (i + 1 < parts.length && !(parts[i + 1] || '').startsWith('-')) {\n const nextVal = (parts[i + 1] || '').replace(/^['\"]|['\"]$/g, '');\n publishValue = nextVal;\n dockerArgs.push({ key: fullKey, value: publishValue });\n i += 2;\n continue;\n } else {\n // 布尔参数,标记为 'true'\n dockerArgs.push({ key: fullKey, value: 'true' });\n i++;\n continue;\n }\n }\n i++;\n continue;\n }\n\n if (value !== null) {\n // 参数和值在同一个部分\n dockerArgs.push({ key: fullKey, value });\n i++;\n continue;\n } else {\n // 参数和值分开,或布尔参数\n if (i + 1 < parts.length && !(parts[i + 1] || '').startsWith('-')) {\n const nextVal = (parts[i + 1] || '').replace(/^['\"]|['\"]$/g, '');\n dockerArgs.push({ key: fullKey, value: nextVal });\n i += 2;\n continue;\n } else {\n dockerArgs.push({ key: fullKey, value: 'true' });\n i++;\n continue;\n }\n }\n }\n\n lastArgs.push(part);\n i++;\n }\n dockerImage = lastArgs[0] || '';\n dockerCommand = lastArgs.slice(1).join(' ');\n const filteredDockerArgs: DockerArgs = [];\n for (const arg of dockerArgs) {\n arg.name = '';\n arg.path = '';\n arg.prefix = '';\n arg.protocol = '';\n arg.proxyBehavior = 'service';\n arg.type = 'docker';\n if (needValueKeys.has(arg.key) && arg.value === 'true') {\n continue;\n }\n filteredDockerArgs.push(arg);\n }\n for (const item of dockerEnvs) {\n item.custom = '';\n item.description = '';\n item.secure = false;\n item.shared = false;\n item.required = false;\n }\n\n return {\n dockerArgs: parseFirstPublishWeb(addBlockletPrefixVolume(filteredDockerArgs)),\n dockerEnvs,\n dockerImage,\n dockerCommand,\n };\n}\n\nexport function dockerBuildCommand({\n dockerArgs,\n dockerEnvs,\n dockerImage,\n dockerCommand,\n}: {\n dockerArgs: DockerArgs;\n dockerEnvs: DockerEnvs;\n dockerImage: string;\n dockerCommand: string;\n}): string {\n if (dockerArgs.length === 0 && dockerEnvs.length === 0 && !dockerImage) {\n return '';\n }\n\n const parts: string[] = ['docker run \\\\'];\n\n // 定义哪些参数可以多次出现\n const multipleArgs = new Set([\n '--publish',\n '--volume',\n '--expose',\n '--device',\n '--mount',\n '--label',\n '--cap-add',\n '--cap-drop',\n '--add-host',\n '--dns',\n '--network-alias',\n '--sysctl',\n '--ulimit',\n '--network',\n ]);\n\n // 处理 dockerArgs\n for (const arg of dockerArgs) {\n const { key, value } = arg;\n\n if (multipleArgs.has(key)) {\n if (value === 'true') {\n parts.push(` ${key} \\\\`);\n } else {\n // 如果值包含空格或特殊字符,添加引号\n const formattedValue = /[\\s\"']/g.test(value) ? `\"${value}\"` : value;\n parts.push(` ${key} ${formattedValue} \\\\`);\n }\n } else {\n // 对于不可重复参数,只使用第一个出现的值\n if (!parts.some((part) => part.startsWith(` ${key}`))) {\n if (value === 'true') {\n parts.push(` ${key} \\\\`);\n } else {\n // 如果值包含空格或特殊字符,添加引号\n const formattedValue = /[\\s\"']/g.test(value) ? `\"${value}\"` : value;\n parts.push(` ${key} ${formattedValue} \\\\`);\n }\n }\n }\n }\n\n // 处理 dockerEnv\n for (const env of dockerEnvs) {\n const { key, value } = env;\n // 如果值包含空格或特殊字符,添加引号\n const formattedEnvValue = /[\"']/g.test(value) ? value : `\"${value}\"`;\n parts.push(` -e ${key}=${formattedEnvValue} \\\\`);\n }\n\n if (dockerImage) {\n parts.push(` ${dockerImage} \\\\`);\n }\n if (dockerCommand) {\n parts.push(` ${dockerCommand} \\\\`);\n }\n // 移除最后的续行符\n if (parts[parts.length - 1]?.endsWith(' \\\\')) {\n parts[parts.length - 1] = (parts[parts.length - 1] || '').slice(0, -2);\n }\n\n return parts.join('\\n');\n}\n","import { isVolumePath } from './docker-parse-command';\n\nexport const dockerArgsValidator: Record<string, (value: string) => string> = {\n '--volume': (volume) => {\n // 拆分 hostPart:containerPart[:options]\n const [hostPart] = volume.split(':');\n if (!hostPart) {\n return 'Volume must start with key:value';\n }\n\n const isPath = isVolumePath(volume);\n if (isPath && !volume.startsWith('$BLOCKLET_APP_DIR/') && !volume.startsWith('$BLOCKLET_DATA_DIR/')) {\n // @ts-ignore\n return 'Volume must start with $BLOCKLET_APP_DIR or $BLOCKLET_DATA_DIR';\n }\n if (volume.indexOf('..') > -1) {\n // @ts-ignore\n return 'Volume cannot contain \"..\"';\n }\n return '';\n },\n};\n","/**\n * 将短横线格式的字符串转换为驼峰式。\n * @param str - 输入的短横线格式字符串,例如 '--aa-bb'\n * @returns 驼峰式字符串,例如 'aaBb'\n */\nexport const dockerArgsToCamelCase = (str: string): string => {\n // 移除前导的 '--' 或 '-'\n const strippedStr = str.replace(/^[-]+/, '');\n\n // 将短横线后的字母转换为大写\n const camelCaseStr = strippedStr.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase());\n\n return camelCaseStr;\n};\n\n/**\n * 将驼峰式字符串转换为短横线格式。\n * @param str - 输入的驼峰式字符串,例如 'aaBb'\n * @returns 短横线格式字符串,例如 '--aa-bb'\n */\nexport const dockerCamelCaseToDash = (str: string): string => {\n // 在大写字母前添加短横线,并转换为小写\n const kebabCaseStr = str.replace(/([A-Z])/g, '-$1').toLowerCase();\n\n // 在结果前添加 '--'\n return `--${kebabCaseStr}`;\n};\n","const DANGEROUS_CMD = [' -- ', '~', '&', '|', '>', '<', '{', '}', '[', ']', ';', '$', '!', '*', '%', '&&', '||', ','];\nconst DANGEROUS_CMD_BIN = ['rm ', 'sudo '];\n\nexport function dockerCmdValidator(dockerCommand: string) {\n if (dockerCommand === '') {\n return;\n }\n\n const dangerousPattern = /(\\n|\\\\n|\\\\\\n|\\t|\\\\t|\\\\\\t)/;\n if (dangerousPattern.test(dockerCommand)) {\n throw new Error('Docker CMD is invalid');\n }\n\n const lowerCaseDockerCommand = dockerCommand.toLocaleLowerCase();\n if (DANGEROUS_CMD_BIN.some((item) => lowerCaseDockerCommand.indexOf(item) !== -1)) {\n throw new Error('Docker CMD is invalid');\n }\n\n if (DANGEROUS_CMD.some((item) => dockerCommand.indexOf(item) !== -1)) {\n throw new Error('Docker CMD is invalid');\n }\n\n // eslint-disable-next-line no-useless-escape\n const strictCommandReg = /^(?:(?:[a-zA-Z0-9\\-_.\\/:=\\s]+)|(?:\\@{1,2}[a-zA-Z_][a-zA-Z0-9_]*))+$/;\n\n if (!strictCommandReg.test(dockerCommand)) {\n throw new Error('Docker CMD is invalid');\n }\n}\n","import Joi, { LanguageMessages } from 'joi';\nimport { allowDockerArgs } from './docker-args';\nimport { dockerArgsToCamelCase, dockerCamelCaseToDash } from './docker-args-to-camel-case';\nimport { dockerArgsValidator } from './docker-args-validator';\nimport { dockerCmdValidator } from './docker-cmd-validator';\n\n// 计算最终允许的 Docker 参数键, 不包含 env, 转换为驼峰\nconst allowedDockerArgKeys = Array.from(new Set(Object.keys(allowDockerArgs).map(dockerArgsToCamelCase)));\n\n// 定义允许多个值的参数\nexport const multiValueArgs = ['publish', 'volume'];\n\n// 定义 Docker 主体的 Joi 验证架构\nexport const dockerSchema = Joi.object({\n workdir: Joi.string().trim().optional(),\n image: Joi.string()\n .trim()\n .regex(/^[^\\s]+$/)\n .optional(),\n shell: Joi.string().trim().optional(),\n // network: Joi.string().valid('host', 'bridge', 'none').default('host').optional(),\n volumes: Joi.array().items(Joi.string().trim()).optional(),\n script: Joi.string().trim().optional(),\n installNodeModules: Joi.boolean().optional(),\n skipWrapDockerfile: Joi.boolean().optional(),\n tmpfs: Joi.string().trim().optional(),\n command: Joi.string()\n .allow('')\n .default('')\n .optional()\n .custom((value: string, helpers: Joi.CustomHelpers) => {\n try {\n // 调用自定义校验函数\n dockerCmdValidator(value);\n return value;\n } catch (error) {\n return helpers.error('any.invalid', { message: (error as Error).message });\n }\n }, 'Docker CMD validation'),\n runBaseScript: Joi.boolean().optional(),\n // 动态 Docker 参数\n ...allowedDockerArgKeys.reduce(\n (acc, key) => {\n const validFn = dockerArgsValidator[dockerCamelCaseToDash(key)];\n if (multiValueArgs.includes(key)) {\n acc[key] = Joi.array().items(Joi.string().trim()).optional();\n\n if (validFn) {\n acc[key] = Joi.array()\n .items(\n Joi.string()\n .trim()\n .custom((value: string, helper: Joi.CustomHelpers) => {\n const msg = validFn(value);\n if (msg) {\n return helper.message(msg as unknown as LanguageMessages);\n }\n return value;\n }) // eslint-disable-line @typescript-eslint/comma-dangle\n )\n .optional();\n } else {\n acc[key] = Joi.array().items(Joi.string().trim()).optional();\n }\n return acc;\n }\n\n if (validFn) {\n acc[key] = Joi.string()\n .trim()\n .custom((value: string, helper: Joi.CustomHelpers) => {\n const msg = validFn(value);\n if (msg) {\n return helper.message(msg as unknown as LanguageMessages);\n }\n return value;\n })\n .optional();\n } else {\n acc[key] = Joi.string().trim().optional();\n }\n return acc;\n },\n {} as Record<string, Joi.AnySchema> // eslint-disable-line @typescript-eslint/comma-dangle\n ),\n}).optional();\n\nconst validateDockerImage = (dockerImage: string) => {\n const reg =\n /^(?:[a-zA-Z0-9.-]+(?::[0-9]+)?\\/)?(?:[a-z0-9]+(?:[._-][a-z0-9]+)*\\/)?[a-z0-9]+(?:[._-][a-z0-9]+)*(:[a-zA-Z0-9_.-]+)?$/;\n\n return Joi.string().trim().regex(reg).required().validate(dockerImage);\n};\n\nexport const parseDockerArgsToSchema = (\n dockerImage: string,\n dockerCommand: string,\n // eslint-disable-next-line @typescript-eslint/comma-dangle\n args: { key: string; value: string }[]\n) => {\n const obj: Record<string, string[] | string> = {};\n args.forEach((item) => {\n const key = dockerArgsToCamelCase(item.key);\n if (multiValueArgs.includes(key)) {\n obj[key] = [...(obj[key] || []), item.value];\n } else {\n obj[key] = item.value;\n }\n });\n const { error } = validateDockerImage(dockerImage);\n if (error) {\n return { error, value: obj };\n }\n try {\n dockerCmdValidator(dockerImage);\n } catch (err) {\n return { error: err as Error, value: obj };\n }\n obj.image = dockerImage;\n obj.command = dockerCommand || '';\n return dockerSchema.validate(obj);\n};\n","import { DockerArgs } from './docker-parse-command';\n\ninterface PublishPort {\n type: string;\n name: string;\n path: string;\n port: string;\n containerPort: number;\n hostIP: string;\n prefix: string;\n proxyBehavior: string;\n}\n\nexport function dockerParsePublishPorts(blockletTitle: string, dockerArgs: DockerArgs): PublishPort[] {\n const updatedDockerArgs: DockerArgs = JSON.parse(JSON.stringify(dockerArgs));\n const hostPortMap = new Map<string, string>();\n let blockletPortIndex = 1;\n const publishPorts: PublishPort[] = [];\n\n updatedDockerArgs.forEach((arg) => {\n if (arg.key === '--publish') {\n const publishValue = arg.value;\n const parts = publishValue.split(':');\n\n let hostIP = '127.0.0.1';\n let hostPort = '';\n let containerPort = '';\n\n if (parts.length === 2) {\n // 格式: hostPort:containerPort\n [hostPort, containerPort] = parts as [string, string];\n } else if (parts.length === 3) {\n // 格式: hostIP:hostPort:containerPort\n [hostIP, hostPort, containerPort] = parts as [string, string, string];\n } else if (parts.length === 1) {\n // 仅指定 containerPort(非标准,但兼容处理)\n containerPort = parts[0] || '';\n }\n\n // 检查是否已经映射该 hostPort\n let blockletPort = hostPortMap.get(hostPort || '');\n if (!blockletPort) {\n blockletPort = `$BLOCKLET_PORT_${blockletPortIndex++}`;\n hostPortMap.set(hostPort || '', blockletPort);\n }\n\n if (!publishPorts.find((port) => port.port === hostPort)) {\n const type = arg.type || 'docker';\n const blockletPathName = `${blockletTitle.replace(/\\W/g, '-')}-${publishPorts.length + 1}`;\n publishPorts.push({\n type,\n proxyBehavior: arg.proxyBehavior || '',\n name: blockletPathName,\n path: `/${blockletPathName}`,\n port: hostPort || containerPort, // 若未指定 hostPort,则使用 containerPort\n containerPort: Number(containerPort) || 0,\n hostIP,\n prefix: type === 'docker' ? `/${blockletPathName}` : arg.prefix || '*',\n });\n }\n }\n });\n\n return publishPorts;\n}\n","import { DockerEnvs } from './docker-parse-command';\n\ninterface DockerEnv {\n name: string;\n default: string;\n secure: boolean;\n shared: boolean;\n required: boolean;\n description: string;\n custom?: string;\n}\n\nexport function dockerParseEnvironments(envs: DockerEnvs, ignoreCustom = false) {\n const blockletEnvs: DockerEnv[] = [];\n\n if (!envs) {\n return blockletEnvs;\n }\n for (const env of envs) {\n const item: DockerEnv = {\n name: env.key,\n default: env.value === `$${env.key}` ? '' : env.value,\n secure: env.secure !== undefined ? env.secure : false,\n shared: env.shared !== undefined ? env.shared : false,\n required: env.required !== undefined ? env.required : false,\n description: env.description || env.key,\n };\n if (!ignoreCustom) {\n item.custom = env.custom || '';\n }\n blockletEnvs.push(item);\n }\n return blockletEnvs;\n}\n","// 获取对象的值,支持通过路径获取, 忽略大小写\n// 类似 path 例如: port.BLOCKLET_PORT, interfaces[0].name\n// 支持数组条件 例如: interfaces[type=web].name\nexport function getObjByPath(data: Record<string, unknown>, path: string) {\n const obj = JSON.parse(JSON.stringify(data));\n const keys = path\n .split('.')\n .map((key) => {\n const match = key.match(/(.+)\\[(.+?)\\]/);\n return match ? [match[1], match[2]] : key;\n })\n .flat();\n\n return keys.filter(Boolean).reduce((acc, key) => {\n if (!acc || !key) {\n return undefined;\n }\n\n // 检测数组条件\n const conditionMatch = key?.match(/(.+?)=(.+)/);\n if (Array.isArray(acc) && conditionMatch) {\n const [, field, value] = conditionMatch;\n if (field && value) {\n /* eslint-disable no-param-reassign */\n acc = acc.find((item: Record<string, unknown>) => {\n const lowerField = Object.keys(item).find((k) => k.toLowerCase() === field.toLowerCase());\n return lowerField && item[lowerField] === value;\n });\n }\n return acc;\n }\n\n // 忽略大小写查找对象键\n const lowerKey = Object.keys(acc).find((k) => k.toLowerCase() === key.toLowerCase());\n return lowerKey ? acc[lowerKey] : undefined;\n }, obj);\n}\n"],"names":["Joi"],"mappings":"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"}
|
package/dist/index.mjs
CHANGED
|
@@ -727,3 +727,4 @@ function getObjByPath(data, path) {
|
|
|
727
727
|
}
|
|
728
728
|
|
|
729
729
|
export { addBlockletPrefixVolume, allowDockerArgs, autoSetDockerArgs, dockerArgsToCamelCase, dockerArgsValidator, dockerBuildCommand, dockerCamelCaseToDash, dockerCmdValidator, dockerParseCommand, dockerParseEnvironments, dockerParsePublishPorts, dockerSchema, getObjByPath, isVolumePath, multiValueArgs, notAllowUseCustomDockerArgs, parseDockerArgsToSchema, whiteDockerArgs };
|
|
730
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../src/docker-args.ts","../src/docker-parse-command.ts","../src/docker-args-validator.ts","../src/docker-args-to-camel-case.ts","../src/docker-cmd-validator.ts","../src/docker-args-schema.ts","../src/docker-parse-publish-ports.ts","../src/docker-parse-environments.ts","../src/get-obj-by-path.ts"],"sourcesContent":["export const whiteDockerArgs: Record<string, string> = {\n // 短参数映射\n '-a': '--attach', // 将标准输入、输出或错误流附加到容器(通常与 -i -t 一起使用)\n '-d': '--detach', // 以后台模式运行容器(分离模式)\n '-e': '--env', // 设置环境变量(例如:-e \"VAR=value\")\n '-h': '--hostname', // 设置容器的主机名\n '-i': '--interactive', // 保持 STDIN 为打开状态(与 -t 一起用可进入交互式模式)\n '-it': '-it',\n '-rm': '-rm',\n '-m': '--memory', // 限制容器可使用的内存大小(例如:-m 512m)\n '-p': '--publish', // 将容器的端口映射到主机(例如:-p 8080:80)\n '-P': '--publish-all', // 将容器暴露的所有端口随机映射到主机端口\n '-l': '--label', // 为容器添加自定义元数据标签(例如:-l \"key=value\")\n '-n': '--name', // 为容器指定名称,而不是自动分配\n '-q': '--quiet', // 静默模式,不输出日志信息(通常用于 docker build)\n '-x': '--x-registry', // 非标准参数(此处为自定义场景)可用于指定镜像注册表等\n '-t': '--tty', // 分配一个伪 TTY(终端),常与 -i 一起使用\n '-u': '--user', // 指定以哪个用户或 UID 运行容器内的进程\n '-v': '--volume', // 挂载宿主机目录或数据卷到容器中\n '-w': '--workdir', // 设置容器内的工作目录\n '-cgroupns': '--cgroupns', // 设置 cgroup 命名空间的模式(host 或 private)\n '-cpus': '--cpus', // 限制可用给容器的 CPU 数量\n '-g': '--gpus', // 分配 GPU 给容器(需要适配 NVIDIA runtime)\n '-ip6': '--ip6', // 设置容器的 IPv6 地址\n '--read-only': '--read-only', // 将容器的文件系统设置为只读\n\n // 长参数映射\n '--add-host': '--add-host', // 添加自定义主机名映射到 /etc/hosts 中(格式:host:IP)\n '--attach': '--attach', // 附加到容器的 STDIN/STDOUT/STDERR\n '--blkio-weight': '--blkio-weight', // 设置容器块 IO 相对权重(需要 cgroup 支持)\n '--blkio-weight-device': '--blkio-weight-device', // 针对指定设备设置块 IO 权重\n '--cap-add': '--cap-add', // 向容器添加 Linux 功能(Capabilities)\n '--cap-drop': '--cap-drop', // 从容器中移除特定 Linux 功能\n '--cgroup-parent': '--cgroup-parent', // 指定容器的 cgroup 父组\n '--cidfile': '--cidfile', // 将创建的容器 ID 写入到指定文件中\n '--cpu-period': '--cpu-period', // 限制 CPU CFS 调度周期\n '--cpu-quota': '--cpu-quota', // 限制 CPU CFS 配额,控制 CPU 时间的使用量\n '--cpu-rt-period': '--cpu-rt-period', // 调整 CPU 实时调度周期(需要特定权限)\n '--cpu-rt-runtime': '--cpu-rt-runtime', // 调整 CPU 实时调度运行时间(需要特定权限)\n '--cpu-shares': '--cpu-shares', // 设置 CPU 共享权重(相对值)\n '--cpus': '--cpus', // 限制容器可用 CPU 数量(例如:--cpus 2.5)\n '--cpuset-cpus': '--cpuset-cpus', // 指定容器能使用的 CPU 核心(例如:--cpuset-cpus=\"0-2,4\")\n '--cpuset-mems': '--cpuset-mems', // 指定容器能使用的内存节点(NUMA 节点)\n '--detach': '--detach', // 后台运行容器\n '--detach-keys': '--detach-keys', // 设置分离容器的键组合\n '--device': '--device', // 将主机设备映射到容器(例如:--device=/dev/sda:/dev/xvda)\n '--device-cgroup-rule': '--device-cgroup-rule', // 为设备访问添加 cgroup 规则\n '--device-read-bps': '--device-read-bps', // 限制设备读取速率(字节/秒)\n '--device-read-iops': '--device-read-iops', // 限制设备读取 IOPS\n '--device-write-bps': '--device-write-bps', // 限制设备写入速率(字节/秒)\n '--device-write-iops': '--device-write-iops', // 限制设备写入 IOPS\n '--disable-content-trust': '--disable-content-trust', // 禁用镜像拉取时的内容信任校验\n '--dns': '--dns', // 设置容器使用的 DNS 服务器\n '--dns-opt': '--dns-opt', // 为 DNS 配置添加选项\n '--dns-search': '--dns-search', // 为 DNS 搜索域配置添加域名\n '--domainname': '--domainname', // 设置容器的域名(FQDN)\n '--entrypoint': '--entrypoint', // 覆盖镜像的默认 ENTRYPOINT\n '--env': '--env', // 设置环境变量\n '--env-file': '--env-file', // 从文件中读取环境变量\n '--expose': '--expose', // 声明容器将会监听的端口(不做主机端口映射,只是元数据声明)\n '--gpus': '--gpus', // 分配 GPU 给容器\n '--group-add': '--group-add', // 向容器添加更多用户组(GID)\n '--health-cmd': '--health-cmd', // 容器健康检查命令\n '--health-interval': '--health-interval', // 健康检查的时间间隔\n '--health-retries': '--health-retries', // 健康检查的重试次数\n '--health-start-period': '--health-start-period', // 健康检查开始前的初始化等待时间\n '--health-timeout': '--health-timeout', // 健康检查的超时时间\n '--help': '--help', // 显示帮助信息\n '--hostname': '--hostname', // 设置容器主机名\n '--init': '--init', // 在容器内使用 init 进程(帮助处理僵尸进程)\n '--interactive': '--interactive', // 保持 STDIN 打开\n '--ip': '--ip', // 指定容器的 IPv4 地址(需自定义网络)\n '--ip6': '--ip6', // 指定容器的 IPv6 地址(需自定义网络)\n '--ipc': '--ipc', // 设置容器的 IPC 命名空间(shareable, container:id, 或 host)\n '--isolation': '--isolation', // 指定容器隔离级别(Windows 环境下使用,如 process 或 hyperv)\n '--kernel-memory': '--kernel-memory', // 限制内核内存使用(已弃用)\n '--label': '--label', // 为容器添加自定义元数据标签\n '--label-file': '--label-file', // 从文件中读取标签\n '--link': '--link', // 连接到另一个容器的网络别名(已弃用,建议用网络替代)\n '--link-local-ip': '--link-local-ip', // 为容器分配一个链接本地地址(IPv4/IPv6)\n '--log-driver': '--log-driver', // 设置容器日志驱动(例如 json-file、syslog 等)\n '--log-opt': '--log-opt', // 为日志驱动添加额外配置选项\n '--mac-address': '--mac-address', // 设置容器的 MAC 地址(需自定义网络)\n '--memory': '--memory', // 限制容器可使用的内存\n '--memory-reservation': '--memory-reservation', // 设置内存软限制(触发内存管理)\n '--memory-swap': '--memory-swap', // 设置内存+swap 的限制值\n '--memory-swappiness': '--memory-swappiness', // 调整内存交换行为(0-100)\n '--mount': '--mount', // 使用高级语法挂载数据卷或绑定宿主机目录\n '--name': '--name', // 指定容器名称\n '--network': '--network', // 指定容器使用的网络(默认 bridge)\n '--network-alias': '--network-alias', // 为容器添加网络别名(在用户定义网络中)\n '--no-healthcheck': '--no-healthcheck', // 禁用继承自镜像的健康检查\n '--oom-kill-disable': '--oom-kill-disable', // 禁用内存不足时对容器进程的杀死操作\n '--oom-score-adj': '--oom-score-adj', // 调整容器的 OOM 分数(影响 OOM 杀死优先级)\n '--pid': '--pid', // 设置 PID 命名空间(容器与主机共享进程视图)\n '--pids-limit': '--pids-limit', // 限制容器内可用的进程数\n '--platform': '--platform', // 指定镜像平台(如 linux/amd64)\n '--privileged': '--privileged', // 提升容器为特权模式(访问更多主机资源)\n '--publish': '--publish', // 映射容器端口到宿主机\n '--publish-all': '--publish-all', // 自动映射容器暴露的所有端口到宿主机随机端口\n '--pull': '--pull', // 指定拉取镜像策略(always, missing, never)\n '--restart': '--restart', // 容器退出后的重启策略(no, on-failure, always, unless-stopped)\n '--rm': '--rm', // 容器停止后自动删除容器\n '--runtime': '--runtime', // 指定运行时(如 runc, nvidia-container-runtime)\n '--security-opt': '--security-opt', // 设置安全选项(如 seccomp, apparmor 配置)\n '--shm-size': '--shm-size', // 设置 /dev/shm 的大小(默认 64M)\n '--stop-signal': '--stop-signal', // 设置停止容器时发送的信号(默认 SIGTERM)\n '--stop-timeout': '--stop-timeout', // 停止容器时等待指定秒数后发送 SIGKILL\n '--storage-opt': '--storage-opt', // 设置存储驱动的选项(如 devicemapper)\n '--sysctl': '--sysctl', // 设置内核参数(sysctl)\n '--tmpfs': '--tmpfs', // 挂载一个 tmpfs 临时文件系统\n '--tty': '--tty', // 分配一个伪终端 TTY\n '--ulimit': '--ulimit', // 设置容器的 ulimit 限制(如打开文件数)\n '--user': '--user', // 指定容器内运行进程的用户/组\n '--userns': '--userns', // 设置用户命名空间模式(host 或 private)\n '--uts': '--uts', // 设置 UTS 命名空间(host 或 container)\n '--volume': '--volume', // 挂载宿主机目录或数据卷到容器中\n '--volume-driver': '--volume-driver', // 指定数据卷驱动\n '--volumes-from': '--volumes-from', // 从另一个容器挂载数据卷\n '--workdir': '--workdir', // 设置容器内的工作目录\n};\n\nexport const allowDockerArgs: Record<string, boolean> = {\n '--env': true,\n '--publish': true,\n '--volume': true,\n '--attach': true,\n '--quiet': true,\n '--entrypoint': true,\n '--workdir': true,\n '--cidfile': true,\n '--detach-keys': true,\n '--disable-content-trust': true,\n '--domainname': true,\n '--expose': true,\n '--ip': true,\n '--link-local-ip': true,\n '--platform': true,\n};\n\nexport const autoSetDockerArgs: Record<string, boolean> = {\n '-rm': true,\n '--name': true,\n '--label': true,\n '--network': true,\n '--user': true,\n};\n\nexport const notAllowUseCustomDockerArgs: Record<string, boolean> = {\n '--volume': true,\n '--publish': true,\n};\n","/* eslint-disable no-continue */\n/* eslint-disable no-param-reassign */\n/* eslint-disable no-lonely-if */\nimport { whiteDockerArgs } from './docker-args';\n\nexport type DockerArgs = {\n key: string;\n value: string;\n type?: string;\n name?: string;\n path?: string;\n prefix?: string;\n protocol?: string;\n proxyBehavior?: string;\n}[];\n\nexport type DockerEnvs = {\n key: string;\n value: string;\n description?: string;\n secure?: boolean;\n shared?: boolean;\n required?: boolean;\n custom?: string;\n}[];\n\nconst needValueKeys = new Set(['--publish', '--volume']);\n\nexport const isVolumePath = (volume: string) => {\n const [hostPart] = volume.split(':');\n return (\n hostPart?.startsWith('/') ||\n hostPart?.startsWith('./') ||\n hostPart?.startsWith('../') ||\n hostPart?.startsWith('~') ||\n hostPart?.startsWith('$BLOCKLET')\n );\n};\n\nexport function addBlockletPrefixVolume(args: DockerArgs): DockerArgs {\n return args.map((arg) => {\n if (arg.key !== '--volume') return arg;\n\n // 已经带了 $BLOCKLET_APP_DIR / $BLOCKLET_DATA_DIR,直接返回\n if (arg.value.startsWith('$BLOCKLET_APP_DIR/') || arg.value.startsWith('$BLOCKLET_DATA_DIR/')) {\n return arg;\n }\n\n // 拆分 hostPart:containerPart[:options]\n const [hostPart, ...rest] = arg.value.split(':');\n if (!hostPart) {\n return arg;\n }\n\n if (!isVolumePath(arg.value)) {\n return arg;\n }\n\n // 路径 → 加 $BLOCKLET_DATA_DIR 前缀\n const newHostPart = hostPart.startsWith('/') ? `$BLOCKLET_DATA_DIR${hostPart}` : `$BLOCKLET_DATA_DIR/${hostPart}`;\n\n return { ...arg, value: [newHostPart, ...rest].join(':') };\n });\n}\n\nfunction parseFirstPublishWeb(args: DockerArgs): DockerArgs {\n let firstPublish = true;\n const hasWebType = args.find((arg) => arg.key === '--publish' && arg.type === 'web');\n if (hasWebType) {\n return args.map((arg) => {\n if (arg.key === '--publish') {\n const next = { ...arg, type: firstPublish ? 'docker' : arg.type };\n firstPublish = arg.type === 'web';\n return next;\n }\n\n return arg;\n });\n }\n return args.map((arg) => {\n if (arg.key === '--publish') {\n const next = { ...arg, type: firstPublish ? 'web' : 'docker' };\n firstPublish = false;\n return next;\n }\n\n return arg;\n });\n}\n\nexport function dockerParseCommand(command: string): {\n dockerArgs: DockerArgs;\n dockerEnvs: DockerEnvs;\n dockerImage: string;\n dockerCommand: string;\n} {\n if (!command) {\n return { dockerArgs: [], dockerEnvs: [], dockerImage: '', dockerCommand: '' };\n }\n\n command = command.trim();\n if (command.startsWith('$ docker run')) {\n command = command.replace('$ docker run', 'docker run');\n }\n if (!command.startsWith('docker run')) {\n return { dockerArgs: [], dockerEnvs: [], dockerImage: '', dockerCommand: '' };\n }\n\n // 移除续行符和换行符,将整个命令合并为单行\n const cleanedCommand = command.replace(/\\\\\\n/g, '').replace(/\\n/g, ' ').trim();\n\n // 匹配命令部分,同时处理单引号和双引号\n const parts = cleanedCommand.match(/(?:[^\\s\"']+|'[^']*'|\"[^\"]*\")+/g);\n\n if (!parts) {\n return { dockerArgs: [], dockerEnvs: [], dockerImage: '', dockerCommand: '' };\n }\n\n const dockerArgs: DockerArgs = [];\n const dockerEnvs: DockerEnvs = [];\n\n let i = 0;\n let dockerImage = '';\n let dockerCommand = '';\n const lastArgs: string[] = [];\n\n while (i < parts.length) {\n const part = parts[i];\n if (!part) {\n i++;\n continue;\n }\n\n // 忽略 'docker' 和 'run'\n if (part === 'docker' || part === 'run') {\n i++;\n continue;\n }\n\n // 处理环境变量参数 '-e' 或 '--env'\n if ((part === '-e' || part === '--env') && i + 1 < parts.length) {\n const envString = parts[i + 1] || '';\n const [envKey, ...envValueParts] = envString.split('=');\n if (envKey) {\n const envValue = envValueParts.join('=').replace(/^['\"]|['\"]$/g, '');\n dockerEnvs.push({ key: envKey, value: envValue });\n }\n i += 2;\n continue;\n }\n\n // 处理其他 Docker 参数\n if (part.startsWith('-') && lastArgs.length === 0) {\n const equalIndex = part.indexOf('=');\n let rawKey = part;\n let value: string | null = null;\n\n if (equalIndex !== -1) {\n // 处理类似 --expose=53 的情况\n rawKey = part.substring(0, equalIndex);\n value = part.substring(equalIndex + 1).replace(/^['\"]|['\"]$/g, '');\n }\n\n const fullKey = whiteDockerArgs[rawKey];\n if (!fullKey) {\n // 如果参数不在白名单中,直接跳过 (同时要跳过 value)\n i += 2;\n continue;\n }\n\n if (fullKey === '--publish') {\n // 处理 --publish 参数,不进行任何替换\n let publishValue = '';\n\n if (value) {\n // 处理类似 --publish=53:53/udp 的情况\n publishValue = value;\n dockerArgs.push({ key: fullKey, value: publishValue });\n } else {\n // 参数和值分开,或者布尔参数\n if (i + 1 < parts.length && !(parts[i + 1] || '').startsWith('-')) {\n const nextVal = (parts[i + 1] || '').replace(/^['\"]|['\"]$/g, '');\n publishValue = nextVal;\n dockerArgs.push({ key: fullKey, value: publishValue });\n i += 2;\n continue;\n } else {\n // 布尔参数,标记为 'true'\n dockerArgs.push({ key: fullKey, value: 'true' });\n i++;\n continue;\n }\n }\n i++;\n continue;\n }\n\n if (value !== null) {\n // 参数和值在同一个部分\n dockerArgs.push({ key: fullKey, value });\n i++;\n continue;\n } else {\n // 参数和值分开,或布尔参数\n if (i + 1 < parts.length && !(parts[i + 1] || '').startsWith('-')) {\n const nextVal = (parts[i + 1] || '').replace(/^['\"]|['\"]$/g, '');\n dockerArgs.push({ key: fullKey, value: nextVal });\n i += 2;\n continue;\n } else {\n dockerArgs.push({ key: fullKey, value: 'true' });\n i++;\n continue;\n }\n }\n }\n\n lastArgs.push(part);\n i++;\n }\n dockerImage = lastArgs[0] || '';\n dockerCommand = lastArgs.slice(1).join(' ');\n const filteredDockerArgs: DockerArgs = [];\n for (const arg of dockerArgs) {\n arg.name = '';\n arg.path = '';\n arg.prefix = '';\n arg.protocol = '';\n arg.proxyBehavior = 'service';\n arg.type = 'docker';\n if (needValueKeys.has(arg.key) && arg.value === 'true') {\n continue;\n }\n filteredDockerArgs.push(arg);\n }\n for (const item of dockerEnvs) {\n item.custom = '';\n item.description = '';\n item.secure = false;\n item.shared = false;\n item.required = false;\n }\n\n return {\n dockerArgs: parseFirstPublishWeb(addBlockletPrefixVolume(filteredDockerArgs)),\n dockerEnvs,\n dockerImage,\n dockerCommand,\n };\n}\n\nexport function dockerBuildCommand({\n dockerArgs,\n dockerEnvs,\n dockerImage,\n dockerCommand,\n}: {\n dockerArgs: DockerArgs;\n dockerEnvs: DockerEnvs;\n dockerImage: string;\n dockerCommand: string;\n}): string {\n if (dockerArgs.length === 0 && dockerEnvs.length === 0 && !dockerImage) {\n return '';\n }\n\n const parts: string[] = ['docker run \\\\'];\n\n // 定义哪些参数可以多次出现\n const multipleArgs = new Set([\n '--publish',\n '--volume',\n '--expose',\n '--device',\n '--mount',\n '--label',\n '--cap-add',\n '--cap-drop',\n '--add-host',\n '--dns',\n '--network-alias',\n '--sysctl',\n '--ulimit',\n '--network',\n ]);\n\n // 处理 dockerArgs\n for (const arg of dockerArgs) {\n const { key, value } = arg;\n\n if (multipleArgs.has(key)) {\n if (value === 'true') {\n parts.push(` ${key} \\\\`);\n } else {\n // 如果值包含空格或特殊字符,添加引号\n const formattedValue = /[\\s\"']/g.test(value) ? `\"${value}\"` : value;\n parts.push(` ${key} ${formattedValue} \\\\`);\n }\n } else {\n // 对于不可重复参数,只使用第一个出现的值\n if (!parts.some((part) => part.startsWith(` ${key}`))) {\n if (value === 'true') {\n parts.push(` ${key} \\\\`);\n } else {\n // 如果值包含空格或特殊字符,添加引号\n const formattedValue = /[\\s\"']/g.test(value) ? `\"${value}\"` : value;\n parts.push(` ${key} ${formattedValue} \\\\`);\n }\n }\n }\n }\n\n // 处理 dockerEnv\n for (const env of dockerEnvs) {\n const { key, value } = env;\n // 如果值包含空格或特殊字符,添加引号\n const formattedEnvValue = /[\"']/g.test(value) ? value : `\"${value}\"`;\n parts.push(` -e ${key}=${formattedEnvValue} \\\\`);\n }\n\n if (dockerImage) {\n parts.push(` ${dockerImage} \\\\`);\n }\n if (dockerCommand) {\n parts.push(` ${dockerCommand} \\\\`);\n }\n // 移除最后的续行符\n if (parts[parts.length - 1]?.endsWith(' \\\\')) {\n parts[parts.length - 1] = (parts[parts.length - 1] || '').slice(0, -2);\n }\n\n return parts.join('\\n');\n}\n","import { isVolumePath } from './docker-parse-command';\n\nexport const dockerArgsValidator: Record<string, (value: string) => string> = {\n '--volume': (volume) => {\n // 拆分 hostPart:containerPart[:options]\n const [hostPart] = volume.split(':');\n if (!hostPart) {\n return 'Volume must start with key:value';\n }\n\n const isPath = isVolumePath(volume);\n if (isPath && !volume.startsWith('$BLOCKLET_APP_DIR/') && !volume.startsWith('$BLOCKLET_DATA_DIR/')) {\n // @ts-ignore\n return 'Volume must start with $BLOCKLET_APP_DIR or $BLOCKLET_DATA_DIR';\n }\n if (volume.indexOf('..') > -1) {\n // @ts-ignore\n return 'Volume cannot contain \"..\"';\n }\n return '';\n },\n};\n","/**\n * 将短横线格式的字符串转换为驼峰式。\n * @param str - 输入的短横线格式字符串,例如 '--aa-bb'\n * @returns 驼峰式字符串,例如 'aaBb'\n */\nexport const dockerArgsToCamelCase = (str: string): string => {\n // 移除前导的 '--' 或 '-'\n const strippedStr = str.replace(/^[-]+/, '');\n\n // 将短横线后的字母转换为大写\n const camelCaseStr = strippedStr.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase());\n\n return camelCaseStr;\n};\n\n/**\n * 将驼峰式字符串转换为短横线格式。\n * @param str - 输入的驼峰式字符串,例如 'aaBb'\n * @returns 短横线格式字符串,例如 '--aa-bb'\n */\nexport const dockerCamelCaseToDash = (str: string): string => {\n // 在大写字母前添加短横线,并转换为小写\n const kebabCaseStr = str.replace(/([A-Z])/g, '-$1').toLowerCase();\n\n // 在结果前添加 '--'\n return `--${kebabCaseStr}`;\n};\n","const DANGEROUS_CMD = [' -- ', '~', '&', '|', '>', '<', '{', '}', '[', ']', ';', '$', '!', '*', '%', '&&', '||', ','];\nconst DANGEROUS_CMD_BIN = ['rm ', 'sudo '];\n\nexport function dockerCmdValidator(dockerCommand: string) {\n if (dockerCommand === '') {\n return;\n }\n\n const dangerousPattern = /(\\n|\\\\n|\\\\\\n|\\t|\\\\t|\\\\\\t)/;\n if (dangerousPattern.test(dockerCommand)) {\n throw new Error('Docker CMD is invalid');\n }\n\n const lowerCaseDockerCommand = dockerCommand.toLocaleLowerCase();\n if (DANGEROUS_CMD_BIN.some((item) => lowerCaseDockerCommand.indexOf(item) !== -1)) {\n throw new Error('Docker CMD is invalid');\n }\n\n if (DANGEROUS_CMD.some((item) => dockerCommand.indexOf(item) !== -1)) {\n throw new Error('Docker CMD is invalid');\n }\n\n // eslint-disable-next-line no-useless-escape\n const strictCommandReg = /^(?:(?:[a-zA-Z0-9\\-_.\\/:=\\s]+)|(?:\\@{1,2}[a-zA-Z_][a-zA-Z0-9_]*))+$/;\n\n if (!strictCommandReg.test(dockerCommand)) {\n throw new Error('Docker CMD is invalid');\n }\n}\n","import Joi, { LanguageMessages } from 'joi';\nimport { allowDockerArgs } from './docker-args';\nimport { dockerArgsToCamelCase, dockerCamelCaseToDash } from './docker-args-to-camel-case';\nimport { dockerArgsValidator } from './docker-args-validator';\nimport { dockerCmdValidator } from './docker-cmd-validator';\n\n// 计算最终允许的 Docker 参数键, 不包含 env, 转换为驼峰\nconst allowedDockerArgKeys = Array.from(new Set(Object.keys(allowDockerArgs).map(dockerArgsToCamelCase)));\n\n// 定义允许多个值的参数\nexport const multiValueArgs = ['publish', 'volume'];\n\n// 定义 Docker 主体的 Joi 验证架构\nexport const dockerSchema = Joi.object({\n workdir: Joi.string().trim().optional(),\n image: Joi.string()\n .trim()\n .regex(/^[^\\s]+$/)\n .optional(),\n shell: Joi.string().trim().optional(),\n // network: Joi.string().valid('host', 'bridge', 'none').default('host').optional(),\n volumes: Joi.array().items(Joi.string().trim()).optional(),\n script: Joi.string().trim().optional(),\n installNodeModules: Joi.boolean().optional(),\n skipWrapDockerfile: Joi.boolean().optional(),\n tmpfs: Joi.string().trim().optional(),\n command: Joi.string()\n .allow('')\n .default('')\n .optional()\n .custom((value: string, helpers: Joi.CustomHelpers) => {\n try {\n // 调用自定义校验函数\n dockerCmdValidator(value);\n return value;\n } catch (error) {\n return helpers.error('any.invalid', { message: (error as Error).message });\n }\n }, 'Docker CMD validation'),\n runBaseScript: Joi.boolean().optional(),\n // 动态 Docker 参数\n ...allowedDockerArgKeys.reduce(\n (acc, key) => {\n const validFn = dockerArgsValidator[dockerCamelCaseToDash(key)];\n if (multiValueArgs.includes(key)) {\n acc[key] = Joi.array().items(Joi.string().trim()).optional();\n\n if (validFn) {\n acc[key] = Joi.array()\n .items(\n Joi.string()\n .trim()\n .custom((value: string, helper: Joi.CustomHelpers) => {\n const msg = validFn(value);\n if (msg) {\n return helper.message(msg as unknown as LanguageMessages);\n }\n return value;\n }) // eslint-disable-line @typescript-eslint/comma-dangle\n )\n .optional();\n } else {\n acc[key] = Joi.array().items(Joi.string().trim()).optional();\n }\n return acc;\n }\n\n if (validFn) {\n acc[key] = Joi.string()\n .trim()\n .custom((value: string, helper: Joi.CustomHelpers) => {\n const msg = validFn(value);\n if (msg) {\n return helper.message(msg as unknown as LanguageMessages);\n }\n return value;\n })\n .optional();\n } else {\n acc[key] = Joi.string().trim().optional();\n }\n return acc;\n },\n {} as Record<string, Joi.AnySchema> // eslint-disable-line @typescript-eslint/comma-dangle\n ),\n}).optional();\n\nconst validateDockerImage = (dockerImage: string) => {\n const reg =\n /^(?:[a-zA-Z0-9.-]+(?::[0-9]+)?\\/)?(?:[a-z0-9]+(?:[._-][a-z0-9]+)*\\/)?[a-z0-9]+(?:[._-][a-z0-9]+)*(:[a-zA-Z0-9_.-]+)?$/;\n\n return Joi.string().trim().regex(reg).required().validate(dockerImage);\n};\n\nexport const parseDockerArgsToSchema = (\n dockerImage: string,\n dockerCommand: string,\n // eslint-disable-next-line @typescript-eslint/comma-dangle\n args: { key: string; value: string }[]\n) => {\n const obj: Record<string, string[] | string> = {};\n args.forEach((item) => {\n const key = dockerArgsToCamelCase(item.key);\n if (multiValueArgs.includes(key)) {\n obj[key] = [...(obj[key] || []), item.value];\n } else {\n obj[key] = item.value;\n }\n });\n const { error } = validateDockerImage(dockerImage);\n if (error) {\n return { error, value: obj };\n }\n try {\n dockerCmdValidator(dockerImage);\n } catch (err) {\n return { error: err as Error, value: obj };\n }\n obj.image = dockerImage;\n obj.command = dockerCommand || '';\n return dockerSchema.validate(obj);\n};\n","import { DockerArgs } from './docker-parse-command';\n\ninterface PublishPort {\n type: string;\n name: string;\n path: string;\n port: string;\n containerPort: number;\n hostIP: string;\n prefix: string;\n proxyBehavior: string;\n}\n\nexport function dockerParsePublishPorts(blockletTitle: string, dockerArgs: DockerArgs): PublishPort[] {\n const updatedDockerArgs: DockerArgs = JSON.parse(JSON.stringify(dockerArgs));\n const hostPortMap = new Map<string, string>();\n let blockletPortIndex = 1;\n const publishPorts: PublishPort[] = [];\n\n updatedDockerArgs.forEach((arg) => {\n if (arg.key === '--publish') {\n const publishValue = arg.value;\n const parts = publishValue.split(':');\n\n let hostIP = '127.0.0.1';\n let hostPort = '';\n let containerPort = '';\n\n if (parts.length === 2) {\n // 格式: hostPort:containerPort\n [hostPort, containerPort] = parts as [string, string];\n } else if (parts.length === 3) {\n // 格式: hostIP:hostPort:containerPort\n [hostIP, hostPort, containerPort] = parts as [string, string, string];\n } else if (parts.length === 1) {\n // 仅指定 containerPort(非标准,但兼容处理)\n containerPort = parts[0] || '';\n }\n\n // 检查是否已经映射该 hostPort\n let blockletPort = hostPortMap.get(hostPort || '');\n if (!blockletPort) {\n blockletPort = `$BLOCKLET_PORT_${blockletPortIndex++}`;\n hostPortMap.set(hostPort || '', blockletPort);\n }\n\n if (!publishPorts.find((port) => port.port === hostPort)) {\n const type = arg.type || 'docker';\n const blockletPathName = `${blockletTitle.replace(/\\W/g, '-')}-${publishPorts.length + 1}`;\n publishPorts.push({\n type,\n proxyBehavior: arg.proxyBehavior || '',\n name: blockletPathName,\n path: `/${blockletPathName}`,\n port: hostPort || containerPort, // 若未指定 hostPort,则使用 containerPort\n containerPort: Number(containerPort) || 0,\n hostIP,\n prefix: type === 'docker' ? `/${blockletPathName}` : arg.prefix || '*',\n });\n }\n }\n });\n\n return publishPorts;\n}\n","import { DockerEnvs } from './docker-parse-command';\n\ninterface DockerEnv {\n name: string;\n default: string;\n secure: boolean;\n shared: boolean;\n required: boolean;\n description: string;\n custom?: string;\n}\n\nexport function dockerParseEnvironments(envs: DockerEnvs, ignoreCustom = false) {\n const blockletEnvs: DockerEnv[] = [];\n\n if (!envs) {\n return blockletEnvs;\n }\n for (const env of envs) {\n const item: DockerEnv = {\n name: env.key,\n default: env.value === `$${env.key}` ? '' : env.value,\n secure: env.secure !== undefined ? env.secure : false,\n shared: env.shared !== undefined ? env.shared : false,\n required: env.required !== undefined ? env.required : false,\n description: env.description || env.key,\n };\n if (!ignoreCustom) {\n item.custom = env.custom || '';\n }\n blockletEnvs.push(item);\n }\n return blockletEnvs;\n}\n","// 获取对象的值,支持通过路径获取, 忽略大小写\n// 类似 path 例如: port.BLOCKLET_PORT, interfaces[0].name\n// 支持数组条件 例如: interfaces[type=web].name\nexport function getObjByPath(data: Record<string, unknown>, path: string) {\n const obj = JSON.parse(JSON.stringify(data));\n const keys = path\n .split('.')\n .map((key) => {\n const match = key.match(/(.+)\\[(.+?)\\]/);\n return match ? [match[1], match[2]] : key;\n })\n .flat();\n\n return keys.filter(Boolean).reduce((acc, key) => {\n if (!acc || !key) {\n return undefined;\n }\n\n // 检测数组条件\n const conditionMatch = key?.match(/(.+?)=(.+)/);\n if (Array.isArray(acc) && conditionMatch) {\n const [, field, value] = conditionMatch;\n if (field && value) {\n /* eslint-disable no-param-reassign */\n acc = acc.find((item: Record<string, unknown>) => {\n const lowerField = Object.keys(item).find((k) => k.toLowerCase() === field.toLowerCase());\n return lowerField && item[lowerField] === value;\n });\n }\n return acc;\n }\n\n // 忽略大小写查找对象键\n const lowerKey = Object.keys(acc).find((k) => k.toLowerCase() === key.toLowerCase());\n return lowerKey ? acc[lowerKey] : undefined;\n }, obj);\n}\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@abtnode/docker-utils",
|
|
3
|
-
"version": "1.17.8-beta-
|
|
3
|
+
"version": "1.17.8-beta-20260121-102603-f9d0176f",
|
|
4
4
|
"description": "Docker utils",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -41,5 +41,5 @@
|
|
|
41
41
|
"prettier": "^3.3.2",
|
|
42
42
|
"unbuild": "^2.0.0"
|
|
43
43
|
},
|
|
44
|
-
"gitHead": "
|
|
44
|
+
"gitHead": "7ae816f51ed511037e5b7ac0008012ebf4afc987"
|
|
45
45
|
}
|