mysql - 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:我已经添加了文件的内容。
解决方案
该问题与sed
's 的in-place
编辑实现有关。-i
当您使用or选项编辑文件时,编辑--in-place
实际上并没有发生in-place
。sed
将更改保存到一个临时文件中,然后用它来替换原始文件。
碰巧您没有/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
脚本的用户。
如果有帮助,请告诉我。
推荐阅读
- javascript - 确保我们不必重写 React 代码
- typescript - 如何使密钥可选?
- c++ - 使用 mpi 的谐波和:开始使用 mpi 时遇到问题,不确定如何将其修改为谐波级数
- php - 在 CodeIgniter 类 stdClass 的 CodeIgniter 对象上出现错误无法转换为 CodeIgniter 中的字符串
- python - PyGetWindow 可以帮忙截图吗?
- javascript - React Js:if else 语句中的获取和错误第 50:20 行:解析错误:意外的令牌,预期的“,”
- node.js - 使用 multer 上传的文件存储在云端后如何删除?
- html - html中的表格问题
- python - 如何写入文件的特定部分?
- c++ - 为什么在 C++ 的 min() 函数中使用 size() 会出错?