我似乎无法在Dockerfile中运行composer install,但是在构建映像并运行容器后我可以在容器中运行。
这是来自Dockerfile的命令:
RUN composer require drupal/video_embed_field:1.5
RUN composer install --no-autoloader --no-scripts --no-progress
输出结果为:
Loading composer repositories with package information
Installing dependencies (including require-dev) from lock file
Nothing to install or update
但在使用docker-compose运行容器之后:
...
drupal:
image: docker_image
container_name: container
ports:
- 8081:80
volumes:
- ./container/modules:/var/www/html/web/modules
links:
# Link the DB container:
- db
运行docker exec composer install将正确安装软件包:
Loading composer repositories with package information
Installing dependencies (including require-dev) from lock file
Package operations: 1 installs, 0 updates, 0 removals
...
Generating autoload files
我假设composer.json和composer.lock文件是正确的,因为我可以在容器中运行composer install命令而不需要任何进一步的努力,但只有在容器运行之后。
更新 尝试将作曲家命令与:
结合起来RUN composer require drupal/video_embed_field:1.5 && composer install
同样的问题,“无需安装或更新”。最后,我想继续在Dockerfile中使用单独的RUN语句来利用docker缓存。
答案 0 :(得分:3)
你的问题来自这样一个事实:docker-compose
是为了协调多个docker容器构建并同时运行而且它在某种程度上并没有真正显示它对于以docker开头的人们在幕后的作用
在docker-compose up
后面有四个步骤:
docker-compose build
如果需要,如果还没有现有图片,请创建图像docker-compose create
如果需要,如果还没有容器存在,请创建容器docker-compose start
启动现有容器docker-compose logs
记录容器的stderr和stdout 所以你必须在那里看到的是,包含在你身上的动作Dockerfile
是在图像创建步骤中执行的。
在容器步骤开始时执行安装文件夹。
因此,当您尝试使用RUN
命令(图像创建步骤的一部分),在composer.lock
和composer.json
等文件上安装启动步骤时,您最终无所事事通过composer安装,因为你的文件还没有安装在任何地方。
如果您执行了COPY
那些可能实际上让您到达某处的文件,因为您将把作曲家文件作为图像的一部分。
这就是说,小心安装的源文件夹将完全覆盖安装点,这样你最终可能会期望一个供应商文件夹而没有它。
理想情况下,您应该将其作为ENTRYPOINT
,这是在容器启动的最后一步发生的。
这是一个小小的开发比较:一个docker镜像是一个docker容器,类是一个类的实例 - 一个对象。
您的容器都是根据可能很久以前构建的图像创建的
Dockerfile
中的大多数步骤都是在创建图像时发生的,而不是在容器启动时发生的
虽然docker-compose的大部分指令都是针对容器构建的自动化,包括文件夹的安装。
答案 1 :(得分:0)
当卷安装覆盖容器内的composer文件时,只需注意一种docker-compose.yml
方法即可解决此问题:
docker-compose.yml
environment:
PROJECT_DIR: /var/www/html
volumes:
- ./php/docker/entrypoint/90-composer-install.sh:/docker-entrypoint-init.d/90-composer-install.sh
composer-install.sh
#!/usr/bin/env bash
cd ${PROJECT_DIR}
composer install
这将在构建后使用docker-entrypoint-init.d
shell脚本运行composer安装