Разрешить MariaDB для всех, чтобы войти как root? (Для Heroku Docker) - PullRequest
0 голосов
/ 11 апреля 2020

У меня есть Dockerfile, который я хочу запустить на Heroku. У меня есть Dockerfile, который отлично работает на обычном Docker сервере. Однако при запуске того же контейнера на Heroku кажется, что Heroku не позволяет Alpine / MariaDB работать как root.

Это мои журналы Heroku:

heroku[web.1]: State changed from crashed to starting

app[web.1]: Starting httpd

app[web.1]: AH00543: httpd: bad user name apache

app[web.1]: Done httpd

app[web.1]: Checking /var/lib/mysql folder

app[web.1]: Installing db

app[web.1]: chown: unknown user mysql

app[web.1]: Installed

app[web.1]: Querying user

app[web.1]: 2020-04-09  1:39:58 0 [Note] /usr/bin/mysqld (mysqld 10.4.12-MariaDB-log) starting as process 27 ...

app[web.1]: /usr/bin/mysqld: One can only use the --user switch if running as root

app[web.1]: Done query

app[web.1]: Starting mariadb database

app[web.1]: 2020-04-09  1:40:01 0 [Note] /usr/bin/mysqld (mysqld 10.4.12-MariaDB-log) starting as process 3 ...

app[web.1]: /usr/bin/mysqld: One can only use the --user switch if running as root

heroku[web.1]: State changed from starting to crashed

Это мой Dockerfile:

FROM alpine:3.11
ENV TIMEZONE America/New_York
RUN apk update && apk upgrade
RUN apk add mariadb mariadb-client \
    apache2 \ 
    apache2-utils \
    curl wget \
    tzdata \
    php7-apache2 \
    php7-cli \
    php7-phar \
    php7-zlib \
    php7-zip \
    php7-bz2 \
    php7-ctype \
    php7-curl \
    php7-pdo_mysql \
    php7-mysqli \
    php7-json \
    php7-mcrypt \
    php7-xml \
    php7-dom \
    php7-iconv \
    php7-xdebug \
    php7-session \
    php7-intl \
    php7-gd \
    php7-mbstring \
    php7-apcu \
    php7-opcache \
    php7-tokenizer \
    python3 \
    bash \
    nano

#
#    sed -i 's#AllowOverride none#AllowOverride All#' /etc/apache2/httpd.conf && \
#    sed -i 's#Require all denied#Require all granted#' /etc/apache2/httpd.conf && \
#    sed -i 's#^DocumentRoot ".*#DocumentRoot "/var/www/localhost/htdocs"#g' /etc/apache2/httpd.conf && \

# configure timezone, mysql, apache
RUN cp /usr/share/zoneinfo/${TIMEZONE} /etc/localtime && \
    echo "${TIMEZONE}" > /etc/timezone && \
    mkdir -p /run/mysqld && chown -R mysql:mysql /run/mysqld /var/lib/mysql && \
    mkdir -p /run/apache2 && chown -R apache:apache /run/apache2 && chown -R apache:apache /var/www/localhost/htdocs/ && \
    sed -i 's#\#LoadModule rewrite_module modules\/mod_rewrite.so#LoadModule rewrite_module modules\/mod_rewrite.so#' /etc/apache2/httpd.conf && \
    sed -i 's#ServerName www.example.com:80#\nServerName localhost:80#' /etc/apache2/httpd.conf && \
    sed -i 's/skip-networking/\#skip-networking/i' /etc/my.cnf.d/mariadb-server.cnf && \
    sed -i '/mariadb\]/a log_error = \/var\/lib\/mysql\/error.log' /etc/my.cnf.d/mariadb-server.cnf && \
    sed -i -e"s/^bind-address\s*=\s*127.0.0.1/bind-address = 0.0.0.0/" /etc/my.cnf.d/mariadb-server.cnf && \
    sed -i '/mariadb\]/a skip-external-locking' /etc/my.cnf.d/mariadb-server.cnf && \
    sed -i '/mariadb\]/a general_log = ON' /etc/my.cnf.d/mariadb-server.cnf && \
    sed -i '/mariadb\]/a general_log_file = \/var\/lib\/mysql\/query.log' /etc/my.cnf.d/mariadb-server.cnf


