【问题标题】:Dockerfile does not build up as expected on `docker-compose up -d`Dockerfile 在 `docker-compose up -d` 上没有按预期构建
【发布时间】:2019-01-22 02:07:42
【问题描述】:

我有一个 PHP Laravel 项目。我是 Docker 新手。

我有一个从 php-apache 映像创建的 Dockerfile,它首先安装一些 php 包,php 作曲家,将所有文件从我的项目复制到 docker 映像 apache 文件夹和这里......如下所示(见Dockerfile)我有RUN composer install --optimize-autoloader --no-dev; \ ...,多行php artisan命令。由于某些未知原因,它们无法正常工作。

当我执行docker-compose up -d 时,php artisan key:generate --force(请参阅 Dockerfile)不会在 docker 映像中的 .env 文件中向 APP_KEY 添加值(我在之后使用 docker exec -it IMAGE_ID bash && cat .env 进行了检查)图像已构建并启动)。尽管它说 应用程序密钥设置成功

另外,php artisan migrate 无法迁移表,它说:

In Connection.php line 664:

  SQLSTATE[HY000] [2002] Connection refused (SQL: select * from information_s  
  chema.tables where table_schema = homestead and table_name = migrations)     


In Connector.php line 70:

  SQLSTATE[HY000] [2002] Connection refused

但是...在构建并启动映像后,我登录到它的 bash -> docker exec -it IMAGE_ID bash,然后我登录到 php artisan migrate,它成功迁移了所有表。太奇怪了。。

能否请您帮我弄清楚 Docker 失败的原因:

  1. 生成应用密钥?
  2. 迁移?

这是我的Dockerfile

FROM php:7.2-apache

RUN apt-get update; \
    apt-get install -y zlib1g-dev git zip unzip; \
    docker-php-ext-install zip pdo_mysql;

COPY --from=composer:1.7.3 /usr/bin/composer /usr/bin/composer

WORKDIR /var/www

COPY ./ ./
COPY .env.example .env
COPY apache-config.conf /etc/apache2/sites-available/000-default.conf

RUN composer install --optimize-autoloader --no-dev; \
    php artisan key:generate --force; \
    php artisan migrate; \
    php artisan db:seed; \
    php artisan cache:clear; \
    php artisan config:cache; \
    php artisan route:cache; \
    php artisan storage:link; \
    chown -R www-data:www-data /var/www;

CMD ["apache2ctl", "-D" , "FOREGROUND"]

我的apache-config.conf

ServerName localhost

<VirtualHost *:80>
  ServerAdmin beqalomadze@gmail.com
  ServerName localhost
  DocumentRoot /var/www/public

  <Directory /var/www/public>
      Options Indexes FollowSymLinks MultiViews
      AllowOverride All
      Order deny,allow
      Allow from all
  </Directory>

  ErrorLog ${APACHE_LOG_DIR}/error.log
  CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

我的docker-compose.yml

version: '3'

services:
  mysql:
    image: mysql:5.7
    environment:
      MYSQL_DATABASE: posts
      MYSQL_ROOT_PASSWORD: root
    volumes:
      - "./data/mysql:/var/lib/mysql"

  app:
    depends_on:
      - mysql
    build:
      context: ./
      dockerfile: Dockerfile
    volumes:
      - "./data/storage-app:/var/www/storage/app"
    ports:
      - 3030:80

我的.env.example

...
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=posts
DB_USERNAME=root
DB_PASSWORD=root
...

【问题讨论】:

  • 您是否更改了 ENV 变量 DB_HOST 并将其设置为 mysql
  • @SimoneCabrino,是的,请再次查看我的问题的结尾,我刚刚更新了它。
  • “构建”步骤与 Docker Compose 序列的其余部分分开进行。在 Dockerfile 中根本没有数据库,尝试在那里运行数据库迁移是行不通的。
  • @DavidMaze,哇,真有趣 :) 在这种情况下有什么好的解决方案?那我应该把那个 php artisan 命令放在哪里呢?

标签: php apache docker docker-compose dockerfile


【解决方案1】:

您可以尝试在您的 MYSQL conf 中添加端口:

  mysql:
    image: mysql:5.7
    environment:
      MYSQL_DATABASE: posts
      MYSQL_ROOT_PASSWORD: root
    ports:
      - 3306:3306
    volumes:
      - "./data/mysql:/var/lib/mysql"

【讨论】:

  • 默认用户定义的桥接网络,默认由docker-compose创建,暴露网络内的所有端口。所以暴露端口不会在网络内部产生影响——只有当你需要从外部访问服务时
猜你喜欢
  • 1970-01-01
  • 2022-11-18
  • 2019-07-17
  • 1970-01-01
  • 2021-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-18
相关资源
最近更新 更多