【发布时间】:2017-06-29 04:20:08
【问题描述】:
我有一个基于Thelia's 和Composer's 的非常简单的Dockerfile。我希望它进行尽可能多的设置,为此,我在容器内的PATH 中安装composer,然后尝试运行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 中声明的挂载是否要等到镜像完全构建好后才会生效?我是否需要明确地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
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:
...
编辑 1 - 在 COPYing 明确文件之后
我在VOLUME 和WORKDIR 指令之后添加了COPY . /var/www/html,并注意到一些奇怪的东西。现在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
所以我修改后的问题是:我如何从运行 docker-compose 的上下文中告诉 Docker 到 COPY? 我认为这是 docker-compose 的默认行为,那就是在过去的项目中它对我的工作方式...
【问题讨论】:
-
试用:
RUN /usr/local/bin/composer install -
要么是这样,要么你没有在 docker 范围内复制本地文件。您设置了工作目录,但我没有看到您在那里复制相关文件。
-
@k0pernikus,指定
composer的绝对路径会产生相同的错误。我添加了一条COPY指令并注意到一些奇怪的东西......请参阅编辑。
标签: docker docker-volume