推荐使用Docker上的Artisan

时间:2014-07-18 09:40:13

标签: php laravel laravel-4 docker

我还没有找到一种优雅而有效的方法来在基于Docker的本地开发环境中运行Laravel Artisan命令。

是否有人建议推荐或"正确"做迁移的方法吗?

或者,是否有人找到了这样做的简洁方法?理想情况下有示例或建议。

我考虑过的事情:

  • 一个新容器(与ssh共享相同的卷和数据库链接),仅用于运行命令(看起来很讨厌)。
  • 主管的黑客攻击最终会在现场直播(不理想)。
  • 编辑数据库配置,或尝试入侵主机"环境,因此至少可以从主机运行迁移等。
  • 创建Web前端来运行(非常讨厌)。
  • 尝试建立一个"信号"对于它来说。

我仍然围绕着Docker和它的新容器换一切方法。

我想我想要平衡很酷的开发操作,以及为什么我需要另一个假的服务器 - 只是让它正在工作 -

我很乐意为我的开发工作流承诺,但在某些情况下使用它似乎很尴尬,比如这个......

欢迎任何建议和想法。谢谢大家。

5 个答案:

答案 0 :(得分:10)

Docker 1.3带来了新命令 exec 所以现在你可以“输入”运行容器,如

docker exec -it my-container-name /bin/bash

之后,您可以运行任何您想要的命令

php artisan --version

答案 1 :(得分:9)

关于Docker的最佳实践是在其自己的容器中运行每个进程。因此,运行artisan命令的理想方法是创建一个专门用于创建容器的映像。

我创建了一个可以从Docker Hub dylanlindgren/docker-laravel-artisan中提取的图像,它运行得非常好。如果您想查看其背后的Dockerfile,它也在GitHub上。

我还写了一篇blog post来描述所有这些单独容器的组合方式。

答案 2 :(得分:1)

有几种可能性......

  1. 在容器中挂载主机目录作为Laravel应用程序所在的文件夹。这样您就可以从主机运行php artisan migratecomposer update。但是,您可能会遇到部署问题,因为您必须在服务器上复制环境的这一部分。

  2. 在您的容器中添加SSH服务器(不推荐使用; here's a good discussion of that)。

  3. 构建并使用nsenter,一种用于“输入”正在运行的容器并获取shell访问权限的工具。请注意,我还没有使用它,我刚刚通过上面链接中的引用找到了它。

  4. 如果您主要对部署感兴趣并且通过dockerfile进行部署,那么答案就是将composer installphp artisan migrate添加到dockerfile中,以便它们在构建容器时运行

    我有兴趣听到更多答案。这也是我刚刚进入的内容,并希望了解更多信息。

答案 3 :(得分:1)

我使用SSH并从容器内的终端运行迁移。

我个人喜欢Phusion's使用Docker作为'lightweight virtual machine'的方法。因此,我使用了我已扩展的baseimage-docker来创建自己的Docker image for Laravel applications

我知道Phusion的图像可能在Docker社区中引起争议,而SSH is frowned upon则是一些主张Docker容器作为微服务的人。但是,在为多容器方法提供更多既定工具和实践之前,我对Phusion的方法感到满意。

答案 4 :(得分:0)

我正在设法为Laravel项目创建Docker映像,这是我到目前为止的工作。

FROM base_image_with_LAMP_stack_and_dependencies

WORKDIR /var/www/html/app

COPY composer.json composer.json

RUN composer install --no-scripts --no-dev --no-autoloader

COPY . .

RUN echo 'chown -R www-data:www-data /var/www/ \
&& composer dump-autoload \
&& cp .env.example .env \
&& php artisan key:generate \
&& php artisan migrate \
&& apachectl -D FOREGROUND' >> /root/container_init.sh && \
 chmod 755 /root/container_init.sh

EXPOSE 80

CMD /root/container_init.sh

这样,在构建期间就不会依赖数据库,并且每次启动新容器时都可以运行迁移过程。