使用 docker-compose 构建容器时出现“php_network_getaddresses: getaddrinfo failed: 名称解析暂时失败”错误

Ton*_*ala 9 php mysql dns laravel docker

当我运行时,我的 php 容器似乎无法解析数据库容器的主机“db” php artisan migrate,我想知道我是否在配置中设置了错误。

尝试弄乱 dockerfile 上的 dependent_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
Run Code Online (Sandbox Code Playgroud)

规定/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"]
Run Code Online (Sandbox Code Playgroud)

数据库docker

FROM mariadb:latest

CMD ["mysqld", "--user=mysql"]
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

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
Run Code Online (Sandbox Code Playgroud)

Leo*_*ssi 8

You are missing

  links:
    - db
Run Code Online (Sandbox Code Playgroud)

in your php configuration.

Anyway as @David Maze mentioned, running php artisan migrate in a Dockerfile is not only a bad practice, but it will not work.

You should run that command only when your containers are started. Think about it, php artisan migrate will modify another container's data, which is not guaranteed it is running at the time the image is being built. That is against the container philosophy.