2016-01-22 84 views
3

这工作:使用泊坞窗环境变量命令

$ 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 

这是行不通的,因为我目前的shell已经证明了这一点。

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 

我完全橡胶鸭子所以我要回答我自己的问题。

回答

4

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

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

太棒了。 docker-compose中的DRY shell命令。

1

概率不是你想要的答案,但我们设置的env瓦尔的方式......

(这是许多容器之一)

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脚本中 - 欢呼声

+0

这是从主机传递一个env。我想要一种重用KEYSTORE_PASSWORD的方法:“ooooo”。看到我的答案,但谢谢! :) – squarism

+0

只是更新的答案 - 希望这对你有用:)只在我的例子中的一个地方使用它,但可以用于许多 – danday74

+0

嗯,这是方便的,无论。这是另一个灵活性选项。谢谢。 – squarism