Docker mysql通过MariaDB与Supervisor

nfs0ujit  于 2024-01-05  发布在  Mysql
关注(0)|答案(2)|浏览(271)

大约一年前,我提出了扩展我的Docker知识的想法,开始以创建一种用于开发目的的多平台服务器映像,从那时起,我想出了如何让Nginx和PHP-fpm在稳定的环境中运行。这一切都是基于Debian映像。现在,从几个星期前开始,我想在映像中添加MySQL功能。起初,我尝试了正常的MySQL(-server)镜像,在尝试修复它无法在我的镜像中运行的错误后,我切换到使用MariaDB -我甚至改变了MySQL的Docker镜像以适应我的需要(当然,因为我的项目使用了几个服务,所以将CMD ["mysqld"]替换为supervisord.conf可执行文件)。我试着弄清楚它几天,但它仍然没有运行。目前,我选择使用https://hub.docker.com/_/mariadb(第二:10.4.12-bionic,10.4-bionic,10-bionic,bionic,10.4.12,10.4,10,最新)与我的形象。
我在写这篇文章的时候刚刚创建了一个mariadb副本,但是替换了直接执行mysqld(工作)。当这个主题被创建的时候,它没有和一个supervisord一起工作,现在它应该工作了。
我有一个docker-compose.yml,它将在这里启动,代码如下:

  1. version: "3"
  2. services:
  3. db:
  4. container_name: mariadb
  5. image: mariadb
  6. build: .
  7. restart: on-failure
  8. ports:
  9. - 3306:3306
  10. environment:
  11. - MYSQL_ROOT_PASSWORD=test123
  12. networks:
  13. - local-network
  14. networks:
  15. local-network:
  16. driver: bridge

