version: "3.3"

services:
  foo:
    cap_add:
      - ALL

    cap_drop:
      - NET_ADMIN
      - SYS_ADMIN

    cgroup_parent: m-executor-abcd

    # String or list
    command: bundle exec thin -p 3000
    # command: ["bundle", "exec", "thin", "-p", "3000"]

    container_name: my-web-container

    depends_on:
      - db
      - redis

    deploy:
      mode: replicated
      replicas: 6
      labels: [FOO=BAR]
      update_config:
        parallelism: 3
        delay: 10s
        failure_action: continue
        monitor: 60s
        max_failure_ratio: 0.3
      resources:
        limits:
          cpus: '0.001'
          memory: 50M
        reservations:
          cpus: '0.0001'
          memory: 20M
      restart_policy:
        condition: on_failure
        delay: 5s
        max_attempts: 3
        window: 120s
      placement:
        constraints: [node=foo]
        preferences:
          - spread: node.labels.az
      endpoint_mode: dnsrr

    devices:
      - "/dev/ttyUSB0:/dev/ttyUSB0"

    # String or list
    # dns: 8.8.8.8
    dns:
      - 8.8.8.8
      - 9.9.9.9

    # String or list
    # dns_search: example.com
    dns_search:
      - dc1.example.com
      - dc2.example.com

    domainname: foo.com

    # String or list
    # entrypoint: /code/entrypoint.sh -p 3000
    entrypoint: ["/code/entrypoint.sh", "-p", "3000"]

    # String or list
    # env_file: .env
    env_file:
      - ./example1.env
      - ./example2.env

    # Mapping or list
    # Mapping values can be strings, numbers or null
    # Booleans are not allowed - must be quoted
    environment:
      BAZ: baz_from_service_def
      QUX:
    # environment:
    #   - RACK_ENV=development
    #   - SHOW=true
    #   - SESSION_SECRET

    # Items can be strings or numbers
    expose:
     - "3000"
     - 8000

    external_links:
      - redis_1
      - project_db_1:mysql
      - project_db_1:postgresql

    # Mapping or list
    # Mapping values must be strings
    # extra_hosts:
    #   somehost: "162.242.195.82"
    #   otherhost: "50.31.209.229"
    extra_hosts:
      - "somehost:162.242.195.82"
      - "otherhost:50.31.209.229"

    hostname: foo

    healthcheck:
      test: echo "hello world"
      interval: 10s
      timeout: 1s
      retries: 5

    # Any valid image reference - repo, tag, id, sha
    image: redis
    # image: ubuntu:14.04
    # image: tutum/influxdb
    # image: example-registry.com:4000/postgresql
    # image: a4bc65fd
    # image: busybox@sha256:38a203e1986cf79639cfb9b2e1d6e773de84002feea2d4eb006b52004ee8502d

    ipc: host

    # Mapping or list
    # Mapping values can be strings, numbers or null
    labels:
      com.example.description: "Accounting webapp"
      com.example.number: 42
      com.example.empty-label:
    # labels:
    #   - "com.example.description=Accounting webapp"
    #   - "com.example.number=42"
    #   - "com.example.empty-label"

    links:
     - db
     - db:database
     - redis

    logging:
      driver: syslog
      options:
        syslog-address: "tcp://192.168.0.42:123"

    mac_address: 02:42:ac:11:65:43

    # network_mode: "bridge"
    # network_mode: "host"
    # network_mode: "none"
    # Use the network mode of an arbitrary container from another service
    # network_mode: "service:db"
    # Use the network mode of another container, specified by name or id
    # network_mode: "container:some-container"
    network_mode: "container:0cfeab0f748b9a743dc3da582046357c6ef497631c1a016d28d2bf9b4f899f7b"

    networks:
      some-network:
        aliases:
         - alias1
         - alias3
      other-network:
        ipv4_address: 172.16.238.10
        ipv6_address: 2001:3984:3989::10
      other-other-network:

    pid: "host"

    ports:
      - 3000
      - "3000-3005"
      - "8000:8000"
      - "9090-9091:8080-8081"
      - "49100:22"
      - "127.0.0.1:8001:8001"
      - "127.0.0.1:5000-5010:5000-5010"

    privileged: true

    read_only: true

    restart: always

    security_opt:
      - label=level:s0:c100,c200
      - label=type:svirt_apache_t

    stdin_open: true

    stop_grace_period: 20s

    stop_signal: SIGUSR1

    # String or list
    # tmpfs: /run
    tmpfs:
      - /run
      - /tmp

    tty: true

    ulimits:
      # Single number or mapping with soft + hard limits
      nproc: 65535
      nofile:
        soft: 20000
        hard: 40000

    user: someone

    volumes:
      # Just specify a path and let the Engine create a volume
      - /var/lib/mysql
      # Specify an absolute path mapping
      - /opt/data:/var/lib/mysql
      # Path on the host, relative to the Compose file
      - .:/code
      - ./static:/var/www/html
      # User-relative path
      - ~/configs:/etc/configs/:ro
      # Named volume
      - datavolume:/var/lib/mysql
      - type: bind
        source: ./opt
        target: /opt
        consistency: cached

    working_dir: /code

networks:
  # Entries can be null, which specifies simply that a network
  # called "{project name}_some-network" should be created and
  # use the default driver
  some-network:

  other-network:
    driver: overlay

    driver_opts:
      # Values can be strings or numbers
      foo: "bar"
      baz: 1

    ipam:
      driver: overlay
      # driver_opts:
      #   # Values can be strings or numbers
      #   com.docker.network.enable_ipv6: "true"
      #   com.docker.network.numeric_value: 1
      config:
      - subnet: 172.16.238.0/24
        # gateway: 172.16.238.1
      - subnet: 2001:3984:3989::/64
        # gateway: 2001:3984:3989::1

  external-network:
    # Specifies that a pre-existing network called "external-network"
    # can be referred to within this file as "external-network"
    external: true

  other-external-network:
    # Specifies that a pre-existing network called "my-cool-network"
    # can be referred to within this file as "other-external-network"
    external:
      name: my-cool-network

volumes:
  # Entries can be null, which specifies simply that a volume
  # called "{project name}_some-volume" should be created and
  # use the default driver
  some-volume:

  other-volume:
    driver: flocker

    driver_opts:
      # Values can be strings or numbers
      foo: "bar"
      baz: 1

  external-volume:
    # Specifies that a pre-existing volume called "external-volume"
    # can be referred to within this file as "external-volume"
    external: true

  other-external-volume:
    # Specifies that a pre-existing volume called "my-cool-volume"
    # can be referred to within this file as "other-external-volume"
    external:
      name: my-cool-volume
