Comment afficher la commande d'exécution d'un conteneur Docker

106

J'utilise une interface graphique tierce (package Synology Docker) pour configurer un conteneur Docker. Cependant, sa limitation me oblige à exécuter le conteneur à partir de la ligne de commande. (Je veux mapper une autre adresse IP d'hôte pour lier le port)

Maintenant, comme il y a beaucoup de paramètres déjà définis, je voudrais récupérer la commande d'exécution originale qui démarre ce conteneur, puis je peux changer le port de mappage de port en un nouveau. par exemple. " docker run -p 80:8080 gitlab"

Je ne trouve pas le moyen de le faire, utilisez l'événement "docker inspect", aucune information de ce type n'est fournie.

Veuillez fournir quelques conseils pour résoudre ce problème.

Jack Yu
la source
6
@capitalistpug cette question est exactement le contraire de celle-ci - il s'agit de la commande à l' intérieur du conteneur, c'est à propos de celle utilisée pour lancer le conteneur.
Niels Keurentjes
histoire | grep 'docker run'
Adrian
1
C'est incroyable que Docker n'ait pas d'option intégrée pour cela.
Macindows

Réponses:

133

Alors, comment inverser la commande d'exécution de docker d'ingénierie?

Il existe un référentiel github qui tente de rétroconcevoir la commande d'exécution de docker, mais ce n'est pas parfait actuellement, la version l'est 0.1.2. Vous devriez le suivre pour la mise à jour. Peut-être qu'un jour vous pourrez l'utiliser pour obtenir une commande d'exécution correcte.

$ 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

Dépôt Github: runlike

Mises à jour:

Exécutez sans installer (merci @tilo)

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

ou définir un alias

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

runlike YOUR-CONTAINER
BMW
la source
1
C'est un peu difficile de configurer runlike sur Synology DSM, mais je vais l'essayer. Je vous remercie!
Jack Yu du
1
J'ai dû utiliser sudo pip install runlike
Simon
@JackYu avez-vous réussi à l'installer dans Sysnology?
xedo
runlike nous fait gagner beaucoup de temps => ❤️
mtt2p
21
courir comme:docker run -v /var/run/docker.sock:/var/run/docker.sock \ assaflavie/runlike YOUR-CONTAINER
Tilo
35

Utilisez docker inspect :

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

Vous pouvez analyser cela par programme avec jq :

$ docker inspect foo/bar | jq -r '.[0]["Config"]["Cmd"][0]'
/usr/local/bin/script.sh
Chris Lamb
la source
1
oui je préfère jq aussi, un léger tweak sur la commande (un peu plus facile à taper et à lire à mon humble avis) est: docker inspect <CONTAINER> | jq ".[0].Config.Cmd"
Paul Carroll
1
"Cmd": null,Peut-être que cela ne fonctionne que si le conteneur n'a pas été démarré automatiquement par le démon docker?
Michael
25

J'ai écrit un simple outil CLI basé sur un nœud pour générer une docker runcommande à partir d'un conteneur existant.

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

Voici un exemple:

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

Gère également les liens et les volumes montés et autres choses.

Pas très robuste pour le moment, mais gère plus que certaines des autres choses mentionnées, et c'était plus ce que je recherchais.

EDIT: En une seule commande, sans installer de logiciel:

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

Une alternative plus simple (?) Consiste à exécuter ce modèle d'inspection de docker , qui utilise les capacités de création de modèles Go intégrées pour générer undocker run commande compatible. Le modèle ne couvre que les options de ligne de commande les plus courantes, mais il peut facilement être étendu.

Cette solution n'a aucune dépendance vis-à-vis d'autres outils, à l'exception de docker lui-même.

Emmanuel Frécon
la source
5

Utilisez la commande suivante pour obtenir les arguments de tous les conteneurs docker inspect -f "{{.Name}} {{.Path}} {{.Args}}" $ (docker ps -a -q)

Abhishek Jain
la source
1
Cela répertorie la commande et les arguments pour ce qui est en cours d'exécution à l' intérieur du conteneur, pas la façon dont le conteneur a été démarré (c'est-à-dire la réponse à la question que vous avez postée 4 minutes après! :)).
OzgurH
4

Actuellement, il semble que nous devions aller «inspecter docker», puis recréer manuellement la commande d'exécution.

J'ai trouvé quelqu'un essayant d'écrire un script bash pour faire ceci: https://gist.github.com/miracle2k/c85b7b077fdb8d54bc89

mais il est incomplet et dépend de jq.

René Wooller
la source
3

Ce qui pourrait être une option plus simple (robuste) serait d'utiliser quelque chose comme bash-preexec pour capturer les commandes qui commencent par "docker run". Vous pouvez ensuite stocker ces commandes quelque part et les récupérer plus tard.

Par exemple, vous pouvez ajouter quelque chose comme ceci dans votre profil 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 $@
}

Ensuite, vous pouvez simplement exécuter vos affaires:

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

Quelles sorties:

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
la source
Alternative intéressante. +1
VonC
Il est absurde que docker n'enregistre pas l'historique des commandes et ait un simple piping comme celui-ci.
Macindows
3

Si vous ne souhaitez rien installer dans la configuration actuelle de votre serveur Docker, vous pouvez simplement exécuter (remplacez-le $CONTAINER_NAMEpar le nom du conteneur dont vous souhaitez avoir les arguments d'exécution):

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"

(pour la rekcodméthode )

ou

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"

(pour la runlikeméthode )

Anthony O.
la source
2

Cette commande d'exécution du docker n'est pas spécifiée dans le fichier Docker ou dans tout autre document lié au docker.

Soit vous trouvez un exemple dans la documentation associée à votre conteneur, soit vous pouvez en déduire que docker fonctionne avec (au moins pour la commande et le mappage de port) a docker ps -a(mais cela ne vous donnera pas le--volumes-from options )

Vérifiez aussi /usr/syno/etc/packages/Docker-GitLab/config

Cela diffère de la configuration de gitlab elle-même, qui sur Synology est disponible dans/usr/syno/etc/packages/Docker/synology_gitlab.config

VonC
la source
Merci d'avoir mentionné l'emplacement du fichier de configuration de Synology Docker. Mais la configuration ne peut pas aider beaucoup plus. Son contenu est sensiblement le même que vous exportez un conteneur à partir de l'interface utilisateur Web.
Jack Yu
0

Pour inverser la commande d'exécution de docker, il existe également le package npm suivant.

https://github.com/nexdrew/rekcod

finrod
la source
Haha .. docker à l'envers ==> rekcod
Macindows
0

Tous les fichiers docker sont ici, vous pouvez trouver cmd et les montages, par exemple, ls -la /proc/1 juste le chat

cat /proc/1/cmdline
nginx: master process nginx -g daemon off;
utilisateur2319883
la source