为了启动 Docker 容器,我运行了命令
docker compose up -d
。 (其实-d
开关并不重要。)
docker ps
显示以下容器正在运行。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
678ef93d18dc python-my-python-project "python3 -m my_pytho…" 6 seconds ago Up 5 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp python-my-python-project-1
image和container名称从何而来?这些字符串是如何生成的?
Image Name: python-my-python-project
Container Name: python-my-python-project-1
Dockerfile
的内容:
# syntax=docker/dockerfile:1
from python:3.12-bookworm
workdir /python-my-python-project
copy ./my_python_project ./my_python_project
copy ./requirements.txt .
run pip3 install --no-cache-dir --upgrade -r requirements.txt
cmd ["python3", "-m", "my_python_project"]
expose 80
docker-compose.yml
的内容:
services:
python-my-python-project:
build: .
ports:
- "80:80"
我找不到任何有关如何创建名称的文档。据我了解,名称 不应该在 Dockerfile
或
docker-compose.yml
规范中手动指定,因为在尝试将容器化应用程序部署为群的一部分时,手动固定名称会导致问题。
什么“规则”导致生成名称
python-my-python-project
?
其具体格式因 Compose 的实现而异。 对于当前的 Docker-plugin Compose 工具版本 2,镜像名称的规则来自于一个名为
GetImageNameOrDefault
的函数:它由 Compose 项目名称、连字符和特定的 Compose 服务名称组成。 类似的规则适用于生成的容器名称,包括复制容器的副本编号。 (基于 Python 的 Compose 版本 1 在这些名称中使用下划线。)
这套规则意味着以下几点:
container_name:
,因为 Compose 可以生成唯一的名称。 大多数 docker
CLI 命令都有 docker compose
等效命令,可以在 docker-compose.yml
文件中按名称查找服务。image:
时,无需手动指定 build:
,除非您专门计划将映像推送到注册表。
services:
something:
build: .
image: registry.example.com/project/something:${SOMETHING_TAG:-latest}
db
或 app
之类的短名称在此特定 Compose 项目的上下文中将是明确的。