Как в docker-compose выполнить комманду с пайпами и перенаправлением вывода

Когда лень входить в терминал контейнера, а выполнить какие-то действия в нём нужно, то можно воспользоваться лайфхаком и запустить команду через вызов docker-compose exec:

docker-compose exec -u appuser appcontainer command args --options=values

Однако, если логика вашей команды подразумевает конвейерную обработку или запись вывода команды в файл внутри контейнера, то подобные команды будут выдавать ошибки:

docker-compose exec appcontainer echo 'something' | worker

Выведет:

bash: php: command not found

Потому что pipe будет относиться не к команде внутри контейнера, а к хостовой консоли, в которой данной команды может не быть. Или ещё один случай:

docker-compose exec appcontainer echo 'something' > /data/logs/test.log

Выведет:

bash: /data/logs/test.log: No such file or directory

По той же причине, bash воспримет символ > в контексте хостовой командной строки, а не команды внутри контейнера.

Существует как минимум один work around для подобных ситуаций. Достаточно обернуть всё что нужно выполнить внутри терминала docker-контейнера в bash -c «commands»:

docker-compose exec appcontainer bash -c "echo 'phpinfo()' | php"