присоединение докера против lxc-attach

ОБНОВЛЕНИЕ: Docker 0.9.0 теперь использует libcontainer, отклоняясь от LXC, см.: Присоединение процесса к libcontainer Docker контейнер

Я запускаю поиск elastics:

docker run -d -p 9200:9200 -p 9300:9300 dockerfile/elasticsearch

Проверка процесса показывает следующее:

$ docker ps --no-trunc
CONTAINER ID                                                       IMAGE                             COMMAND                                           CREATED             STATUS              PORTS                                            NAMES
49fdccefe4c8c72750d8155bbddad3acd8f573bf13926dcaab53c38672a62f22   dockerfile/elasticsearch:latest   /usr/share/elasticsearch/bin/elasticsearch java   About an hour ago   Up 8 minutes        0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp   pensive_morse   

Теперь, когда я пытаюсь подключить работающий контейнер, я получаю стек:

$  sudo docker attach 49fdccefe4c8c72750d8155bbddad3acd8f573bf13926dcaab53c38672a62f22
[sudo] password for lsoave:

tty не подключается, и приглашение не возвращается. То же самое с lxc-attach работает нормально:

$ sudo lxc-attach -n 49fdccefe4c8c72750d8155bbddad3acd8f573bf13926dcaab53c38672a62f22
root@49fdccefe4c8:/# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0 49 20:37 ?        00:00:20 /usr/bin/java -Xms256m -Xmx1g -Xss256k -Djava.awt.headless=true -XX:+UseParNewGC -XX:+UseConcMa
root        88     0  0 20:38 ?        00:00:00 /bin/bash
root        92    88  0 20:38 ?        00:00:00 ps -ef
root@49fdccefe4c8:/# 

Кто-нибудь знает, что не так с докером?

NB. dockerfile/elasticsearch заканчивается:

ENTRYPOINT ["/usr/share/elasticsearch/bin/elasticsearch"]

person Luca G. Soave    schedule 10.03.2014    source источник


Ответы (3)


Вы подключаетесь к контейнеру, в котором выполняется elasticsearch, который не является интерактивной командой. Вы не получаете оболочку для ввода, потому что контейнер не запускает оболочку. Причина, по которой lxc-attach работает, заключается в том, что она дает вам оболочку по умолчанию. Для man lxc-attach:

Если команда не указана, текущая оболочка по умолчанию пользователя, запускающего lxc-attach, будет найдена внутри контейнера и выполнена. Это не удастся, если внутри контейнера нет такого пользователя или в контейнере нет работающего механизма nsswitch.

docker attach ведет себя так, как ожидалось.

person Ben Whaley    schedule 10.03.2014
comment
ожидаемо, но противоречиво ИМХО - person Luca G. Soave; 13.03.2014

Как отмечает Бен Уэйли, это ожидаемое поведение. Однако стоит отметить, что если вы хотите отслеживать процесс, вы можете сделать несколько вещей:

  • Запустите bash как передний процесс: например. $ES_DIR/bin/elasticsearch && /bin/bash даст вам вашу оболочку при подключении. В основном полезно во время разработки. Не так чисто :)
  • Установите ssh-сервер. Хотя я никогда не делал этого сам, это хороший вариант. Недостаток, конечно, накладные расходы и, возможно, угол безопасности. Вы действительно хотите использовать ssh во всех своих контейнерах? Лично я предпочитаю, чтобы их было как можно меньше, а единственный процесс — это окончательный выигрыш.
  • Используйте лог-файлы! Вы можете использовать docker cp для локального получения журналов или, что еще лучше, команду docker logs $CONTAINER_ID. Последние каждый раз дают вам накопленный вывод stdin/stderr за все время существования контейнера.
  • Смонтируйте каталог журнала. Просто смонтируйте каталог на своем хосте и попросите elasticsearch записать в файл журнала в этом каталоге. Вы можете иметь системный журнал на своем хосте, Logstash или что-то еще, что вас заводит;). Конечно, недостатком здесь является то, что теперь вы используете свой хост больше, чем вам хотелось бы. Я также нашел хороший эксперимент с использованием logstash в этом блог.
person qkrijger    schedule 11.03.2014
comment
Текущие попытки использования /bin/bash в качестве переднего процесса и присоединения после терпят неудачу. Контейнер автоматически закрывается (поэтому /bin/bash больше не работает в качестве переднего процесса). - person qkrijger; 20.05.2014

FWIW, теперь, когда выпущен Docker 1.3, вы можете использовать «docker exec», чтобы открыть оболочку или другой процесс в работающем контейнере. Это должно позволить вам эффективно заменить lxc-attach при использовании родного драйвера.

http://blog.docker.com/2014/10/docker-1-3-signed-images-process-injection-security-options-mac-shared-directories/

person buggystick    schedule 23.10.2014