在docker中通过composer安装laravel时出错
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在docker中通过composer安装laravel时出错相关的知识,希望对你有一定的参考价值。
我在通过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命令,则会显示文件。
在你的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容器,或使用公司提供的注册表:
- Gitlab.com - Gitlab Registry(免费)
- Docker.com - hub.docker.com(1张私有图片免费)
- Google.com - Google Container Registry
- ...
因此,您需要构建一个docker镜像,然后将该图像推送到您的注册表中。最佳实践是在Jenkins,Gitlab CI,Travis CI,Circle CI,Google 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镜像(之前已在暂存环境中部署以进行验证)。
以上是关于在docker中通过composer安装laravel时出错的主要内容,如果未能解决你的问题,请参考以下文章
Larave使用composer安装无反应,提示“Changed current directory to C:/Users/Administrator/AppData/Roaming/Compose
如何在TYPO3 V9中通过composer安装typo3 / cms-workspaces扩展