字符串
然后,我将使用(--build)参数执行docker-compose up -d或。
这背后的Dockerfile是:

  1. FROM debian:buster-slim
  2. ENV DEBIAN_FRONTEND noninteractive
  3. ENV GOSU_VERSION 1.12
  4. ENV MARIADB_VERSION 10.4
  5. ENV GPG_KEYS \
  6. 199369E5404BD5FC7D2FE43BCBCB082A1BB943DB \
  7. 177F4010FE56CA3336300305F1656F24C74CD1D8
  8. # add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added
  9. RUN groupadd -r mysql && useradd -r -g mysql mysql
  10. RUN apt-get update && apt-get install --no-install-recommends --no-install-suggests -q -y \
  11. wget \
  12. ca-certificates \
  13. gnupg \
  14. gnupg1 \
  15. gnupg2 \
  16. dirmngr \
  17. pwgen \
  18. tzdata \
  19. xz-utils
  20. # Get Gosu for easy stepdown from root (to avoid sudo/su miscommunications)
  21. # https://github.com/tianon/gosu/releases
  22. RUN set -eux; \
  23. savedAptMark="$(apt-mark showmanual)"; \
  24. dpkgArch="$(dpkg --print-architecture | awk -F- '{ print $NF }')"; \
  25. wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch"; \
  26. wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch.asc"; \
  27. export GNUPGHOME="$(mktemp -d)"; \
  28. gpg --batch --keyserver hkps://keys.openpgp.org --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4; \
  29. gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu; \
  30. gpgconf --kill all; \
  31. rm -rf "$GNUPGHOME" /usr/local/bin/gosu.asc; \
  32. apt-mark auto '.*' > /dev/null; \
  33. [ -z "$savedAptMark" ] || apt-mark manual $savedAptMark > /dev/null; \
  34. apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; \
  35. chmod +x /usr/local/bin/gosu; \
  36. gosu --version; \
  37. gosu nobody true
  38. RUN mkdir /docker-entrypoint-initdb.d
  39. RUN set -ex; \
  40. export GNUPGHOME="$(mktemp -d)"; \
  41. for key in $GPG_KEYS; do \
  42. gpg --batch --keyserver ha.pool.sks-keyservers.net --recv-keys "$key"; \
  43. done; \
  44. gpg --batch --export $GPG_KEYS > /etc/apt/trusted.gpg.d/mariadb.gpg; \
  45. command -v gpgconf > /dev/null && gpgconf --kill all || :; \
  46. rm -r "$GNUPGHOME"; \
  47. apt-key list
  48. # Add MariaDB repo
  49. RUN set -e;\
  50. echo "deb http://downloads.mariadb.com/MariaDB/mariadb-$MARIADB_VERSION/repo/debian buster main" > /etc/apt/sources.list.d/mariadb.list; \
  51. { \
  52. echo 'Package: *'; \
  53. echo 'Pin: release o=MariaDB'; \
  54. echo 'Pin-Priority: 999'; \
  55. } > /etc/apt/preferences.d/mariadb
  56. # Install MariaDB and set custom requirements
  57. RUN set -ex; \
  58. { \
  59. echo "mariadb-server" mysql-server/root_password password 'unused'; \
  60. echo "mariadb-server" mysql-server/root_password_again password 'unused'; \
  61. } | debconf-set-selections; \
  62. apt-get update && apt-get install --no-install-recommends --no-install-suggests -y -q \
  63. mariadb-server \
  64. mariadb-backup \
  65. socat; \
  66. # comment out any "user" entires in the MySQL config ("docker-entrypoint.sh" or "--user" will handle user switching)
  67. sed -ri 's/^user\s/#&/' /etc/mysql/my.cnf /etc/mysql/conf.d/*; \
  68. # making sure that the correct permissions are set
  69. mkdir -p /var/lib/mysql /var/run/mysqld; \
  70. chown -R mysql:mysql /var/lib/mysql /var/run/mysqld; \
  71. # comment out a few problematic configuration values
  72. find /etc/mysql/ -name '*.cnf' -print0 \
  73. | xargs -0 grep -lZE '^(bind-address|log)' \
  74. | xargs -rt -0 sed -Ei 's/^(bind-address|log)/#&/'; \
  75. # don't reverse lookup hostnames, they are usually another container
  76. echo '[mysqld]\nskip-host-cache\nskip-name-resolve' > /etc/mysql/conf.d/docker.cnf
  77. # Setup the Supervisor
  78. RUN apt-get update && apt-get install supervisor -y \
  79. && mkdir -p /var/log/supervisor
  80. COPY /supervisord.conf /etc/supervisor/conf.d/supervisord.conf
  81. RUN chmod +x /etc/supervisor/conf.d/supervisord.conf
  82. VOLUME /var/lib/mysql
  83. COPY /docker-entrypoint.sh /usr/local/bin/
  84. RUN chmod +x /usr/local/bin/docker-entrypoint.sh \
  85. && ln -s /usr/local/bin/docker-entrypoint.sh /
  86. ENTRYPOINT ["docker-entrypoint.sh"]
  87. EXPOSE 3306 33060
  88. # call and execute the supervisor after build
  89. CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]


经过几天的工作,对固定的形象,我认为supervisord是问题,它不能运行,因为这或什么.好吧,这里是supervisord:

  1. [supervisord]
  2. logfile=/var/log/supervisord.log
  3. nodaemon=true
  4. user=root
  5. [program:mysql]
  6. command=/usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql
  7. process_name=mysqld
  8. priority=1
  9. stdout_logfile=/dev/stdout
  10. stdout_logfile_maxbytes=0
  11. stdout_events_enabled=true
  12. stderr_logfile=/dev/stderr
  13. stderr_logfile_maxbytes=0
  14. stderr_events_enabled=true
  15. autorestart=true
  16. user=mysql


镜像构建完成后,mysql将被supervisor执行。但是,问题是我想使用https://github.com/mariadb-corporation/mariadb-server-docker/tree/master/10.4的入口点-我在Bash中不是很有名,所以需要一些时间来练习。无论如何,docker-entrypoint第一次没有执行,数据库将不会初始化。我能做的是,我正在创建一个自己的shell脚本来初始化它。测试了一下,它工作了,但是为什么我不能使用默认的入口点作为第一选择呢?
是否在Supervisord命令之间的某个点出错- docker-entrypoint与mysql连接点或其他东西?
我真的希望有人能帮我。

**编辑[04/26/2020]:**描述了从现在开始的最新情况,数据库未初始化,没有来自entrypoint脚本的消息,注解或警告。

问候,科林

d6kp6zgx

d6kp6zgx1#

MySQL服务应该以root用户的身份运行,但后来是mysql用户试图访问“socket”。因此,socket目录应该由mysql用户访问,但Superviser以root用户的身份运行mysql服务。
我通过在我的Dockerfile中创建MySQL套接字目录并给予正确的权限来解决这个问题:

  1. ARG MARIADB_MYSQL_SOCKET_DIRECTORY='/var/run/mysqld'
  2. RUN mkdir -p $MARIADB_MYSQL_SOCKET_DIRECTORY && \
  3. chown root:mysql $MARIADB_MYSQL_SOCKET_DIRECTORY && \
  4. chmod 774 $MARIADB_MYSQL_SOCKET_DIRECTORY

字符串
然后像这样配置Supervisor:

  1. [program:mariadb]
  2. command=/usr/sbin/mysqld
  3. autorestart=true
  4. user=root

展开查看全部
wnrlj8wa

wnrlj8wa2#

你应该能够chown套接字到mysql的userid。

相关问题