在Docker容器内的交互式shell中的源代码脚本

4
我想打开一个交互式 shell,该 shell 使用绑定挂载的仓库上的 bitbake 环境并运行脚本。
docker run --rm -it \
--mount type=bind,source=$(MY_PATH),destination=/mnt/bb_repoistory  \
my_image /bin/bash -c "cd /mnt/bb_repoistory/oe-core && source build/conf/set_bb_env.sh"

问题在于-it参数似乎没有任何作用,因为在执行cd /mnt/bb_repoistory/oe-core && source build/conf/set_bb_env.sh后,shell立即退出。
我还尝试了以下内容:
docker run --rm -it \
--mount type=bind,source=$(MY_PATH),destination=/mnt/bb_repoistory  \
my_image /bin/bash -c "cd /mnt/bb_repoistory/oe-core && source build/conf/set_bb_env.sh && bash"

这会生成一个交互式shell,但是set_bb_env.sh定义的宏都没有被执行。

有没有一种方法可以正确地启动脚本并提供tty?


你尝试过使用man bash命令,特别是关于bash的-i选项和INVOCATION部分的文档吗?你调用bash的方式不是交互式的。 - Robin479
我也尝试过/bin/bash -ci,但没有成功。添加-c标志的行为似乎总是在执行'''之间的参数后退出shell,而不管其他选项是否添加。 - Arthur Pinheiro
1个回答

2
-it 标志与运行命令冲突,因为您告诉docker创建伪终端(ptty),然后在该终端中运行一个命令(bash -c ...)。当该命令完成时,运行就完成了。
有些人为了解决这个问题,只在他们的源环境中导出变量,并且最后一个命令将是 exec bash。但是,如果您需要别名或其他不像那样被继承的项,则您的选项会更加有限。
您可以在目标 shell 中运行源代码,而不是在父 shell 中运行它。如果您修改了 .bash_profile 文件以包含以下行:
[ -n "$DOCKER_LOAD_EXTRA" -a -r "$DOCKER_LOAD_EXTRA" ] && source "$DOCKER_LOAD_EXTRA

然后你的命令应该是:

... /bin/bash -c "cd /mnt/bb_repository/oe-core && DOCKER_LOAD_EXTRA=build/conf/set_bb_env.sh exec bash"

这可能是有效的。当环境变量已经设置时,这告诉你的.bash_profile加载此文件,否则不加载。(在docker命令行上也可以有-e标志,但我认为它会全局设置整个容器,这可能不是你想要的。)


1
这是一个不错的解决方法。由于我的容器现在是短暂的(docker run --rm),我直接在运行命令中编辑了 .bashrc 文件:... /bin/bash -c "echo 'source build/conf/set_bb_env.sh' >> ~/.bashrc && cd /mnt/bb_repository/oe-core && bash"。它完美地工作! - Arthur Pinheiro
或者,您可以使用bash--rcfile选项和可能的嵌入式命令替换,如下所示:docker run --rm -it bash -c 'exec bash -i --rcfile <(cat <<< "cd /to/some/path && source another.sh")' - Robin479

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接