上一个回答可能没有正确理解问题,现在重新回答:
@川南吴彦祖,使用
mount --bind
组织文件夹,避免符号连接在容器内不可触及的缺点。rm /data/a/b mkdir -p /data/a/b mount --bind /data/b /data/a/b
现在,容器内的
/www/b
将可用,而且是“普通文件夹”,不是符号连接。
/etc/fstab
中的mount --bind
写法(可开机自动挂载):/data/b /data/a/b none bind 0 0
@川南吴彦祖,用
mount --bind
把/data/a
转移到另一个挂载点就可以了。mkdir -p /data/www mount --bind /data/a /data/www
然后把宿主机的
/data/www
目录挂载到docker
的/www
目录,这样你再往/data/a
进行任何挂载操作都不会影响到/data/www
。
/etc/fstab
中的mount --bind
写法(可开机自动挂载):/data/a /data/www none bind 0 0
我不会![]()
总结,楼主想要在docker里面挂载宿主机里面的一个文件夹,应该怎么实现。请楼下回答
@无名啊,加上
shopt -s expand_aliases
可以了 谢谢大佬。只是,这nodejs代码里,哪一行是代表连接到了tty吗?(我不熟悉nodejs,但我还是能看得懂很多js的,即使是到ES2022)
我的理解跟编程语言无关,我是fork出来的子进程来启动bash命令,这个bash命令不会立刻退出,可以等待我输入,我就可以输入流写入数据,我称它为“交互式” 😂(1. 也可能默认开启了tty 2.也可能没有收到终止信号,所以一直等待)
和实际 交互式登录SHELL 非交互式登录SHELL概念是否一样,我并没有仔细研究
@无名啊,好的,谢谢。我明天试试10楼的。
你写的那个参数,我之前查资料是bash这个shell才有的好像。zsh好像没有
shopt is not a command, but a shell built-in. bash knows what to do with it because it's a bash built-in , but zsh has no idea what it is. You'll want to look into setopt which is a zsh built-in, and put those values into a new .zshrc script.
@无名啊,shopt 这个软件我电脑没有。。
22:50 测试发现,原来是我用的zsh没有。我没具体看这个报错,我明天再试试
shopt is not a command, but a shell built-in. bash knows what to do with it because it's a bash built-in , but zsh has no idea what it is. You'll want to look into setopt which is a zsh built-in, and put those values into a new .zshrc script.
@弟妹,我觉得,你的
nodejs
应该只是提供了普通stdin
,加上你又没用bash -i
参数,所以启动的bash
应该不是交互式的这时你用 10 楼的代码,
alias
应该就能生效了
@无名啊,我是python2 2>file.err 这么测试的,sed我是不太会用
@弟妹,
因为机器没网,电脑里没有这个软件。所以就没采用这个。。。
Emm..?不需要额外安装啥软件呀,只是加一行
bash
代码然后,我是拿python2.7测试--version输出到错误流的(我还没测试其他机器的2.7是否也这样)
我不熟悉
Python 2
,我电脑也没装,那就不清楚了
@弟妹,
噢,我看漏了这一句
并开启交互式shell
看来,你读了 7 楼的
只是,这
nodejs
代码里,哪一行是代表连接到了tty
吗?(我不熟悉nodejs
,但我还是能看得懂很多js
的,即使是到ES2022
)
@无名啊,我知道7楼这个方案,因为机器没网,电脑里没有这个软件。所以就没采用这个。。。
使用的交互式shell,是不好用的。
然后,我是拿python2.7测试--version输出到错误流的(我还没测试其他机器的2.7是否也这样)
@弟妹,
PS: python --version竟然输出到错误流 真离谱
我瞅了瞅,应该是输出至
stdout
的?$ python3 --version | sed 's/^/[STDOUT] /' [STDOUT] Python 3.10.5
@弟妹,看来,你没看 7 楼
await execRequest('bash',['shopt -s expand_aliases', 'alias python233=python2', 'python233 --version 2>&1'])
@无名啊,以Node.js 创建子进程为例
import * as child from 'child_process' export async function execRequest(cmd: string, commands: string[]) { return new Promise((resolve) => { let spawnChild = child.spawn(cmd) spawnChild.stdout.on('data', ch => { console.log(ch.toString().trim()) }) spawnChild.stderr.on('data', ch => { console.log(ch.toString().trim()) }) spawnChild.on('exit', code => { console.log(code) }) commands.forEach((command) => { spawnChild.stdin.write(`${command}\n`) }) spawnChild.stdin.end('\nexit\n') }) } await execRequest('bash',['alias python233=python2','python233 --version 2>&1'])
以上代码 大概意思是,输入bash,并开启交互式shell
第一次流写入alias python233=python2 并且回车
第二次流写入python233 --version 2>&1 并且回车
输出流提示
提示python233不存在
PS: python --version竟然输出到错误流 真离谱
@弟妹,
Aliases are not expanded when the shell is not interactive, unless the expand_aliases shell option is set using shopt.
需要在交互式模式,或者启用
expand_aliases
,alias
才能生效
@无名啊,是的 因为我是子进程打开的shell 我无法做到输入两条命令,因为我不是在tty下进行输入的