Come mostrare il comando di esecuzione di un container docker


102

Uso una GUI di terze parti (pacchetto Synology Docker) per configurare un contenitore Docker. Tuttavia, la sua limitazione mi rende necessario eseguire il contenitore dalla riga di comando. (Voglio mappare un altro IP host per collegare la porta)

Ora, poiché ci sono molte impostazioni già eseguite, vorrei recuperare il comando di esecuzione originale che avvia questo contenitore, quindi posso cambiare la porta di mappatura delle porte in una nuova. per esempio. " docker run -p 80:8080 gitlab"

Non riesco a trovare il modo per farlo, uso dell'evento "docker inspect", nessuna informazione fornita.

Fornisci alcuni consigli per risolvere questo problema.



6
@capitalistpug questa domanda è l'esatto opposto di questa: si tratta del comando all'interno del contenitore, si tratta di quello utilizzato per avviare il contenitore.
Niels Keurentjes

storia | grep 'docker run'
Adrian May

1
È sorprendente che Docker non abbia un'opzione integrata per questo.
Macindows

Risposte:


132

Quindi come invertire il comando di esecuzione del docker?

Esiste un repository GitHub che tenta di invertire il comando di esecuzione di Docker, ma al momento non è perfetto, la versione lo è 0.1.2. Dovresti seguirlo per l'aggiornamento. Forse un giorno puoi usarlo per ottenere il comando di esecuzione corretto con esso.

$ 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

Repository Github: runlike

Aggiornamenti :

Esegui senza installare (Grazie @tilo)

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

o imposta alias

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

runlike YOUR-CONTAINER

1
È un po 'difficile da configurare come run su Synology DSM, ma lo proverò. Grazie!
Jack Yu

1
Ho dovuto usare sudo pip install runlike
Simon

@JackYu sei riuscito a installarlo in Sysnology?
xedo

runlike ci fa risparmiare un sacco di tempo => ❤️
mtt2p

21
corri come:docker run -v /var/run/docker.sock:/var/run/docker.sock \ assaflavie/runlike YOUR-CONTAINER
Tilo

30

Usa docker inspect :

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

Puoi analizzarlo programmaticamente con jq :

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

si preferisco anche jq, una leggera modifica al comando (un po 'più facile da digitare e leggere IMHO) è: docker inspect <CONTAINER> | jq ".[0].Config.Cmd"
Paul Carroll

1
"Cmd": null,Forse questo funziona solo se il contenitore non è stato avviato automaticamente essere il demone docker?
Michael il

23

Ho scritto un semplice strumento CLI basato su nodi per generare un docker runcomando da un contenitore esistente.

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

Ecco un esempio:

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

Gestisce anche collegamenti e volumi montati e altre cose.

Non è super robusto al momento, ma gestisce più di alcune delle altre cose menzionate, ed era più di quello che stavo cercando.

EDIT: in un unico comando, senza installare alcun software:

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

6

Un'alternativa più semplice (?) È eseguire questo modello di docker inspect , che utilizza le funzionalità di creazione dei modelli Go incorporate per generare un docker runcomando compatibile. Il modello copre solo le più comuni opzioni della riga di comando, ma può essere facilmente esteso.

Questa soluzione non ha dipendenze da altri strumenti, eccetto Docker stesso.


5

Utilizza il seguente comando per ottenere gli argomenti per tutti i contenitori docker inspect -f "{{.Name}} {{.Path}} {{.Args}}" $ (docker ps -a -q)


1
Questo elenca il comando e gli argomenti per cosa è in esecuzione all'interno del contenitore, non come il contenitore è stato avviato (cioè la risposta alla domanda che hai pubblicato la risposta runlike 4 minuti dopo! :)).
OzgurH


3

Quale potrebbe essere un'opzione più semplice (robusta) sarebbe usare qualcosa come bash-preexec per acquisire comandi che iniziano con "docker run". È quindi possibile memorizzare questi comandi da qualche parte e recuperarli in seguito.

Ad esempio, potresti aggiungere qualcosa di simile nel tuo profilo 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 $@
}

Quindi potresti semplicemente eseguire le tue cose:

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

Quali uscite:

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

Alternativa interessante. +1
VonC

È assurdo che docker non registri la cronologia dei comandi e abbia semplicemente un piping come questo.
Macindows

3

Se non si desidera installare nulla nella configurazione del server Docker attualmente in esecuzione, è possibile eseguire semplicemente (sostituire $CONTAINER_NAMEcon il nome del contenitore di cui si desidera avere gli argomenti di esecuzione):

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"

(per il rekcodmetodo )

o

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"

(per il runlikemetodo )


2

Quel comando di esecuzione della finestra mobile non è specificato nel Dockerfile o in qualsiasi altro documento relativo a Docker.

O trovi un esempio nella documentazione associata al tuo contenitore, oppure puoi dedurre che docker viene eseguito con (almeno per il comando e la mappatura delle porte) a docker ps -a(ma questo non ti darà le possibili --volumes-fromopzioni)

Controlla anche /usr/syno/etc/packages/Docker-GitLab/config

Questo differisce dalla configurazione gitlab stessa, che su Synology è disponibile in/usr/syno/etc/packages/Docker/synology_gitlab.config


Grazie per aver menzionato il percorso del file di configurazione di Synology Docker. Ma la configurazione non può aiutare molto di più. Il suo contenuto è più o meno lo stesso che esporti un contenitore dall'interfaccia utente Web.
Jack Yu


0

Tutti i file docker sono qui, puoi trovare cmd e monta ad esempio ls -la /proc/1 semplicemente cat it

cat /proc/1/cmdline
nginx: master process nginx -g daemon off;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.