gpt4 book ai didi

docker - docker-compose 和手动命令之间的区别

转载 作者:行者123 更新时间:2023-12-02 08:29:10 29 4
gpt4 key购买 nike

我想做什么

我想在一个 docker 容器中运行一个 yesod web 应用程序,链接到另一个 docker 容器中的 postgres 数据库。

我尝试过的

我有以下文件层次结构:

/
api/
Dockerfile
database/
Dockerfile
docker-compose.yml

docker-compose.yml 看起来像这样:

database:
build: database
api:
build: api
command: .cabal/bin/yesod devel # dev setting
environment:
- HOST=0.0.0.0
- PGHOST=database
- PGPORT=5432
- PGUSER=postgres
- PGPASS
- PGDATABASE=postgres
links:
- database
volumes:
- api:/home/haskell/
ports:
- "3000:3000"

运行 sudo docker-compose up 根本无法启动 api 容器,或者同样经常出现以下错误:

api_1      | Yesod devel server. Press ENTER to quit
api_1 | yesod: <stdin>: hGetLine: end of file
personal_api_1 exited with code 1

但是,如果我运行 sudo docker-compose database up & 然后在不使用 compose 的情况下启动 api 容器,而是使用

sudo docker run -p 3000:3000 -itv /home/me/projects/personal/api/:/home/haskell --link personal_database_1:database personal_api /bin/bash

我可以导出docker-compose.yml文件中设置的环境变量,然后手动运行yesod devel并访问我的网站在本地主机上成功。

最后,如果我自己运行 sudo docker-compose run api,我会获得第三种不同的行为。这似乎启动成功,但我无法在浏览器中访问该页面。通过运行 sudo docker-compose run api/bin/bash 我已经能够探索这个容器并且我可以确认在 docker-compose.yml 中设置的环境变量都设置正确。

期望的行为

我想通过在后台运行数据库然后通过运行 sudo docker-compose up 在 api 容器的 shell 中手动设置环境来获得我获得的结果。

问题

很明显,我尝试的三种不同方法的作用略有不同。但根据我对 docker 和 docker-compose 的理解,我希望它们本质上是等价的。请有人解释一下它们的不同之处和原因,如果可能的话,我如何才能达到我想要的结果?

最佳答案

错误消息表明 API 容器需要来自命令行的输入,这需要 TTY 出现在您的容器中。

在“手动”启动中,您通过 -t 标志告诉 docker 在容器中创建 TTY(-itv-i 的简写-t -v),所以API容器运行成功。

要在 docker-compose 中实现相同的功能,您必须在 docker-compose.yml 中向 API 服务添加一个 tty 键并将其设置为;

database:
build: database
api:
build: api
tty: true # <--- enable TTY for this service
command: .cabal/bin/yesod devel # dev setting

关于docker - docker-compose 和手动命令之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29201206/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com