【发布时间】: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 失败的原因:
- 生成应用密钥?
- 迁移?
这是我的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