首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过MariaDB与主管对接mysql

通过MariaDB与主管对接mysql
EN

Stack Overflow用户
提问于 2020-04-22 10:31:49
回答 1查看 2.5K关注 0票数 1

大约一年前,我提出了扩展我的Docker知识的想法,从创建一种用于开发目的的多平台服务器映像开始,从那时起,我想出了如何让Nginx和PHP在一个稳定的环境中运行。这一切都是基于Debian的图像。现在,从一周前开始,我想将MySQL功能添加到映像中。起初,我尝试了普通的MySQL(-server)映像,在试图修复为什么它不能在我的映像中运行的错误之后,我转而使用MariaDB --我甚至更改了MySQL的Docker映像以适应我的需要(当然,我的项目使用了几个服务,所以用CMD ["mysqld"]替换了supervisord.conf可执行文件)。现在,我试着想办法解决这几天,但它仍然没有运行。目前,我选择使用https://hub.docker.com/_/mariadb (第二,10.4.12-仿生,10.4-仿生,10-仿生,10.4.12,10.4,10,最新)与我的形象。

我刚刚在编写时创建了一个mariadb副本,但是代替了直接执行mysqld (工作)。当这个主题被创建时,它并没有与一个监督程序一起工作,而且它的工作原理应该是现在。

我有一个docker-compose.yml来启动它,这里的代码是:

代码语言:javascript
复制
version: "3"
services:
  db:
    container_name: mariadb
    image: mariadb
    build: .
    restart: on-failure
    ports:
      - 3306:3306
    environment:
      - MYSQL_ROOT_PASSWORD=test123
    networks: 
      - local-network

networks:
  local-network:
    driver: bridge

然后,我将使用-d或(--build)参数执行docker。

背后的Dockerfile是:

代码语言:javascript
复制
FROM debian:buster-slim

ENV DEBIAN_FRONTEND noninteractive

ENV GOSU_VERSION 1.12

ENV MARIADB_VERSION 10.4

ENV GPG_KEYS \
    199369E5404BD5FC7D2FE43BCBCB082A1BB943DB \
    177F4010FE56CA3336300305F1656F24C74CD1D8

# add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added
RUN groupadd -r mysql && useradd -r -g mysql mysql

RUN apt-get update && apt-get install --no-install-recommends --no-install-suggests -q -y \
    wget \
    ca-certificates \
    gnupg \
    gnupg1 \
    gnupg2 \
    dirmngr \
    pwgen \
    tzdata \
    xz-utils

# Get Gosu for easy stepdown from root (to avoid sudo/su miscommunications)
# https://github.com/tianon/gosu/releases
RUN set -eux; \
    savedAptMark="$(apt-mark showmanual)"; \
    dpkgArch="$(dpkg --print-architecture | awk -F- '{ print $NF }')"; \
    wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch"; \
    wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch.asc"; \
    export GNUPGHOME="$(mktemp -d)"; \
    gpg --batch --keyserver hkps://keys.openpgp.org --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4; \
    gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu; \
    gpgconf --kill all; \
    rm -rf "$GNUPGHOME" /usr/local/bin/gosu.asc; \
    apt-mark auto '.*' > /dev/null; \
    [ -z "$savedAptMark" ] || apt-mark manual $savedAptMark > /dev/null; \
    apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; \
    chmod +x /usr/local/bin/gosu; \
    gosu --version; \
    gosu nobody true

RUN mkdir /docker-entrypoint-initdb.d

RUN set -ex; \
    export GNUPGHOME="$(mktemp -d)"; \
    for key in $GPG_KEYS; do \
        gpg --batch --keyserver ha.pool.sks-keyservers.net --recv-keys "$key"; \
    done; \
    gpg --batch --export $GPG_KEYS > /etc/apt/trusted.gpg.d/mariadb.gpg; \
    command -v gpgconf > /dev/null && gpgconf --kill all || :; \
    rm -r "$GNUPGHOME"; \
    apt-key list

# Add MariaDB repo
RUN set -e;\
    echo "deb http://downloads.mariadb.com/MariaDB/mariadb-$MARIADB_VERSION/repo/debian buster main" > /etc/apt/sources.list.d/mariadb.list; \
    { \
        echo 'Package: *'; \
        echo 'Pin: release o=MariaDB'; \
        echo 'Pin-Priority: 999'; \
    } > /etc/apt/preferences.d/mariadb

