首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Docker使用环境变量编写运行状况检查

Docker使用环境变量编写运行状况检查
EN

Stack Overflow用户
提问于 2019-03-05 01:46:48
回答 3查看 5.9K关注 0票数 12

这是我的docker-compose.yml

代码语言:javascript
复制
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_USERMYSQL_PASSWORD?在当前设置中,我在运行docker compose时收到以下警告:

代码语言:javascript
复制
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.
EN

回答 3

Stack Overflow用户

发布于 2019-03-05 02:56:38

为了告诉docker-compose不要解析这些环境变量,您需要使用双美元符号($$)。我也改变了定义测试的方式,因为我试图让它工作,但我不能不改变它。下面的代码应该可以正常工作:

代码语言:javascript
复制
test: mysql --user=$$MYSQL_USER --password=$$MYSQL_PASSWORD -e 'SHOW DATABASES;'

docker ps结果:Up 35 seconds (healthy)

票数 20
EN

Stack Overflow用户

发布于 2020-12-24 14:23:46

对我来说,Mostafa(用户: 2336650)的答案不起作用,但它让我走上了正确的方向。关于docker-compose.yml中的$需要转义这一点,答案是正确的。

缺少的部分是测试命令有多种执行模式;我们特别感兴趣的是CMD-SHELL

CMD-SHELLCMD不同,因为它将命令执行包装在/bin/sh中,所以外壳语法可以工作。因为我同时使用了环境变量和&&进行多条件检查,所以我不太确定是什么原因导致了我的健康检查中断。(可能两者都有)

对于那些四处寻找答案的人来说,可能与我的答案不同,参考文档值得一看。https://docs.docker.com/compose/compose-file/compose-file-v2/#healthcheck

票数 1
EN

Stack Overflow用户

发布于 2019-03-05 02:21:56

你的YAML看起来不错,你是如何调用你的环境变量的?确保引用的是正确的对象。通常,在您的应用程序中,您可以使用下面这样的方式调用变量

process.env.MYSQL_USER

你也不需要破折号,我的偏好(为了可读性)应该是这样的语法:

代码语言:javascript
复制
mysql:
  environment:
    MYSQL_ROOT_PASSWORD: password
    MYSQL_DATABASE: somedb
    MYSQL_USER: rstudio
    MYSQL_PASSWORD: password

如果你试图在yaml配置中直接引用你的环境变量(即在你的测试命令中),你应该使用ARGS,因为你的环境变量可能还没有被编译。

编辑-如果你想在yaml中引用一个对象,你可以使用self,例如:

代码语言:javascript
复制
test: ["CMD", "mysql", "--user=${self:services.mysql.environment.MYSQL_USER}", "--password=${self:services.mysql.environment.MYSQL_PASSWORD}", "-e", "'SHOW DATABASES;'"]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54988792

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档