services-config.yaml 사용

간소화된 Linux 서비스 관리자를 사용하여 마이그레이션을 수행하면 Migrate to Containers에서 새로운 아티팩트 파일(services-config.yaml)을 만듭니다. 이 파일을 사용하여 배포된 컨테이너에서 애플리케이션 초기화를 제어합니다.

예를 들어 컨테이너를 마이그레이션한 후 services-config.yaml 파일을 수정하여 애플리케이션 초기화를 다음과 같이 제어합니다.

  • 파일에서 애플리케이션 삭제
  • 파일에 애플리케이션 추가
  • 애플리케이션의 초기화 속성 수정

다음은 services-config.yaml 파일의 예시입니다.

version: v1beta1
env:
  - name: KEY1
    value: VALUE1
  - name: KEY2
    value: VALUE2
applications:
    - name: nginx
      type: forking
      envfile: /path/to/file.txt
      env:
        - name: KEY3
          value: VALUE3
      start:
      - cmd: /usr/sbin/nginx -g 'daemon on; master_process on;'
      pidfile: /run/nginx.pid
    - name: ssh@
      type: simple
      start:
      - cmd: /usr/sbin/sshd -i $SSHD_OPTS
        ignore_errors: true
      runtime_directories:
        mode: "0755"
        paths:
          - /run/sshd
        preserve: true
    - name: suitecrm
      type: exec
      start:
      - cmd: /etc/init.d/suitecrm start
      status:
        cmd: /etc/init.d/suitecrm status
    - name: phpsessionclean
      type: oneshot
      start:
        - cmd: /usr/lib/php/sessionclean
      timers:
        - name: phpsessionclean.timer
          on_calendar:
            - cron: 09,39 * * * *
    - name: mariadb
      type: notify
      prestart:
        - cmd: /usr/bin/install -m 755 -o mysql -g root -d /var/run/mysqld
        - cmd: /bin/sh -c "systemctl unset-environment _WSREP_START_POSITION"
        - cmd: /bin/sh -c "[ ! -e /usr/bin/galera_recovery ] && VAR= || VAR=`cd /usr/bin/..; /usr/bin/galera_recovery`; [ $? -eq 0 ] && systemctl set-environment _WSREP_START_POSITION=$VAR || exit 1"
      start:
      - cmd: /usr/sbin/mysqld $MYSQLD_OPTS $_WSREP_NEW_CLUSTER $_WSREP_START_POSITION
      poststart:
        - cmd: /bin/sh -c "systemctl unset-environment _WSREP_START_POSITION"
        - cmd: /etc/mysql/debian-start
      user: mysql
      group: mysql

