docker-compose不重写dockerfile环境variables

我正在尝试从我的docker-compose中设置基本的postgres信息。 容器启动,但是当我运行Dockerfile docker-compose up时,来自Dockerfile的variables不会被覆盖。 请帮忙。

 FROM mine/debian7 ## START: UPDATES & INSTALLS ########################################################################################### RUN echo "deb http://apt.postgresql.org/pub/repos/apt/ wheezy-pgdg main" >> /etc/apt/sources.list.d/pgdg.list && \ wget --quiet -O - http://apt.postgresql.org/pub/repos/apt/ACCC4CF8.asc | apt-key add - && \ apt-get update && \ apt-get upgrade && \ apt-get install -y python-software-properties software-properties-common postgresql-9.4 postgresql-client-9.4 postgresql-contrib-9.4 && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* ## END: UPDATES & INSTALLS ############################################################################################# ENV DB_USER_NAME test ENV DB_PASSWORD test ENV DB_NAME test ## START: CONCFIGURATION ############################################################################################### # start postgres at boot #RUN echo "/etc/init.d/postgresql start" >> ~/.bashrc USER postgres RUN /etc/init.d/postgresql start && \ psql --command "CREATE USER $DB_USER_NAME WITH SUPERUSER PASSWORD '$DB_PASSWORD';" && \ createdb -O $DB_NAME $DB_NAME RUN echo "host all all 0.0.0.0/0 md5" >> /etc/postgresql/9.4/main/pg_hba.conf RUN echo "listen_addresses='*'" >> /etc/postgresql/9.4/main/postgresql.conf VOLUME ["/etc/postgresql", "/var/log/postgresql", "/var/lib/postgresql"] #USER root #RUN update-rc.d postgresql defaults ## END: CONCFIGURATION ################################################################################################# EXPOSE 5432 CMD service postgresql start && tail -f /var/log/postgresql/postgresql-9.4-main.log 

而我的docker – 撰写文件:

 tomcat: image: clegge/tomcat ports: - "8080:8080" volumes: - sample.war:/opt/tomcat7/webapps/sample.war postgres: build: /Users/clegge/Dockers/docker-postgres-base/ ports: - "5432:5432" stdin_open: true tty: true environment: - DB_USER_NAME=legge_crud - DB_PASSWORD=legge_crud - DB_NAME=test 

我错过了什么?

在你的Dockerfile你可以在RUN语句中使用这些环境variables。 这些都是在构build图像的过程中在构build时执行的。

当你用docker run你的容器时,它只是根据你刚刚构build的镜像启动一个容器。 此时的图像已经存在, RUN语句不再执行。

所以在运行时设置这些环境variables将不起作用。

Docker镜像构build过程旨在自成一体。 也就是说,构build映像的过程不应该除Dockerfile和Dockerfile目录以外的任何其他input。 这是为了使图像很难意外地依赖于构build环境。

在docker-compose中设置环境只会在运行时影响环境variables,而不会影响构build时间。

您应该在运行时初始化您的数据库。

顺便说一句,已经有一个非常好的官方postgres图像 。

为了logging我不得不使用docker-entrypoint.sh和hack我的dockerfile匹配:

https://github.com/docker-library/postgres/tree/a82c28e1c407ef5ddfc2a6014dac87bcc4955a26/9.4

这样做,我能够注入我需要在我的docker组成的XML文件的variables…