Когда лень входить в терминал контейнера, а выполнить какие-то действия в нём нужно, то можно воспользоваться лайфхаком и запустить команду через вызов 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"