Я новичок в докере, я пытаюсь автоматически выполнить установку композитора в моем файле Docker, но мне кажется, что я не могу войти в свое приложение во время установки, что не так? Или, может быть, есть другой способ лучше?
мой 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.json. это там. но ваша ошибка заключается в том, что он не может cd в / application / app, и поскольку ваш WORKDIR - / application, он возвращается в этот каталог, и поэтому, если вы посмотрите на свою ошибку, он говорит, что не может найти composer.json в / application /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
Я уже пробовал это решение, но кажется, что файлы не были найдены до его запуска.
Возможный дубликат Как смонтировать хост-тома в Docker-контейнеры в Dockerfile во время сборки
Директивы «volume» в файле docker-compose.yml не влияют на сборку образа; вам необходимо скопировать код вашего приложения. (В этот момент установка тома поверх него является излишней, если вы не возражаете против рабочего процесса, когда вам нужно тестировать-сборку-запускать после внесения изменений.)
Может быть, есть способ запустить какую-нибудь команду или скрипт, когда он будет запущен?






Ссылаясь на Документация для Dockerfiles, вам нужно отредактировать свой Dockerfile.
должен быть:
WORKDIR /application/app
RUN composer install
Решает ли это вашу проблему?
Шаг 6/6: RUN composer install ---> Запуск в 9821f69e3ce0 Composer не может найти файл composer.json в / application / app Но есть файл composer.json
Вы не должны запускать установку композитора в Dockerfile. Это не удастся, потому что вы еще не создали / синхронизировали том из локального в контейнер. Таким образом, все файлы, включая composer.json, не помещаются в / var / www / html.
Что вы можете сделать, так это добавить 1 строку (команду) в файл docker-compose.yaml внутри службы, например.
services:
api-php-fpm:
build: ./docker/php-fpm
command: sh -c "composer install"
Это связано с тем, что тома не монтируются до завершения сборки. Просто используйте COPY, чтобы скопировать Только composer.json в папку и запустить установку композитора как обычно.
на этот раз опустите часть «установка композитора» и войдите в контейнер (после того, как он будет запущен и запустится), и попытайтесь вручную выполнить установку композитора внутри контейнера.