我正在设置一个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_NAME
和DOCKER_IMAGE_NAME_PHP
存储在一个env文件中,并从那里读取。 PHP映像已成功构建,我正在使用该映像将文件从那里复制到此处,以便我可以运行PHPUnit。
当我删除该RUN
行时,当我尝试运行创建数据库的脚本时,构建失败
mysqladmin:连接到“ localhost”服务器失败 错误:“无法连接到'localhost'上的MySQL服务器(99“无法分配请求的地址”)“ 检查mysqld是否在localhost上运行,端口是否为3306。 您可以通过执行“ telnet localhost 3306”进行检查
要使其工作,我需要在Dockerfile中做什么?
答案 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之类的工具来启动和停止容器。