首页 文章

在Dockerfile中运行时,Composer安装不会安装软件包

提问于
浏览
2

我似乎无法在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命令而不需要任何进一步的努力,但只有在容器运行之后 .

Update 尝试将composer命令与:

RUN composer require drupal/video_embed_field:1.5 && composer install

同样的问题,“无需安装或更新” . 最后,我想继续在Dockerfile中使用单独的RUN语句来利用docker缓存 .

1 回答

  • 2

    你的问题来自这样一个事实: docker-compose 是为了编排多个docker容器构建并同时运行,并且它在某种程度上并没有真正显示它对于以docker开头的人所做的幕后操作 .

    docker-compose up 背后有四个步骤:

    • docker-compose build 如果需要,如果还没有现有图像,请创建图像

    • docker-compose create 如果需要,如果还没有容器存在,请创建容器

    • docker-compose start 启动现有容器

    • docker-compose logs 记录容器的stderr和stdout

    所以你必须在那里看到的是,包含在你身上的动作 Dockerfile 是在图像创建步骤中执行的 .
    在容器步骤开始时执行安装文件夹 .

    因此,当您尝试使用 RUN 命令(图像创建步骤的一部分),在启动步骤中安装的文件(如 composer.lockcomposer.json )时,您最终无法通过编写器安装任何内容,因为您的文件尚未安装在任何位置 .

    如果您执行的某些文件实际上可能会让您到达某个地方,那么您将使用作曲家文件作为图像的一部分 .

    这就是说,要小心安装的源文件夹将完全覆盖安装点,这样你最终可能会期望一个供应商文件夹而不是它 .
    理想情况下应该将它作为 ENTRYPOINT ,这个在容器启动的最后一步发生 .

    这是一个小小的开发比较:一个docker镜像是一个docker容器,类是一个类的实例 - 一个对象 .
    您的容器都是根据可能很久以前构建的图像创建的 .
    Dockerfile 中的大多数步骤都是在创建映像时发生的,而不是在容器引导时发生的 .
    虽然docker-compose的大部分指令都是针对容器构建的自动化,包括文件夹的安装 .

相关问题