首页 > 解决方案 > 如何使用 make 文件将环境变量传递给 Docker 组合

问题描述

我们的 Makefile 中有一行读取 env 文件并将变量导出到 shell:

include .env
export $(shell sed 's/=.*//' .env)

这使得可以在生成文件任务中使用变量,例如

connect-db:
    docker-compose exec mysql mysql --host=0.0.0.0 --user=${DATABASE_USER} --password=${DATABASE_PASSWORD} ${DATABASE_NAME}

但是 docker-compose 文件中也有服务,它们使用环境变量作为卷名。

  yarn:
    image: node:10
    entrypoint: "yarn"
    command: "help"
    volumes:
      - ${YARN_HOME}:/yarn
      - ${PROJECT_DIR}:/opt/project
      - ${SSH_AUTH_SOCK}:/ssh_agent
      - ${SSH_ID_RSA}:/node/.ssh/id_rsa:ro
    environment:
      SSH_AUTH_SOCK: ${SSH_AUTH_SOCK}
      GIT_SSH_COMMAND: "ssh -i /node/.ssh/id_rsa -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no"
      YARN_CACHE_FOLDER: "/yarn"
      PROJECT_DIR: ${PROJECT_DIR}
      YARN_HOME: ${YARN_HOME}
    working_dir: /opt/project

当我运行docker-compose run yarn容器时,容器被正确执行,但是如果我使用这个 docker-compose 命令运行一个 make 任务,则会记录一个错误

make yarn
docker-compose run --rm yarn
ERROR: Cannot create container for service yarn: create .: volume name is too short, names should be at least two alphanumeric characters

当使用 include .env 禁用行时,任务可以工作,但使用变量的任务不能。

如何在这两种情况下使用环境变量?

标签: dockermakefiledevops

解决方案


推荐阅读