Jak wyświetlić polecenie uruchomienia kontenera Dockera

106

Korzystam z graficznego interfejsu użytkownika innej firmy (pakietu Synology Docker), aby skonfigurować kontener Docker. Jednak to ograniczenie sprawia, że ​​muszę uruchamiać kontener z wiersza poleceń. (Chcę zmapować inny adres IP hosta, aby powiązać port)

Teraz, ponieważ istnieje wiele ustawień, które już zostały wykonane, chciałbym pobrać oryginalne polecenie uruchomienia, które uruchamia ten kontener, a następnie mogę zmienić port mapowania portów na nowy. na przykład. „ docker run -p 80:8080 gitlab

Nie mogę znaleźć sposobu, aby to zrobić, użyj zdarzenia „docker inspect”, brak takich informacji.

Proszę o porady, jak rozwiązać ten problem.

Jack Yu
źródło
6
@capitalistpug to pytanie jest dokładnym przeciwieństwem tego - chodzi o polecenie wewnątrz kontenera, to jest o to, które jest używane do uruchomienia kontenera.
Niels Keurentjes
historia | grep 'docker run'
Adrian Maj
1
To niesamowite, że Docker nie ma do tego wbudowanej opcji.
Macindows

Odpowiedzi:

134

Jak więc wykonać polecenie Docker Run w inżynierii odwrotnej?

Istnieje repozytorium github, które próbuje odwrócić komendę docker run, ale obecnie nie jest idealne, wersja jest 0.1.2. Powinieneś go śledzić w celu aktualizacji. Może pewnego dnia będziesz mógł go użyć, aby uzyskać z nim prawidłowe polecenie uruchomienia.

$ 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

Repozytorium Github: runlike

Aktualizacje :

Uruchom bez instalowania (dzięki @tilo)

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

lub ustaw alias

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

runlike YOUR-CONTAINER
BMW
źródło
1
Trochę trudno jest skonfigurować działanie w sposób podobny do Synology DSM, ale spróbuję. Dziękuję Ci!
Jack Yu
1
Musiałem użyć sudo pip install runlike
Simon
@JackYu, czy udało Ci się zainstalować go w Sysnology?
xedo
runlike oszczędza nam dużo czasu => ❤️
mtt2p
21
biegać jak:docker run -v /var/run/docker.sock:/var/run/docker.sock \ assaflavie/runlike YOUR-CONTAINER
Tilo
35

Użyj inspekcji docker :

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

Możesz programowo przeanalizować to za pomocą jq :

$ docker inspect foo/bar | jq -r '.[0]["Config"]["Cmd"][0]'
/usr/local/bin/script.sh
Chris Lamb
źródło
1
tak, ja też wolę jq, drobna poprawka w poleceniu (trochę łatwiejsza do wpisania i odczytania IMHO) to: docker inspect <CONTAINER> | jq ".[0].Config.Cmd"
Paul Carroll
1
"Cmd": null,Może działa to tylko wtedy, gdy kontener nie został uruchomiony automatycznie jako demon Dockera?
Michael,
25

Napisałem proste narzędzie CLI oparte na Node, aby wygenerować docker runpolecenie z istniejącego kontenera.

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

Oto przykład:

$ 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"

Obsługuje również łącza, zamontowane woluminy i inne rzeczy.

W tej chwili nie jest super wytrzymały, ale radzi sobie lepiej niż niektóre z innych wymienionych rzeczy i było to bardziej tego, czego szukałem.

EDYCJA: jednym poleceniem, bez instalowania oprogramowania:

docker run --rm -v /var/run/docker.sock:/var/run/docker.sock nexdrew/rekcod redis_container
superEb
źródło
6

Prostszą (?) Alternatywą jest uruchomienie tego szablonu Docker inspect , który wykorzystuje wbudowane możliwości tworzenia szablonów Go w celu wyprowadzenia docker runzgodnego polecenia. Szablon obejmuje tylko najbardziej typowe opcje wiersza poleceń, ale można go łatwo rozszerzyć.

To rozwiązanie nie ma żadnych zależności od innych narzędzi, z wyjątkiem samego dockera.

Emmanuel Frécon
źródło
5

Użyj następującego polecenia, aby pobrać argumenty dla wszystkich kontenerów Docker inspect -f "{{.Name}} {{.Path}} {{.Args}}" $ (docker ps -a -q)

Abhishek Jain
źródło
1
Zawiera listę poleceń i argumentów dla tego, co działa w kontenerze, a nie jak kontener został uruchomiony (tj. Odpowiedź na pytanie, które opublikowałeś odpowiedź podobną do run 4 minuty później! :)).
OzgurH
4

Obecnie wydaje się, że musimy przejść do „docker inspect”, a następnie ręcznie odtworzyć polecenie uruchomienia.

Znalazłem kogoś, kto próbował napisać skrypt bash, aby to zrobić: https://gist.github.com/miracle2k/c85b7b077fdb8d54bc89

ale jest niekompletny i zależy od jq.

Rene Wooller
źródło
3

Prostszą (solidniejszą) opcją byłoby użycie czegoś takiego jak bash-preexec do przechwytywania poleceń zaczynających się od „docker run”. Możesz wtedy przechowywać te polecenia gdzieś i odzyskać je później.

Na przykład możesz dodać coś takiego w swoim profilu 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 $@
}

Wtedy możesz po prostu uruchomić swoje rzeczy:

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

Które wyjścia:

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
cglacet
źródło
Ciekawa alternatywa. +1
VonC
To absurd, że docker nie rejestruje historii poleceń i ma po prostu takie proste potoki.
Macindows
3

Jeśli nie chcesz niczego instalować w bieżącej konfiguracji serwera Docker, możesz po prostu wykonać (zastąpić $CONTAINER_NAMEnazwą kontenera, dla którego chcesz mieć argumenty uruchamiania):

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"

(dla rekcodmetody )

lub

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"

(dla runlikemetody )

Anthony O.
źródło
2

To polecenie docker run nie jest określone w pliku Dockerfile ani w innych dokumentach związanych z platformą Docker.

Albo znajdziesz przykład w dokumentacji związanej z twoim kontenerem, albo możesz wywnioskować, że docker działa z (przynajmniej dla polecenia i mapowania portów) a docker ps -a(ale to nie da ci możliwego--volumes-from opcji)

Sprawdź również /usr/syno/etc/packages/Docker-GitLab/config

Różni się to od samej konfiguracji gitlab, która w Synology jest dostępna w/usr/syno/etc/packages/Docker/synology_gitlab.config

VonC
źródło
Dziękujemy za wzmiankę o lokalizacji pliku konfiguracyjnego Synology Docker. Ale konfiguracja niewiele więcej może pomóc. Jego zawartość jest taka sama, jak podczas eksportowania kontenera z interfejsu WWW.
Jack Yu
0

Aby cofnąć polecenie docker run, istnieje również następujący pakiet npm.

https://github.com/nexdrew/rekcod

finrod
źródło
Haha .. docker in reverse ==> rekcod
Macindows
0

Wszystkie pliki dockera są tutaj, możesz znaleźć cmd i montuje na przykład ls -la /proc/1 po prostu cat it

cat /proc/1/cmdline
nginx: master process nginx -g daemon off;
user2319883
źródło