Docker - почему cp неправильно копирует через bash? - PullRequest
0 голосов
/ 29 декабря 2018

Я пытаюсь запустить обычный скрипт 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 голосов
/ 29 декабря 2018

Простейшим было бы прочитать руководство :) и запустить его так:

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
0 голосов
/ 29 декабря 2018

Если основной целью вашей программы является чтение и запись локальных файлов, рассмотрите возможность запуска ее не в Docker.Это полностью исключает проблемы жизненного цикла контейнера и сопоставления файловой системы, с которыми вы сталкиваетесь.

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

В противном случае контейнеры Docker имеют свои собственные отдельные файловые системы и должны явно получать доступ к файлам хост-системы.См. Документацию Docker по bind mounts .Вы можете запустить эту программу как

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.

Если ваша проблема заключается в том, что контейнер выходит ("... в остановленном состоянии")state ") ваш самый первый шаг должен посмотреть на docker logs и запустить контейнер на переднем плане без опции -d, чтобы понять почему.* * * * * * * * * * * * * * * * * * * * * * Несмотря на то, что docker exec является полезным инструментом отладки, он не был предназначен для основного способа взаимодействия с контейнером.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...