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
这次没有任何错误了,一切工作正常。
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
这次没有任何错误了,一切工作正常。
相关文章推荐
- docker内程序如何读取dockerfile和compose.yml中设置的环境变量
- 利用docker-compose和docker-swarm搭建ELK环境
- window 环境下docker-compose命令报错:(2, 'WaitNamedPipe', 'The system cannot find the file specified.')
- Docker Compose - Compose 中可用的环境变量
- Docker-compose搭建ELK+head+redis环境(2)-- head插件安装
- docker-compose 安装TYK环境(4个Docker:dashboard、gateway、mongo、redis)
- Docker 生产环境之使用可信镜像 - 用 compose 部署 Notary 服务器
- docker~环境变量到底怎么用
- 使用 docker-compose.yml 快速搭建php开发环境
- Docker集群实验环境布署--swarm【7 让docker客户端支持docker-compose】
- 【docker】环境变量 和 脚本 作用
- docker-compose搭建Nginx+Tomcat负载均衡环境
- 利用docker-compose实现elk+redice的但宿主机环境搭建
- 基于docker-compose搭建laravel环境(nodejs+npm+bower)
- docker compose环境搭建
- Docker-compose搭建ELK+head+redis环境(1)-- elasticsearch安装
- 使用docker-compose来部署开发环境
- 使用docker-compose搭建AspNetCore开发环境