Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

docker-compose: hosts environment variables are higher priority than .env file?

I want to set the environment variables from .env file to the container. But host environment variables are set to the container instead of .env file.

Setting files as follows.

host # ls -la:

docker-compose.yml
Dockerfile
.env

host environment variable:

JAVA_HOME="/usr/lib/jvm/java-8-oracle/jre"
LANG="en_US.UTF-8"

.env file:

TZ=Asia/Tokyo
LANG=ja_JP.utf8
ORACLE_URL=http://download.oracle.com/otn-pub/java/jdk/8u112-b15/jdk-8u112-linux-x64.rpm
ORACLE_VERSION=8u112
JAVA_HOME=/usr/java/jdk1.8.0_112/jre

docker-compose.yml:

version: '2'
services:

  oracle8:
    build:
      context: ./
      args:
        ORACLE_URL: ${ORACLE_URL}
        ORACLE_VERSION: ${ORACLE_VERSION}
    environment:
      - TZ=$TZ
      - LANG=$LANG
      - JAVA_HOME=$JAVA_HOME
    image: oracle8
    privileged: true
    tty: true
    container_name: oracle8
    hostname: oracle8

Dockerfile:

FROM centos:latest

ARG ORACLE_URL
ARG ORACLE_VERSION
ARG JAVA_HOME

ENV JAVA_HOME       ${JAVA_HOME}

RUN set -x \
    && yum update -y \
    && yum install -y wget tar \
    && yum clean all \
    && wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" ${ORACLE_URL} \
    && rpm -ivh                 jdk-"${ORACLE_VERSION}"-linux-x64.rpm \
    && rm -f                    jdk-"${ORACLE_VERSION}"-x64.rpm \
    && echo ${JAVA_HOME}


CMD ["tail", "-f", "/dev/null"]

and then, docker-compose build & up

host # docker-compose build
host # docker-compose up -d 
host # docker exec -it oracle8 bash
oracle8 # export
    JAVA_HOME="/usr/lib/jvm/java-8-oracle/jre"
    LANG="en_US.UTF-8"
    TZ="Asia/Tokyo"

$TZ is set from .env file because host is not set $TZ. $LANG and $JAVA_HOME are not set "ja_JP.utf8" and "/usr/java/jdk1.8.0_112" of .env file but "en_US.UTF-8" and "/usr/lib/jvm/java-8-oracle/jre" are set of host environment variables.

If I write it directly in a docker-compose.yml, it's ok. but I want to handle it in .env file.

like image 418
Yusuke Ohta Avatar asked Oct 18 '25 21:10

Yusuke Ohta


1 Answers

The variables are prioritized in the following order:

  1. compose file itself
  2. shell variables
  3. .env file
  4. Dockerfile

This can be found: here

like image 66
tarfeef101 Avatar answered Oct 22 '25 05:10

tarfeef101