# Docker 명령어 시리즈로 런처를 이해해 보기

**URL:** <https://meta.discourse.org/t/trying-to-understand-launcher-as-a-series-of-docker-commands/153861>\
**Category:** Development\
**Created:** [6월 4, 2020, 7:22오후 UTC](https://meta.discourse.org/t/trying-to-understand-launcher-as-a-series-of-docker-commands/153861 "2020-06-04T19:22:14Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![EricGT](https://avatars.discourse-cdn.com/v4/letter/e/f1d935/32.png) [@EricGT](https://meta.discourse.org/u/EricGT)\
**Post date:** [6월 4, 2020, 7:22오후 UTC](https://meta.discourse.org/t/trying-to-understand-launcher-as-a-series-of-docker-commands/153861/1 "2020-06-04T19:22:14Z")

</div>

launcher가 실행하는 Docker 명령어를 이해하려고 노력하고 있습니다.

이를 위해서는 스크립트 내의 다른 bash 명령어들도 이해해야 합니다. 저는 bash 전문가가 아니기 때문에 일부 부분을 파악하기 위해 조사를 해야 합니다. 보통은 코드를 읽고 수동으로 명령어를 파악한 후, 예를 들어 다음과 같이 테스트 실행하여 확인합니다.

```plaintext
docker info 2> /dev/null

```

때로는 일부 줄이 더 복잡한 경우가 있는데, 이 경우 동등한 명령어를 실행해 봅니다. 예를 들어:

```plaintext
test=$(($(stat -f --format="%a*%S" /var/lib/docker)/1024**3 < 5)); echo $test

```

현재 작업 중인 서브루틴은 host\_run()인데, 이 루틴의 입력이 어디에서 오는지 전혀 모르겠습니다.

[https://github.com/discourse/discourse\_docker/blob/master/launcher#L259-#L287](https://github.com/discourse/discourse_docker/blob/master/launcher#L259-#L287).

앞으로 며칠 동안 많은 질문을 하거나 수정된 launcher에 echo 문구를 삽입하는 방법도 있지만, 더 나은 방법이 있을 것입니다.

실행 중인 내부 Docker 명령어를 캡처하여 파일로 기록할 수 있는 [script](http://manpages.ubuntu.com/manpages/xenial/man1/script.1.html) 명령어와 유사한 수단이 있을까요?

**수정**

이것이 작동하는 것 같습니다. 참고: [Bash 스크립트 디버깅](https://tldp.org/LDP/Bash-Beginners-Guide/html/sect_02_03.html)

단순히 bash의 -x 옵션을 사용하면 됩니다. 예를 들어:

```plaintext
groot@galaxy:/var/discourse$ sudo bash -x launcher start app

```

이를 파일로 캡처하려면

1. 트레이스를 저장할 디렉토리를 생성합니다. 권한 문제를 피하기 위해 ~ 경로 아래에 생성합니다.

```plaintext
groot@galaxy:/var/discourse$ mkdir ~/traces

```

1. 관심 있는 bash 명령어를 실행합니다. 핵심은 트레이스 출력이 stdout으로 가지 않고 stderr로 나가기 때문에 1\>인 \> 대신 2\>를 사용해야 한다는 점입니다.

```plaintext
groot@galaxy:/var/discourse$ sudo bash -x launcher start app 2> ~/traces/start_01

```

1. 파일에서 docker 명령어가 포함된 줄을 필터링합니다.

```plaintext
groot@galaxy:/var/discourse$ grep /usr/bin/docker ~/traces/start_01

```

* * *

출력 예시:

```plaintext
+ docker_path=/usr/bin/docker
+ '[' -z /usr/bin/docker ']'
++ /usr/bin/docker info
+ /usr/bin/docker info
++ /usr/bin/docker --version
++ /usr/bin/docker images
++ /usr/bin/docker run -i --rm -a stdout -a stderr discourse/base:2.0.20200512-1735 echo working
++ /usr/bin/docker info --format '{{.DockerRootDir}}'
+ '[' -z /usr/bin/docker ']'
++ /usr/bin/docker --version
++ /usr/bin/docker ps
++ /usr/bin/docker ps -a
+ /usr/bin/docker start app

```

기대했던 것보다 훨씬 더 많은 Docker 명령어가 표시될 수 있지만, launcher는 수동으로 수행해야 하는 많은 무결성 검사를 수행하고 있습니다. 이는 launcher가 생성된 목적에 맞는 정기적인 작업에 launcher를 사용해야 한다는 확신을 줍니다.
