通过Docker运行PHP迁移

5hcedyr0  于 2023-10-16  发布在  Docker
关注(0)|答案(2)|浏览(181)

我尝试在docker compose上运行php artisan migrate,但在我的mysql容器中出现此错误:

  1. sh: php: command not found

docker-compose.yml

  1. version: "3"
  2. services:
  3. # Application & web server
  4. app:
  5. build:
  6. context: .
  7. working_dir: /var/www
  8. volumes:
  9. - ./:/var/www
  10. depends_on:
  11. - "mysql"
  12. ports:
  13. - 8001:80
  14. mysql:
  15. image: mysql:latest
  16. volumes:
  17. - dbdata:/var/lib/mysql
  18. environment:
  19. MYSQL_DATABASE: ${DB_DATABASE}
  20. MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
  21. MYSQL_PASSWORD: ${DB_PASSWORD}
  22. ports:
  23. - 3306:3306
  24. entrypoint: sh -c "sleep 30 && php artisan migrate"
  25. phpmyadmin:
  26. image: phpmyadmin:latest
  27. ports:
  28. - 9001:80
  29. environment:
  30. - PMA_ARBITRARY=1
  31. #Docker Networks
  32. networks:
  33. app-network:
  34. driver: bridge
  35. #Volumes
  36. volumes:
  37. dbdata:
  38. driver: local

Docker文件

  1. FROM php:8.0-apache
  2. RUN apt-get update && apt-get install -y \
  3. libfreetype6-dev \
  4. libjpeg-dev \
  5. libpng-dev \
  6. libwebp-dev \
  7. --no-install-recommends \
  8. && docker-php-ext-enable opcache \
  9. && docker-php-ext-configure gd --with-freetype --with-jpeg \
  10. && docker-php-ext-install pdo_mysql -j$(nproc) gd \
  11. && apt-get autoclean -y \
  12. && rm -rf /var/lib/apt/lists/*
  13. # Update apache conf to point to application public directory
  14. ENV APACHE_DOCUMENT_ROOT=/var/www/public
  15. RUN sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf
  16. RUN sed -ri -e 's!/var/www/!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf
  17. # Update uploads config
  18. RUN echo "file_uploads = On\n" \
  19. "memory_limit = 1024M\n" \
  20. "upload_max_filesize = 512M\n" \
  21. "post_max_size = 512M\n" \
  22. "max_execution_time = 1200\n" \
  23. > /usr/local/etc/php/conf.d/uploads.ini
  24. # Enable headers module
  25. RUN a2enmod rewrite headers
tag5nh1u

tag5nh1u1#

mysql映像只包含数据库。entrypoint:设置说“运行这个命令而不是容器正常运行的命令,甚至忽略它的默认设置”。由于您已经将entrypoint:附加到database:,因此您尝试运行php artisan migrate而不是运行MySQL,并且您在仅数据库映像中运行它。
迁移步骤需要附加到应用程序容器,而不是数据库容器。我倾向于将其编写为一个 * 入口点 Package 器脚本 *,一个编译到镜像中的脚本,它作为镜像的默认ENTRYPOINT运行,但接受普通的CMD作为实际的主容器进程。最简单的形式如下

  1. #!/bin/sh
  2. # entrypoint.sh
  3. # run migrations
  4. php artisan migrate
  5. # run the main container `CMD` (or an execution-time override)
  6. exec "$@"

这里的一个复杂之处在于,在Dockerfile中设置ENTRYPOINT也会重置CMD,而php:apache图像带有默认的CMD。如果你看一下Docker Hub php image page,然后点击“Dockerfile链接”页面,你可以找到官方的Dockerfile for php:8.0-apache。如果您查看该文件的结尾,它同时具有ENTRYPOINTCMD,因此您需要在设置中复制这两个文件。

  1. #!/bin/sh
  2. # entrypoint.sh
  3. ...
  4. # run the main container CMD, via the original ENTRYPOINT
  5. exec docker-php-entrypoint "$@"
  6. # ^^^^^^^^^^^^^^^^^^^^^
  7. # this is the base image's ENTRYPOINT
  1. # Dockerfile
  2. ...
  3. WORKDIR /var/www
  4. # copy the application source and supporting scripts into the image
  5. COPY ./ ./
  6. # set the entrypoint to our wrapper script, and repeat the base
  7. # image's command
  8. ENTRYPOINT ["./entrypoint.sh"]
  9. CMD ["apache2-foreground"]
  10. # ^^^^^^^^^^^^^^^^^^^^^^
  11. # this is the base image's CMD

现在,在Compose设置中,您不需要为这些容器中的任何一个设置command:entrypoint:,也不需要将应用程序代码装入容器;所有这些细节都已经设置在图像中。

  1. version: "3.8"
  2. services:
  3. app:
  4. build: .
  5. depends_on:
  6. - mysql
  7. ports:
  8. - 8001:80
  9. # no working_dir: or volumes:
  10. mysql:
  11. image: mysql:latest
  12. volumes:
  13. - dbdata:/var/lib/mysql
  14. environment:
  15. MYSQL_DATABASE: ${DB_DATABASE}
  16. MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
  17. MYSQL_PASSWORD: ${DB_PASSWORD}
  18. ports:
  19. - 3306:3306
  20. # no entrypoint:
  21. volumes:
  22. dbdata:
  23. # empty
  24. # no need for top-level networks: in most applications
展开查看全部
l2osamch

l2osamch2#

您的mysql容器没有安装PHP。您需要在“app”容器中运行该命令。

相关问题