【问题标题】:Docker compose healthcheck use environment variablesDocker compose healthcheck 使用环境变量
【发布时间】:2019-07-26 02:14:07
【问题描述】:

这是我的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_USERMYSQL_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.

【问题讨论】:

    标签: mysql docker docker-compose environment-variables


    【解决方案1】:

    您需要使用双美元符号 ($$) 来告诉 docker-compose 不要解析这些环境变量。当我试图让它工作时,也改变定义测试的方式,但我不能不改变它。以下应按预期工作:

    test: mysql --user=$$MYSQL_USER --password=$$MYSQL_PASSWORD -e 'SHOW DATABASES;'
    

    docker ps 结果:Up 35 seconds (healthy)

    【讨论】:

    • 我试过 test: ["CMD", "psql", "host=$$POSTGRES_HOST port=$$POSTGRES_PORT dbname=$$POSTGRES_DB user=$$POSTGRES_USER password=$$POSTGRES_PASSWORD" , "-c", "SELECT 1"] 即使我有 $$ 也不起作用,感谢语法!
    • @KamilDziedzic 也许您需要在其自己的引号内传递每个键和值。你试过了吗?像这样test: ["CMD", "psql", "host=$$POSTGRES_HOST", "port=$$POSTGRES_PORT", "dbname=$$POSTGRES_DB", "user=$$POSTGRES_USER", "password=$$POSTGRES_PASSWORD", "-c", "SELECT 1"]
    • 测试 Postgres 9.4+:测试:pg_isready -q -d $$POSTGRES_DB -U $$POSTGRES_USER
    • 考虑使用mysqladminping 而不是SQL 查询。这对我有用:test: mysqladmin --user=$$MYSQL_USER --password=$$MYSQL_PASSWORD ping。将它放在 ["CMD", ...]["CMD-SHELL", ...] 构造中是行不通的。
    【解决方案2】:

    你的 YAML 看起来不错,你是如何调用你的环境变量的?确保您引用了正确的对象。通常从您的应用程序中,您会使用类似

    的方式调用变量

    process.env.MYSQL_USER

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

    mysql:
      environment:
        MYSQL_ROOT_PASSWORD: password
        MYSQL_DATABASE: somedb
        MYSQL_USER: rstudio
        MYSQL_PASSWORD: password
    

    如果您尝试直接在 yaml 配置中引用您的 env 变量(即在您的测试命令中),您应该使用 ARGS,因为您的 env 变量可能还不会被编译。

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

    test: ["CMD", "mysql", "--user=${self:services.mysql.environment.MYSQL_USER}", "--password=${self:services.mysql.environment.MYSQL_PASSWORD}", "-e", "'SHOW DATABASES;'"]
    

    【讨论】:

    • @contool 我应该从哪里执行${self:services.mysql.environment.MYSQL_USER.sns}?因为在容器中 exec 什么都不返回。
    • 使用 ${self:services.mysql.environment.XXX} 对我来说只是一个错误:( 使用 $$XXX 效果很好!
    【解决方案3】:

    对我来说,Mostafa(用户:2336650)的回答不起作用,但它让我朝着正确的方向前进。在$ 需要在docker-compose.yml 中转义方面,答案是正确的。

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

    CMD-SHELLCMD 不同,因为它将命令执行包装在/bin/sh 中,因此shell 语法有效。由于我同时使用了环境变量和&& 来进行多重条件检查,所以我不确定是什么导致我的情况下的运行状况检查中断。 (可能两者都有)

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

    【讨论】:

      猜你喜欢
      • 2015-06-17
      • 1970-01-01
      • 2021-09-02
      • 1970-01-01
      • 2022-01-01
      • 2018-02-03
      • 2019-02-25
      • 2022-06-11
      • 1970-01-01
      相关资源
      最近更新 更多