我正在尝试从我的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
我错过了什么?
答案 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