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中进行如下部署时会抛出错误:
我如何理解这个问题?
添加
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:我已经添加了文件的内容。
问题与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
用户身份运行此命令。
最简单的解决方案是放弃使用--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:无法打开临时文件的主要内容,如果未能解决你的问题,请参考以下文章