version: "3.13"
services:
  foo:
    build:
      context: ./dir
      dockerfile: Dockerfile
      args:
        foo: bar
      labels:
        FOO: BAR
      cache_from:
        - foo
        - bar
      extra_hosts:
        - ipv4.example.com:127.0.0.1
        - ipv6.example.com:::1
      network: foo
      target: foo
    cap_add:
      - ALL
    cap_drop:
      - NET_ADMIN
      - SYS_ADMIN
    cgroup_parent: m-executor-abcd
    command:
      - bundle
      - exec
      - thin
      - -p
      - "3000"
    configs:
      - source: config1
      - source: config2
        target: /my_config
        uid: "103"
        gid: "103"
        mode: 288
    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: 1m0s
        max_failure_ratio: 0.3
        order: start-first
      rollback_config:
        parallelism: 3
        delay: 10s
        failure_action: continue
        monitor: 1m0s
        max_failure_ratio: 0.3
        order: start-first
      resources:
        limits:
          cpus: "0.001"
          memory: "52428800"
          pids: 100
        reservations:
          cpus: "0.0001"
          memory: "20971520"
          generic_resources:
            - discrete_resource_spec:
                kind: gpu
                value: 2
            - discrete_resource_spec:
                kind: ssd
                value: 1
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3
        window: 2m0s
      placement:
        constraints:
          - node=foo
        preferences:
          - spread: node.labels.az
        max_replicas_per_node: 5
      endpoint_mode: dnsrr
    devices:
      - /dev/ttyUSB0:/dev/ttyUSB0
    dns:
      - 8.8.8.8
      - 9.9.9.9
    dns_search:
      - dc1.example.com
      - dc2.example.com
    domainname: foo.com
    entrypoint:
      - /code/entrypoint.sh
      - -p
      - "3000"
    environment:
      BAR: bar_from_env_file_2
      BAZ: baz_from_service_def
      FOO: foo_from_env_file
      QUX: qux_from_environment
    env_file:
      - ./example1.env
      - ./example2.env
    expose:
      - "3000"
      - "8000"
    external_links:
      - redis_1
      - project_db_1:mysql
      - project_db_1:postgresql
    extra_hosts:
      - somehost:162.242.195.82
      - otherhost:50.31.209.229
      - host.docker.internal:host-gateway
    hostname: foo
    healthcheck:
      test:
        - CMD-SHELL
        - echo "hello world"
      timeout: 1s
      interval: 10s
      retries: 5
      start_period: 15s
      start_interval: 1s
    image: redis
    ipc: host
    labels:
      com.example.description: Accounting webapp
      com.example.empty-label: ""
      com.example.number: "42"
    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: container:0cfeab0f748b9a743dc3da582046357c6ef497631c1a016d28d2bf9b4f899f7b
    networks:
      other-network:
        ipv4_address: 172.16.238.10
        ipv6_address: 2001:3984:3989::10
      other-other-network: null
      some-network:
        aliases:
          - alias1
          - alias3
        driver_opts:
          driveropt1: optval1
          driveropt2: optval2
    pid: host
    ports:
      - mode: ingress
        target: 3000
        protocol: tcp
      - mode: ingress
        target: 3001
        protocol: tcp
      - mode: ingress
        target: 3002
        protocol: tcp
      - mode: ingress
        target: 3003
        protocol: tcp
      - mode: ingress
        target: 3004
        protocol: tcp
      - mode: ingress
        target: 3005
        protocol: tcp
      - mode: ingress
        target: 8000
        published: 8000
        protocol: tcp
      - mode: ingress
        target: 8080
        published: 9090
        protocol: tcp
      - mode: ingress
        target: 8081
        published: 9091
        protocol: tcp
      - mode: ingress
        target: 22
        published: 49100
        protocol: tcp
      - mode: ingress
        target: 8001
        published: 8001
        protocol: tcp
      - mode: ingress
        target: 5000
        published: 5000
        protocol: tcp
      - mode: ingress
        target: 5001
        published: 5001
        protocol: tcp
      - mode: ingress
        target: 5002
        published: 5002
        protocol: tcp
      - mode: ingress
        target: 5003
        published: 5003
        protocol: tcp
      - mode: ingress
        target: 5004
        published: 5004
        protocol: tcp
      - mode: ingress
        target: 5005
        published: 5005
        protocol: tcp
      - mode: ingress
        target: 5006
        published: 5006
        protocol: tcp
      - mode: ingress
        target: 5007
        published: 5007
        protocol: tcp
      - mode: ingress
        target: 5008
        published: 5008
        protocol: tcp
      - mode: ingress
        target: 5009
        published: 5009
        protocol: tcp
      - mode: ingress
        target: 5010
        published: 5010
        protocol: tcp
    privileged: true
    read_only: true
    restart: always
    secrets:
      - source: secret1
      - source: secret2
        target: my_secret
        uid: "103"
        gid: "103"
        mode: 288
    security_opt:
      - label=level:s0:c100,c200
      - label=type:svirt_apache_t
    stdin_open: true
    stop_grace_period: 20s
    stop_signal: SIGUSR1
    sysctls:
      net.core.somaxconn: "1024"
      net.ipv4.tcp_syncookies: "0"
    tmpfs:
      - /run
      - /tmp
    tty: true
    ulimits:
      nofile:
        soft: 20000
        hard: 40000
      nproc: 65535
    user: someone
    volumes:
      - type: volume
        target: /var/lib/mysql
      - type: bind
        source: /opt/data
        target: /var/lib/mysql
      - type: bind
        source: /foo
        target: /code
      - type: bind
        source: /foo/static
        target: /var/www/html
      - type: bind
        source: /bar/configs
        target: /etc/configs/
        read_only: true
      - type: volume
        source: datavolume
        target: /var/lib/mysql
      - type: bind
        source: /foo/opt
        target: /opt
        consistency: cached
      - type: tmpfs
        target: /opt
        tmpfs:
          size: 10000
      - type: cluster
        source: group:mygroup
        target: /srv
    working_dir: /code
    x-bar: baz
    x-foo: bar
