Docker使用环境变量来设置额外的主机

时间:2016-09-09 14:51:59

标签: docker docker-compose

我使用docker compose来运行我的应用程序。为此,我需要在容器内设置主机(它取决于我正在运行的环境)。

我的方法是:

创建环境文件并设置变量:

#application.env
SERVER_IP=10.10.9.134

我的docker撰写文件如下:

version: '2'
services:

  api:
    container_name: myApplication
    env_file:
      - application.env
    build: ./myApplication/
    entrypoint: ./docker/api-startup.sh
    ports:
      - "8080:8080"
    depends_on:
      - redis    
    extra_hosts: &extra_hosts
      myip: $SERVER_IP

但我的问题是变量SERVER_IP永远不会被替换。

当我运行docker-compose配置时,我看到:

services:
  api:
    build:
      context: /...../myApplication
    container_name: myApplication
    depends_on:
    - redis
    entrypoint: ./docker/api-startup.sh
    environment:
      SERVER_IP: 10.10.9.134
    extra_hosts:
      myip: ''
    ports:
    - 8080:8080

我尝试使用$ SERVER_IP或$ {SERVER_IP}替换变量引用,但它没有用。

2 个答案:

答案 0 :(得分:6)

我创建了一个文件.env,添加了单行HOST=test.example.com,然后在docker-compose中执行了此操作:

extra_hosts:
- myip:${HOST}

docker-compose config然后显示

  extra_hosts:
      myip: test.example.com

为此,我按照Docker-compose environment variables中有关.env文件

的部分的说明进行操作

更新

根据Docker文档,

  

注意:如果您的服务指定了构建选项,则定义的变量   在构建期间,环境文件不会自动显示。   使用build的args子选项来定义构建时环境   变量

这基本上意味着如果将变量放在.env文件中,可以在docker-compose.yml中使用它们进行替换,但如果对特定容器使用env_file选项,则只能查看Docker容器内的变量,而不是在构建期间。这也是合乎逻辑的,env_file取代docker run --env-file=FILE ...而不是其他任何内容。

因此,您只能将您的值放入.env。或者,正如William所描述的,您可以使用主机的环境变量。

答案 1 :(得分:1)

修改

尝试以下方法:

version: '2'
services:
  api:
    container_name: myApplication
    env_file:
      - application.env
    build: ./myApplication/
    entrypoint: ./docker/api-startup.sh
    ports:
      - "8080:8080"
    depends_on:
      - redis    
    extra_hosts:
      - "myip:${SERVER_IP}"

确保大括号并且主机操作系统上存在环境变量。