Usar o ficheiro services-config.yaml

Quando usa o gestor de serviços do Linux simplificado para realizar uma migração, o Migrate to Containers cria um novo ficheiro de artefacto, services-config.yaml. Use este ficheiro para controlar a inicialização da aplicação num contentor implementado.

Por exemplo, depois de migrar o contentor, edite o ficheiro services-config.yaml para controlar a inicialização da aplicação para:

  • Remova aplicações do ficheiro
  • Adicione aplicações ao ficheiro
  • Edite as propriedades de inicialização de uma aplicação

Segue-se um exemplo de um ficheiro 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

Neste ficheiro:

  • env: especifica variáveis de ambiente ao nível global ou ao nível da aplicação. Se especificar a mesma variável de ambiente nos níveis global e de aplicação, a variável de ambiente no nível de aplicação tem precedência.

    • Para variáveis de ambiente definidas ao nível global, use env para especificar um par name/value. Os nomes podem conter letras ASCII, dígitos e o caráter de sublinhado. Os nomes não podem começar por um dígito.

    • Para variáveis de ambiente definidas ao nível da aplicação, use env para especificar um par name/value. Em alternativa, use envfile para especificar o caminho para um ficheiro de texto que contenha linhas no formato:

      # Comments allowed
      KEY=VALUE

      Se o ficheiro de texto contiver uma definição de variável de ambiente que duplica uma especificada por env, a especificada por env tem precedência.

  • applications: especifica a lista de aplicações a iniciar quando implementa o contentor e define as propriedades de inicialização da aplicação.

    • name: especifica o nome da aplicação.

    • type especifica o tipo da aplicação, como um dos seguintes:

      • forking: Execute o ficheiro especificado por start sem ramificação. Espera-se que o executável do serviço se ramifique. Recomendamos que também defina pidfile.

      • exec: divida para executar o serviço. O serviço é considerado iniciado depois de exec ter sido chamado no ficheiro executável.

      • simple - Igual a exec. Um serviço simple comporta-se de forma diferente da definição systemd porque aguarda fork e exec em vez de apenas fork.

      • notify: igual a exec, exceto que, para systemd, a variável de ambiente NOTIFY_SOCKET não está definida, pelo que as chamadas sd_notify systemd não funcionam.

      • oneshot: o serviço é considerado iniciado após a chamada de exec no ficheiro executável. O estado é error se o serviço for terminado com um código de erro diferente de 0.

    • Comandos prestart, start, poststart e status para o serviço.

      Para iniciar um serviço, o Migrate to Containers executa os comandos prestart (se existirem), seguidos do comando start e, finalmente, dos comandos poststart (se existirem). Se um comando falhar e não tiver configurado o comando para usar ignore_errors, o serviço é parado e é apresentada uma mensagem de erro no estado do serviço.

      Os comandos usados para realizar operações específicas na aplicação têm o seguinte formato:

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

      Onde:

      • command-type: especifica o tipo de comando como prestart, start, poststart ou status.

        Para o start, pode ter um único comando, a menos que o type seja oneshot.

        Se type=forking ou type=oneshot, os comandos poststart são executados após a ramificação do comando start. Caso contrário, são executados imediatamente após a execução do comando start.

      • command: especifica o comando a executar para realizar a operação.

      • shell (Opcional): por predefinição, todos os comandos são executados no shell /bin/sh. Opcionalmente, pode definir shell como /bin/bash.

      • ignore_errors (Opcional): se true, é registado um código de saída do comando normalmente considerado uma falha, mas o comando é considerado bem-sucedido. O valor predefinido é false.

        Por predefinição, a opção Migrar para contentores define ignore_errors como true para qualquer ficheiro executável que inclua o prefixo "-".systemd

      • ignore_environment_variables (Opcional): se true, a substituição de variáveis de ambiente não é aplicada. O valor predefinido é false.

        Por predefinição, a ferramenta Migrate to Containers define ignore_environment_variables como true para qualquer executável systemd que inclua o prefixo ":".

    • pidfile: especifica o ficheiro PID que contém o ID do processo do serviço usado para verificar se o processo ainda está em execução.

    • chdir: especifica o diretório de trabalho do processo iniciado.

    • user: especifica o nome de utilizador com o qual o novo processo é iniciado.

    • group: especifica o nome do grupo no qual o novo processo é iniciado.

    • timers: especifica a lista de temporizadores da aplicação. A aplicação é ativada sempre que qualquer um dos temporizadores especificados expirar.

      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: especifica o nome do temporizador.

      • on_calendar: especifica a lista de eventos de calendário para o temporizador.

        • cron: uma hora especificada através do formato cron. Por exemplo:

          cron: 0 0 * * *
          cron: @daily
          
      • on_startup: especifica uma lista de durações (relativas ao momento em que implementa o contentor).

        • duration: uma hora especificada através do formato de duração. Por exemplo:
        duration: 30m
        duration: 1sec
        
      • on_service_start: especifica uma lista de durações relativas ao momento em que o estado da sua aplicação muda para ativo.

        • duration: uma hora especificada através do formato de duração.
      • on_service_stop: especifica uma lista de durações, relativamente ao momento em que o estado da sua aplicação muda para inativo.

        • duration: uma hora especificada através do formato de duração.
    • Use as seguintes propriedades para especificar paths para diretórios criados antes de iniciar o serviço:

      • runtime_directories: especifica a lista de paths para diretórios criados em /run/.

      • state_directories: especifica a lista de paths para diretórios criados em /var/lib/.

      • cache_directories: especifica a lista de paths para diretórios criados em /var/cache/.

      • logs_directories: especifica a lista de paths para diretórios criados em /var/log/.

      • configuration_directories: especifica a lista de paths para diretórios criados em /etc/.

      Cada uma destas propriedades tem as seguintes opções:

      • mode: especifica o modo do ficheiro. O valor predefinido é 0755, o que corresponde ao acesso de leitura e execução para todos e ao acesso de escrita para o proprietário.
      • preserve: se false o diretório for limpo quando o serviço for parado. A predefinição é true.

