Контейнер Docker немедленно завершает работу, если запускается как пользователь без полномочий root - PullRequest
0 голосов
/ 03 января 2019

Я следовал этому руководству , чтобы запустить контейнер от имени пользователя без полномочий root. Пользователь gpadmin уже создан в образе.

Но контейнер немедленно завершается, если я запускаю следующую команду:

root@dev01:~# docker run -i -d -v /tmp/$(mktemp -d):/run -p 5432:5432 -p 28080:28080 --user gpadmin --name  gpcentos-dev --hostname mdw gpdb-postgres9.4/centos /usr/sbin/sshd -D
adcaf577c0a589987b556824a3413c74381dfe4d9347467891cf47ac18b91743
root@dev01:~# docker ps -l
CONTAINER ID        IMAGE                     COMMAND               CREATED             STATUS                     PORTS               NAMES
adcaf577c0a5        gpdb-postgres9.4/centos   "/usr/sbin/sshd -D"   4 seconds ago       Exited (1) 2 seconds ago                       gpcentos-dev

Но когда я запускаю команду, пропустив --user gpadmin, контейнер не выходит сразу.

root@dev01:~# docker run -i -d -v /tmp/$(mktemp -d):/run -p 5432:5432 -p 28080:28080 --name  gpcentos-dev --hostname mdw gpdb-postgres9.4/centos /usr/sbin/sshd -D
24f00ec4e531168fb266e7f4616e5fa8f2829112132de211392a9040a0f52d5f
root@dev01:~# docker ps -l
CONTAINER ID        IMAGE                     COMMAND               CREATED             STATUS              PORTS                                                              NAMES
24f00ec4e531        gpdb-postgres9.4/centos   "/usr/sbin/sshd -D"   8 seconds ago       Up 7 seconds        22/tcp, 0.0.0.0:5432->5432/tcp, 80/tcp, 0.0.0.0:28080->28080/tcp   gpcentos-dev

Как я понимаю -i -t -d должен поддерживать работу контейнера в фоновом режиме.

РЕДАКТИРОВАТЬ 1: На основе этой ссылки рекомендации Docker , контейнеры могут быть запущены от имени пользователя root. Но все службы должны быть запущены с использованием пользователя службы. Итак, я создал пользователя gpadmin для запуска базы данных.

docker run -i -d -v /tmp/$(mktemp -d):/run -p 5432:5432 -p 28080:28080 --name  gpdb-centos --hostname mdw gpdb-postgres9.4/centos /usr/sbin/sshd -D
docker exec -it gpdb-centos sh -c "su - gpadmin -c 'echo 'y' | /home/gpadmin/greenplum_start.sh' && hostname -i"

1 Ответ

0 голосов
/ 03 января 2019

Опции -i -t -d указывают докеру настроить дескриптор файла для ввода, настроить вход как псевдотерминал (терминал) и отсоединить этот контейнер от текущей командной строки. Это не гарантирует, что контейнер продолжит работать, это зависит от команды, которую вы выполняете внутри контейнера.

Исходя из вашего вывода, команда, которую вы запускаете, выглядит так: «/ usr / sbin / sshd -D», для которой потребуется root-доступ для привязки к порту 22, чтения файлов конфигурации в / etc и записи в файлы в / var .

Чтобы отлаживать команды, не работающие внутри контейнеров, вы должны просмотреть журналы и проверить контейнер, чтобы увидеть, что не удалось и почему. Команды для этого:

docker logs $container_id
docker inspect $container_id

где $container_id будет 24f00ec4e531 в вашем примере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...