Як показати команду запуску контейнера докера


102

Для налаштування контейнера докера я використовую сторонній графічний інтерфейс (пакет Synology Docker). Однак це обмеження змушує мене запускати контейнер із командного рядка. (Я хочу зіставити інший ip хоста для прив'язки порту)

Тепер, оскільки існує безліч налаштувань, які вже зроблено, я хотів би отримати вихідну команду запуску, яка запускає цей контейнер, тоді я можу змінити порт відображення портів на новий. напр. " docker run -p 80:8080 gitlab"

Я не можу знайти спосіб зробити це, використання події "перевірка докера", такої інформації не надано.

Будь ласка, надайте кілька порад для вирішення цієї проблеми.



6
@capitalistpug це питання прямо протилежне цьому - мова йде про команду всередині контейнера, це про ту, яка використовується для запуску контейнера.
Niels Keurentjes

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

1
Дивно, що Docker не має вбудованого варіанту для цього.
Macindows

Відповіді:


132

Отже, як змінити команду запуску інженерного докера?

Існує сховище 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
Це трохи важко налаштувати на Synology DSM, але я спробую. Дякую!
Jack Yu

1
Мені довелося скористатися sudo pip install runlike
Саймон

@JackYu чи домігся ви встановити його в Sysnology?
xedo 03.03.17

runlike економить нам багато часу => ❤️
mtt2p

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

30

Використовуйте перевірку докера :

$ 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

так, я теж віддаю перевагу jq, невелика корекція команди (трохи легше набирати та читати IMHO): docker inspect <CONTAINER> | jq ".[0].Config.Cmd"
Пол Керролл

1
"Cmd": null,Можливо, це працює лише в тому випадку, якщо контейнер не запускався автоматично, щоб бути демоном Docker?
Майкл

24

Я написав простий інструмент CLI на основі вузла для створення 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

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


1
Тут перелічено команду та аргументи щодо того, що працює в контейнері, а не про те, як контейнер був запущений (тобто відповідь на запитання, яке ви опублікували у вигляді запущеної відповіді через 4 хвилини після цього! :)).
OzgurH

4

На даний момент здається, що ми маємо перейти до "перевірки докера", а потім вручну відтворити команду запуску.

Я знайшов, що хтось намагається написати скрипт bash для цього: https://gist.github.com/miracle2k/c85b7b077fdb8d54bc89

але вона неповна і залежить від jq.


3

Простішим (надійнішим) варіантом може бути використання чогось на зразок bash-preexec для захоплення команд, які починаються з "запуску докера ". Потім ви можете десь зберегти ці команди і отримати їх пізніше.

Наприклад, ви можете додати щось подібне до свого профілю 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

Ця команда запуску докера не вказана у файлі Docker або будь-яких інших документах, пов'язаних із докером.

Або ви знайдете приклад у документації, пов’язаній з вашим контейнером, або ви можете зробити висновок, що докер запущений за допомогою (принаймні для відображення команд та портів) 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. Але конфігурація не може допомогти набагато більше. Його вміст майже такий самий, як ви експортуєте контейнер із веб-інтерфейсу.
Jack Yu


0

Тут знаходяться всі файли докера, ви можете знайти cmd та кріплення, наприклад, ls -la /proc/1 просто коти його

cat /proc/1/cmdline
nginx: master process nginx -g daemon off;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.