Как показать команду запуска контейнера докеров


106

Я использую сторонний графический интерфейс (пакет Synology Docker) для настройки контейнера докеров. Однако это ограничение заставляет меня запускать контейнер из командной строки. (Я хочу сопоставить другой IP-адрес хоста, чтобы привязать порт)

Теперь, поскольку есть много настроек, которые уже выполнены, я хотел бы получить исходную команду запуска, запускающую этот контейнер, а затем я могу изменить порт сопоставления портов на новый. например. " docker run -p 80:8080 gitlab"

Я не могу найти способ сделать это, используйте событие «docker inspect», такой информации не предоставлено.

Пожалуйста, дайте совет по решению этой проблемы.



6
@capitalistpug этот вопрос прямо противоположен этому - он о команде внутри контейнера, это о той, которая используется для запуска контейнера.
Нильс Керентьес,

история | grep 'docker run'
Адриан,

1
Удивительно, что Docker не имеет встроенной опции для этого.
Macindows,

Ответы:


134

Итак, как выполнить обратную разработку команды запуска докера?

Существует репозиторий github, который пытается реконструировать команду запуска докера, но в настоящее время он не идеален, версия есть 0.1.2. Вам следует следить за ним для обновления. Возможно, однажды вы сможете использовать его, чтобы получить с ним правильную команду запуска.

$ sudo pip install runlike

# run the ubuntu image
$ docker run -ti ubuntu bash

$ docker ps -a  
# suppose you get the container ID 1dfff2ba0226

# Run runlike to get the docker run command. 
$ runlike 1dfff2ba0226
docker run --name=elated_cray -t ubuntu bash

Репозиторий Github: runlike

Обновления :

Запускать без установки (Спасибо @tilo)

docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
    assaflavie/runlike YOUR-CONTAINER

или установить псевдоним

alias runlike="docker run --rm -v/var/run/docker.sock:/var/run/docker.sock 
 assaflavie/runlike"

runlike YOUR-CONTAINER

1
Настроить runlike на Synology DSM немного сложно, но я попробую. Спасибо!
Джек Ю

1
Мне пришлось использовать sudo pip install runlike
Саймон

@JackYu удалось ли вам установить его в Sysnology?
xedo 03

runlike экономит нам много времени => ❤️
mtt2p 05

21
беги как:docker run -v /var/run/docker.sock:/var/run/docker.sock \ assaflavie/runlike YOUR-CONTAINER
Тило

35

Используйте docker inspect :

$ docker inspect foo/bar
[
    {
        # …
        "Config": {
            # …
            "Cmd": [
                "/usr/local/bin/script.sh"
            ],
            # …
        }
    }
]

Вы можете программно проанализировать это с помощью jq :

$ docker inspect foo/bar | jq -r '.[0]["Config"]["Cmd"][0]'
/usr/local/bin/script.sh

1
да, я тоже предпочитаю jq, небольшая настройка команды (немного легче набирать и читать ИМХО): docker inspect <CONTAINER> | jq ".[0].Config.Cmd"
Пол Кэрролл

1
"Cmd": null,Может быть, это работает только в том случае, если контейнер не запускался автоматически демоном докера?
Майкл

25

Я написал простой инструмент CLI на основе Node для генерации docker runкоманды из существующего контейнера.

https://www.npmjs.com/package/rekcod

Вот пример:

$ npm i -g rekcod
$ rekcod redis_container

docker run -d --name redis_container --restart always -h a44159e148e1 \
--expose 6379/tcp -e PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin \
-e REDIS_VERSION=3.0.7 -e REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-3.0.7.tar.gz \
-e REDIS_DOWNLOAD_SHA1=e56b4b7e033ae8dbf311f9191cf6fdf3ae974d1c \
--entrypoint "/entrypoint.sh" redis "redis-server"

Также обрабатывает ссылки, смонтированные тома и прочее.

На данный момент не очень надежный, но справляется с большим количеством вещей, упомянутых выше, и это было больше того, что я искал.

РЕДАКТИРОВАТЬ: одной командой без установки программного обеспечения:

docker run --rm -v /var/run/docker.sock:/var/run/docker.sock nexdrew/rekcod redis_container

6

