MySQL Docker file: sed: не удалось открыть временный файл - PullRequest
0 голосов
/ 27 марта 2020

Я пытаюсь создать новый образ MySQL и развернуть его в Kubernetes.

FROM oraclelinux:7-slim
USER root
ARG MYSQL_SERVER_PACKAGE=mysql-community-server-minimal-8.0.19
ARG MYSQL_SHELL_PACKAGE=mysql-shell-8.0.19

# Install server
RUN yum install -y https://repo.mysql.com/mysql-community-minimal-release-el7.rpm \
      https://repo.mysql.com/mysql-community-release-el7.rpm \
  && yum-config-manager --enable mysql80-server-minimal \
  && yum install -y \
      $MYSQL_SERVER_PACKAGE \
      $MYSQL_SHELL_PACKAGE \
      libpwquality \
  && yum clean all \
  && mkdir /docker-entrypoint-initdb.d

VOLUME /var/lib/mysql

COPY docker-entrypoint.sh /entrypoint.sh
COPY healthcheck.sh /healthcheck.sh
ENTRYPOINT ["/entrypoint.sh"]
HEALTHCHECK CMD /healthcheck.sh
EXPOSE 3306 33060

RUN chmod +rwx /entrypoint.sh
RUN chmod +rwx /healthcheck.sh

RUN groupadd -r mysql && useradd -r -g mysql mysql

EXPOSE 3306
CMD ["mysqld"]

В контейнере все работает нормально. Но выдает ошибку при развертывании в Kubernetes, как показано ниже:

enter image description here

Как я могу понять эту проблему?

ДОБАВЛЕНО

docker -входная точка. sh:

if [ -n "$MYSQL_LOG_CONSOLE" ] || [ -n "console" ]; then
        # Don't touch bind-mounted config files
        if ! cat /proc/1/mounts | grep "/etc/my.cnf"; then
            sed -i 's/^log-error=/#&/' /etc/my.cnf
        fi
fi

PS: Я добавил содержимое файла.

1 Ответ

0 голосов
/ 27 марта 2020

Проблема связана с реализацией редактирования sed in-place. Когда вы редактируете файл с помощью опции -i или --in-place, на самом деле редактирование не происходит in-place. sed сохраняет изменения во временном файле, а затем использует его для замены исходного.

Бывает, что у вас нет разрешения на запись в каталог /etc, где sed пытается создать его временный файл.

Как указано в комментариях, наиболее вероятно, что команда запускается пользователем mysql. Конечно, он не запускается как root, поскольку у него достаточно привилегий для записи в /etc:

bash-4.2# ls -ld /etc
drwxr-xr-x 1 root root 4096 Mar 27 15:04 /etc

Как видите, others не имеет разрешения на запись. Изменение прав доступа или владельца самого каталога /etc - очень плохая идея, и я не советую вам запускать эту команду как пользователь root.

Самое простое решение - отказаться от использования * 1024. * опция, сохранить результат в каталоге, таком как /tmp, к которому все имеют доступ:

bash-4.2# ls -ld /tmp
drwxrwxrwt 1 root root 4096 Mar 27 16:39 /tmp

и после этого заменить содержимое исходного файла содержимым временного.

Ваша команда может выглядеть следующим образом:

sed 's/^log-error=/#&/' /etc/my.cnf > /tmp/my.cnf && cat /tmp/my.cnf > /etc/my.cnf

Одно важное предупреждение:

Необходимо убедиться, что у вас есть разрешение write для файла /etc/my.cnf. Как вы можете видеть ниже, по умолчанию у вас также нет такого разрешения, поэтому ошибка возникнет позже, когда команда попытается записать в исходный файл конфигурации.

bash-4.2# ls -l /etc/my.cnf
-rw-r--r-- 1 root root 1239 Mar 27 15:04 /etc/my.cnf

Вам необходимо изменить в вашем Dockerfile либо сделайте его доступным для редактирования всеми:

RUN chmod 666 /etc/my.cnf

или лучше:

RUN chown mysql /etc/my.cnf

чтобы сменить владельца на mysql, если это пользователь, который выполняет сценарий entrypoint.sh.

Пожалуйста, дайте мне знать, если это поможет.

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