Adicione ou remova um serviço do ficheiro services.yaml

Pode adicionar ou remover um serviço do seu ficheiro services.yaml editando-o manualmente. Sempre que adicionar um novo serviço, tem de preencher os seguintes campos:

  • name
  • type
  • start

Para mais informações acerca dos campos obrigatórios e opcionais de um serviço, consulte a definição de services.yaml acima.

Adicionar um serviço

Para adicionar um serviço ao seu ficheiro services.yaml, siga estes passos:

  1. Abra o ficheiro services.yaml num editor de texto para modificação.

  2. Em services.yaml, navegue para o atributo applications:

    version: v1beta1
    env:
     - name: KEY1
     ...
    applications:
    
  3. Adicione o serviço pretendido na linha abaixo do atributo applications, começando pelo campo name, seguido dos outros campos obrigatórios e opcionais adequados à sua aplicação:

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

    Se o seu ficheiro services.yaml já tiver definições de serviços no atributo applications, pode adicionar um novo serviço começando pelo campo name na linha abaixo da última entrada do serviço anterior:

    version: v1beta1
    env:
     - name: KEY1
     ...
    applications:
    - name:
      type:
      start:
    - name:
      type:
      start:
        ...
    
  4. Guarde o ficheiro services.yaml.

Remova um serviço

Para remover um serviço do seu ficheiro services.yaml, siga estes passos:

  1. Abra o ficheiro services.yaml num editor de texto para modificação.

  2. Em services.yaml, navegue para o atributo applications:

    version: v1beta1
    env:
     - name: KEY1
     ...
    applications:
    ...
    
  3. Remova o serviço pretendido começando pelo campo name, seguido dos outros campos obrigatórios e opcionais adequados à sua aplicação. Por exemplo:

    Antes de o serviço ser removido:

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

    Após a remoção do serviço:

    version: v1beta1
    env:
    - name: KEY1
      ...
    applications:
    - name:
      ...
    
  4. Guarde o ficheiro services.yaml.