Docker-为什么cp无法通过bash正确复制?

时间:2018-12-29 11:57:32

标签: bash docker

我正在尝试运行普通的bash脚本,以从容器中运行工具并将其输出提取到主机。这就是我到目前为止(课程的脚本本身):

docker build -t amass https://github.com/OWASP/Amass.git
docker run -d --name amass_dock amass
docker exec -it amass_dock sh -c "./bin/amass --passive -d example.com -o out.txt"
docker cp amass_dock:/out.txt .

这将发出错误:“无法在停止状态下执行”。 执行此操作的正确方法是什么?我的目标是最终运行docker程序并将输出输出到主机。

2 个答案:

答案 0 :(得分:1)

最简单的操作是read the manual :),然后像这样运行它:

docker build -t amass https://github.com/OWASP/Amass.git
# Note that out.txt will be created on your host, not within the container
docker run amass --passive -d example.com > out.txt
cat out.txt

PS:为方便起见,您可能希望将包装器脚本放置在主机系统上,如下所示:

#!/bin/bash
# /usr/local/bin/amass
docker run amass "$@"

使其可执行:

chmod +x /usr/local/bin/amass

现在,您可以运行amass,并在脚本中使用它,就像将其安装在主机系统上一样:

amass --passive -d example.com

答案 1 :(得分:0)

如果您程序的主要目标是读写本地文件,请考虑不要在Docker中运行它。这完全避免了您遇到的容器生命周期和文件系统映射问题。

sudo apt install snapd
sudo systemctl start snapd
sudo snap install amass
./bin/amass --passive -d example.com -o out.txt

否则,Docker容器具有自己的独立文件系统,并且需要显式地授予对主机系统文件的访问权限。请参阅bind mounts上的Docker文档。您可以像这样运行该程序

sudo docker build -t amass https://github.com/OWASP/Amass.git
sudo docker run --rm -v $PWD:/data \
  amass --passive -d example.com -o /data/out.txt
cat out.txt

请注意,您可以在docker run -v选项中指定 any 主机目录,甚至是/etc/bin之类的系统目录,因此我显式地调出需要与root用户等效的权限的步骤(docker组中的成员资格等同于拥有root用户)。还要注意,没有Docker的用户可以以普通用户身份运行该工具,但是要运行Docker容器,您必须有效地是root用户。

如果您的问题是容器正在退出(“ ...处于停止状态”),那么第一步应该是查看docker logs并在没有{{1}的情况下在前台运行容器}选项以了解原因。尽管-d是有用的调试工具,但它并不是与容器进行交互的主要方式。