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