在docker文件中使用docker compose中的环境变量

在docker文件中使用docker compose中的环境变量,docker,environment-variables,docker-compose,Docker,Environment Variables,Docker Compose,我感到困惑,因为docker-compose.yml中设置的环境变量似乎导致docker在docker compose up上重建我的图像: apache\u php\u的Dockerfile,带有\u自定义\u docroot FROM php:7.1.11-apache-jessie # Set apache document root ENV APACHE_DOCUMENT_ROOT /var/www/web RUN sed -ri -e 's!/var/www/html!${APACH

我感到困惑,因为docker-compose.yml中设置的环境变量似乎导致docker在docker compose up上重建我的图像:

apache\u php\u的Dockerfile,带有\u自定义\u docroot

FROM php:7.1.11-apache-jessie

# Set apache document root
ENV APACHE_DOCUMENT_ROOT /var/www/web
RUN sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf
RUN sed -ri -e 's!/var/www/!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf
我正在使用
docker build-t apache\u php\u和\u custom\u docroot构建它。

docker-compose.yml

version: "3"
services:
  web:    
    image: apache_php_with_custom_docroot
    environment:
      - APACHE_DOCUMENT_ROOT=/var/www/anotherfolder
所以,对我来说奇怪的是:它可以设置APACHE_文档的根。当我运行docker compose-d时,apache使用docroot
/var/www/anotherfolder

我确信,当我的图像生成时,我不能在docker compose文件中更改它。我阅读了一些关于
构建
参数的内容,例如:


但是我没有设置构建参数。docker怎么知道他必须重建我的形象?我在哪里可以阅读到这背后的原则?

在dockerfile中定义一个入口点,如:

ENTRYPOINT bash $APACHE_DOCUMENT_ROOT/entrypoint.sh
然后,在每次容器启动时的入口点中,您将能够读取带有文件的映射卷,并将其注入到容器中,或者声明所需的环境或相关启动任务

enviroment=$(cat /mapped_config/enviroment.env)
if grep -Fxq "$enviroment" /home/.bashrc
  then 
      echo "Environment setted propertly"
  else
      echo "$enviroment" >> /home/.bashrc
      echo "enviorment setted!"
fi

这只是一个想法,可能不是最好的办法,是我过去的处理方式。

对docker有点生疏,据我所知,docker-compose.yml中的每一个更改都需要进行补充(因为docker读取它并创建虚拟文件系统和容器行为),所以我认为您需要将其附加到入口点,在那里您可以读取带有VAR的文件,并在每次容器启动时加载它…-1,因为这不是我问题的答案。我不明白为什么我的代码可以工作,我没有寻找答案,这可以通过另一种方式来完成…我只是想解释一下,当你做docker compose时,docker会读取你的docker-compose.yml文件并构建你的映像(使用你定义的配置和变量),如果你对docker compose文件做任何更改(如change env var等…)如果您想在容器启动时动态读取某些内容,则需要重新构建(而不是停止、启动或重新启动),您可以在入口点执行此操作