繁体   English   中英

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

[英]Docker - why cp doesn't copy correctly via bash?

我正在尝试运行普通的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程序并将输出输出到主机。

最简单的方法是阅读手册 :),然后像这样运行它:

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

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

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

否则,Docker容器将拥有自己的独立文件系统,并且需要显式地获得对主机系统文件的访问权限。 请参阅关于绑定安装的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选项中指定任何主机目录,甚至是/etc/bin类的系统目录,因此,我已明确调出需要root等效权限的步骤( docker组中的成员资格)等同于拥有root)。 还要注意,如果没有Docker,您可以以普通用户身份运行该工具,但是要运行Docker容器,您必须有效地是root用户。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM