yml 파일의 환경 변수로 백업 페이지에서 실행 중인 컨테이너 지정

제안할 플러그인: discourse-container-names.git

어떤 작업을 원하시나요?

백업 페이지에 다음과 같이 컨테이너 이름을 표시하는 간단한 플러그인을 개발해 주셨으면 합니다 (예시):

컨테이너 이름은 yml 파일의 환경 변수에서 가져와야 하며, 다음과 같습니다:

애플리케이션 관련 참고 사항:

  1. 컨테이너 이름은 위 이미지에 표시된 대로 환경 변수에서 가져와야 합니다 (예: docker ps 명령을 통해 가져오는 것은 불가)

  2. 데이터 컨테이너와 애플리케이션 컨테이너가 함께 존재하는 경우, 데이터 컨테이너의 이름도 함께 표시되면 좋겠습니다:

  • Container: app # 기본 스탠드얼론 이름 예시
  • Containers: socket-only, data # 기본 2개 컨테이너 설정 예시
  1. 이 작업이 필요한 이유는 여러 개의 앱 컨테이너를 실행하고 있기 때문입니다. 관리자 페이지, 특히 백업 페이지(첫 번째 이미지 참조)를 볼 때 어떤 컨테이너가 실행 중인지 항상 파악하고 싶습니다.

언제까지 완료되길 원하시나요?

언제든 좋습니다. 급하지 않습니다. Discourse 플러그인 전문가에게는 매우 간단한 작업으로 보입니다. 관리자 백업 페이지에 있는 “있으면 좋은” 기능일 뿐이고, 직접 작성할 의욕이 없어서 합리적인 비용을 지불하고 누군가에게 맡기고 싶습니다!

이 작업을 위해 제시하실 예산(USD)은 얼마인가요?

개인 메시지(PM)를 통해 알려 주십시오.

다른 Discourse 시스템 관리자 중 여러 컨테이너를 실행하며 관리자 패널의 백업 페이지에서 현재 실행 중인 컨테이너의 이름을 확인하고 싶어 하는 사람이 있거나, 스탠드얼론 모드일 경우를 포함해 백업 페이지에서 실행 중인 컨테이너 이름을 보고 싶어 하는 사람이 있을 수 있으므로, 이 플러그인은 Discourse 커뮤니티 전체에 자유롭게 공개되어야 합니다.

훌륭한 아이디어네요. 실제 컨테이너 ID도 함께 추가하는 건 어떨까요?

컨테이너 내부에서 이렇게 조회할 수 있습니다:
cat /proc/self/cgroup|grep "systemd:/docker"| awk -F/ '{print $3}'|cut -c1-12

감사합니다만, 플러그인 내에 플랫폼에 종속적인 명령줄 유틸리티를 사용하여 정보를 가져오는 방식은 제 환경에서는 (필요한 대로) 작동하지 않습니다. (아래 명령으로 docker ID를 가져오는 것이 저희 Ubuntu 18.04 환경에서 작동하지 않음):

# cat /proc/self/cgroup|grep "systemd:/docker"| awk -F/ '{print $3}'|cut -c1-12

#. (결과 없음)

아래 명령도 결과를 주지 않습니다:

# cat /proc/self/cgroup|grep "systemd:/docker"

#  (결과 없음)

참고 (docker ps 출력):

CONTAINER ID        IMAGE                           COMMAND                  CREATED             STATUS                  PORTS                               NAMES
63c52bc571b5        local_discourse/socket-only     "/sbin/boot"             28 minutes ago      Up 28 minutes                                               socket-only
631fbabedda9        local_discourse/socket-only2    "/sbin/boot"             26 hours ago        Up 26 hours                                                 socket-only2
123743e12208        mysql/mysql-server              "/entrypoint.sh mysq…"   2 days ago          Up 20 hours (healthy)   33060/tcp, 0.0.0.0:6603->3306/tcp   mysql-man
7a145366268c        registry.unix.com/unix:condor   "/run.sh"                6 days ago          Up 20 hours             3306/tcp, 0.0.0.0:8999->80/tcp      unix
3cc0c90c3e3a        registry:2                      "/entrypoint.sh /etc…"   7 days ago          Up 7 days               0.0.0.0:5000->5000/tcp              hubby
ca7b55fc5a0c        local_discourse/data            "/sbin/boot"             2 weeks ago         Up 8 days                                                   data

