为什么 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

相关:

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