#Replace display_errors=Off in the first one to 'On'
RUN sed -i 's#display_errors = On#display_errors = Off#' /etc/php7/php.ini && \
    sed -i 's#upload_max_filesize = 2M#upload_max_filesize = 100M#' /etc/php7/php.ini && \
    sed -i 's#post_max_size = 8M#post_max_size = 100M#' /etc/php7/php.ini && \
    sed -i 's#session.cookie_httponly =#session.cookie_httponly = true#' /etc/php7/php.ini && \
    sed -i 's#error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT#error_reporting = Off#' /etc/php7/php.ini

COPY entry.sh /entry.sh

RUN chmod u+x /entry.sh && chmod -R 777 /var/www/localhost/htdocs && chmod -R 777 /var/www/localhost/htdocs/

ADD . /var/www/localhost/htdocs

RUN chmod u+x /entry.sh && chmod -R 777 /var/www/localhost/htdocs && chown -R apache /var/www/localhost/htdocs

WORKDIR /var/www/localhost/htdocs/

EXPOSE 80

ENTRYPOINT ["/entry.sh"]

Это мой файл Entry. sh, необходимый для моего Dockerfile:

#!/bin/sh
MYSQL_ROOT_PASSWORD="root"

# start apache
echo "Starting httpd"
httpd
echo "Done httpd"

# check if mysql data directory is nuked
# if so, install the db
echo "Checking /var/lib/mysql folder"
if [ ! -f /var/lib/mysql/ibdata1 ]; then 
    echo "Installing db"
    mariadb-install-db --user=mysql --ldata=/var/lib/mysql > /dev/null
    echo "Installed"
fi;

# from mysql official docker repo
if [ -z "$MYSQL_ROOT_PASSWORD" -a -z "$MYSQL_RANDOM_ROOT_PASSWORD" ]; then
            echo >&2 'error: database is uninitialized and password option is not specified '
            echo >&2 '  You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_RANDOM_ROOT_PASSWORD'
            exit 1
fi

# random password
if [ ! -z "$MYSQL_RANDOM_ROOT_PASSWORD" ]; then
    echo "Using random password"
    MYSQL_ROOT_PASSWORD="$(pwgen -1 32)"
    echo "GENERATED ROOT PASSWORD: $MYSQL_ROOT_PASSWORD"
    echo "Done"
fi

tfile=`mktemp`
if [ ! -f "$tfile" ]; then
    return 1
fi

cat << EOF > $tfile
    USE mysql;
    DELETE FROM user;
    FLUSH PRIVILEGES;
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY "$MYSQL_ROOT_PASSWORD" WITH GRANT OPTION;
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;
    UPDATE user SET password=PASSWORD("") WHERE user='root' AND host='localhost';
    FLUSH PRIVILEGES;
EOF

echo "Querying user"
/usr/bin/mysqld --user=root --bootstrap --verbose=0 < $tfile
rm -f $tfile
echo "Done query"

# start mysql
# nohup mysqld_safe --skip-grant-tables --bind-address 0.0.0.0 --user mysql > /dev/null 2>&1 &
echo "Starting mariadb database"
exec /usr/bin/mysqld --user=root --bind-address=0.0.0.0

Если мне нужно изменить настройки MariaDB, я должен это сделать в файле Docker с момента записи. Файл sh не может работать как root. Как разрешить кому-либо войти в систему как root и избежать "/ usr / bin / mysqld: можно использовать ключ --user, только если он работает как root"

Для записи:

  • Я понимаю, что в этом сценарии есть огромные угрозы безопасности с chown и тому подобным
  • Я понимаю, что небезопасно иметь пользователя / pass в качестве root / root, его для тестирования
  • Я понимаю, что моя база данных будет стерта, когда динамометрический модуль отключится, я на самом деле не хочу постоянного хранилища, и я хочу, чтобы оно было стерто.

Я просто пытаюсь настроить Docker, чтобы скрипт PHP мог войти в систему, создать базу данных, добавить таблицы и т. Д. c, когда пользователь заходит на определенную веб-страницу.

...