为什么 composer 在我的 Docker 容器中找不到 composer.json 文件?

aco*_*ter 7 docker docker-volume

我有一个基于TheliaComposer 的非常简单的 Dockerfile 。我想要它做的尽可能多的设置成为可能,所以为此,我安装composerPATH容器内,然后尝试运行composer install。但是,此时,容器中似乎还不存在我的本地/挂载文件(请参阅RUN echo pwd: ...下面的输出)。

构建失败并显示以下错误消息:

Composer 在 /var/www/html 中找不到 composer.json 文件

要初始化项目,请按照https://getcomposer.org/ “入门”部分中的说明创建 composer.json 文件

错误:服务“web”无法构建:命令“/bin/sh -c composer install”返回非零代码:1

请注意,在没有RUN composer install指令的情况下构建然后运行是docker-compose exec web composer install有效的。

docker-compose.yml 中声明的 mount 是否在镜像完全构建后生效?我是否需要明确地显示COPY我的本地文件,以便它们在构建过程中可见?

Dockerfile:

FROM php:5.6-apache
COPY docker-php-pecl-install /usr/local/bin/

RUN apt-get update && apt-get install -y \
 libfreetype6-dev \
 libjpeg62-turbo-dev \
 libmcrypt-dev \
 libpng12-dev \
 libicu-dev \
 git \
 zip \
 libzip-dev \
    && docker-php-ext-install intl pdo_mysql mcrypt mbstring zip calendar \
    && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
    && docker-php-ext-install gd \
    && docker-php-pecl-install xdebug-2.3.3

RUN a2enmod rewrite
RUN usermod -u 1000 www-data
COPY config/php.ini /usr/local/etc/php/
COPY config/vhost/vhost.conf /etc/apache2/sites-enabled/

# Expose webroot
VOLUME /var/www/html
WORKDIR /var/www/html
COPY . /var/www/html # Added at Edit 1

# Allow Composer to be run as root
ENV COMPOSER_ALLOW_SUPERUSER 1

# Setup the Composer installer
RUN curl -o /tmp/composer-setup.php https://getcomposer.org/installer \
  && curl -o /tmp/composer-setup.sig https://composer.github.io/installer.sig \
  && php -r "if (hash('SHA384', file_get_contents('/tmp/composer-setup.php')) !== trim(file_get_contents('/tmp/composer-setup.sig'))) { unlink('/tmp/composer-setup.php'); echo 'Invalid installer' . PHP_EOL; exit(1); }" \
  && php /tmp/composer-setup.php \
  && chmod a+x composer.phar \
  && mv composer.phar /usr/local/bin/composer

# Install composer dependencies
RUN echo pwd: `pwd` && echo ls: `ls`  # outputs:
                                      # pwd: /var/www/html
                                      # ls:
RUN composer install
Run Code Online (Sandbox Code Playgroud)

docker-compose.yml:

web:
  build: ./docker/php
  ports:
    - "8002:80"
  links:
    - mariaDB
  environment:
    SYMFONY_ENV: dev
  command: /usr/sbin/apache2ctl -D FOREGROUND
  volumes:
    - .:/var/www/html

mariaDB:
   ...
Run Code Online (Sandbox Code Playgroud)

编辑 1 - 在COPY显式 ing 文件之后

COPY . /var/www/htmlVOLUMEWORKDIR说明之后添加了一个,并注意到一些奇怪的东西。现在RUN pwd: ...指令回显:

密码:/var/www/html

ls: Dockerfile 配置 docker-php-pecl-install

这是我的 docker/php 目录的内容,不是项目根目录!

完整(ish)目录结构:

.
??? LICENSE.txt
??? Readme.md
??? Thelia
??? bin
?   ??? ...
??? bootstrap.php
??? cache
?   ??? ...
??? change-version.sh
??? composer.json
??? composer.lock
??? docker
?   ??? php
?       ??? Dockerfile
?       ??? config
?       ??? docker-php-pecl-install
??? docker-compose.yml
??? lib
?   ??? Thelia
?       ??? Project
??? local
?   ??? ...
??? log
??? templates
?   ??? ...
??? vendor
?   ??? ...
??? web
    ??? favicon.ico
    ??? index.php
    ??? index_dev.php
    ??? robots.txt
Run Code Online (Sandbox Code Playgroud)

所以我修改后的问题是:我如何COPY从我运行的上下文中告诉 Docker docker-compose我认为这是 的默认行为docker-compose,这就是它在过去项目中为我工作的方式......

k0p*_*kus 6

您可以使用以下命令定义 docker-compose 1.7 文件:

web:
  build: ./docker/php
Run Code Online (Sandbox Code Playgroud)

这基本上导致:

docker build -f ./docker/php/Dockerfile ./docker/php/
Run Code Online (Sandbox Code Playgroud)

所以基本上构建路径构建过程的上下文。

如果您确实想定义上下文,则必须将 docker-compose 定义至少升级到v2 或 v3

在那里你应该能够做到:

version: '2'
services:
  web:
    build:
      context: ./
      dockerfile: ./docker/php/Dockerfile
Run Code Online (Sandbox Code Playgroud)

我建议不要这样做:

  • 每当编辑该 Dockerfile 时,您总是必须记住父文件夹的上下文结构,这将很难维护
  • 随着上下文变得越来越大,您将通过向容器构建的上下文发送大量数据来减慢构建过程。文件.dockerignore会有所帮助,但您必须将其用作白名单而不是黑名单。

如果你想构建多个 php 容器,它们都与你的docker-php-pecl-install文件安装依赖项,我建议你不要注入上帝上下文,而是从它自己的 Dockerfile 创建一个基本 php 镜像,然后在其他容器中引用它Dockerfile 作为FROM源。该基础镜像可以是一个不相关的项目,您所需要做的就是构建一个镜像,并在其他不同的 php 项目中重用。

如果您想在整个公司中重用该映像,那么设置一个私有 docker 注册表会很有帮助,您和您的团队可以从中推送和拉取映像。