Как я могу установить переменную env со значением из выражения в docker-compose после запуска контейнера - PullRequest
0 голосов
/ 11 января 2019

У меня есть docker-compose.yml, как это:

version: '3'
services:
  php-fpm:
    command: php-fpm --allow-to-run-as-root
    restart: always
    links:
      - postgresql
    build: ./php
    ports:
      - '9090:9000'
    volumes:
      - ../../:/var/www/html/
      - ./php/config/php.ini:/usr/local/etc/php/php.ini
    networks:
      - backend

И я хочу установить переменную окружения с ip контейнера php-fpm в тот же контейнер. Например, если я позвоню

docker exec -it php-fpm /bin/sh export ALLOWED_ID 

Я вижу свой динамический IP-адрес контейнера 172.21.0.4 (например)

Я пытался добавить в Dockerfile этот код:

RUN 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')

Но это не работает, когда я вхожу в контейнер.

Я попытался добавить команду sh в раздел команд docker-compose следующим образом:

command: php-fpm --allow-to-run-as-root && export ALLOWED_ID=<some expression>

Но это неправильный синтаксис. Также я читал о разделах точки входа в файле docker-compose, но я не понимаю, как он работает и как сохранить этот код "php-fpm --allow-to-run-as-root".

Ответы [ 2 ]

0 голосов
/ 12 января 2019

Я нашел решение:

COPY entrypoint.sh /
ENTRYPOINT ["/entrypoint.sh"]
ENV ALLOWED_IP=${ALLOWED_IP}

и entrypoint.sh

#!/bin/sh
set -e
export ALLOWED_IP="$(hostname -i)"
exec "$@"

А потом, если я запусту контейнер

docker-compose run --rm php-fpm env

Я вижу свою переменную ALLOWED_IP с контейнером ip

0 голосов
/ 11 января 2019

Довольно необычно знать внутренний 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.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...