이 파일에서 각 항목의 의미는 다음과 같습니다.

  • env: 환경 변수를 전역 수준 또는 애플리케이션 수준으로 지정합니다. 전역 수준과 애플리케이션 수준 모두 동일한 환경 변수를 지정하면 애플리케이션 수준의 환경 변수가 우선 적용됩니다.

    • 전역 수준으로 설정된 환경 변수의 경우 env를 사용해서 name/value 쌍을 지정합니다. 이름에는 ASCII 문자, 숫자, 밑줄이 포함될 수 있습니다. 이름은 숫자로 시작할 수 없습니다.

    • 애플리케이션 수준으로 설정된 환경 변수의 경우 env를 사용해서 name/value 쌍을 지정합니다. 또는 envfile을 사용하여 다음 줄이 포함된 텍스트 파일 경로를 지정합니다.

      # Comments allowed
      KEY=VALUE

      텍스트 파일에 env로 지정된 환경 변수 정의가 중복된 경우 env로 지정된 환경 변수가 우선 적용됩니다.

  • applications: 컨테이너를 배포할 때 시작할 애플리케이션 목록을 지정하고 애플리케이션의 초기화 속성을 설정합니다.

    • name: 애플리케이션의 이름을 지정합니다.

    • type은 애플리케이션 유형을 다음 중 하나로 지정합니다.

      • forking: 포크 없이 start로 지정된 파일을 실행합니다. 이 서비스 실행 파일은 포크를 수행하도록 예상됩니다. pidfile도 설정하는 것이 좋습니다.

      • exec: 서비스를 실행하도록 포크합니다. 이 서비스는 exec가 실행 파일에서 호출된 다음에 시작되는 것으로 간주됩니다.

      • simple - exec와 동일. simple 서비스는 fork만 대기하는 것이 아니라 forkexec를 모두 기다리므로 systemd 정의와 다르게 동작합니다.

      • notify: systemd와 달리 NOTIFY_SOCKET 환경 변수가 설정되지 않아 sd_notify systemd 호출이 작동하지 않는다는 점을 제외하면 exec와 동일합니다.

      • oneshot: 이 서비스는 exec가 실행 파일에서 호출된 다음에 시작되는 것으로 간주됩니다. 오류 코드가 0이 아닌 상태로 서비스가 종료될 경우에는 상태가 error입니다.

    • 서비스에 대한 prestart, start, poststart, status 명령어입니다.

      서비스를 시작하려면 Migrate for Containers에서 prestart 명령어(있는 경우), start 명령어, poststart 명령어(있는 경우)를 차례대로 실행합니다. 명령어가 실패하고 ignore_errors를 사용하도록 명령어를 구성하지 않으면 서비스가 중지되고 서비스 상태에 오류 메시지가 표시됩니다.

      애플리케이션에서 특정 작업을 수행하기 위해 사용되는 명령어의 형식은 다음과 같습니다.

        command-type:
          cmd: command
          shell: /bin/sh
          ignore_errors: false
          ignore_environment_variables: false

      각 항목의 의미는 다음과 같습니다.

      • command-type: 명령어 유형을 prestart, start, poststart 또는 status로 지정합니다.

        start의 경우 typeoneshot이 아닌 한 단일 명령어를 가질 수 있습니다.

        type=forking 또는 type=oneshot인 경우 start 명령어 분기 후 poststart 명령어가 실행됩니다. 그렇지 않으면 start 명령어 실행 후 즉시 실행됩니다.

      • command: 작업 수행을 위해 실행할 명령어를 지정합니다.

      • shell(선택사항): 기본적으로 모든 명령어는 /bin/sh 셸에서 실행됩니다. 필요에 따라 shell/bin/bash로 설정할 수 있습니다.

      • ignore_errors(선택사항): true이면 일반적으로 오류로 간주되는 명령어의 종료 코드가 기록되지만 명령어는 성공한 것으로 간주됩니다. 기본값은 false입니다.

        기본적으로 Migrate to Containers는 '-' 프리픽스가 포함된 모든 systemd 실행 파일에 대해 ignore_errorstrue로 설정합니다.

      • ignore_environment_variables(선택사항): true인 경우 환경 변수 대체가 적용되지 않습니다. 기본값은 false입니다.

        기본적으로 Migrate to Containers는 ':' 프리픽스가 포함된 systemd 실행 파일에 대해 ignore_environment_variablestrue로 설정합니다.

    • pidfile: 프로세스가 아직 실행 중인지 확인하기 위해 사용되는 서비스의 프로세스 ID가 포함된 pid 파일을 지정합니다.

    • chdir: 시작된 프로세스의 작업 디렉터리를 지정합니다.

    • user: 새로 시작되는 프로세스의 사용자 이름을 지정합니다.

    • group: 새로 시작되는 프로세스의 그룹 이름을 지정합니다.

    • timers: 애플리케이션의 타이머 목록을 지정합니다. 지정된 타이머가 경과할 때마다 애플리케이션이 활성화됩니다.

      version: v1beta1
      env: []
      Applications:
      - name: service_name
        type: service_type
        start:
          - cmd: service_exec_command
        timers:
          - name: timer_name
            on_calendar:
              - cron: realtime_time
            on_startup:
              - duration: monotonic_time
            on_service_start:
              - duration: monotonic_time
            on_service_stop:
              - duration: monotonic_time
      
      • name: 타이머 이름을 지정합니다.

      • on_calendar: 타이머의 캘린더 일정 목록을 지정합니다.

        • cron: 크론 형식을 사용하여 지정된 시간입니다. 예를 들면 다음과 같습니다.

          cron: 0 0 * * *
          cron: @daily
          
      • on_startup: 기간 목록을 지정합니다(컨테이너 배포 시간 기준).

        • duration: 기간 형식을 사용하여 지정된 시간입니다. 예를 들면 다음과 같습니다.
        duration: 30m
        duration: 1sec
        
      • on_service_start: 애플리케이션 상태가 활성으로 변경될 때를 기준으로 기간 목록을 지정합니다.

        • duration: 기간 형식을 사용하여 지정된 시간입니다.
      • on_service_stop: 애플리케이션 상태가 비활성으로 변경될 때를 기준으로 기간 목록을 지정합니다.

        • duration: 기간 형식을 사용하여 지정된 시간입니다.
    • 다음 속성을 사용하여 서비스를 시작하기 전에 만든 디렉터리에 paths를 지정합니다.

      • runtime_directories: /run/에 생성된 디렉터리에 대해 paths 목록을 지정합니다.

      • state_directories: /var/lib/에 생성된 디렉터리에 대해 paths 목록을 지정합니다.

      • cache_directories: /var/cache/에 생성된 디렉터리에 대해 paths 목록을 지정합니다.

      • logs_directories: /var/log/에 생성된 디렉터리에 대해 paths 목록을 지정합니다.

      • configuration_directories: /etc/에 생성된 디렉터리에 대해 paths 목록을 지정합니다.

      이러한 각 속성에는 다음 옵션이 사용됩니다.

      • mode: 파일 모드를 지정합니다. 기본값은 0755입니다. 모든 사용자에게 대해 읽기 및 실행 액세스 권한을 부여하고, 소유자에게 쓰기 액세스 권한을 부여합니다.
      • preserve: false인 경우 서비스가 중지되었을 때 디렉터리가 삭제됩니다. 기본값은 true입니다.

