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

问题描述 投票:0回答:1

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

laravel docker docker-compose composer-php dockerfile
1个回答
0
投票

在你的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的音量。


编辑

Developing with the help of a Docker container

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

每次需要测试应用程序时重建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

Producing project artifacts

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

Dockerfile for production

对于生产用途,您希望拥有一个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 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>

Deploying your Docker image

启动容器:

version: '3.7'

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

请注意,docker-compose文件不会构建任何图像。对于生产,更好的做法是引用已经构建的docker镜像(之前已在暂存环境中部署以进行验证)。

© www.soinside.com 2019 - 2024. All rights reserved.