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

这工作:

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

docker-compose.yml文件遍布各地的环境variables。 如果我运行docker-compose run web env ,我会在这些closures命令(脚本和一次性shell)中看到各种美味的东西。

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

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

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

这些环境variables来自像.app.env -compose.yml引用的.app.env这样的env文件,但是docker-compose本身可以设置环境variables。 当他们在那里时甚至可以inputdbuser ,这似乎是一种耻辱。 我已经尝试了我正常的转义技巧。

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

我完全是橡皮泥,所以我要回答我自己的问题。

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

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

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

不是你想要的答案,而是我们设置环境variables的方式…

(这是许多容器之一)

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