Запуск нескольких контейнеров docker с использованием docker -compose вызывает зависание на stdout для другого приложения - PullRequest
0 голосов
/ 28 апреля 2020

У меня уникальная проблема. Вот мои настройки:

  1. У меня есть приложение c, которое вызывает скрипт оболочки через execv ():
     char * const * parmList=(char * const *)data; // shell script is /root/test.sh
     if(pipe(pipes) == -1)
     {
        perror("Error creating pipe");
        free(output);
        exit(EXIT_FAILURE);
     }
     else
     {
        pid_t pid;
        pid = fork();
        if (pid  == -1)
        {
            perror("Error in fork");
        }
        else if (pid == 0)
        {
            dup2(pipes[1],1);
            close(pipes[0]);
            close(pipes[1]);
            if(execv(parmList[0], parmList) == -1)
            {
                perror("Error in execv");
                free(output);
                exit(EXIT_FAILURE);
            }
        }
        else if(pid > 0)
        {
            close(pipes[1]);
            if(waitpid(pid, &status, 0)>0)
            {
                rc = WEXITSTATUS(status);
                int nbytes = read(pipes[0], output, 10000);
                output[nbytes]='\0';
                close(pipes[0]);
                strcpy(resultStr,(char *)output);
            }
        }
     }
     free(output);
Все, что делает сценарий оболочки, это отслеживает файл XML с большими данными. Значение данных: XML длина файла составляет около 6000 символов.
#!/bin/sh
cat /root/file.xml
У меня четыре docker контейнера, работающих с использованием двух файлов compose. Пример одного из файлов составления выглядит следующим образом:
version: '2.2'
services:

     test-compose1:
         image: test-image
         container_name: web_container1
         privileged: true
         network_mode: "host"
         volumes:
          - "/usr/:/usr/"
          - "/var/:/var/"
          - "/tmp/:/tmp/"
          - "/etc/:/etc/"
          - "/usr/local/thirdparty/jakarta-tomcat/lib/:/opt/APACHE_TOMCAT/lib/"
          - "/home/tomcat/server_webapps.xml:/home/tomcat/server.xml"
          - "/home/tomcat/start_webapps.sh:/home/tomcat/start.sh"
          - "/home/tomcat/context.xml:/opt/APACHE_TOMCAT/conf/context.xml"

     test-compose2:
         image: test-image
         container_name: web_container2
         privileged: true
         network_mode: "host"
         volumes:
          - "/usr/:/usr/"
          - "/var/:/var/"
          - "/tmp/:/tmp/"
          - "/etc/:/etc/"
          - "/usr/local/thirdparty/jakarta-tomcat/lib/:/opt/APACHE_TOMCAT/lib/"
          - "/home/tomcat/server_webapps.xml:/home/tomcat/server.xml"
          - "/home/tomcat/start_webapps.sh:/home/tomcat/start.sh"
          - "/home/tomcat/context.xml:/opt/APACHE_TOMCAT/conf/context.xml"

Итак, как я уже сказал, у меня есть два файла составления. Другой файл compose аналогичен приведенному выше. И все четыре контейнера запускают экземпляр tomcat внутри каждого. Ничего фантастического. Итак, когда я выполняю docker -композицию, у меня в общей сложности работает четыре контейнера.

Issue : при вышеуказанной настройке, если я запускаю свое приложение c, оно просто висит по команде кошки. Я перепробовал все возможные способы взлома, такие как увеличение размера буфера, очистка стандартного вывода. Ничто не похоже на работу. GDB показывает, что приложение просто застревает в системном вызове write ().

Теперь самая интересная часть:

-Если контейнеры docker НЕ запущены, приложение (команда cat) работает просто отлично. Он не зависает в команде 'cat command'

-Если у меня запущено ДВА контейнера вместо четырех, приложение работает просто отлично. Он не зависает в команде 'cat command'

-При всех четырех работающих контейнерах, если я использую API system () вместо execv () в приведенном выше коде c, похоже, он работает нормально , Он не зависает в команде 'cat command'

-При всех четырех запущенных контейнерах, если я использую файл XML с меньшими данными, он работает просто отлично.

-Если я запускаю все четыре контейнера docker, используя команду "docker run" вместо docker -compose, она работает просто отлично. Он не зависает в команде «cat»

Итак, я озадачен тем, как контейнеры docker влияют на команду cat для зависания в stdout. Кажется, это как-то связано с docker -композиционной средой. Но я не уверен, что на самом деле не так. Я зашел в тупик при отладке этого.

Есть какие-нибудь указатели о том, как это отладить?

...