[docker] Docker 컨테이너의 실행 명령을 표시하는 방법

타사 GUI (Synology Docker 패키지)를 사용하여 도커 컨테이너를 설정합니다. 그러나 제한으로 인해 명령 줄에서 컨테이너를 실행해야합니다. (다른 호스트 IP를 매핑하여 포트를 바인딩하고 싶습니다)

이제 이미 수행 된 많은 설정이 있으므로이 컨테이너를 시작하는 원래 실행 명령을 검색하고 싶습니다. 그러면 포트 매핑 포트를 새 포트로 변경할 수 있습니다. 예. ” docker run -p 80:8080 gitlab

그렇게하는 방법을 찾을 수 없습니다. 이벤트는 “docker inspect”를 사용합니다. 그러한 정보는 제공되지 않았습니다.

이 문제를 해결하기 위해 몇 가지 조언을 제공하십시오.



답변

그렇다면 도커 실행 명령을 리버스 엔지니어링하는 방법은 무엇입니까?

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


답변

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


답변

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


답변

더 간단한 (?) 대안은 기본 제공 Go 템플릿 기능을 사용하여 호환되는 명령 을 출력하는 이 docker inspect 템플릿 을 실행 하는 것 docker run입니다. 템플릿은 가장 일반적인 명령 줄 옵션 만 다루지 만 쉽게 확장 할 수 있습니다.

이 솔루션은 docker 자체를 제외하고 다른 도구에 대한 종속성이 없습니다.


답변

다음 명령을 사용하여 모든 컨테이너에 대한 인수를 가져옵니다.
docker inspect -f “{{.Name}} {{.Path}} {{.Args}}”$ (docker ps -a -q)


답변

현재는 ‘docker inspect’로 가서 수동으로 실행 명령을 다시 만들어야하는 것 같습니다.

이 작업을 수행하기 위해 bash 스크립트를 작성하려는 사람을 찾았습니다.
https://gist.github.com/miracle2k/c85b7b077fdb8d54bc89

그러나 그것은 불완전하고 jq에 의존합니다.


답변

더 간단한 (강력한) 옵션은 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