首页 > 解决方案 > MySQL Docker 文件:sed:无法打开临时文件

问题描述

我正在尝试创建新的 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 中部署时抛出错误,如下所示:

在此处输入图像描述

我该如何理解这个问题?

添加

码头入口点.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:我已经添加了文件的内容。

标签: mysqlbashdocker

解决方案


该问题与sed's 的in-place编辑实现有关。-i当您使用or选项编辑文件时,编辑--in-place实际上并没有发生in-placesed将更改保存到一个临时文件中,然后用它来替换原始文件。

碰巧您没有/etc目录的写权限,sed试图在其中创建其临时文件。

正如评论中所建议的那样,该命令很可能由 user 运行mysql。确保它没有运行,root因为它有足够的权限可以写入/etc

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

如您所见others,没有写权限。更改目录本身的权限或所有者/etc是一个非常糟糕的主意,我也不建议您以root用户身份运行此命令。

最简单的解决方案是放弃使用--in-place选项,将结果保存在/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脚本的用户。

如果有帮助,请告诉我。


推荐阅读