使用docker exec执行主机上存在的Shell脚本时出现问题

时间:2019-04-03 11:36:53

标签: bash docker amazon-emr

我正在尝试在AWS EMR集群的主节点上执行脚本。目的是创建一个新的conda env并将其链接到jupyter。我正在关注AWS的this文档。问题是,无论脚本的内容是什么,执行bash: /home/hadoop/scripts/bootstrap.sh: No such file or directory时都会遇到相同的错误:sudo docker exec jupyterhub bash /home/hadoop/scripts/bootstrap.sh。我已确保sh文件位于正确的位置。

但是,如果我将bootstrap.sh文件复制到容器中,然后运行相同的docker exec cmd,则工作正常。我在这里想念什么?我已经尝试过使用带有以下条目的简单脚本,但是会引发相同的错误:

#!/bin/bash
echo "Hello"

该文档明确指出:

  

内核安装在Docker容器中。最简单的方法   要做到这一点,就是用安装命令创建一个bash脚本,   将其保存到主节点,然后使用 sudo docker exec   jupyterhub script_name 命令以在jupyterhub中运行脚本   容器。

1 个答案:

答案 0 :(得分:1)

docker exec命令在容器的名称空间内运行命令。这些名称空间之一是文件系统。因此,除非该命令是映像的一部分,或者直接写入容器,或者您已经安装了主机卷以将主机目录映射到容器中,否则将无法执行该命令。主机卷可能如下所示:

docker run -v /host/scripts:/container/scripts -n your_container $your_image
docker exec -it your_container /container/scripts/test.sh

该主机卷在主机和容器上可能是相同的路径。

如果它是Shell脚本,则可以使用I / O重定向,例如:

docker exec -i $container_id /bin/bash <local_script.sh

,但是请注意,由于脚本内容已将您的终端替换为stdin,因此您不能以这种方式进行交互式操作。之所以可行,是因为容器内的外壳程序只是在处理来自stdin的命令。

除了那些情况之外,除了AWS的文档似乎是错误的,我不知道该告诉您什么。