我尝试在docker compose上运行php artisan migrate
,但在我的mysql容器中出现此错误:
sh: php: command not found
docker-compose.yml
version: "3"
services:
# Application & web server
app:
build:
context: .
working_dir: /var/www
volumes:
- ./:/var/www
depends_on:
- "mysql"
ports:
- 8001:80
mysql:
image: mysql:latest
volumes:
- dbdata:/var/lib/mysql
environment:
MYSQL_DATABASE: ${DB_DATABASE}
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
MYSQL_PASSWORD: ${DB_PASSWORD}
ports:
- 3306:3306
entrypoint: sh -c "sleep 30 && php artisan migrate"
phpmyadmin:
image: phpmyadmin:latest
ports:
- 9001:80
environment:
- PMA_ARBITRARY=1
#Docker Networks
networks:
app-network:
driver: bridge
#Volumes
volumes:
dbdata:
driver: local
Docker文件
FROM php:8.0-apache
RUN apt-get update && apt-get install -y \
libfreetype6-dev \
libjpeg-dev \
libpng-dev \
libwebp-dev \
--no-install-recommends \
&& docker-php-ext-enable opcache \
&& docker-php-ext-configure gd --with-freetype --with-jpeg \
&& docker-php-ext-install pdo_mysql -j$(nproc) gd \
&& apt-get autoclean -y \
&& rm -rf /var/lib/apt/lists/*
# Update apache conf to point to application public directory
ENV APACHE_DOCUMENT_ROOT=/var/www/public
RUN sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf
RUN sed -ri -e 's!/var/www/!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf
# Update uploads config
RUN echo "file_uploads = On\n" \
"memory_limit = 1024M\n" \
"upload_max_filesize = 512M\n" \
"post_max_size = 512M\n" \
"max_execution_time = 1200\n" \
> /usr/local/etc/php/conf.d/uploads.ini
# Enable headers module
RUN a2enmod rewrite headers
2条答案
按热度按时间tag5nh1u1#
mysql
映像只包含数据库。entrypoint:
设置说“运行这个命令而不是容器正常运行的命令,甚至忽略它的默认设置”。由于您已经将entrypoint:
附加到database:
,因此您尝试运行php artisan migrate
而不是运行MySQL,并且您在仅数据库映像中运行它。迁移步骤需要附加到应用程序容器,而不是数据库容器。我倾向于将其编写为一个 * 入口点 Package 器脚本 *,一个编译到镜像中的脚本,它作为镜像的默认
ENTRYPOINT
运行,但接受普通的CMD
作为实际的主容器进程。最简单的形式如下这里的一个复杂之处在于,在Dockerfile中设置
ENTRYPOINT
也会重置CMD
,而php:apache
图像带有默认的CMD
。如果你看一下Docker Hubphp
image page,然后点击“Dockerfile
链接”页面,你可以找到官方的Dockerfile forphp:8.0-apache
。如果您查看该文件的结尾,它同时具有ENTRYPOINT
和CMD
,因此您需要在设置中复制这两个文件。现在,在Compose设置中,您不需要为这些容器中的任何一个设置
command:
或entrypoint:
,也不需要将应用程序代码装入容器;所有这些细节都已经设置在图像中。l2osamch2#
您的mysql容器没有安装PHP。您需要在“app”容器中运行该命令。