【问题标题】:Composer install with dockerfile使用 dockerfile 安装 Composer
【发布时间】:2019-02-10 15:30:36
【问题描述】:

我对 docker 很陌生,我尝试在我的 Dockerfile 中自动执行 composer install 但似乎在安装时我无法 cd 进入我的应用程序,这是怎么回事?或者也许还有其他更好的方法来做到这一点?

我的 docker-compose.yml

version: "3.1"
services:

    app:
      image: nginx:alpine
      container_name: app
      working_dir: /application
      volumes:
          - ./Projects/app:/application/app
          - ./Docker/nginx/app.conf:/etc/nginx/conf.d/app.conf
      ports:
          - "8080:8080"

    php-fpm-app:
      build: Docker/php-fpm-app
      container_name: php-fpm-app
      working_dir: /application
      volumes:
          - ./Projects:/application
          - ./Docker/php-fpm-app/php-ini-overrides.ini:/etc/php/7.2/fpm/conf.d/99-overrides.ini

我的 Dockerfile

FROM phpdockerio/php72-fpm:latest
WORKDIR "/application"

# Fix debconf warnings upon build
ARG DEBIAN_FRONTEND=noninteractive

RUN mkdir -p /var/www/.composer \
    && chown -R www-data:www-data /var/www/.composer

USER www-data

RUN cd /application/app; composer install

我运行这个命令后的输出:

docker-compose up -d

Step 6/6 : RUN cd /application/app; composer install
 ---> Running in ac53e653af46
/bin/sh: 1: cd: can't cd to /application/app
Composer could not find a composer.json file in /application
To initialize a project, please create a composer.json file as described in the https://getcomposer.org/ "Getting Started" section
ERROR: Service 'php-fpm-app' failed to build: The command '/bin/sh -c cd /application/app; composer install' returned a non-zero code: 1

如果我尝试从我的 Dockerfile 中删除最后一行,一旦它启动并运行,如果我运行此命令:

docker-compose exec --user www-data php-fpm-app bash -c 'cd /application/app && composer install'

它有效,我不明白为什么我不能用我的 Dockerfile 做到这一点。

============================ 终于 我找到了一种执行脚本的方法,但我没有看到输出,所以如果脚本持续了很多秒/分钟,我不知道它什么时候完成。

ADD ./setup.sh /setup.sh
RUN chmod +x /setup.sh
CMD ["sh", "/setup.sh"]

我决定在它全部启动并运行后手动执行此脚本

sh ./setup.sh

【问题讨论】:

  • 省略一次“composer install”部分,登录容器(一旦启动并运行),手动尝试在容器内发出composer install。
  • 是的,如果我在它启动并运行后执行它就可以工作
  • 问题不在于 composer.json 的存在。它在那里。但是您的错误是它无法 cd 进入 /application/app,并且由于您的 WORKDIR 是 /application,它会退回到该目录,因此如果您查看错误,它会说它在 /application 中找不到 composer.json /bin/sh: 1: cd: can't cd to /application/app Composer could not find a composer.json file in /application
  • 而不是 WORKDIR /application,可以尝试将其设置为 /application/app,并删除 RUN cd /application/app 并执行 RUN composer install
  • 我已经尝试过这个解决方案,但它似乎在启动和运行之前没有找到文件

标签: php docker docker-compose composer-php dockerfile


【解决方案1】:

您不应该在 Dockerfile 中运行 composer install。它将失败,因为您尚未从本地创建/同步卷到容器。因此,包括 composer.json 在内的所有文件都不会放在 /var/www/html 下。

您可以做的是在服务内的 docker-compose.yaml 文件中添加 1 行(命令),例如。

services:
  api-php-fpm:
    build: ./docker/php-fpm
    command: sh -c "composer install"

【讨论】:

    【解决方案2】:

    这是因为在构建完成之前不会安装卷。只需使用 COPY 将 only composer.json 复制到文件夹中,然后正常运行 composer install。

    【讨论】:

      【解决方案3】:

      引用 Documentation for Dockerfiles 您需要编辑 Dockerfile。

      应该是:

      WORKDIR /application/app
      RUN composer install
      

      这能解决您的问题吗?

      【讨论】:

      • Step 6/6 : RUN composer install ---> Running in 9821f69e3ce0 Composer在/application/app中找不到composer.json文件但是有composer.json文件
      猜你喜欢
      • 2019-09-12
      • 2015-09-26
      • 2017-10-01
      • 2017-12-01
      • 2013-07-16
      • 2023-03-15
      • 2021-06-05
      • 2012-07-07
      • 2014-10-09
      相关资源
      最近更新 更多