在Docker中连接到MySQL失败

时间:2018-11-22 10:40:18

标签: mysql docker

我正在设置一个Dockerfile,可以在其中运行自动化测试,并且在连接mysql数据库时遇到了麻烦。

Dockerfile依赖于以前构建的映像,如下所示:

# Stage 0, assign argument as multistage image alias
ARG PHP_IMAGE
FROM ${PHP_IMAGE} as image

# Stage 1, start tests
FROM php:7.2-fpm

RUN curl -sS https://getcomposer.org/installer | php \
  && chmod +x composer.phar && mv composer.phar /usr/local/bin/composer

RUN apt-get update && apt-get install -y gnupg
RUN curl -sL https://deb.nodesource.com/setup_8.x | bash - && \
    apt-get install -yq nodejs build-essential \
        git unzip \
        libfreetype6-dev \
        libjpeg62-turbo-dev \
        libmcrypt-dev \
        libpng-dev \
        subversion \
    && curl -sL https://deb.nodesource.com/setup_8.x | bash - \
    && pecl install mcrypt-1.0.1 \
    && docker-php-ext-enable mcrypt \
    && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
    && docker-php-ext-install -j$(nproc) gd \
    && docker-php-ext-install -j$(nproc) mysqli

RUN apt-get install -y mysql-server
RUN /etc/init.d/mysql start
RUN mysqladmin -u root -p status

RUN yes | pecl install xdebug \
    && echo "zend_extension=$(find /usr/local/lib/php/extensions/ -name xdebug.so)" > /usr/local/etc/php/conf.d/xdebug.ini \
    && echo "xdebug.remote_enable=on" >> /usr/local/etc/php/conf.d/xdebug.ini \
    && echo "xdebug.remote_autostart=off" >> /usr/local/etc/php/conf.d/xdebug.ini

RUN npm install -g npm

COPY --from=image /var/www/html/ /var/www/html/

WORKDIR /var/www/html/
COPY scripts/develop.sh develop.sh
COPY scripts/docker-test.sh docker-test.sh

RUN ["/bin/bash", "-c", "bash develop.sh && bash docker-test.sh"]

我添加了RUN mysqladmin -u root -p status来调试为什么无法连接到mysql并失败了

  

输入密码:mysqladmin:连接到“ localhost”服务器失败   错误:“无法通过套接字'/var/run/mysqld/mysqld.sock”(2“无此文件或目录”)连接到本地MySQL服务器”   检查mysqld是否正在运行以及套接字:'/var/run/mysqld/mysqld.sock'是否存在!

要运行此程序,我正在运行

docker build -t $TEST_DOCKER_NAME --build-arg PHP_IMAGE=$DOCKER_IMAGE_NAME_PHP -f Dockerfile.test .

TEST_DOCKER_NAMEDOCKER_IMAGE_NAME_PHP存储在一个env文件中,并从那里读取。 PHP映像已成功构建,我正在使用该映像将文件从那里复制到此处,以便我可以运行PHPUnit。

当我删除该RUN行时,当我尝试运行创建数据库的脚本时,构建失败

  

mysqladmin:连接到“ localhost”服务器失败   错误:“无法连接到'localhost'上的MySQL服务器(99“无法分配请求的地址”)“   检查mysqld是否在localhost上运行,端口是否为3306。   您可以通过执行“ telnet localhost 3306”进行检查

要使其工作,我需要在Dockerfile中做什么?

1 个答案:

答案 0 :(得分:2)

回答您的特定问题

这是人们在使用docker时常犯的错误。当您在docker中使用RUN指令时,您将运行一个命令直至完成,捕获文件系统更改,然后退出。

所以当你有行

RUN /etc/init.d/mysql start
RUN mysqladmin -u root -p status

第一个是启动mysql。但是随后捕获了更改,退出了容器,然后启动了一个新容器来运行mysqladmin命令。因此,mysql进程不再运行。

为避免这种情况,您可以将它们合并成一行,例如

RUN /etc/init.d/mysql start && mysqladmin -u root -p status

但是,每次要使用mysql时,都需要执行此操作。例如在您的develop.sh中。

更广泛的答案

不建议您在容器中运行多个进程,也不建议在容器中使用init.d或其他系统启动框架。

您似乎将容器像虚拟机一样对待,因为容器不是VM,因此出现了问题。

我建议您探索在单独的容器中运行mysql,然后使用docker-compose之类的工具来启动和停止容器。