Dockerコンテナーの実行コマンドを表示する方法


102

サードパーティのGUI(Synology Dockerパッケージ)を使用して、Dockerコンテナーをセットアップします。ただし、これには制限があるため、コマンドラインからコンテナを実行する必要があります。(ポートをバインドするために別のホストIPをマップしたい)

ここで、すでに多くの設定が行われているので、このコンテナーを開始する元の実行コマンドを取得したいので、ポートマッピングポートを新しいポートマッピングに変更できます。例えば。「docker run -p 80:8080 gitlab

私はそうする方法を見つけることができません。イベントは「docker inspect」を使用します。そのような情報は提供されません。

この問題を解決するためのアドバイスを提供してください。



6
@capitalistpugその質問はこれとは正反対です-それはコンテナのコマンドに関するものであり、これはコンテナを起動するために使用されるものに関するものです。
Niels Keurentjes、2016年

歴史| grep 'docker run'
Adrian May

1
Dockerにはこのための組み込みオプションがないのは驚くべきことです。
Macindows

回答:


132

では、どのようにdocker runコマンドをリバースエンジニアリングするのですか?

docker runコマンドをリバースエンジニアリングしようとするgithubリポジトリがありますが、現時点では完全ではありません0.1.2。バージョンはです。あなたはそれを更新するために従うべきです。多分ある日あなたはそれを使って正しい実行コマンドを得るためにそれを使うことができます。

$ 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リポジトリ: runlike

アップデート:

インストールせずに実行(ありがとう@tilo)

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

またはエイリアスを設定

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

runlike YOUR-CONTAINER

1
Synology DSMでrunlikeを設定するのは少し難しいですが、私は試してみます。ありがとうございました!
ジャックユー

1
私はsudo pip install runlikeを使用しなければなりませんでした
Simon

@JackYuは、Sysnologyにインストールするために達成しましたか?
xedo

runlikeは私たちに時間=>❤️の節約
mtt2p

21
ランのような:docker run -v /var/run/docker.sock:/var/run/docker.sock \ assaflavie/runlike YOUR-CONTAINER
は、Tilo

30

docker inspectを使用ます。

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

これをjqでプログラム的に解析できます。

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

はい、私はあまりにもJQ好む、コマンドに若干の微調整がある(入力し、私見を読みやすくビット): docker inspect <CONTAINER> | jq ".[0].Config.Cmd"
ポール・キャロル

1
"Cmd": null,多分これはコンテナが自動的に起動されなかった場合にのみ機能しますdocker daemon?
マイケル

23

docker run既存のコンテナーからコマンドを生成する簡単なノードベースのCLIツールを作成しました。

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

次に例を示します。

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

リンクやマウントされたボリュームなども処理します。

現時点では超堅牢ではありませんが、言及されている他のもののいくつかよりも多くを処理し、それが私が探していたものの多くでした。

編集:ソフトウェアをインストールせずに単一のコマンドで:

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

6

より簡単な(?)代替方法は、このdocker inspect templateを実行することです。これは、組み込みのGoテンプレート機能を使用してdocker run互換性のあるコマンドを出力します。テンプレートは最も一般的なコマンドラインオプションのみをカバーしますが、簡単に拡張できます。

このソリューションは、Docker自体を除いて、他のツールに依存していません。


5

次のコマンドを使用して、すべてのコンテナーの引数を取得します docker inspect -f "{{.Name}} {{.Path}} {{.Args}}" $(docker ps -a -q)


1
これは、コンテナーの起動方法ではなく、コンテナー内で実行さているもののコマンドと引数をリストします(つまり、4分後にrunlike回答を投稿した質問への回答!:))。
OzgurH


3

より単純な(堅牢な)オプションは、bash-preexecのようなものを使用して、「docker run」で始まるコマンドをキャプチャすることです。次に、これらのコマンドをどこかに保存し、後で取得することができます。

たとえば、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 $@
}

次に、あなたはあなたの物事を実行することができます:

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

どの出力:

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

興味深い代替案。+1
VonC 2017年

dockerがコマンドの履歴を記録せず、このような単純なパイプ処理を行うのは不合理です。
Macindows

3

現在実行中のDockerサーバーセットアップに何もインストールしたくない場合は、次のコマンドを実行するだけです($CONTAINER_NAME実行引数を設定するコンテナー名に置き換えます)。

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"

rekcodメソッド用

または

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"

runlikeメソッド用


2

そのdocker runコマンドは、Dockerfileや他のdocker関連のドキュメントでは指定されていません。

コンテナーに関連付けられたドキュメントで例を見つけるか、(少なくともコマンドとポートのマッピングに対して)Dockerの実行を推測できますdocker ps -a(ただし、可能な--volumes-fromオプションは提供されません)

こちらもチェック /usr/syno/etc/packages/Docker-GitLab/config

これは、Synologyで利用可能なgitlab構成自体とは異なります。/usr/syno/etc/packages/Docker/synology_gitlab.config


Synology Dockerの構成ファイルの場所について言及していただきありがとうございます。しかし、設定はそれ以上は役に立ちません。その内容は、Web UIからコンテナーをエクスポートする場合とほとんど同じです。
Jack Yu


0

すべてのドッキングウィンドウのファイルは、例えばCMDおよびマウントを見つけることができるここにいる ls -la /proc/1 だけで猫にそれを

cat /proc/1/cmdline
nginx: master process nginx -g daemon off;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.