Docker撰写Healthcheck使用环境变量

Taz*_*Taz 5 mysql environment-variables docker docker-compose

这是我的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
Run Code Online (Sandbox Code Playgroud)

如何使用环境变量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.
Run Code Online (Sandbox Code Playgroud)

Mos*_*ein 6

您需要使用双美元符号($$)来指示docker-compose不要解析这些环境变量。当我尝试使测试生效时,也要更改定义测试的方式,但是我不能不更改它。以下应该可以正常工作:

test: mysql --user=$$MYSQL_USER --password=$$MYSQL_PASSWORD -e 'SHOW DATABASES;'
Run Code Online (Sandbox Code Playgroud)

docker ps 结果: Up 35 seconds (healthy)

  • 考虑将“mysqladmin”与“ping”一起使用,而不是使用 SQL 查询。这对我有用:“测试:mysqladmin --user=$$MYSQL_USER --password=$$MYSQL_PASSWORD ping”。将其放入 `["CMD", ...]` 或 `["CMD-SHELL", ...]` 构造中不起作用。 (4认同)

con*_*ool 4

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

process.env.MYSQL_USER

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

mysql:
  environment:
    MYSQL_ROOT_PASSWORD: password
    MYSQL_DATABASE: somedb
    MYSQL_USER: rstudio
    MYSQL_PASSWORD: password
Run Code Online (Sandbox Code Playgroud)

如果您尝试直接在 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;'"]
Run Code Online (Sandbox Code Playgroud)