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.



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

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

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

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.


5

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


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


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

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 )


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


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

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;
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.