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


106

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

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

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

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



6
@capitalistpug 그 질문은이 질문과 정반대입니다 . 컨테이너 내부 의 명령에 관한 것이고 컨테이너를 시작 하는 데 사용되는 질문에 관한 것 입니다.
Niels Keurentjes

역사 | 그렙 '고정 표시기 실행'
아드리안 월

1
Docker에 내장 옵션이 없다는 것은 놀라운 일입니다.
Macindows

답변:


134

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

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에서 실행 방식으로 설정하는 것은 약간 어렵지만 시도해 보겠습니다. 감사합니다!
Jack Yu

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

35

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

1
그래 난 너무 JQ 선호 명령에 약간의 비틀기는 (a는 입력 이럴을 쉽게 읽을 비트) : docker inspect <CONTAINER> | jq ".[0].Config.Cmd"
폴 캐롤

1
"Cmd": null,컨테이너가 자동으로 시작되지 않은 경우에만 도커 데몬이 될 수 있습니까?
Michael

25

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

더 간단한 (?) 대안은 기본 제공 Go 템플릿 기능을 사용하여 호환되는 명령 을 출력하는 이 docker inspect 템플릿 을 실행 하는 것 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

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 관련 문서에 지정되어 있지 않습니다.

컨테이너와 관련된 문서에서 예제를 찾거나 (적어도 명령 및 포트 매핑의 경우) a로 실행되는 도커를 추론 할 수 docker ps -a있지만 가능한 --volumes-from옵션을 제공하지는 않습니다.

또한 확인 /usr/syno/etc/packages/Docker-GitLab/config

이것은 Synology 에서 사용할 수있는 gitlab 구성 자체 와 다릅니다 ./usr/syno/etc/packages/Docker/synology_gitlab.config


Synology Docker의 구성 파일 위치를 언급 해 주셔서 감사합니다. 그러나 구성은 더 많은 것을 도울 수 없습니다. 콘텐츠는 웹 UI에서 컨테이너를 내보내는 것과 거의 동일합니다.
Jack Yu


0

모든 도커 파일이 여기에 있습니다. cmd 및 마운트를 찾을 수 있습니다. 예를 들어 ls -la /proc/1 cat it

cat /proc/1/cmdline
nginx: master process nginx -g daemon off;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.