docker-compose不会覆盖dockerfile环境变量

时间:2015-08-08 05:09:37

标签: docker docker-compose

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

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-compose文件:

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

我错过了什么?

5 个答案:

答案 0 :(得分:9)

Dockerfile中,您在RUN语句中使用了这些环境变量。这些是在构建图像时在构建时间期间执行的。

当您使用docker run启动容器时,它只会根据您刚刚构建的图像启动容器。该时间点的图像已经存在,RUN语句不会再次执行。

因此,在运行时期间设置这些环境变量将无效。

答案 1 :(得分:3)

docker镜像构建过程旨在自包含。也就是说,构建映像的过程不应该接受除Dockerfile和Dockerfile目录之外的任何输入。这是为了使图像难以意外地依赖于构建环境。

在docker-compose中设置环境仅影响运行时的环境变量,而不影响映像构建时间。

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

是的,已经有了非常好的official postgres image

答案 2 :(得分:2)

是的,@Lie Ryan指出那里有official postgres张图片。尽管如此,问题/问题仍未得到解决,这是...

  

docker-compose不覆盖Dockerfile环境变量

我打算现在解决。

不要将ENV用于您的预期行为。

ARG很好documented

例如...

-Dockerfile

ARG

-docker-compose.yaml

ARG NODE_ENV=production # This will default to "production"

这样,build: context: "../path-to-Dockerfile-folder" args: [ "NODE_ENV=development" ] 将与NODE_ENV一起运行

答案 3 :(得分:0)

对于记录我必须使用docker-entrypoint.sh并破解我的dockerfile来匹配:

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

这样做我能够在我的docker-compose yml文件中注入我需要的变量...

答案 4 :(得分:0)

在Dockerfile中,您应该具有:

ENV DB_USER_NAME=${DB_USER_NAME}
ENV DB_PASSWORD=${DB_PASSWORD}
ENV DB_NAME=${DB_NAME}

然后将使用docker-compose.yml中的值 并且您想在Dockerfile中获得一些默认值,就可以做到这一点

Dockerfile:

ARG DB_USER_NAME=test
ARG DB_PASSWORD=test
ARG DB_NAME=test

ENV DB_USER_NAME=${DB_USER_NAME}
ENV DB_PASSWORD=${DB_PASSWORD}
ENV DB_NAME=${DB_NAME}

并且您的docker-compose.yml应该具有这些值(问题中的当前docker-compose.yml正确):

environment:
    - DB_USER_NAME=legge_crud
    - DB_PASSWORD=legge_crud
    - DB_NAME=test