在docker-compose运行命令中使用docker环境变量

时间:2016-01-22 18:12:34

标签: docker docker-compose

这有效:

$ docker-compose run web psql -U dbuser -h db something_development

我的docker-compose.yml文件到处都有环境变量。如果我运行docker-compose run web env,我会看到各种美味的东西,我想在这些一次性命令(脚本和一次性shell)中重复使用。

docker-compose run env
...
DATABASE_USER=dbuser
DATABASE_HOST=db
DATABASE_NAME=something_development
DB_ENV_POSTGRES_USER=dbuser
... many more

这不会起作用,因为我现在的外壳会使它失败。

docker-compose run web psql -U ${DATABASE_USER} -h ${DATABASE_HOST} ${DATABASE_NAME} ``` psql:无法连接到服务器:没有这样的文件或目录     服务器是在本地运行还是接受     Unix域套接字上的连接" /var/run/postgresql/.s.PGSQL.5432" ;? ````

这些环境变量来自像docker-compose.yml引用的.app.env之类的env文件,但是docker-compose本身可以设置环境变量。甚至在他们就在那里时键入dbuser似乎是一种耻辱。我尝试了正常的逃避技巧。

docker-compose run web psql -U \$\{DATABASE_USER\} -h \$\{DATABASE_HOST\} \$\{DATABASE_NAME\}
... many other attempts

我完全不喜欢这样,所以我会回答我自己的问题。

2 个答案:

答案 0 :(得分:4)

答案(可能有很多方法)是使用-c运行bash并使用单引号,以便本地shell不会插入字符串。

docker-compose run web bash -c 'psql -U ${DATABASE_USER} \ -h ${DATABASE_HOST} ${DATABASE_NAME}'

优秀。 Docker-compose中的DRY shell命令。

答案 1 :(得分:1)

不是你想要的答案,而是我们设置env vars的方式......

(这是许多容器之一)

api:
  image: 10.20.2.139:5000/investigation-api:${apiTag}
  container_name: "api"
  links:
    - "database"
    - "ldap"
  ports:
    - 8843:8843
  environment:
    KEYSTORE_PASSWORD: "ooooo"
    KEYSTORE: "${MYVAR}"
  volumes_from:
    - certs:rw

运行撰写...

MYVAR=/etc/ssl/certs/keystoke.jks docker-compose (etcetera) 

通常上面的行将在provision.sh脚本中 - 欢呼