我是 Docker Compose 的新手,但已经使用 Docker 多年。下面的屏幕截图是 PowerShell 和 GitBash 的。如果我在没有 docker-compose 的情况下运行容器,我可以
docker exec -it <container_ref> /bin/bash
这些 shell 中的任何一个都没有问题。
但是,当使用 docker-compose up
运行时,两个 shell 在尝试使用 docker-compose exec
时都不会出错。他们都只是挂了几秒钟,然后返回到提示符。
最后,出于某种原因,我在使用我所知道的东西时确实在 GitBash 中遇到错误:docker exec...
。我已经用了很多年了,所以我很困惑并提出了一个问题。 Docker Compose 做了什么会扰乱 GitBash docker 功能,但不会扰乱 PowerShell?而且,为什么使用docker-compose exec...
时挂起,但没有错误?
我在 docker-compose.yml 中使用
tty: true
,但老实说这似乎没有什么不同。不要在一篇文章中抛出一堆问题,但不管发生了什么,这也可能是我无法在浏览器中仅在使用 Docker Compose 运行它时访问我的 Web 服务器的原因吗?
version: '3.8'
volumes:
pgdata:
external: true
services:
db:
image: postgres
container_name: trac-db
tty: true
restart: 'unless-stopped'
environment:
POSTGRES_PASSWORD: postgres
POSTGRES_USER: postgres
POSTGRES_DB: iol
volumes:
- pgdata:/var/lib/postgresql/data
network_mode: 'host'
expose:
- 5432
web:
image: lindben/trac-server
container_name: trac-server
tty: true
restart: 'unless-stopped'
environment:
ADDRESS: localhost
PORT: 3000
NODE_ENV: development
depends_on:
- db
network_mode: 'host'
privileged: true
expose:
- 1234
- 3000
```
我假设你正在使用 Docker for Desktop 所以你可以
docker exec
使用 PowerShell 的原因是因为 PS 和 Docker for Desktop 都是为 Windows 构建的,而 GitBash 是基于 bash它不是在 Windows 中本地使用,而是在 Linux 中使用,并且基于 Linux shell(bash = Bourne-Again SHell)。
因此,当使用需要 tty 的 Windows 程序时,您需要某种“适配器”,例如
winpty
,以弥合 Docker for Desktop 本机界面与 GitBash(或 Bash)的界面之间的差距。
这里有关于winpty
更详细的解释抛开所有这些,如果只尝试使用撰写选项,您最好建议这个问题
现在,关于您的 Web 服务问题,我认为您实际上并没有使用 expose 标签公开您的应用程序。看看 docker-compose 公开参考。你需要的是添加一个“端口”标签,就像这里引用的一样here:
db:
ports:
- "5432:5432"
web:
ports:
- "1234:1234"
- "3000:3000"
我希望这能解决你的问题;)