Более простой (?) Альтернативой является запуск этого шаблона проверки докеров , который использует встроенные возможности шаблонов Go для вывода docker runсовместимой команды. Шаблон охватывает только самые обычные параметры командной строки, но его можно легко расширить.

Это решение не зависит от других инструментов, кроме самого докера.


5

Используйте следующую команду, чтобы получить аргументы для всех контейнеров docker inspect -f "{{.Name}} {{.Path}} {{.Args}}" $ (docker ps -a -q)


1
Здесь перечислены команды и аргументы для того, что выполняется внутри контейнера, а не то, как контейнер был запущен (то есть ответ на вопрос, который вы опубликовали через 4 минуты после этого! :)).
OzgurH

4

В настоящее время кажется, что нам нужно выполнить проверку докеров, а затем вручную воссоздать команду запуска.

Я нашел, что кто-то пытается написать сценарий bash для этого: https://gist.github.com/miracle2k/c85b7b077fdb8d54bc89

но он неполный и зависит от jq.


3

Более простой (надежный) вариант - использовать что-то вроде bash-preexec для захвата команд, которые начинаются с «docker run». Затем вы можете где-нибудь сохранить эти команды и получить их позже.

Например, вы можете добавить что-то вроде этого в свой профиль bash:

[[ -f ~/.bash-preexec.sh ]] && source ~/.bash-preexec.sh
docker_run_history=~/.docker_run_history
docker_clear_history(){
    echo -n > $docker_run_history
}
docker_search_history(){
    search_for="$@"
    [[ -z $search_for ]] && search_for=".*"
    \cat $docker_run_history | grep "$search_for" | tail -1
}
docker_ps_mod(){
    for c in $(docker ps --format "{{.Image}}"); do 
        echo "Container $c was run using:"
        echo -e "\t$(docker_search_history $c)"
    done
}
docker_hook(){
    if [[ $@ =~ ^"docker run".*$ ]]; then
        \echo "$@" >> $docker_run_history 
    fi
}
preexec(){ 
    docker_hook $@
}

Тогда вы могли бы просто запустить свои вещи:

source ~/.bash_profile
docker run -it --rm -v $(pwd)/data:/data -p 8080:80 image
docker run -d daemon
docker_ps_mod

Какие выходы:

Container image was run using:
    docker run -it --rm -v $(pwd)/data:/data -p 8080:80 image
Container daemon was run using:
    docker run -d daemon

Интересная альтернатива. +1
VonC

Абсурдно, что докер не записывает историю команд и имеет такой простой конвейер.
Macindows,

3

Если вы не хотите ничего устанавливать в текущую установку сервера Docker, вы можете просто выполнить (замените $CONTAINER_NAMEимя контейнера, в котором вы хотите иметь аргументы запуска):

docker run -it--rm --volume /var/run/docker.sock:/var/run/docker.sock --privileged docker sh -c "apk add --no-cache nodejs nodejs-npm && npm i -g rekcod && rekcod $CONTAINER_NAME"

(для rekcodметода )

или

docker run -it--rm --volume /var/run/docker.sock:/var/run/docker.sock --privileged docker sh -c "apk add --no-cache py-pip && pip install runlike && runlike $CONTAINER_NAME"

(для runlikeметода )


2

Эта команда запуска докера не указана в Dockerfile или других документах, связанных с докером.

Либо вы найдете пример в документации, связанной с вашим контейнером, либо вы можете сделать вывод, что докер запускается с (по крайней мере, для команды и сопоставления портов) a docker ps -a(но это не даст вам возможных--volumes-from вариантов)

Проверьте также /usr/syno/etc/packages/Docker-GitLab/config

Это отличается от самой конфигурации gitlab, которая в Synology доступна в/usr/syno/etc/packages/Docker/synology_gitlab.config


Благодарим за указание расположения файла конфигурации Synology Docker. Но конфиг не может больше помочь. Его содержимое почти такое же, как при экспорте контейнера из веб-интерфейса.
Джек Ю


0

Все файлы докеров находятся здесь, вы можете найти cmd и монтировать, например, ls -la /proc/1 просто cat it

cat /proc/1/cmdline
nginx: master process nginx -g daemon off;
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.