正如@larsks在他的回答中提到的那样,你的问题是你的命令在Compose文件中,而不是在Dockerfile中。
要在另一台机器上原样运行项目,请使用以下docker-compose.yml
:
version: '3'
services:
db:
image: postgres
environment:
- POSTGRES_DB=postgres
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
web:
image: vivanks/firsttry:latest
command: python manage.py runserver 0.0.0.0:8000
ports:
- "8000:8000"
depends_on:
- db
如果你已经在Dockerfile中添加了
CMD python manage.py runserver 0.0.0.0:8000
并重新构建了镜像,那么上述内容可以进一步简化为:
version: '3'
services:
db:
image: postgres
environment:
- POSTGRES_DB=postgres
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
web:
image: vivanks/firsttry:latest
ports:
- "8000:8000"
depends_on:
- db
使用
docker run
将会失败,因为它不会设置数据库。
编辑:
楼主,我欣赏你的坚持,但同时也不理解为什么要使用Docker CLI而不是docker-compose。我建议使用上述任一
docker-compose.yml
文件来启动您的应用程序。
尽管如此,我接受了不使用docker-compose运行它的挑战。
当您使用
docker run
命令时,您的应用程序无法启动,因为它尝试连接到名为
db
的主机上的数据库,但该主机不存在。在您(和我的)的
docker-compose.yml
中,有一个称为
db的服务定义。Docker-compose使用该定义为您设置数据库容器,并使其在主机名
db
下可用于您的应用程序。
要在不使用docker-compose的情况下启动应用程序,您需要手动执行它自动执行的所有操作(以下命令假定您已将
CMD...
添加到您的
Dockerfile
中)。
docker network create --driver bridge django-test-network
docker run --detach --env POSTGRES_DB=postgres --env POSTGRES_USER=postgres --env POSTGRES_PASSWORD=postgres --network django-test-network --name db postgres:latest
docker run -it --rm --network django-test-network --publish 8080:8000 vivanks/firsttry:latest
上述3个命令创建了一个新的桥接网络,创建并启动了一个已配置好数据库连接到该网络的分离(后台)容器,最后创建并启动了一个基于您的镜像的附加(前台)容器,也连接到该新网络。由于两个容器都在相同的
非默认桥接网络上,因此您的应用程序将能够将主机名
db
解析为数据库容器的内部IP地址并正确启动。
一旦您使用
Ctrl+C
关闭它,您的应用程序容器将删除自身(因为它是使用选项
--rm
启动的),但您还需要手动清理其余部分。要这样做,请运行以下命令:
docker stop db
docker rm -v db
docker network remove django-test-network
第一个命令停止数据库容器,第二个命令删除它及其匿名卷,第三个命令删除网络。
希望这能解释一切。
docker-compose up
命令,在我的机器上它可以完美地运行,并且有正确的数据库。docker-compose up
命令只会自动创建数据库镜像。 - The Drunken Wiz