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