services.yaml 파일에 대한 서비스 추가 또는 삭제

직접 수정을 통해 services.yaml 파일에서 서비스를 추가하거나 삭제할 수 있습니다. 새 서비스를 추가할 때마다 다음 필드가 채워집니다.

  • name
  • type
  • start

서비스의 필수 및 선택사항 필드에 대한 자세한 내용은 위의 services.yaml 정의를 참조하세요.

서비스 추가

services.yaml 파일에 서비스를 추가할 때는 다음 단계를 수행합니다.

  1. 텍스트 편집기에서 수정할 services.yaml 파일을 엽니다.

  2. services.yaml에서 applications 속성으로 이동합니다.

    version: v1beta1
    env:
     - name: KEY1
     ...
    applications:
    
  3. applications 속성 아래에서 name 필드로 시작하는 줄에 원하는 서비스를 추가하고, 애플리케이션에 따라 기타 필수 및 선택사항 필드를 추가합니다.

    version: v1beta1
    env:
     - name: KEY1
     ...
    applications:
    - name:
      type:
      start:
        - cmd:
      ...
    

    applications 속성 아래에서 services.yaml 파일에 이미 서비스 정의가 있으면 이전 서비스의 마지막 항목 아래 줄에서 name 필드로 시작하는 새 서비스를 추가할 수 있습니다.

    version: v1beta1
    env:
     - name: KEY1
     ...
    applications:
    - name:
      type:
      start:
    - name:
      type:
      start:
        ...
    
  4. services.yaml 파일을 저장합니다.

서비스 삭제

services.yaml 파일에서 서비스를 삭제할 때는 다음 단계를 수행합니다.

  1. 텍스트 편집기에서 수정할 services.yaml 파일을 엽니다.

  2. services.yaml에서 applications 속성으로 이동합니다.

    version: v1beta1
    env:
     - name: KEY1
     ...
    applications:
    ...
    
  3. name 필드로 시작하고 애플리케이션에 따라 기타 필수 및 선택사항 필드가 포함된 원하는 서비스를 삭제합니다. 예를 들면 다음과 같습니다.

    서비스가 삭제되기 전:

    version: v1beta1
    env:
    - name: KEY1
      ...
    applications:
    - name:
      type:
      start:
        - cmd:
    - name:
      ...
    
    

    서비스가 삭제된 후:

    version: v1beta1
    env:
    - name: KEY1
      ...
    applications:
    - name:
      ...
    
  4. services.yaml 파일을 저장합니다.