Ambari 2.2 - выход с ненулевым кодом состояния в контейнере Docker Ubuntu 14.04

TL;DR — Dockerized Ambari в Ubuntu 14.04 Контейнер Docker выдает ошибку при запуске с конфигурациями по умолчанию

Я пытаюсь докеризировать развертывание Ambari, чтобы поддерживать его запуск вместе с моими контейнерами Hadoop. Вот мой Dockerfile:

FROM ubuntu:14.04

ENV AMBARI_HOME /opt/ambari
ENV AMBARI_VERSION 2.2.0.0

RUN export DEBIAN_FRONTEND=noninteractive \
    && apt-get update \
    && apt-get -y install wget software-properties-common python-software-properties openssh-client openssh-server

# Install Java.
RUN \
  echo oracle-java8-installer shared/accepted-oracle-license-v1-1 select true | debconf-set-selections && \
  add-apt-repository -y ppa:webupd8team/java && \
  apt-get update && \
  apt-get install -y oracle-java8-installer && \
  rm -rf /var/lib/apt/lists/* && \
  rm -rf /var/cache/oracle-jdk8-installer

# Define commonly used JAVA_HOME variable
ENV JAVA_HOME /usr/lib/jvm/java-8-oracle

RUN mkdir -p "$AMBARI_HOME"
WORKDIR $AMBARI_HOME

# passwordless ssh
RUN export DEBIAN_FRONTEND=noninteractive \
    && echo -e 'y\n'|ssh-keygen -q -t rsa -N "" -f /root/.ssh/id_rsa \
    && cp /root/.ssh/id_rsa.pub /root/.ssh/authorized_keys

RUN export DEBIAN_FRONTEND=noninteractive \
    && wget -nv http://public-repo-1.hortonworks.com/ambari/ubuntu14/2.x/updates/2.2.0.0/ambari.list -O /etc/apt/sources.list.d/ambari.list \
    && apt-key adv --recv-keys --keyserver keyserver.ubuntu.com B9733A7A07513CAD \
    && apt-get update \
    && apt-get -y install ambari-server

#Disable SELinux
RUN echo SELINUX=disabled >> /etc/selinux/config

EXPOSE 8080

RUN ambari-server setup -s --verbose --java-home $JAVA_HOME
CMD ambari-server start

Когда я запускаю контейнер, я получаю следующую ошибку:

Using python  /usr/bin/python2
Starting ambari-server
Ambari Server running with administrator privileges.
About to start PostgreSQL
Organizing resource files at /var/lib/ambari-server/resources...
WARNING: setpgid(73, 0) failed - [Errno 13] Permission denied
Server PID at: /var/run/ambari-server/ambari-server.pid
Server out at: /var/log/ambari-server/ambari-server.out
Server log at: /var/log/ambari-server/ambari-server.log
Waiting for server start.........
ERROR: Exiting with exit code -1.
REASON: Ambari Server java process died with exitcode -1. Check /var/log/ambari-server/ambari-server.out for more information.

Кажется, в ambari-server.log или .out нет ничего полезного.

Я обнаружил, что проблема с WARNING: setpgid(73, 0) failed - [Errno 13] Permission denied исправлена ​​здесь: проблема с setpgid

Из чтения документов HortonWorks для развертывания в Ubuntu 14.04 это должно работать:

Установите Ambari в Ubuntu 14.04

Я пытался развернуть встроенный Postges, а также внешний с теми же результатами.

Одно интересное замечание заключается в том, что даже с ошибкой Ambari, похоже, работает, и я могу войти в систему как администратор/администратор по умолчанию, но при вызове `ambari-server stop' он говорит, что процесс не запущен...

root@3e6d778b43f8:/opt/ambari# ambari-server stop
Using python  /usr/bin/python2
Stopping ambari-server
Ambari Server is not running
root@3e6d778b43f8:/opt/ambari# jps
868 AmbariServer
955 Jps

Завтра я воспроизведу эту настройку на своем компьютере с Ubuntu и посмотрю, произойдет ли то же самое.

Спасибо!

Правка №1: docker info

vagrant@vagrant-ubuntu-trusty-64:/vagrant/scripts$ docker info
Containers: 14
Images: 161
Server Version: 1.9.1
Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Backing Filesystem: extfs
 Dirs: 189
 Dirperm1 Supported: false
Execution Driver: native-0.2
Logging Driver: json-file
Kernel Version: 3.13.0-44-generic
Operating System: Ubuntu 14.04.1 LTS
CPUs: 1
Total Memory: 3.861 GiB
Name: vagrant-ubuntu-trusty-64
ID: 7AD6:Z5TH:76NW:G54B:IHVK:PWKP:E2LI:CRPI:MIGM:STJU:3D2B:K7EQ
WARNING: No swap limit support

vagrant@vagrant-ubuntu-trusty-64:/vagrant/scripts$ docker version
Client:
 Version:      1.9.1
 API version:  1.21
 Go version:   go1.4.2
 Git commit:   a34a1d5
 Built:        Fri Nov 20 13:12:04 UTC 2015
 OS/Arch:      linux/amd64

Server:
 Version:      1.9.1
 API version:  1.21
 Go version:   go1.4.2
 Git commit:   a34a1d5
 Built:        Fri Nov 20 13:12:04 UTC 2015
 OS/Arch:      linux/amd64

докер работает внутри экземпляра Vagrant Virtualbox (v1.8.1)


person false_memories    schedule 18.01.2016    source источник
comment
Я тоже перешел на версию 2.1.2.1 - предупреждение pid ушло, но все равно поднимался ненулевой код.   -  person false_memories    schedule 18.01.2016
comment
Вы можете добавить вывод docker version и docker info? Используете ли вы драйвер хранилища overlay?   -  person thaJeztah    schedule 18.01.2016
comment
О, вероятно, это не связано.. Я только что видел ссылку на проблему с setpgid.   -  person thaJeztah    schedule 18.01.2016
comment
Вот сценарий, который я использую для установки docker и docker-compose на хост-компьютере (это также Ubuntu 14.04 LTS для согласованности):   -  person false_memories    schedule 18.01.2016
comment
#!/bin/bash echo Установка Docker... wget -qO- get.docker.com | sh docker run hello-world groupadd docker gpasswd -a vagrant docker service docker restart newgrp docker echo Установка Docker-Compose... apt-get -y install python-pip pip install docker-compose   -  person false_memories    schedule 18.01.2016
comment
Здесь нет хороших предложений, но у меня нет абсолютно никакого опыта работы с Ambari (читая это, я не большой поклонник того, чтобы помещать так много в один контейнер, но это просто личное предпочтение). Существует известная проблема с aufs и некоторыми версиями ядра, которая приводит к взаимоблокировке (JAVA) процессов. Для этого есть патч, но он еще не объединен с исходными ядрами Ubuntu; github.com/docker/docker/issues/18180. Однако я думаю, что проблема связана с более новыми ядрами (кстати, ваше ядро ​​​​и Ubuntu устарели)   -  person thaJeztah    schedule 18.01.2016
comment
Разве не принято загружать веб-приложение Java в один контейнер докеров? все, что находится в этом файле, — это установка java 8 и двоичный файл ambari. Как это может быть лучше «докеризовано»?   -  person false_memories    schedule 18.01.2016
comment
Ну, возможно, Амбари так устроен, но, например, я видел в докерфайле установленный openssh-server, помимо встроенного postgresql.   -  person thaJeztah    schedule 18.01.2016


Ответы (2)


У меня была такая же проблема с амбари-сервером внутри докера на Ubuntu 14.04. Не могли бы вы попробовать следующее

Обход проблемы с aufs

Внутри /etc/default/docker добавить

DOCKER_OPTS="--storage-driver=devicemapper"

и перезапустите службу докеров. Обратите внимание, что после этого все ваши изображения исчезнут (http://muehe.org/posts/switching-docker-from-aufs-to-devicemapper/). Восстановите свои изображения.

Честно говоря, я не уверен на 100%, нужна ли эта часть.

После переключения с aufs на devicemapper вы можете получить следующую ошибку:

ОШИБКА: не удалось найти контейнер для идентификатора объекта

Решение состояло в том, чтобы удалить старую базу данных AUFS и все существующие контейнеры:

sudo rm -rf /var/lib/docker/containers/*
sudo rm -rf /var/lib/docker/linkgraph.db

Перезапуск образов/контейнеров докеров теперь должен работать на движке devicemapper.

Переведите apparmor в режим жалоб для докера

Внутри /etc/apparmor.d/docker закомментируйте (#) строку deny @{PROC}/{*,**^[0-9*],sys/kernel/shm*} wkx,, это как-то сбивает с толку утилиты apparmor. Чем бежать

sudo aa-complain /etc/apparmor.d/docker

Если команда aa-complain throws не найдена, установите:

sudo apt-get install apparmor-utils

После запуска контейнера у меня заработал амбари-сервер.

Я не знаю, как докер полагается здесь на apparmor, т.е. какие риски представляет операция, описанная выше...

person tmf    schedule 19.01.2016
comment
Могу ли я использовать файл докера выше или Horton работает? Какое изображение вы использовали? - person false_memories; 19.01.2016
comment
Я начал с голого образа докера Ubuntu, настроил сервер ssh для работы в нем и попытался установить hortonworks вручную (т.е. внутри сеанса ssh, два отдельных контейнера master и slave). Я не пробовал ваш файл докера (просто наткнулся на ту же проблему, что и вы) - person tmf; 19.01.2016
comment
Я разветвил образ hortonworks Ambari ambari-server: github.com/mikeblum/docker-ambari - person false_memories; 19.01.2016

Похоже, возникла проблема с развертыванием Ambari в док-контейнере. Я сломал его и установил на виртуальную машину Vagrant 14.04 Ubuntu со следующими сценариями:

install_java.sh

#!/bin/bash

echo oracle-java8-installer shared/accepted-oracle-license-v1-1 select true | debconf-set-selections && \
  add-apt-repository -y ppa:webupd8team/java && \
  apt-get update && \
  apt-get install -y oracle-java8-installer && \
  rm -rf /var/lib/apt/lists/* && \
  rm -rf /var/cache/oracle-jdk8-installer

install_ambari.sh

#!/bin/bash

export DEBIAN_FRONTEND=noninteractive \
    && wget -nv http://public-repo-1.hortonworks.com/ambari/ubuntu14/2.x/updates/2.2.0.0/ambari.list -O /etc/apt/sources.list.d/ambari.list \
    && apt-key adv --recv-keys --keyserver keyserver.ubuntu.com B9733A7A07513CAD \
    && apt-get update \
    && apt-get -y install ambari-server

С последующим:

sudo ambari-server setup -s -v -j $JAVA_HOME

sudo ambari-server start -v

@thaJeztah - что мне нужно исправить с настройкой Dockerfile?

person false_memories    schedule 18.01.2016
comment
хорошо, я попробовал dockerfile и заметил одну вещь; ambari-server — это скрипт Python, который запускает сервер amberi, а затем завершает работу. Учитывая, что этот скрипт является основным процессом контейнера, контейнер останавливается после завершения команды ambari-server start; сервер работает, но поскольку скрипт-оболочка завершен, контейнер останавливается. Чтобы решить эту проблему, вам, вероятно, потребуется использовать сам сервер в качестве основного процесса или сценарий инициализации (например, supervisord, tini) - person thaJeztah; 18.01.2016
comment
Это имеет смысл — например, запустить CMD ['bash'] в конце Dockerfile? Есть ли способ (в стиле докера) подавить ошибку -1, возникающую при запуске сервера ambari, чтобы контейнер не умирал? - person false_memories; 18.01.2016
comment
я действительно не знаю; Я не проверял, какая фактическая команда сервера запускает скрипт python; вы должны проверить, может ли он работать на переднем плане, но это будет работать, только если это единственный процесс. Если вам нравится переопределять команду, взгляните, например, на сценарий entryoint официального образа MySQL; github.com/docker-library/ mysql/блоб/ - person thaJeztah; 18.01.2016
comment
Спасибо! Я пошел дальше и разветвил Hortonworks Dockerfile для Ambari и смог воспроизвести Java-процесс с кодом ошибки -1/зомби: github.com/sequenceiq/docker-ambari/blob/master/ambari-server/ Я думаю, что это, скорее всего, связано с проблемой GitHub в зомби-процессах: github.com/docker/docker/issues/18180. Я попробую сделать то, что делает mysql здесь... Я ничего не знаю о CentOS... - person false_memories; 18.01.2016
comment
ах, это может объяснить вещи; если вы используете boot2docker, вы можете попробовать релиз-кандидат; github.com/tianon/boot2docker-legacy/releases/tag/ v1.10.0-rc1, к которой применен патч aufs. В противном случае переключение на другой графический драйвер (например, оверлей) может помочь. - person thaJeztah; 18.01.2016
comment
Я работаю на виртуальной машине Ubuntu 14.04 VM. Есть ли способ переключить движок на оверлей при работе на Ubuntu в качестве основной ОС? - person false_memories; 18.01.2016
comment
хм, оверлей требует более свежего ядра. Ubuntu 14.04.3 использует ядро ​​3.19, которое должно поддерживать оверлей. - person thaJeztah; 18.01.2016
comment
Спасибо. Я создам виртуальную машину с 14.04.3 и попробую. Я думаю, что могу просто позволить установить амбари без контейнера. Он работал при установке на образ Ubuntu AWS. Я все еще могу хранить остальные службы в контейнерах (например, ldap). Я удивлен, что мой образ Docker tomcat не страдает от этой проблемы. Спасибо за всю вашу помощь. - person false_memories; 19.01.2016
comment
Вы можете попробовать github.com/tianon/boot2docker-legacy/releases /tag/v1.10.0-rc1, к которому уже применен патч aufs и последнее ядро ​​(поэтому также поддерживает наложение) - person thaJeztah; 19.01.2016