Довольно необычно знать внутренний IP-адрес контейнера в Docker. Docker предоставляет внутреннюю службу DNS, в которой имя каждого блока Docker Compose преобразуется в этот IP-адрес; Вы можете использовать имена блоков, такие как php-fpm
или postgresql
, в качестве имен хостов как обычно (без блока links:
; я бы рекомендовал удалить его по общему принципу).
Когда Docker запускается, если у контейнера есть точка входа, он запускает точку входа (только), передавая команду (если есть) в качестве аргументов командной строки. Поэтому очень типичный путь, если вам нужно выполнить первоначальную настройку, подобную этой, - это написать точку входа в виде сценария оболочки, который устанавливает переменные среды, а затем запускает указанную команду. В вашем случае этот скрипт может выглядеть как
#!/bin/sh
export ALLOWED_ID=$(ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1')
exec "$@"
(Предполагается, что ifconfig
установлен в вашем контейнере; он обычно присутствует, особенно на изображениях на основе Debian / Ubuntu, но редко используется).
В вашем Dockerfile там же вы копируете в коде приложения, а также копируете в этом сценарии точки входа и устанавливаете его как точку входа изображения по умолчанию (соблюдая осторожность при использовании формы в квадратных скобках).
...
COPY . /var/www/html
COPY entrypoint.sh /
ENTRYPOINT ["/entrypoint.sh"]
CMD ["php-fpm", "--allow-to-run-as-root"]
(Поскольку этот шаблон очень полезен, я рекомендую по умолчанию запускать процесс основного контейнера как CMD, чтобы вам не приходилось перепроектировать все, если вам нужно добавить оболочку ENTRYPOINT.)