如何将mysql日志重定向到容器内的/ dev / stdout?

时间:2019-01-10 14:10:54

标签: mysql docker mariadb stdout stderr

我正在尝试编写自己的mariadb-alpine码头工人形象。一切正常,但是当我尝试收集mariadb日志时,我什么也没得到。我试图关注this之类的许多相关问题,但都没有成功。

FROM alpine:edge


COPY my.cnf /etc/mysql/my.cnf


RUN set -ex \
    && apk add mariadb mariadb-client shadow \
    && ln -snf /usr/lib/mariadb /usr/lib/mysql \
    && mysql_install_db --user=mysql --skip-name-resolve --auth-root-authentication-method=socket --auth-root-socket-user=root --force --rpm --skip-test-db \
    && usermod -a -G tty mysql \
    && ln -sf /dev/stdout /var/log/mysqld.err \
    && chown -h mysql:mysql /var/log/mysqld.err

CMD ["mysqld_safe"]
EXPOSE 3306

mysqld是否需要pid = 1才能工作stdout?就我而言,如下所示。

# ps aux
PID   USER     TIME  COMMAND
1     root     0:00  {mysqld_safe} /bin/sh /usr/bin/mysqld_safe
134   mysql    0:00  /usr/bin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib/mariadb/plugin --user=mysql --log-error=/var/log/mysqld.err --pid-file=49ea99ae9348.p
166   root     0:00  sh
171   root     0:00  ps aux

1 个答案:

答案 0 :(得分:0)

您可能会遇到以下问题:

当您更改用户帐户时,使用alpine的某些东西会破坏访问/ dev / stdout的能力。我使用的解决方法涉及:

  • 使用tty运行容器
  • 将容器内的用户添加到tty组
  • 使用gosu / exec启动命令以用您的应用替换pid 1 shell脚本

我不确定是否需要最后一部分,并且您可能无权使用mysql命令来执行此操作。您已经在做第二项了。剩下的第一项可以实现:

docker run -t your_image

或在撰写文件中

services:
  mysql:
    image: your_image
    tty: true
    ....

唯一的另一种选择是直接将您的应用程序作为mysql运行,而不是使用compose文件中的user: mysql以root身份启动它,但是mysql本身可能不支持。

如果这些都不起作用,那么官方图像使用的选项是选择一个debian基本图像而不是高山图像。您可以在此处查看其Dockerfile:

https://github.com/docker-library/mysql/blob/696fc899126ae00771b5d87bdadae836e704ae7d/8.0/Dockerfile