这是我的docker-compose.yml
version: "3"
services:
mongodb:
image: mongo:4.1
volumes:
- ./mongodb_data:/data/db
container_name: mongodb
ports:
- 27017:27017
mysql:
image: mysql:5.7
#volumes:
#- ./mysql_data:/var/lib/mysql
container_name: mysqldb
ports:
- 3306:3306
- 33060:33060
expose:
- 3306
- 33060
environment:
- MYSQL_ROOT_PASSWORD=password
- MYSQL_DATABASE=somedb
- MYSQL_USER=rstudio
- MYSQL_PASSWORD=password
healthcheck:
test: ["CMD", "mysql", "--user=$MYSQL_USER", "--password=$MYSQL_PASSWORD", "-e", "'SHOW DATABASES;'"]
timeout: 5s
retries: 5
如何使用环境变量MYSQL_USER
和MYSQL_PASSWORD
?在当前设置中,我在运行docker compose时收到以下警告:
WARNING: The MYSQL_USER variable is not set. Defaulting to a blank string.
WARNING: The MYSQL_PASSWORD variable is not set. Defaulting to a blank string.
发布于 2019-03-05 02:56:38
为了告诉docker-compose
不要解析这些环境变量,您需要使用双美元符号($$
)。我也改变了定义测试的方式,因为我试图让它工作,但我不能不改变它。下面的代码应该可以正常工作:
test: mysql --user=$$MYSQL_USER --password=$$MYSQL_PASSWORD -e 'SHOW DATABASES;'
docker ps
结果:Up 35 seconds (healthy)
发布于 2020-12-24 14:23:46
对我来说,Mostafa(用户: 2336650)的答案不起作用,但它让我走上了正确的方向。关于docker-compose.yml
中的$
需要转义这一点,答案是正确的。
缺少的部分是测试命令有多种执行模式;我们特别感兴趣的是CMD-SHELL
。
CMD-SHELL
与CMD
不同,因为它将命令执行包装在/bin/sh
中,所以外壳语法可以工作。因为我同时使用了环境变量和&&
进行多条件检查,所以我不太确定是什么原因导致了我的健康检查中断。(可能两者都有)
对于那些四处寻找答案的人来说,可能与我的答案不同,参考文档值得一看。https://docs.docker.com/compose/compose-file/compose-file-v2/#healthcheck
发布于 2019-03-05 02:21:56
你的YAML看起来不错,你是如何调用你的环境变量的?确保引用的是正确的对象。通常,在您的应用程序中,您可以使用下面这样的方式调用变量
process.env.MYSQL_USER
你也不需要破折号,我的偏好(为了可读性)应该是这样的语法:
mysql:
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: somedb
MYSQL_USER: rstudio
MYSQL_PASSWORD: password
如果你试图在yaml配置中直接引用你的环境变量(即在你的测试命令中),你应该使用ARGS,因为你的环境变量可能还没有被编译。
编辑-如果你想在yaml中引用一个对象,你可以使用self
,例如:
test: ["CMD", "mysql", "--user=${self:services.mysql.environment.MYSQL_USER}", "--password=${self:services.mysql.environment.MYSQL_PASSWORD}", "-e", "'SHOW DATABASES;'"]
https://stackoverflow.com/questions/54988792
复制相似问题