您的位置:首页 > 运维架构 > Docker

docker-compose中的环境变量

2017-03-20 15:09 190 查看
使用docker-compose部署一个MySQL server. mysq serverl的数据库文件存放在/var/lib/mysql目录下,为了重启mysql server不至于丢失创建的数据库数据,我们需要mount一个目录到mysql server容器的/var/lib/mysql。用docker-compose创建一个mysql instance大概如下:

version: '2'

services:

  mysql:

    image:mysql

    volumes:

      - ${MYSQL_DATA_DIR}:/var/lib/mysql

MYSQL_DATA_DIR是我用到的环境变量,希望配置到一个文件中,不同的MySQL instance用不同的目录,所以用到了环境变量。

粗粗的浏览了一下docker-compose参考文档,好像变量可以定义到一个文件中,如定义到mysql,.env中,这样mysql服务的定义就改为了:

version: '2'

services:

  mysql:

    image:mysql

   env-file:

      - ./mysql.env

    volumes:

      - ${MYSQL_DATA_DIR}:/var/lib/mysql

mysql.env的内容如下:

$ cat mysql.env

MYSQL_DATA_DIR=/my/sql/data-dir

然后启动mysql:

$ docker-compose up -d

docker-composegeic给出警告:

WARNING: The MYSQL_DATA_DIR variable is not set. Defaulting to a blank string.

奇怪,定义在MYSQL_DATA_DIR中的环境变量不起作用。环境变量也可以定义在environment中,不从文件中读取环境变量了,直接定义在environment中有如何。docker-compose.yml改为:

version: '2'

services:

  mysql:

    image:mysql

    environment:

      - MYSQL_DATA_DIR=/my/sql/data-dir

    volumes:

      - ${MYSQL_DATA_DIR}:/var/lib/mysql

用docker-compose启动mysql:

$docker-compose up -d

得到一样的错误。什么原因?文档上不是说可以用环境变量并且可以把环境变量定义在env_file和environment中吗。为什么就不工作呢?google一把,有人问同样的问题,看了几个回到,终于有人说到了点子上:

- env_file,environment中定义的环境变量是穿给container用的不是在docker-compose.yml中的环境变量用的

- docker-compose.yml中的环境变量${VARIABLE:-default}引用的是在.env中定义的或者同个shell export出来的

原来如此,把MYSQL_DATA_DIR定义在.env中试试:

$ cat .env

MYSQL_DATA_DIR=/my/sql/data-dir

然后重新启动mysql:

$ docker-compose up -d

这次没有任何错误了,一切工作正常。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息