skip to Main Content

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

2

Answers


  1. What you’re doing in the docker run command is the following mounting:

    ${PWD}/local/otel-config.yaml on the local host to /otel-local-config.yaml from inside the docker

    You can achieve same behavior with volumes option from docker compose:

    volumes:

    • "${PWD}/local/otel-config.yaml":/otel-local-config.yaml
    Login or Signup to reply.
  2. 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.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search