我在通过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
的音量。
编辑
在开发过程中,您更改了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
由于您要部署的不是包含源代码和配置的zip / tar存档,而是包含docker镜像,因此您需要构建将在部署时使用的docker镜像。
对于生产用途,您希望拥有一个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镜像,然后将该图像推送到您的注册表中。最佳实践是在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>
启动容器:
version: '3.7'
services:
app:
container_name: "app"
image: <registry>/<my_app>:<version>
ports:
- "80"
- "443"
restart: always
depends_on:
- db
...
请注意,docker-compose文件不会构建任何图像。对于生产,更好的做法是引用已经构建的docker镜像(之前已在暂存环境中部署以进行验证)。