즉, 실행 중인 컨테이너 이름을 지정하는 문자열 정보는 yml 파일의 환경 변수에서 파생되어야 합니다. 이를 통해 플랫폼 중립성을 확보하고 여러 컨테이너가 동시에 실행되는 환경에서도 정상 작동할 수 있도록 해야 합니다.

예를 들어, 우리는 동시에 여러 Discourse 앱 컨테이너와 기타 컨테이너를 실행합니다. 따라서 docker-cli 명령을 사용해서는 우리가 필요한 정확한 정보(리버스 프록시 설정에 의해 결정되며 docker에 의해 결정되지 않는, 웹에서 “현재” 실행 중인 컨테이너의 이름)를 제공할 수 없습니다.

우리는 리버스 프록시 설정에서 unix 소켓 이름(또는 노출된 컨테이너 포트)을 변경하여 표시할 컨테이너를 선택하므로, 다운타임 없이 1초도 안 되는 시간에 컨테이너를 전환할 수 있습니다. 이는 컨테이너 이름이 100% 신뢰할 수 있고 정확하려면 yml 파일의 환경 변수에서 가져와야 함을 의미합니다.

따라서 문자열(컨테이너 이름, 컨테이너 ID 등) 정보는 yml 파일의 환경 변수에서만 가져오도록 하는 것이 제 요구사항입니다.

컨테이너 ID를 선호하는 경우, 다음과 같이 환경 변수에 추가할 수 있습니다(예시):

DISCOURSE_APP_CONTAINER_NAME = 'socket-only (63c52bc571b5)'

또는:

DISCOURSE_APP_CONTAINER_NAME = '63c52bc571b5'
DISCOURSE_DATA_CONTAINER_NAME = 'ca7b55fc5a0c'

그리고 제 원본 게시글(우리가 원하는 사용 방식)에 따르면:

DISCOURSE_APP_CONTAINER_NAME = 'socket-only'
DISCOURSE_DATA_CONTAINER_NAME = 'data'

어떤 문자열(토큰) 식별자(이름, 컨테이너 ID, 또는 둘 다)를 사용할지는 시스템 관리자(또는 비즈니스)의 요구사항에 따라 결정됩니다.

이것이 제가 정보가 docker ps나 기타 OS(플랫폼)에 종속적인 CLI 명령이 아닌, 메인 앱 yml 파일의 환경 변수로 하드코딩되어야 한다고 명확히 지적한 이유입니다.

제 요구사항이 더 명확해졌기를 바랍니다.

플랫폼과 설정에 중립적이고 CLI 명령이나 시스템 명령에 의존하지 않는 방식을 원합니다. 우리는 서버에서 Discourse뿐만 아니라 많은 다른 앱에 Docker를 사용하고 있습니다(위 docker ps 출력 예시에서 볼 수 있듯이 Discourse, Docker화 된 LAMP 앱, Docker 프라이빗 레지스트리 등).

정말 맞습니다!

@RGJ 님, 안녕하세요.

추가로 한 가지 생각을 더 나누고 싶습니다.

컨테이너 식별자(컨테이너 ID, 이름 또는 둘 다)를 yml 환경 변수로 하드코딩하는 것이 작동하지 않을 수 있는 코너 케이스는 Docker Swarm 또는 Kubernetes(예시)를 사용하는 경우입니다. 컨테이너가 부하와/또는 장애에 따라 동적으로 생성 및 제거되는 환경에서는 yml에 환경 변수를 하드코딩하는 방식이 작동하지 않기 때문입니다(제 추측이며, 직접 해보지 않아서 이 주제에 대해 단정적으로 말하기는 어렵습니다). 하지만 지금은 “단순한 접근 방식”(yml에 환경 변수 설정)으로 진행하는 데 동의합니다.

어쨌든 저는 아직 Swarm이나 Kubernetes(Kuber)로 Discourse를 배포해 본 적이 없으므로, 나중에 해당 상황에 이르렀을 때 그 문제를 해결할 계획입니다 :slight_smile:

이 문제에 대해 많이 고민해 보았으며, 이 시점에서 최선의 방법은 Discourse 환경 변수를 yml 파일에 하드코딩하는 것이라고 결정했습니다.

이 환경 변수들을 사이트 설정(site settings)으로 가져와서 제 간단한 목업(mockup)과 같이 관리자 백업 페이지에 표시하는 것은 비교적 쉬운 작업이 될 것입니다: