Search code examples
dockerasp.net-coredocker-composejaegeropen-telemetry

What is the difference between docker run --config vs docker compose config?


So what I am looking at is a docker run command being used in to create a docker container for open telemetry that passes in a config command, and the code looks like...

$ git clone [email protected]:open-telemetry/opentelemetry-collector.git; \
    cd opentelemetry-collector/examples; \
    go build main.go; ./main & pid1="$!";
    docker run --rm -p 13133:13133 -p 14250:14250 -p 14268:14268 \
      -p 55678-55679:55678-55679 -p 4317:4317 -p 8888:8888 -p 9411:9411 \
      -v "${PWD}/local/otel-config.yaml":/otel-local-config.yaml \
      --name otelcol otel/opentelemetry-collector \
      --config otel-local-config.yaml; \
    kill $pid1; docker stop otelcol

(https://opentelemetry.io/docs/collector/getting-started/#docker)

What I don't understand is how a non-docker related config file(open telemetry config) fits into the "docker run --config" or "docker compose config" commands. Below is the open telemetry config file that seems to be non-docker related

extensions:
  memory_ballast:
    size_mib: 512
  zpages:
    endpoint: 0.0.0.0:55679

receivers:
  otlp:
    protocols:
      grpc:
      http:

processors:
  batch:
  memory_limiter:
    # 75% of maximum memory up to 4G
    limit_mib: 1536
    # 25% of limit up to 2G
    spike_limit_mib: 512
    check_interval: 5s

exporters:
  logging:
    logLevel: debug

service:
  pipelines:
    traces:
      receivers: [otlp]
      processors: [memory_limiter, batch]
      exporters: [logging]
    metrics:
      receivers: [otlp]
      processors: [memory_limiter, batch]
      exporters: [logging]

  extensions: [memory_ballast, zpages]

https://github.com/open-telemetry/opentelemetry-collector/blob/main/examples/local/otel-config.yaml

Now I have looked at these Docker links

https://docs.docker.com/engine/swarm/configs/#how-docker-manages-configs

https://nickjanetakis.com/blog/docker-tip-43-using-the-docker-compose-config-command

but I couldn't figure out how to get the docker run --config command in the open telemetry example to start working in docker compose with docker compose config. Here is my docker compose

version: "3.9"

services:
  opentelemetry:
    container_name: otel
    image: otel/opentelemetry-collector:latest
    volumes:
      - ~/source/repos/CritterTrackerProject/DockerServices/OpenTelemetry/otel-collector-config.yml:/otel-local-config.yml
    config:
      - otel-local-config.yml
    ports:
      - 13133:13133
      - 14250:14250
      - 14268:14268
      - 55678-55679:55678-55679
      - 4317:4317
      - 8888:8888
      - 9411:9411
    extra_hosts:
      - "host.docker.internal:host-gateway"
    networks:
      - my-network

  jaeger:
    # restart: unless-stopped
    container_name: jaeger
    image: jaegertracing/all-in-one:latest
    ports:
      - 16686:16686
      # - 14250:14250
      # - 14268:14268
      # - 5775:5775/udp
      - 6831:6831/udp
      # - 6832:6832/udp
      # - 5778:5778
      # - 9411:9411
    extra_hosts:
      - "host.docker.internal:host-gateway"
    networks:
      - my-network

  postgres:
   restart: always
   container_name: postgres
   image: postgres:latest
   environment:
     - POSTGRES_USER=code
     - POSTGRES_PASSWORD=code
   ports:
     - 5432:5432
   volumes: 
     - postgres:/var/lib/postgresql/data
   extra_hosts:
     - "host.docker.internal:host-gateway"
   networks:
     - my-network

  nginx:
    restart: always
    container_name: webserver
    image: nginx:latest
    build:
      context: ~/source/repos/CritterTrackerProject
      dockerfile: DockerServices/Nginx/Dockerfile
    ports:
      - 80:80
      - 443:443
    extra_hosts:
      - "host.docker.internal:host-gateway"
    networks:
      - my-network

volumes:
  postgres:

networks:
  my-network:
    external: true
    name: my-network

Here is my error after running docker compose up in a Git Bash terminal

$ docker compose -f ./DockerServices/docker-compose.yml up -d
services.opentelemetry Additional property config is not allowed


Solution

  • The general form of docker run is

    docker run [docker options] image [command]
    

    And if you look at your original command it matches this pattern

    docker run \
      --rm -p ... -v ... --name ... \  # Docker options
      otel/opentelemetry-collector \   # Image
      --config otel-local-config.yaml  # Command
    

    So what looks like a --config option is really the command part of the container setup; it overrides the Dockerfile CMD, and it is passed as additional arguments to the image's ENTRYPOINT.

    In a Compose setup, then, this would be the container's command:.

    services:
      opentelemetry:
        image: otel/opentelemetry-collector:latest
        command: --config otel-local-config.yaml
    

    Since this is an application-specific command string, it's unrelated to the docker-compose config command, which is a diagnostic tool that just dumps out parts of your Compose configuration.