这有效:
$ 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
我完全不喜欢这样,所以我会回答我自己的问题。
答案 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脚本中 - 欢呼