У меня есть 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, когда пользователь заходит на определенную веб-страницу.