使用docker-compose构建容器时出现“php_network_getaddresses:getaddrinfo失败:名称解析中的临时故障”错误。

8
似乎我的php容器在运行“php artisan migrate”时无法解析数据库容器的主机“db”,我想知道是否在配置中设置了错误。
尝试通过更改dockerfile上的depends_on:和links:选项来解决问题。
docker-compose.yml
version: '3.3'

services:
  db:
    container_name: tasks-db
    image: mariadb:latest
    volumes:
      - dbdata:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=password
      - MYSQL_DATABASE=tasks
      - MYSQL_USER=root
      - MYSQL_PASSWORD=password
    restart: always

  webserver:
    container_name: tasks-webserver
    image: nginx:latest
    ports:
      - "8080:80"
      - "443:443"
    volumes:
      - .:/app
      - ./provision/nginx/:/etc/nginx/conf.d/
    depends_on:
      - php
    restart: always

  php:
    container_name: tasks-php
    build:
      context: .
      dockerfile: provision/php.docker
    depends_on:
      - db
    restart: always
    env_file:
      - .env

volumes:
  dbdata:
    driver: local

provision/db.docker

FROM php:7.3-fpm

# Add dependencies
RUN apt-get update -y && apt-get install -y openssl libpng-dev libxml2-dev curl cron git libzip-dev zip unzip

# Install php extensions
RUN docker-php-ext-install pdo mbstring gd xml pdo_mysql zip

# Install composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

COPY . /app/

WORKDIR /app

RUN chown -R $USER:www-data /app/storage
RUN chown -R $USER:www-data /app/bootstrap/cache

RUN chmod -R 775 /app/storage
RUN chmod -R 775 /app/bootstrap/cache

# Install composer dependencies
RUN composer install

RUN php artisan optimize

#RUN php artisan migrate --seed

RUN crontab -l | { cat; echo "* * * * * php /app/artisan schedule:run >> /dev/null 2>&1"; } | crontab -

STOPSIGNAL SIGTERM

CMD ["php-fpm"]

db.docker

FROM mariadb:latest

CMD ["mysqld", "--user=mysql"]

我遇到了这个错误:

Step 13/16 : RUN php artisan migrate --no-interaction --seed
 ---> Running in ccbfcde9324d

   Illuminate\Database\QueryException  : SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Temporary failure in name resolution (SQL: select * from information_schema.tables where table_schema = tasks and table_name = migrations and table_type = 'BASE TABLE')

  at /app/vendor/laravel/framework/src/Illuminate/Database/Connection.php:664
    660|         // If an exception occurs when attempting to run a query, we'll format the error
    661|         // message to include the bindings with SQL, which will make this exception a
    662|         // lot more helpful to the developer instead of just the database's errors.
    663|         catch (Exception $e) {
  > 664|             throw new QueryException(
    665|                 $query, $this->prepareBindings($bindings), $e
    666|             );
    667|         }
    668|

  Exception trace:

  1   PDOException::("PDO::__construct(): php_network_getaddresses: getaddrinfo failed: Temporary failure in name resolution")
      /app/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70

  2   PDO::__construct("mysql:host=db;port=3306;dbname=tasks", "root", "password", [])
      /app/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70

  Please use the argument -v to see more details.
ERROR: Service 'php' failed to build: The command '/bin/sh -c php artisan migrate --no-interaction --seed' returned a non-zero code: 1

你不能在Dockerfile中访问其他服务,也不能在镜像构建时运行数据库迁移。(如果你销毁并重新创建数据库,但不重建镜像怎么办?)链接的问题有一个基于entrypoint的解决方案,应该可以解决这个问题。 - David Maze
1个回答

7

您缺少了

  links:
    - db

在你的php配置中。

无论如何,就像@David Maze所提到的那样,在Dockerfile中运行php artisan migrate不仅是一种不好的做法,而且它不起作用。

只有当您的容器启动时才应该运行该命令。想想看,php artisan migrate会修改另一个容器的数据,这并不能保证该容器在构建映像时正在运行。这与容器哲学相悖。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接