Как я могу увидеть полную команду работающего контейнера / процесса в Docker?
$ docker ps --all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5b6291859b61 nginx:1.7.8 "nginx -g 'daemon of 4 minutes ago Exited (0) 4 minutes ago thirsty_brattain
Я вижу только "nginx -g 'daemon of" .. здесь, а не полную команду.
Ответы:
docker ps --no-trunc
отобразит полную команду вместе с другими деталями запущенных контейнеров.источник
--no-trunc
.docker ps --no-trunc
docker ps --all --no-trunc|cut -c-400
Использование:
... он выполняет «проверку докера» для всех контейнеров.
источник
docker inspect -f "{{.Name}} {{.Path}} {{.Args}}" $(docker ps -a -q)
sudo
команду, вы получите"docker inspect" requires at least 1 argument(s).
из-за второго вызова все имена контейнеров, возможно, вы захотите добавить sudo только внутри$(
.Использование:
Это покажет путь к команде и аргументы, похожие на
docker ps
.источник
kube-apiserver
?docker inspect -f "{{.Path}} {{.Args}} ({{.Id}})" $(docker ps -a -q) | grep kube-apiserver
Используйте runlike из репозитория git https://github.com/lavie/runlike
Установить runlike
Поскольку он принимает идентификатор контейнера в качестве аргумента, чтобы извлечь идентификатор контейнера, используйте следующую команду
Вы можете использовать runlike для извлечения полной команды запуска docker с помощью следующей команды
источник
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock assaflavie/runlike YOUR-CONTAINER
TL-DR
docker ps --no-trunc
иdocker inspect CONTAINER
предоставить точку входа, выполняемую для запуска контейнера, в соответствии с переданной командой, но это может пропустить некоторые части, например,${ANY_VAR}
потому что переменные среды контейнера не печатаются как разрешенные.Чтобы преодолеть это,
docker inspect CONTAINER
есть преимущество, поскольку оно также позволяет извлекать переменные env и их значения, определенные в контейнере, изConfig.Env
свойства.docker ps
иdocker inspect
предоставить информацию о выполненной точке входа и ее команде. Часто это скрипт точки входа оболочки (.sh
), а не «настоящая» программа, запускаемая контейнером. Чтобы получить информацию об этом, запросите информацию о процессе с помощьюps
или/proc/1/cmdline
помощью.1)
docker ps --no-trunc
Он печатает точку входа и команду, выполненную для всех работающих контейнеров. Хотя он печатает команду, переданную точке входа (если мы ее передаем), он не показывает значения переменных env docker (таких как
$FOO
или${FOO}
).Если наши контейнеры используют переменные env, этого может быть недостаточно.
Например, запустите альпийский контейнер:
При использовании docker -ps, таких как:
Это печатает:
Мы видим, что команда передана точке входа:
sh -c 'ls $MY_VAR'
но$MY_VAR
на самом деле она не разрешена.2)
docker inspect CONTAINER
Когда мы проверяем контейнер alpine-example:
Команда также есть, но мы все еще не видим значение переменной env:
Фактически, мы не могли видеть интерполированные переменные с этими командами докера.
В качестве компромисса мы могли бы отдельно отобразить переменные команды и env для контейнера с проверкой докера:
Это печатает:
Более подходящим способом было бы использовать
--format
флаг,docker inspect
который позволяет указывать атрибуты JSON для рендеринга:Что выводит:
3) Получить запущенный процесс из самого контейнера для запуска контейнеров
Точка входа и команда, выполняемые Docker, могут быть полезны, но в некоторых случаях этого недостаточно, поскольку это «только» сценарий точки входа оболочки (
.sh
), который отвечает за запуск реального / основного процесса.Например, когда я запускаю контейнер Nexus, команда выполняется и показывается для запуска контейнера
"sh -c ${SONATYPE_DIR}/start-nexus-repository-manager.sh"
.Для PostgreSQL это так
"docker-entrypoint.sh postgres"
.Чтобы получить больше информации, мы можем выполнить на работающем контейнере
docker exec CONTAINER ps aux
.Это может напечатать другие процессы, которые могут не интересовать нас.
Чтобы сузить начальный процесс, запущенный точкой входа, мы могли бы сделать:
Я указываю,
1
потому что процесс, выполняемый точкой входа, как правило, с1
идентификатором.Без
ps
этого мы все еще могли бы найти информацию/proc/1/cmdline
(в большинстве дистрибутивов Linux, но не во всех). Например :Если у нас есть доступ к узлу докера, который запустил контейнер, другой альтернативой для получения полной команды процесса, выполняемого точкой входа, является:: execute,
ps -PID
где PID - это локальный процесс, созданный демоном Docker для запуска контейнера, такой как:Удобное форматирование с помощью Docker PS
docker ps --no-trunc
не всегда легко читать.Указание столбцов для печати и в табличном формате может сделать это лучше:
Создать псевдоним может помочь:
источник
Перемещение комментария Дилана в полномасштабный ответ, потому что СЛИШКОМ ПОЛЕЗНО:
Что оно делает? Запускает https://github.com/lavie/runlike внутри контейнера, получает полную команду запуска docker, а затем удаляет контейнер для вас.
источник