Post

gitlab-runner container에서 Command not found가 발생하는 문제

gitlab-runner container에서 Command not found가 발생하는 문제

🚫 현상

  • gitlab runner 이미지로 만든 컨테이너에서 sh, bash, tail과 같은 명령어를 사용하려고 할 때 아래와 같은 문제 발생

    1
    2
    
      gitlab_runner   | Runtime platform                                    arch=amd64 os=linux pid=7 revision=782c6ecb version=16.9.1
      gitlab_runner   | FATAL: Command tail not found.  
    

💡원인

  • 왜 됨…?

이 문제는 GitLab Runner 컨테이너가 실행될 때 entrypoint 스크립트에 의해 예상치 못한 명령어(tail 등)가 실행되면서 발생한 오류입니다. 이를 해결하기 위해 entrypoint: [""]를 추가하면, 컨테이너의 기본 엔트리포인트 동작이 비활성화되고 직접 지정한 명령어만 실행됩니다.

이유와 원리

  1. 기본 Entrypoint와 CMD:
    • Docker 이미지는 보통 ENTRYPOINTCMD를 지정할 수 있습니다.
    • ENTRYPOINT는 컨테이너가 실행될 때 무조건 실행되는 스크립트나 명령어를 정의합니다.
    • CMDENTRYPOINT와 함께 전달될 추가 인자를 정의하거나, ENTRYPOINT가 없을 경우 기본 명령어로 사용됩니다.
  2. 문제의 원인:
    • GitLab Runner의 Docker 이미지는 ENTRYPOINT로 기본 동작이 정의되어 있습니다. 특정 상황에서는 이 ENTRYPOINT 스크립트가 tail 명령어를 사용하거나 잘못된 실행 환경을 유발할 수 있습니다.
    • tail not found라는 오류는 컨테이너 내부에서 tail 명령어를 실행하려 했지만, tail이 설치되어 있지 않거나 경로 설정이 올바르지 않은 경우 발생합니다.
  3. entrypoint: [""]의 효과:
    • entrypoint: [""]를 추가하면 Docker Compose는 기본 이미지를 사용할 때 지정된 ENTRYPOINT를 비활성화합니다.
    • 이로 인해 컨테이너가 실행될 때 CMD 또는 command에서 지정한 명령만 실행됩니다.

해결 방법의 작동 방식

  • 기본 ENTRYPOINT를 비활성화하면 GitLab Runner 컨테이너가 의존하는 스크립트나 명령이 실행되지 않으므로, 사용자가 명시적으로 지정한 명령만 실행되어 오류를 피할 수 있습니다.

주의점

  1. entrypoint: [""]ENTRYPOINT를 비활성화했을 때, 컨테이너의 의도된 기본 동작이 실행되지 않을 수 있습니다. 따라서 명령어(command 또는 CMD를 통해})를 명확히 지정해야 합니다.

🛠 해결책

  • docker-comspose에 entrypoint: [""] 를 추가하여 해결

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    
      # docker-compsoe.yml
      ...
        gitlab-runner:
          image: gitlab/gitlab-runner:v16.9.1
          container_name: gitlab_runner
          restart: unless-stopped
          volumes:
            - ./gitlab-runner/config:/etc/gitlab-runner
            - /var/run/docker.sock:/var/run/docker.sock
          environment:
            - TZ=Asia/Seoul
            - CI_SERVER_URL=${CI_SERVER_URL}
            - REGISTRATION_TOKEN=${REGISTRATION_TOKEN}
            - RUNNER_EXECUTOR=${RUNNER_EXECUTOR}     # docker, shell 등
          command: >
            sh -c "
              gitlab-runner register
                --non-interactive
                --url $CI_SERVER_URL
                --registration-token $REGISTRATION_TOKEN
                --executor $RUNNER_EXECUTOR
                --description 'my-docker-runner'
                --tag-list 'docker,fastapi'
                --run-untagged='true'
                --locked='false'
                --access-level='not_protected'
              && gitlab-runner run --working-directory=/home/gitlab-runner
            " 
          entrypoint: [""]
          networks:
            - default
      ...
    

🤔 회고

  • 단지 gtilab-ci에 대한 이해가 부족해서 생긴 문제

📚 Reference

This post is licensed under CC BY 4.0 by the author.