#laravel #docker #docker-compose
#laravel #docker #docker-compose
Вопрос:
Настройка:
Я использую docker-compose для создания набора контейнеров, похожих на среду Laravel Homestead, конечно, адаптируя ее к своим потребностям. Итак, у меня есть следующие контейнеры:
- nginx
- php_fpm
- php_queue
- приложение [контейнер данных]
- mysql
- сокеты [контейнер nodejs, который запускает сервер websocket]
- redis
[Я опубликую docker-compose.yml ниже]
Проблема:
Как вы можете видеть, у меня здесь довольно много контейнеров, которые взаимодействуют друг с другом, и иногда мне нужно запускать команды в них. Например, иногда мне нужно запускать php artisan ...
команды в php_queue
контейнере или gulp
в контейнере nodejs.
Итак, что я делаю сейчас, docker exec
в каждом из этих контейнеров, а затем запускаю необходимые команды. Но это очень раздражает, поскольку мне приходится постоянно переключаться между контейнерами PHP и JS, и их легко перепутать.
Вопрос:
Возможно ли получить доступ к необходимым скриптам ( gulp
, php artisan
, npm
, composer
и т.д.) Из одного места, будь то хост-машина или другой контейнер?
Возможное решение:
Я подумал о добавлении другого контейнера, в котором будут установлены все движки (PHP и nodejs), чтобы я мог использовать SSH или docker exec
в этом контейнере и запускать все необходимое. Если это единственно возможное решение, оно тоже звучит неплохо, но я хотел бы изучить варианты.
Файлы:
docker-compose.yml
version: '2'
services:
nginx:
build: ./nginx/
ports:
- 80:80
- 443:443
depends_on:
- php_fpm
- sockets
links:
- php_fpm
- sockets
volumes_from:
- app
php_fpm:
build:
context: ./php/
expose:
- 9000
links:
- mysql
- redis
volumes_from:
- app
php_queue:
build:
context: ./php/
links:
- mysql
- redis
volumes_from:
- app
command: "php /var/www/koodzo/artisan queue:work --daemon"
app:
image: php:7.0-fpm
volumes:
- ../Sources:/var/www/koodzo
command: "true"
mysql:
image: mysql:5.7
ports:
- 3306:3306
volumes:
- ../Database:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: koodzo
MYSQL_USER: homestead
MYSQL_PASSWORD: secret
sockets:
build: ./sockets
expose:
- 6001
volumes_from:
- app
command: "node /var/www/koodzo/sockets/server.js"
redis:
image: redis:3.2
expose:
- 6379
Ответ №1:
Вы знаете, что вы можете использовать exec для фактического выполнения команд? Таким образом, вы можете просто назвать разные контейнеры в своем docker-compose.yml, а затем запустить скрипт, который использует docker exec для выполнения всех команд по имени контейнера.
Комментарии:
1. Это также хороший способ сделать это, лучше, чем иметь главный контейнер. Но мой вопрос был больше о встроенных способах упрощения этой задачи в docker. В любом случае спасибо 🙂
2. Обратите внимание, что то, что вы хотите сделать, на самом деле немного противоречит философии docker. Способ достижения вашей цели в docker — это перестраивать образ каждый раз, когда он меняется (скажем, при изменении файла gulp или package.json). Выполнение команд в запущенном контейнере подходит для экспериментов, но не является хорошей практикой при попытке разработки процессов контейнера. Следовательно, способом docker было бы каждый раз запускать перестроение образа, запуская команды, которые вы хотите выполнить в dockerfile
3. Я понимаю, что вы имеете в виду. Однако мои node_modules и каталог поставщиков Composer не находятся внутри контейнера, поэтому на самом деле не влияют на его состояние, поэтому не похоже, что бизнес влияет на сборку контейнера.
4. Я воспользовался вашим предложением для создания скрипта, который запускает необходимые скрипты с помощью docker exec, он работает довольно хорошо 🙂
5. Я видел, что эти файлы находятся в томе приложения. Это по-прежнему не меняет дело — изменение этих файлов, очевидно, изменяет поток вашего кода, и по этой причине требует перестройки образа. Чтобы прояснить мой случай, представьте изменение в одном из этих файлов с синтаксической ошибкой, которое приведет к ошибкам при выполнении команды и, возможно, может привести к сбою процесса, запущенного контейнером. Учитывайте это при создании своей архитектуры. В любом случае, рад, что это помогло вам. Удачного.