我正在尝试编写我自己的mariadb高山码头工人图像。一切正常,但当我试图收集mariadb日志时,我一无所获。我试着关注很多类似的相关问题,也尝试过这些,但都无济于事。
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
您可能会遇到以下问题:
- https://github.com/moby/moby/issues/31243
- https://github.com/moby/moby/issues/31106
当您更改用户帐户时,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