通过docker中的composer安装laravel时出错

时间:2019-03-28 13:46:09

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

我在通过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命令,则会显示文件。

1 个答案:

答案 0 :(得分:0)

在Dockerfile中,您使用了WORKDIR /var/www,然后使用了RUN composer create-project ...,这使作曲家可以在容器文件系统上的/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映像(该映像已早些部署在登台环境中进行验证)。