MySQL Docker文件:sed:无法打开临时文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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中进行如下部署时会抛出错误:

enter image description here

我如何理解这个问题?

添加

docker-entrypoint.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

P.S:我已经添加了文件的内容。

答案

问题与sedin-place编辑实现有关。当使用-i--in-place选项编辑文件时,实际上并不会发生版本in-placesed将更改保存到一个临时文件中,然后使用它替换原始文件。

碰巧您没有对/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用户身份运行此命令。

最简单的解决方案是放弃使用--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脚本的用户。

请让我知道是否有帮助。

以上是关于MySQL Docker文件:sed:无法打开临时文件的主要内容,如果未能解决你的问题,请参考以下文章

Mysql 表修复失败:“无法创建新的临时文件”

sed

sed命令详解

Linux学习- sed,软件包管理

sed命令基本使用

docker安装部署(kubeadm方式亲测)