ProgramingTip

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

bestdevel 2020. 10. 26. 08:25
반응형

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

Docker 검사 사용 :

$ 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'로 이동 한 다음 수동으로 실행 명령을 다시 선택하는 것입니다.

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

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


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


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

해당 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


현재 실행중인 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방법의 경우 )


docker run 명령을 되돌리려면 다음 npm 패키지도 있습니다.

https://github.com/nexdrew/rekcod

참고 URL : https://stackoverflow.com/questions/32758793/how-to-show-the-run-command-of-a-docker-container

반응형