# Install MariaDB and set custom requirements
RUN set -ex; \
    { \
        echo "mariadb-server" mysql-server/root_password password 'unused'; \
        echo "mariadb-server" mysql-server/root_password_again password 'unused'; \
    } | debconf-set-selections; \
    apt-get update && apt-get install --no-install-recommends --no-install-suggests -y -q \
    mariadb-server \
    mariadb-backup \
    socat; \
# comment out any "user" entires in the MySQL config ("docker-entrypoint.sh" or "--user" will handle user switching)
    sed -ri 's/^user\s/#&/' /etc/mysql/my.cnf /etc/mysql/conf.d/*; \
# making sure that the correct permissions are set
    mkdir -p /var/lib/mysql /var/run/mysqld; \
    chown -R mysql:mysql /var/lib/mysql /var/run/mysqld; \
# comment out a few problematic configuration values
    find /etc/mysql/ -name '*.cnf' -print0 \
        | xargs -0 grep -lZE '^(bind-address|log)' \
        | xargs -rt -0 sed -Ei 's/^(bind-address|log)/#&/'; \
# don't reverse lookup hostnames, they are usually another container
    echo '[mysqld]\nskip-host-cache\nskip-name-resolve' > /etc/mysql/conf.d/docker.cnf

# Setup the Supervisor
RUN apt-get update && apt-get install supervisor -y \
    && mkdir -p /var/log/supervisor

COPY /supervisord.conf /etc/supervisor/conf.d/supervisord.conf
RUN chmod +x /etc/supervisor/conf.d/supervisord.conf

VOLUME /var/lib/mysql

COPY /docker-entrypoint.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/docker-entrypoint.sh \
    && ln -s /usr/local/bin/docker-entrypoint.sh /

ENTRYPOINT ["docker-entrypoint.sh"]

EXPOSE 3306 33060

# call and execute the supervisor after build
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]

经过几天的工作修复图像,我认为监督是问题,它不能运行,因为那个或什么。好吧,这是监管机构:

代码语言:javascript
复制
[supervisord]
logfile=/var/log/supervisord.log
nodaemon=true
user=root

[program:mysql]
command=/usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql
process_name=mysqld
priority=1
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stdout_events_enabled=true
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
stderr_events_enabled=true
autorestart=true
user=mysql

在构建映像时,接下来发生的事情是mysql将由主管执行。但是,问题是我想使用https://github.com/mariadb-corporation/mariadb-server-docker/tree/master/10.4的入口点--我在Bash中不太出名,所以需要一些时间来练习那里的东西。无论如何,对接点-入口点尚未第一次执行,数据库将不会被初始化。我能做的就是创建一个自己的shell脚本来初始化它。测试了这个结果,但是为什么我不能使用默认的入口点作为第一个选择呢?

在监督命令--停靠点-入口点和mysql连接点之间的某个点上出错了吗?

我真的希望有人能帮我。

编辑04/26/2020描述了从现在开始的最新情况,数据库没有初始化,没有消息,没有来自入口点脚本的注释或警告。

你好,科林

EN

回答 1

Stack Overflow用户

发布于 2020-09-24 12:57:44

MySQL服务应该以根用户的身份运行,但稍后,这就是试图访问“套接字”的mysql用户。因此,套接字目录应该可以由mysql用户访问,但监督器以root用户的身份运行mysql服务。

我通过在我的Dockerfile中创建并授予MySQL套接字目录正确的权限来解决这个问题:

代码语言:javascript
复制
ARG MARIADB_MYSQL_SOCKET_DIRECTORY='/var/run/mysqld'

RUN mkdir -p $MARIADB_MYSQL_SOCKET_DIRECTORY && \
    chown root:mysql $MARIADB_MYSQL_SOCKET_DIRECTORY && \
    chmod 774 $MARIADB_MYSQL_SOCKET_DIRECTORY

然后将主管配置如下:

代码语言:javascript
复制
[program:mariadb]
command=/usr/sbin/mysqld
autorestart=true
user=root
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61362934

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档