为什么 Docker 无视我的 container_name 规定?
Why is Docker ignoring my container_name stipulation?
我是 运行 一个 Docker 包含一个主要服务和两个主要服务的组合文件。主服务所依赖的子服务,如下:
docker-compose run -p hlp-api --service-ports web
这一切都很好。然而,虽然子服务以我想要的名称结束,但主要服务的名称基于我输入的项目令牌 (hlp-api
) 加上一个丑陋的自动生成的附件。
为什么主要 'web' 服务没有以我在其 container_name
参数中指定的名称结尾?
docker-compose.yml:
version: '2'
services:
# web service
web:
container_name: hlp-api-web
build:
context: .
dockerfile: Dockerfile
command: /bin/sh -c "gem install bundler && bundle install && rails server --port 3000 --binding 0.0.0.0"
ports:
- 3000:3000
- 5432:5432
- 2222:2222
volumes:
- ./webapp:/opt/webapp
- ../:/app:cached
- bundle:/usr/local/bundle
- rails_cache:/app/tmp/cache
- node_modules:/app/node_modules
depends_on:
- postgres
- ngrok
# database
postgres:
container_name: hlp-api-db
image: postgres:14.2
volumes:
- .psqlrc:/root/.psqlrc:ro
- dbdat:/var/lib/postgresql/data
- ./log:/root/log:cached
- ./latest.dump:/latest.dump
environment:
POSTGRES_DB: hlp-api-dev
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
DB_PORT: 5432
ports:
- 5432
healthcheck:
test: pg_isready -U postgres -h 127.0.0.1
interval: 5s
# ngrok
ngrok:
container_name: hlp-api-ngrok
image: ngrok/ngrok:latest
environment:
- NGROK_AUTHTOKEN
command: http host.docker.internal:3000
volumes:
web:
bundle:
dbdat:
node_modules:
rails_cache:
我猜,出于同样的原因,您必须明确使用 --service-ports
,他们决定不希望名称冲突,因为他们不希望发生端口冲突。
如果 docker compose run
命令会遵守该名称,这意味着当您想要 运行 命令时,您总是必须指定一个名称,如果容器已经 运行ning,因为它会一遍又一遍地尝试分配相同的名称。
好处是您可以提供一个名称,因为您可以要求它遵守已发布的端口:
docker-compose run -p hlp-api --service-ports --name hlp-api-web web
相关:
- https://github.com/docker/compose/issues/2061, and more specifically: this comment
docker-compose run
旨在将 one-off 容器启动为 运行 临时命令。它将启动命名容器 depends_on:
的服务。它实际上并没有启动 docker-compose.yml
中描述的特定容器,而是一个具有不同名称和不同命令的相关容器。
如果要实际启动 docker-compose.yml
文件中列出的容器,请使用 docker-compose up
。
docker-compose run
的典型用途是调用数据库迁移,例如:
# Start the entire system
docker-compose up -d
# Start a new temporary container, with the same image and setup
# as the normal Rails container, to run migrations
docker-compose run web \
bundle exec rails db:migrate
我是 运行 一个 Docker 包含一个主要服务和两个主要服务的组合文件。主服务所依赖的子服务,如下:
docker-compose run -p hlp-api --service-ports web
这一切都很好。然而,虽然子服务以我想要的名称结束,但主要服务的名称基于我输入的项目令牌 (hlp-api
) 加上一个丑陋的自动生成的附件。
为什么主要 'web' 服务没有以我在其 container_name
参数中指定的名称结尾?
docker-compose.yml:
version: '2'
services:
# web service
web:
container_name: hlp-api-web
build:
context: .
dockerfile: Dockerfile
command: /bin/sh -c "gem install bundler && bundle install && rails server --port 3000 --binding 0.0.0.0"
ports:
- 3000:3000
- 5432:5432
- 2222:2222
volumes:
- ./webapp:/opt/webapp
- ../:/app:cached
- bundle:/usr/local/bundle
- rails_cache:/app/tmp/cache
- node_modules:/app/node_modules
depends_on:
- postgres
- ngrok
# database
postgres:
container_name: hlp-api-db
image: postgres:14.2
volumes:
- .psqlrc:/root/.psqlrc:ro
- dbdat:/var/lib/postgresql/data
- ./log:/root/log:cached
- ./latest.dump:/latest.dump
environment:
POSTGRES_DB: hlp-api-dev
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
DB_PORT: 5432
ports:
- 5432
healthcheck:
test: pg_isready -U postgres -h 127.0.0.1
interval: 5s
# ngrok
ngrok:
container_name: hlp-api-ngrok
image: ngrok/ngrok:latest
environment:
- NGROK_AUTHTOKEN
command: http host.docker.internal:3000
volumes:
web:
bundle:
dbdat:
node_modules:
rails_cache:
我猜,出于同样的原因,您必须明确使用 --service-ports
,他们决定不希望名称冲突,因为他们不希望发生端口冲突。
如果 docker compose run
命令会遵守该名称,这意味着当您想要 运行 命令时,您总是必须指定一个名称,如果容器已经 运行ning,因为它会一遍又一遍地尝试分配相同的名称。
好处是您可以提供一个名称,因为您可以要求它遵守已发布的端口:
docker-compose run -p hlp-api --service-ports --name hlp-api-web web
相关:
- https://github.com/docker/compose/issues/2061, and more specifically: this comment
docker-compose run
旨在将 one-off 容器启动为 运行 临时命令。它将启动命名容器 depends_on:
的服务。它实际上并没有启动 docker-compose.yml
中描述的特定容器,而是一个具有不同名称和不同命令的相关容器。
如果要实际启动 docker-compose.yml
文件中列出的容器,请使用 docker-compose up
。
docker-compose run
的典型用途是调用数据库迁移,例如:
# Start the entire system
docker-compose up -d
# Start a new temporary container, with the same image and setup
# as the normal Rails container, to run migrations
docker-compose run web \
bundle exec rails db:migrate