So zeigen Sie den Befehl run eines Docker-Containers an

101

Ich verwende eine GUI eines Drittanbieters (Synology Docker-Paket), um einen Docker-Container einzurichten. Aufgrund seiner Einschränkung muss ich den Container jedoch über die Befehlszeile ausführen. (Ich möchte eine andere Host-IP zuordnen, um den Port zu binden.)

Da bereits viele Einstellungen vorgenommen wurden, möchte ich den ursprünglichen Ausführungsbefehl abrufen, mit dem dieser Container gestartet wird, und dann den Portzuordnungsport in einen neuen ändern. z.B. " docker run -p 80:8080 gitlab"

Ich kann den Weg dazu nicht finden, Ereignis verwenden "Docker Inspect", keine solchen Informationen bereitgestellt.

Bitte geben Sie einige Ratschläge, um dieses Problem zu lösen.

Jack Yu
quelle
6
@capitalistpug Diese Frage ist das genaue Gegenteil von dieser - es geht um den Befehl im Container, es geht um den Befehl , der zum Starten des Containers verwendet wird.
Niels Keurentjes
Geschichte | grep 'Docker Run'
Adrian
1
Es ist erstaunlich, dass Docker hierfür keine eingebaute Option hat.
Macindows

Antworten:

131

Wie kann man den Docker-Ausführungsbefehl rückgängig machen?

Es gibt ein Github-Repository, das versucht, den Docker-Ausführungsbefehl rückzuentwickeln, aber es ist derzeit nicht perfekt, Version ist 0.1.2. Sie sollten es zur Aktualisierung befolgen. Vielleicht können Sie es eines Tages verwenden, um den richtigen Ausführungsbefehl damit zu erhalten.

$ 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-Repository: runlike

Aktualisierung:

Ohne Installation ausführen (Danke @tilo)

docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
    assaflavie/runlike YOUR-CONTAINER
BMW
quelle
1
Es ist ein wenig schwierig, Runlike auf Synology DSM einzurichten, aber ich werde es versuchen. Danke dir!
Jack Yu
1
Ich musste sudo pip install runlike verwenden
Simon
@ JackYu hast du es geschafft, es in Sysnology zu installieren?
Xedo
runlike spart uns viel Zeit => ❤️
mtt2p
21
laufen wie:docker run -v /var/run/docker.sock:/var/run/docker.sock \ assaflavie/runlike YOUR-CONTAINER
Tilo
30

Verwenden Sie Docker Inspect :

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

Sie können dies programmgesteuert mit jq analysieren :

$ docker inspect foo/bar | jq -r '.[0]["Config"]["Cmd"][0]'
/usr/local/bin/script.sh
Chris Lamb
quelle
Ja, ich bevorzuge auch JQ. Eine kleine Änderung am Befehl (etwas einfacher zu tippen und zu lesen, IMHO) ist: docker inspect <CONTAINER> | jq ".[0].Config.Cmd"
Paul Carroll
1
"Cmd": null,Vielleicht funktioniert das nur, wenn der Container nicht automatisch als Docker-Daemon gestartet wurde?
Michael
23

Ich habe ein einfaches knotenbasiertes CLI-Tool geschrieben, um einen docker runBefehl aus einem vorhandenen Container zu generieren .

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

Hier ist ein Beispiel:

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

Behandelt auch Links und gemountete Volumes und andere Dinge.

Im Moment nicht besonders robust, handhabt aber mehr als einige der anderen genannten Dinge, und es war mehr von dem, wonach ich gesucht habe.

BEARBEITEN: In einem einzigen Befehl, ohne Software zu installieren:

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

Eine einfachere (?) Alternative besteht darin, diese Docker-Inspektionsvorlage auszuführen , die die integrierten Go- Vorlagenfunktionen verwendet , um einen docker runkompatiblen Befehl auszugeben . Die Vorlage deckt nur die gängigsten Befehlszeilenoptionen ab, kann jedoch problemlos erweitert werden.

Diese Lösung hat keine Abhängigkeiten von anderen Tools außer Docker selbst.

Emmanuel Frécon
quelle
5

Verwenden Sie den folgenden Befehl, um die Argumente für alle Container abzurufen. Docker inspect -f "{{.Name}} {{.Path}} {{.Args}}" $ (Docker ps -a -q)

Abhishek Jain
quelle
1
Hier werden der Befehl und die Argumente für das aufgelistet, was im Container ausgeführt wird, nicht wie der Container gestartet wurde (dh die Antwort auf die Frage, die Sie 4 Minuten später gestellt haben! :)).
OzgurH
4

Derzeit scheint es so, als müssten wir 'Docker Inspect' ausführen und dann den Befehl run manuell neu erstellen.

Ich habe jemanden gefunden, der versucht, ein Bash-Skript zu schreiben, um dies zu tun: https://gist.github.com/miracle2k/c85b7b077fdb8d54bc89

aber es ist unvollständig und hängt von jq ab.

Rene Wooller
quelle
3

Eine einfachere (robuste) Option könnte darin bestehen , Befehle wie bash-preexec zu verwenden, um Befehle zu erfassen, die mit "Docker Run" beginnen. Sie können diese Befehle dann irgendwo speichern und später abrufen.

Sie können beispielsweise Ihrem Bash-Profil Folgendes hinzufügen:

[[ -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 $@
}

Dann könnten Sie einfach Ihre Sachen laufen lassen:

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

Welche Ausgänge:

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
quelle
Interessante Alternative. +1
VonC
Es ist absurd, dass Docker keinen Befehlsverlauf aufzeichnet und eine einfache Rohrleitung wie diese hat.
Macindows
3

Wenn Sie nichts in Ihr aktuell ausgeführtes Docker-Server-Setup installieren möchten, können Sie es einfach ausführen (durch $CONTAINER_NAMEden Containernamen ersetzen, für den Sie die Ausführungsargumente haben möchten):

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"

(für die rekcodMethode )

oder

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"

(für die runlikeMethode )

Anthony O.
quelle
2

Dieser Docker-Ausführungsbefehl ist weder in der Docker-Datei noch in anderen Docker-bezogenen Dokumenten angegeben.

Entweder finden Sie ein Beispiel in der Dokumentation zu Ihrem Container, oder Sie können daraus schließen, dass Docker mit (zumindest für die Befehls- und Portzuordnung) a ausgeführt wird docker ps -a(dies gibt Ihnen jedoch nicht die Möglichkeit--volumes-from bietet Optionen).

Überprüfen Sie auch /usr/syno/etc/packages/Docker-GitLab/config

Dies unterscheidet sich von der gitlab-Konfiguration selbst, die unter Synology verfügbar ist/usr/syno/etc/packages/Docker/synology_gitlab.config

VonC
quelle
Vielen Dank, dass Sie den Speicherort der Konfigurationsdatei von Synology Docker erwähnt haben. Aber die Konfiguration kann nicht viel mehr helfen. Der Inhalt entspricht weitgehend dem Export eines Containers aus der Web-Benutzeroberfläche.
Jack Yu
0

Um den Docker-Ausführungsbefehl umzukehren, gibt es auch das folgende npm-Paket.

https://github.com/nexdrew/rekcod

Finrod
quelle
Haha .. Docker in umgekehrter Richtung ==> rekcod
Macindows
0

Alle Docker-Dateien sind hier. Sie finden cmd und Mounts zum Beispiel ls -la /proc/1 einfach cat it

cat /proc/1/cmdline
nginx: master process nginx -g daemon off;
user2319883
quelle