У меня есть довольно простой Dockerfile, основанный на Thelia's и Композитор. Я хочу, чтобы он выполнил как можно больше настроек, поэтому я устанавливаю composer
в PATH
внутри контейнера, а затем пытаюсь запустить composer install
. Однако в этот момент кажется, что мои локальные / смонтированные файлы еще не существуют в контейнере (см. Вывод RUN echo pwd: ...
ниже).
Сбой сборки с этим сообщением об ошибке:
Композитор не смог найти файл composer.json в / var / www / html
Чтобы инициализировать проект, создайте файл composer.json, как описано в https://getcomposer.org/ Начало работы раздел
ОШИБКА: не удалось создать службу 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 - после COPY
ing файлов явно
Я добавил COPY . /var/www/html
после инструкций VOLUME
и WORKDIR
и заметил кое-что странное. Теперь команда RUN pwd: ...
отзывается эхом:
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 COPY
из контекста, в котором я запускаю docker-compose
? Я думал, что это поведение по умолчанию для docker-compose
, и именно так оно работало для меня в прошлых проектах. ..
RUN /usr/local/bin/composer install
- person k0pernikus   schedule 10.02.2017composer
дает ту же ошибку. Я добавилCOPY
инструкцию и заметил кое-что странное ... см. Edit. - person acobster   schedule 10.02.2017