【问题标题】:Error installing laravel through composer in docker在 docker 中通过 composer 安装 laravel 时出错
【发布时间】:2019-08-19 07:38:43
【问题描述】:

我在通过 dockerfile 安装 laravel 时遇到问题。我正在使用 docker-compose 来拉取一个 dockerfile 我基本上有这个:

FROM php:7.3-apache-stretch

*some apt-get and install composer*

WORKDIR /var/www

RUN composer create-project --prefer-dist laravel/laravel app

CMD apachectl -D FOREGROUND

但是当我访问容器时,我会看到应该使用 composer 创建的文件,我发现它是空的,即使我已经看到在容器构建中执行了命令。

容器运行良好,甚至我也可以访问它……只有那些甚至没有出现的文件。

如果我在创建容器后手动运行 composer 命令,则会出现文件。

【问题讨论】:

标签: laravel docker docker-compose composer-php dockerfile


【解决方案1】:

在您的 Dockerfile 中,您使用了 WORKDIR /var/www,然后使用了 RUN composer create-project ...,这使得 composer 在 容器文件系统 上的 /var/www 下创建文件。

在您用于启动容器的 docker-compose.yml 文件中:

version: '3.7'

services:
  app:
    container_name: "app"
    build:
      context: ./docker
      dockerfile: Dockerfile-app
    ports:
      - "80"
      - "443"
    restart: always
    depends_on:
      - db
    volumes:
      - ".:/var/www"

您正在声明一个卷,该卷将安装在容器中的同一位置 /var/www

发生的情况是卷内容将取代容器文件系统中 /var/www 上的任何内容。

我建议您仔细阅读documentation regarding docker volumes,尤其是标题为Populate a volume using a container 的部分。


现在继续前进,问问自己为什么首先需要这本书。是否需要在运行时更改文件?

如果没有,只需在构建时添加文件:

FROM php:7.3-apache-stretch

*some apt-get and install composer*

WORKDIR /var/www

RUN composer create-project --prefer-dist laravel/laravel app
COPY . /var/www

CMD apachectl -D FOREGROUND

并删除/var/www 的卷。


编辑

借助 Docker 容器进行开发

在开发过程中,您更改了 docker 主机(假设是您的开发计算机)上的 php 文件,并且需要通过测试 docker 容器中的网络服务器提供的应用程序来经常测试结果。

每次需要测试应用时都必须重新构建 Docker 映像会很麻烦。解决方案是挂载一个卷,以便容器可以从您的开发计算机提供文件:

FROM php:7.3-apache-stretch

*some apt-get and install composer*

WORKDIR /var/www
CMD apachectl -D FOREGROUND

然后开始:

version: '3.7'

services:
  app:
    container_name: "app"
    build:
      context: ./docker
      dockerfile: Dockerfile-app
    ports:
      - "80"
      - "443"
    restart: always
    depends_on:
      - db
    volumes:
      - ".:/var/www"
...

当您需要在该容器中运行某些命令时,只需使用docker exec

docker-compose exec app composer create-project --prefer-dist laravel/laravel app

制作项目工件

由于您要部署的不是包含源代码和配置的 zip/tar 存档,而是 docker 映像,因此您需要构建将在部署时使用的 docker 映像。

用于生产的 Dockerfile

对于生产用途,您希望拥有一个 Docker 映像,它包含所有必需的文件,并且不需要任何 docker 卷,除了保存用户生成的数据(上传的文件、数据库文件等)

FROM php:7.3-apache-stretch

*some apt-get and install composer*

WORKDIR /var/www

COPY . /var/www

CMD apachectl -D FOREGROUND

请注意,此 Dockerfile 中没有 RUN composer create-project --prefer-dist laravel/laravel app。这是因为此命令用于初始化您的项目,这是一个开发时间任务,而不是部署时间任务。

您还需要一个地方来托管您的 docker 镜像(Docker registry)。您可以使用 official registry image 将自己的注册表部署为 Docker 容器,或使用公司提供的:

所以您需要构建一个 docker 镜像,然后将该镜像推送到您的注册表中。最佳实践是借助JenkinsGitlab CITravis CICircle CIGoogle Cloud Build 等持续集成工具自动执行这些任务...

您的 CI 作业将运行以下命令:

git clone <url of you git repo> my_app
cd my_app
git checkout <some git tag>
docker build -t <registry>/<my_app>:<version>
docker login <registry> --user=<registry user> --password=<registry password>
docker push <registry>/<my_app>:<version>

部署您的 Docker 映像

启动容器:

version: '3.7'

services:
  app:
    container_name: "app"
    image: <registry>/<my_app>:<version>
    ports:
      - "80"
      - "443"
    restart: always
    depends_on:
      - db
...

请注意,docker-compose 文件不会构建任何镜像。对于生产,最好参考已经构​​建的 docker 镜像(之前已在暂存环境中部署以进行验证)。

【讨论】:

  • 好吧……我明白了……我会看到最好的解决方案……关于音量,理由是我对文件的版本是通过主机完成的。有什么建议吗?
  • 您是在使用此 docker 映像进行开发还是在生产中运行您的应用程序?
  • 开发...但一个想法是在生产中毫无问题地玩...
  • 在这种情况下,我将使用 /var/www 上的卷,从 Dockerfile 中删除 RUN composer create-project --prefer-dist laravel/laravel appCOPY . /var/www。启动容器,然后运行docker exec &lt;container_name&gt; composer create-project --prefer-dist laravel/laravel app
  • 我已经根据使用 docker 进行生产的指南编辑了我的答案
猜你喜欢
  • 1970-01-01
  • 2021-08-04
  • 1970-01-01
  • 2017-07-13
  • 2019-08-03
  • 2016-07-04
  • 2021-01-06
  • 1970-01-01
  • 2014-12-01
相关资源
最近更新 更多