docker

우분투 리눅스에서 /etc/cron.d/ (혹은 기타 /etc/cron.daily 등)에 docker exec -it 명령문 호출하지 않는 경우 해결 방법

# sudo docker exec -it /do/somthing

cron.d 에 docker exec 명령문을 수행하도록 추가하는 경우 습관적으로 -it 플래그를 붙이는 경우가 있습니다. -it 플래그를 붙여 실행하면 보통 도커 컨테이너에 쉘(shell)로 접속해 여러 가지 명령어를 직접 실행하기에 좋은데요.

하지만 cron 서비스가 위 명령어를 실행하는 경우 cron 은 별도의 콘솔 즉 TTY를 접속하지 않기 때문에 -it 플래그를 붙인 명령문은 제대로 실행하지 않고 종료하게 됩니다.

따라서 해결 방법은 간단히 -it 를 빼고 명령문을 넣어주면 됩니다. (이렇게 간단한 걸 모르고 며칠을 고민하다니..)

# docker exec /do/somthing

추가로 docker exec 에 대한 도움말을 보면 아래와 같습니다. 특히 -t 플래그의 경우 pseudo-TTY 를 할당한다고 되어 있네요. cron 서비스가 TTY에 연결되지 않기 때문에 문제가 되는 거였습니다.

$ docker exec --help

Usage:  docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

Execute a command in a running container

Aliases:
  docker container exec, docker exec

Options:
  -d, --detach               Detached mode: run command in the background
      --detach-keys string   Override the key sequence for detaching a container
  -e, --env list             Set environment variables
      --env-file list        Read in a file of environment variables
  -i, --interactive          Keep STDIN open even if not attached
      --privileged           Give extended privileges to the command
  -t, --tty                  Allocate a pseudo-TTY
  -u, --user string          Username or UID (format: "<name|uid>[:<group|gid>]")
  -w, --workdir string       Working directory inside the container

습관적으로 주던 명령문의 플래그는 의미를 잘 알고 있어야 하겠습니다. 이것 때문에 며칠 동안 cron 으로 걸어둔 작업이 정상작동하지 않아 애먹었네요. ㅜㅜ

[참고]