108

Windows11系统下Ubuntu子系统以及Docker运行的一些问题

乐果   发表于   2024 年 12 月 24 日 标签:windows

最近因公司某项目中使用邦奇灯控,需要在 windows 系统下安装一些硬件相关的调试软件, 所以又将自己的办公电脑切换到 windows 系统。

习惯于在 unix 架构系统下开发的我,倒不怎么习惯 windows 系统。

在之前的印象中,windows11 系统总是不那么稳定,偶尔就会莫名的死机,在 windows 系统刚开始推出 “子系统” 时也曾把玩过,但当时爆各种兼容性问题,无法做到真正的 Linux 体验。但现在发现它的 “子系统” 变得完善了,之前的各种兼容性问题差不多得到了解决,观摩下来感觉基本上已可以替代 kvm 虚拟机运行 Linux 体验。

本文主要是记录使用过程中遇到的一些问题以及解决方法的笔记。

PowerShell 启动时出现红色警告,提示没有权限

解决办法,执行如下命令:

set-executionpolicy remotesigned

命令行安装ubuntu子系统

首先要在 控制面版 -> 程序和功能 -> 启用或关闭Windows功能 开启虚拟化相关服务(详百度搜索了解一下)。

开启虚拟化、并重启电脑生效后,以管理员运行 PowerShell 执行如下命令:

wsl --install
wsl --set-default-version 2

wsl --install 命令默认会安装 ubuntu 最新发行版本,例如当前是 ubuntu24.04

ubuntu子系统下docker运行vue项目

ubuntu 子系统,在 docker 容器实例中执行 vue 项目的初始化 yarn instll 报 错:

Error: EPERM: operation not permitted, symlink '../../../mime/cli.js' -> '/mnt/d/....'

解决办法,执行命令带上 --no-bin-links 参数,如下:

yarn install --no-bin-links

如上图所示,以及通过 AI 工具查询,--no-bin-links 参数解释如下:

  • 软链接(symbolic link)是 Unix 系统的一个概念,它允许你创建一个指向另一个文件的特殊类型的文件,而不是复制文件本身。在 Windows 系统中,软链接的实现与 Unix 系统不同,因此在尝试创建或使用软链接时可能会遇到兼容性问题。

因此加上 --no-bin-links 虽然可以通过 yarn install 命令,但可能又会带来新的问题:在项目的 node_modules 目录下无法生存 .bin 目录,因为 .bin 目录是安装依赖成功后的 软链接 ,由于 --no-bin-links 命令的意思是不创建 软链接 ,因此就不会生成了。

总结:windows下以docker运行vue项目的正确方式

由于 Windows 系统与 Unix 系统在处理软链接的不兼容,因此当在 docker 容器中挂载 windows 宿主机的目录,并在挂载目录中创建软链接时,就会出现不兼容的报错(可能以没权限方式报错)。

因此,vue 项目在容器中初始化依赖时 yarn install 命令带上 --no-bin-links 后, 虽然可以安装成功,但无法创建 .bin 目录,这会导致 vue 无法启动(因为启动时,首先会去 node_modules/.bin/ 目录下寻找依赖包的命令,如果没有才会去系统全局查找)。

因此,正确解决办法是在容器挂载中,不要挂载 vue 项目的整个根目录,而是单独挂载, 例如,如下 docker compose 容器编排文件中的这种方式:

version: '3'
services:
  dev:
    container_name: cooper-vue
    image: ppos-vue:v2
    privileged: true
    ports:
     - "8092:8092"
    restart: always
    volumes: 
     - ./src:/data/src/src
     - ./public:/data/src/public
     - ./tests:/data/src/tests
     - ./.browserslistrc:/data/src/.browserslistrc
     - ./.editorconfig:/data/src/.editorconfig
     - ./.env:/data/src/.env
     - ./.eslintignore:/data/src/.eslintignore
     - ./.eslintrc.js:/data/src/.eslintrc.js
     - ./.prettierrc:/data/src/.prettierrc
     - ./babel.config.js:/data/src/babel.config.js
     - ./jest.config.js:/data/src/jest.config.js
     - ./package.json:/data/src/package.json
     - ./postcss.config.js:/data/src/postcss.config.js
     - ./start.sh:/data/src/start.sh
     - ./tsconfig.json:/data/src/tsconfig.json
     - ./vue.config.js:/data/src/vue.config.js
    stdin_open: true
    tty: true

如此单个分别挂载,让 vue 项目的依赖目录 node_modules 能够正常在容器内部生成(而不是在宿主机的目录里创建),就不会有软链接兼容性的问题。

在折腾后终于成功了,但可能又发现新的问题:热重载 失效。

解决办法,在容器配置中加入 CHOKIDAR_USEPOLLING=true 环境变量,完整 docker compose 容器编排文件:

version: '3'
services:
  dev:
    container_name: cooper-vue
    image: ppos-vue:v2
    privileged: true
    ports:
     - "8092:8092"
    environment: 
     - CHOKIDAR_USEPOLLING=true
    restart: always
    volumes: 
     - ./src:/data/src/src
     - ./public:/data/src/public
     - ./tests:/data/src/tests
     - ./.browserslistrc:/data/src/.browserslistrc
     - ./.editorconfig:/data/src/.editorconfig
     - ./.env:/data/src/.env
     - ./.eslintignore:/data/src/.eslintignore
     - ./.eslintrc.js:/data/src/.eslintrc.js
     - ./.prettierrc:/data/src/.prettierrc
     - ./babel.config.js:/data/src/babel.config.js
     - ./jest.config.js:/data/src/jest.config.js
     - ./package.json:/data/src/package.json
     - ./postcss.config.js:/data/src/postcss.config.js
     - ./start.sh:/data/src/start.sh
     - ./tsconfig.json:/data/src/tsconfig.json
     - ./vue.config.js:/data/src/vue.config.js
    stdin_open: true
    tty: true

乐果   发表于   2024 年 12 月 24 日 标签:windows

0

文章评论