У меня уникальная проблема. Вот мои настройки:
- У меня есть приложение 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 -композиционной средой. Но я не уверен, что на самом деле не так. Я зашел в тупик при отладке этого.
Есть какие-нибудь указатели о том, как это отладить?