networks:
  external-network:
    name: external-network
    external: true
  other-external-network:
    name: my-cool-network
    external: true
    x-bar: baz
    x-foo: bar
  other-network:
    driver: overlay
    driver_opts:
      baz: "1"
      foo: bar
    ipam:
      driver: overlay
      config:
        - subnet: 172.16.238.0/24
        - subnet: 2001:3984:3989::/64
    labels:
      foo: bar
  some-network: {}
volumes:
  another-volume:
    name: user_specified_name
    driver: vsphere
    driver_opts:
      baz: "1"
      foo: bar
  cluster-volume:
    driver: my-csi-driver
    x-cluster-spec:
      group: mygroup
      access_mode:
        scope: single
        sharing: none
        block_volume: {}
      accessibility_requirements:
        requisite:
          - segments:
              region: R1
              zone: Z1
          - segments:
              region: R1
              zone: Z2
        preferred:
          - segments:
              region: R1
              zone: Z1
      capacity_range:
        required_bytes: "1073741824"
        limit_bytes: "8589934592"
      secrets:
        - key: mycsisecret
          secret: secret1
        - key: mycsisecret2
          secret: secret4
      availability: active
  external-volume:
    name: external-volume
    external: true
  external-volume3:
    name: this-is-volume3
    external: true
    x-bar: baz
    x-foo: bar
  other-external-volume:
    name: my-cool-volume
    external: true
  other-volume:
    driver: flocker
    driver_opts:
      baz: "1"
      foo: bar
    labels:
      foo: bar
  some-volume: {}
secrets:
  secret1:
    file: /foo/secret_data
    labels:
      foo: bar
  secret2:
    name: my_secret
    external: true
  secret3:
    name: secret3
    external: true
  secret4:
    name: bar
    file: /foo
    x-bar: baz
    x-foo: bar
configs:
  config1:
    file: /foo/config_data
    labels:
      foo: bar
  config2:
    name: my_config
    external: true
  config3:
    name: config3
    external: true
  config4:
    name: foo
    file: /foo
    x-bar: baz
    x-foo: bar
x-bar: baz
x-foo: bar
x-nested:
  bar: baz
  foo: bar
