我在通过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命令,则会显示文件。
答案 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主机(假设是您的开发计算机)上的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映像。
对于生产用途,您想要一个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映像,然后将该映像推送到注册表中。最佳实践是借助诸如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映像(该映像已早些部署在登台环境中进行验证)。