Запустить MySQL предварительно заполненный контейнер докера как случайный (не root) пользователь Linux? - PullRequest
0 голосов
/ 17 мая 2018

Я пытаюсь создать предварительно заполненный образ контейнера MySQL, соответствующий OpenShift.

Запуск контейнера с указанным пользователем (к сожалению) не вариант для нас.

Это проблема, поскольку OpenShift просто создает некоторый случайный UID без имени пользователя, поэтому настройка имени пользователя во время выполнения с помощью скрипта перед запуском службы MySQL не является опцией.

Есть ли способ заставить MySQL работать с любым случайным UID в контейнере Docker?

редактирование: Идея, лежащая в основе этого вопроса, заключается в возможности запуска контейнера MySQL, подобного этому Dockerfile для randomusermysql:example

FROM mysql:5.7.22

#IMPORTANT: MySQL Container runs init in alphanumerical order!
COPY src/some.sql /docker-entrypoint-initdb.d/

ENV MYSQL_ROOT_PASSWORD='somepw'

RUN mkdir -p /var/lib/mysql2 && \
    chown -R mysql:mysql /var/lib/mysql2 && \
    chmod -R 777 /var/lib/mysql2 && \
    sed -i 's|/var/lib/mysql|/var/lib/mysql2|g' /etc/mysql/mysql.conf.d/mysqld.cnf && \
    sed -i 's|exec "$@"||g' /entrypoint.sh && \
    /entrypoint.sh mysqld && \
    chmod -R 777 /var/lib/mysql2/ && \
    chown -R mysql:mysql /var/lib/mysql2 && \
    find /var/lib/mysql2/ -name "*.cnf" -exec chmod 775 {} \; && \
    echo 'exec "$@"' >> /entrypoint.sh

Затем запустив это так

docker run -u 123456789 randomusermysql:example

При запуске контейнера возникает следующая ошибка

2018-05-22T11:39:35.084034Z 0 [ERROR] Fatal error: Can't open and lock privilege tables: Table storage engine for 'user' doesn't have this option
2018-05-22T11:39:35.084235Z 0 [ERROR] Aborting

Нет возможности передать пользователя как docker ENV при запуске контейнера

edit2: неверный текст награды.
Исправлено заявление о вознаграждении:
Требуется решение с предварительно заполненной базой данных MySQL без простого копирования файлов дампа в каталог /docker-entrypoint-initdb.d!

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Проблема в том, что случайный uid, которого нет ни в файле passwd, ни в файле группы.

Я разместил решение для этого на странице github в mssql: https://github.com/Microsoft/mssql-docker/issues/121#issuecomment-347766828

Краткое описание решения: я создал оболочку с lib-nss-wrapper, чтобы процесс мог найти случайный uid.

Дайте мне знать, если вам нужны дальнейшие инструкции.

0 голосов
/ 23 мая 2018

Проблема в том, что если вы предварительно создаете файлы базы данных как часть изображения в требуемом месте, то они будут иметь пользователя, такого же, как Dockerfile, создавшего их.Вы не будете знать заранее, что это за пользователь, и поэтому не сможете сопоставить, с какой базой данных она может быть запущена, что приведет к сбою MySQL при запуске, поскольку каталог, владеющий файлами базы данных, отличается от того, с которым он запускается.

Единственное решение, которое я видел, это добавить файлы базы данных в изображение в tar-файле в каком-то месте.В команде запуска для базы данных создайте каталог для базы данных и распакуйте в нее файл tar.Таким образом, каталог и файлы будут пользователем, от имени которого запускается MySQL.

Обратите внимание, что вы захотите создать родительский каталог, в котором будет создан каталог базы данных, группировать корень и доступный для записи по группе, чтобы выможет создать каталог базы данных, когда образ запускается как произвольный идентификатор пользователя, для которого нет записи в файле passwd.В этом случае идентификатор группы будет в качестве корневой группы, что позволит создать каталог базы данных.

...