[{"data":1,"prerenderedAt":1386},["ShallowReactive",2],{"blog-docker-compose-file-reference":3},{"id":4,"title":5,"body":6,"category":1375,"date":1376,"description":1377,"extension":1378,"meta":1379,"navigation":213,"path":1380,"readingTime":110,"seo":1381,"stem":1382,"tool":1383,"updated":1384,"__hash__":1385},"blog\u002Fblog\u002Fdocker-compose-file-reference.md","Docker Compose File Reference",{"type":7,"value":8,"toc":1355},"minimark",[9,26,29,34,231,244,247,252,342,346,388,398,416,420,474,477,518,521,548,552,635,639,682,689,693,716,720,791,794,892,895,899,903,1170,1174,1180,1269,1275,1279,1339,1343,1351],[10,11,12,13,17,18,21,22,25],"p",{},"Docker Compose defines multi-container applications in a single YAML file. Instead of running multiple ",[14,15,16],"code",{},"docker run"," commands with complex flags, you declare your entire stack — web servers, databases, caches, workers — in ",[14,19,20],{},"compose.yaml"," and bring it up with ",[14,23,24],{},"docker compose up",".",[10,27,28],{},"This reference covers the most commonly used Compose directives with practical examples.",[30,31,33],"h2",{"id":32},"basic-structure","Basic Structure",[35,36,41],"pre",{"className":37,"code":38,"language":39,"meta":40,"style":40},"language-yaml shiki shiki-themes github-light github-dark","services:\n  web:\n    image: nginx:alpine\n    ports:\n      - \"8080:80\"\n  \n  api:\n    build: .\u002Fapi\n    ports:\n      - \"3000:3000\"\n    depends_on:\n      - db\n  \n  db:\n    image: postgres:16\n    environment:\n      POSTGRES_PASSWORD: secret\n    volumes:\n      - pgdata:\u002Fvar\u002Flib\u002Fpostgresql\u002Fdata\n\nvolumes:\n  pgdata:\n","yaml","",[14,42,43,56,64,77,85,94,100,108,119,126,134,142,150,155,163,173,181,192,200,208,215,223],{"__ignoreMap":40},[44,45,48,52],"span",{"class":46,"line":47},"line",1,[44,49,51],{"class":50},"s9eBZ","services",[44,53,55],{"class":54},"sVt8B",":\n",[44,57,59,62],{"class":46,"line":58},2,[44,60,61],{"class":50},"  web",[44,63,55],{"class":54},[44,65,67,70,73],{"class":46,"line":66},3,[44,68,69],{"class":50},"    image",[44,71,72],{"class":54},": ",[44,74,76],{"class":75},"sZZnC","nginx:alpine\n",[44,78,80,83],{"class":46,"line":79},4,[44,81,82],{"class":50},"    ports",[44,84,55],{"class":54},[44,86,88,91],{"class":46,"line":87},5,[44,89,90],{"class":54},"      - ",[44,92,93],{"class":75},"\"8080:80\"\n",[44,95,97],{"class":46,"line":96},6,[44,98,99],{"class":54},"  \n",[44,101,103,106],{"class":46,"line":102},7,[44,104,105],{"class":50},"  api",[44,107,55],{"class":54},[44,109,111,114,116],{"class":46,"line":110},8,[44,112,113],{"class":50},"    build",[44,115,72],{"class":54},[44,117,118],{"class":75},".\u002Fapi\n",[44,120,122,124],{"class":46,"line":121},9,[44,123,82],{"class":50},[44,125,55],{"class":54},[44,127,129,131],{"class":46,"line":128},10,[44,130,90],{"class":54},[44,132,133],{"class":75},"\"3000:3000\"\n",[44,135,137,140],{"class":46,"line":136},11,[44,138,139],{"class":50},"    depends_on",[44,141,55],{"class":54},[44,143,145,147],{"class":46,"line":144},12,[44,146,90],{"class":54},[44,148,149],{"class":75},"db\n",[44,151,153],{"class":46,"line":152},13,[44,154,99],{"class":54},[44,156,158,161],{"class":46,"line":157},14,[44,159,160],{"class":50},"  db",[44,162,55],{"class":54},[44,164,166,168,170],{"class":46,"line":165},15,[44,167,69],{"class":50},[44,169,72],{"class":54},[44,171,172],{"class":75},"postgres:16\n",[44,174,176,179],{"class":46,"line":175},16,[44,177,178],{"class":50},"    environment",[44,180,55],{"class":54},[44,182,184,187,189],{"class":46,"line":183},17,[44,185,186],{"class":50},"      POSTGRES_PASSWORD",[44,188,72],{"class":54},[44,190,191],{"class":75},"secret\n",[44,193,195,198],{"class":46,"line":194},18,[44,196,197],{"class":50},"    volumes",[44,199,55],{"class":54},[44,201,203,205],{"class":46,"line":202},19,[44,204,90],{"class":54},[44,206,207],{"class":75},"pgdata:\u002Fvar\u002Flib\u002Fpostgresql\u002Fdata\n",[44,209,211],{"class":46,"line":210},20,[44,212,214],{"emptyLinePlaceholder":213},true,"\n",[44,216,218,221],{"class":46,"line":217},21,[44,219,220],{"class":50},"volumes",[44,222,55],{"class":54},[44,224,226,229],{"class":46,"line":225},22,[44,227,228],{"class":50},"  pgdata",[44,230,55],{"class":54},[10,232,233,234,236,237,239,240,243],{},"A Compose file has three top-level keys: ",[14,235,51],{}," (required), ",[14,238,220],{}," (optional), and ",[14,241,242],{},"networks"," (optional).",[30,245,246],{"id":51},"Services",[248,249,251],"h3",{"id":250},"image-vs-build","Image vs Build",[35,253,255],{"className":37,"code":254,"language":39,"meta":40,"style":40},"services:\n  # Use a pre-built image\n  redis:\n    image: redis:7-alpine\n\n  # Build from a Dockerfile\n  api:\n    build:\n      context: .\u002Fapi\n      dockerfile: Dockerfile\n      args:\n        NODE_ENV: production\n",[14,256,257,263,269,276,285,289,294,300,306,315,325,332],{"__ignoreMap":40},[44,258,259,261],{"class":46,"line":47},[44,260,51],{"class":50},[44,262,55],{"class":54},[44,264,265],{"class":46,"line":58},[44,266,268],{"class":267},"sJ8bj","  # Use a pre-built image\n",[44,270,271,274],{"class":46,"line":66},[44,272,273],{"class":50},"  redis",[44,275,55],{"class":54},[44,277,278,280,282],{"class":46,"line":79},[44,279,69],{"class":50},[44,281,72],{"class":54},[44,283,284],{"class":75},"redis:7-alpine\n",[44,286,287],{"class":46,"line":87},[44,288,214],{"emptyLinePlaceholder":213},[44,290,291],{"class":46,"line":96},[44,292,293],{"class":267},"  # Build from a Dockerfile\n",[44,295,296,298],{"class":46,"line":102},[44,297,105],{"class":50},[44,299,55],{"class":54},[44,301,302,304],{"class":46,"line":110},[44,303,113],{"class":50},[44,305,55],{"class":54},[44,307,308,311,313],{"class":46,"line":121},[44,309,310],{"class":50},"      context",[44,312,72],{"class":54},[44,314,118],{"class":75},[44,316,317,320,322],{"class":46,"line":128},[44,318,319],{"class":50},"      dockerfile",[44,321,72],{"class":54},[44,323,324],{"class":75},"Dockerfile\n",[44,326,327,330],{"class":46,"line":136},[44,328,329],{"class":50},"      args",[44,331,55],{"class":54},[44,333,334,337,339],{"class":46,"line":144},[44,335,336],{"class":50},"        NODE_ENV",[44,338,72],{"class":54},[44,340,341],{"class":75},"production\n",[248,343,345],{"id":344},"ports","Ports",[35,347,349],{"className":37,"code":348,"language":39,"meta":40,"style":40},"ports:\n  - \"8080:80\"          # host:container\n  - \"3000:3000\"        # same port\n  - \"127.0.0.1:9090:9090\"  # bind to localhost only\n",[14,350,351,357,368,378],{"__ignoreMap":40},[44,352,353,355],{"class":46,"line":47},[44,354,344],{"class":50},[44,356,55],{"class":54},[44,358,359,362,365],{"class":46,"line":58},[44,360,361],{"class":54},"  - ",[44,363,364],{"class":75},"\"8080:80\"",[44,366,367],{"class":267},"          # host:container\n",[44,369,370,372,375],{"class":46,"line":66},[44,371,361],{"class":54},[44,373,374],{"class":75},"\"3000:3000\"",[44,376,377],{"class":267},"        # same port\n",[44,379,380,382,385],{"class":46,"line":79},[44,381,361],{"class":54},[44,383,384],{"class":75},"\"127.0.0.1:9090:9090\"",[44,386,387],{"class":267},"  # bind to localhost only\n",[10,389,390,391,394,395,397],{},"Use ",[14,392,393],{},"expose"," instead of ",[14,396,344],{}," for container-to-container communication without host binding:",[35,399,401],{"className":37,"code":400,"language":39,"meta":40,"style":40},"expose:\n  - \"6379\"\n",[14,402,403,409],{"__ignoreMap":40},[44,404,405,407],{"class":46,"line":47},[44,406,393],{"class":50},[44,408,55],{"class":54},[44,410,411,413],{"class":46,"line":58},[44,412,361],{"class":54},[44,414,415],{"class":75},"\"6379\"\n",[248,417,419],{"id":418},"environment-variables","Environment Variables",[35,421,423],{"className":37,"code":422,"language":39,"meta":40,"style":40},"environment:\n  DATABASE_URL: postgres:\u002F\u002Fuser:pass@db:5432\u002Fmyapp\n  NODE_ENV: production\n\n# Or from a file\nenv_file:\n  - .env\n",[14,424,425,432,442,451,455,460,467],{"__ignoreMap":40},[44,426,427,430],{"class":46,"line":47},[44,428,429],{"class":50},"environment",[44,431,55],{"class":54},[44,433,434,437,439],{"class":46,"line":58},[44,435,436],{"class":50},"  DATABASE_URL",[44,438,72],{"class":54},[44,440,441],{"class":75},"postgres:\u002F\u002Fuser:pass@db:5432\u002Fmyapp\n",[44,443,444,447,449],{"class":46,"line":66},[44,445,446],{"class":50},"  NODE_ENV",[44,448,72],{"class":54},[44,450,341],{"class":75},[44,452,453],{"class":46,"line":79},[44,454,214],{"emptyLinePlaceholder":213},[44,456,457],{"class":46,"line":87},[44,458,459],{"class":267},"# Or from a file\n",[44,461,462,465],{"class":46,"line":96},[44,463,464],{"class":50},"env_file",[44,466,55],{"class":54},[44,468,469,471],{"class":46,"line":102},[44,470,361],{"class":54},[44,472,473],{"class":75},".env\n",[248,475,476],{"id":220},"Volumes",[35,478,480],{"className":37,"code":479,"language":39,"meta":40,"style":40},"volumes:\n  - .\u002Fsrc:\u002Fapp\u002Fsrc          # bind mount (host path)\n  - node_modules:\u002Fapp\u002Fnode_modules  # named volume\n  - \u002Fapp\u002Fdist               # anonymous volume\n",[14,481,482,488,498,508],{"__ignoreMap":40},[44,483,484,486],{"class":46,"line":47},[44,485,220],{"class":50},[44,487,55],{"class":54},[44,489,490,492,495],{"class":46,"line":58},[44,491,361],{"class":54},[44,493,494],{"class":75},".\u002Fsrc:\u002Fapp\u002Fsrc",[44,496,497],{"class":267},"          # bind mount (host path)\n",[44,499,500,502,505],{"class":46,"line":66},[44,501,361],{"class":54},[44,503,504],{"class":75},"node_modules:\u002Fapp\u002Fnode_modules",[44,506,507],{"class":267},"  # named volume\n",[44,509,510,512,515],{"class":46,"line":79},[44,511,361],{"class":54},[44,513,514],{"class":75},"\u002Fapp\u002Fdist",[44,516,517],{"class":267},"               # anonymous volume\n",[10,519,520],{},"Named volumes persist data across container restarts and recreations:",[35,522,524],{"className":37,"code":523,"language":39,"meta":40,"style":40},"volumes:\n  pgdata:\n    driver: local\n",[14,525,526,532,538],{"__ignoreMap":40},[44,527,528,530],{"class":46,"line":47},[44,529,220],{"class":50},[44,531,55],{"class":54},[44,533,534,536],{"class":46,"line":58},[44,535,228],{"class":50},[44,537,55],{"class":54},[44,539,540,543,545],{"class":46,"line":66},[44,541,542],{"class":50},"    driver",[44,544,72],{"class":54},[44,546,547],{"class":75},"local\n",[248,549,551],{"id":550},"health-checks","Health Checks",[35,553,555],{"className":37,"code":554,"language":39,"meta":40,"style":40},"healthcheck:\n  test: [\"CMD\", \"curl\", \"-f\", \"http:\u002F\u002Flocalhost:3000\u002Fhealth\"]\n  interval: 30s\n  timeout: 10s\n  retries: 3\n  start_period: 40s\n",[14,556,557,564,594,604,614,625],{"__ignoreMap":40},[44,558,559,562],{"class":46,"line":47},[44,560,561],{"class":50},"healthcheck",[44,563,55],{"class":54},[44,565,566,569,572,575,578,581,583,586,588,591],{"class":46,"line":58},[44,567,568],{"class":50},"  test",[44,570,571],{"class":54},": [",[44,573,574],{"class":75},"\"CMD\"",[44,576,577],{"class":54},", ",[44,579,580],{"class":75},"\"curl\"",[44,582,577],{"class":54},[44,584,585],{"class":75},"\"-f\"",[44,587,577],{"class":54},[44,589,590],{"class":75},"\"http:\u002F\u002Flocalhost:3000\u002Fhealth\"",[44,592,593],{"class":54},"]\n",[44,595,596,599,601],{"class":46,"line":66},[44,597,598],{"class":50},"  interval",[44,600,72],{"class":54},[44,602,603],{"class":75},"30s\n",[44,605,606,609,611],{"class":46,"line":79},[44,607,608],{"class":50},"  timeout",[44,610,72],{"class":54},[44,612,613],{"class":75},"10s\n",[44,615,616,619,621],{"class":46,"line":87},[44,617,618],{"class":50},"  retries",[44,620,72],{"class":54},[44,622,624],{"class":623},"sj4cs","3\n",[44,626,627,630,632],{"class":46,"line":96},[44,628,629],{"class":50},"  start_period",[44,631,72],{"class":54},[44,633,634],{"class":75},"40s\n",[248,636,638],{"id":637},"dependencies","Dependencies",[35,640,642],{"className":37,"code":641,"language":39,"meta":40,"style":40},"depends_on:\n  db:\n    condition: service_healthy\n  redis:\n    condition: service_started\n",[14,643,644,651,657,667,673],{"__ignoreMap":40},[44,645,646,649],{"class":46,"line":47},[44,647,648],{"class":50},"depends_on",[44,650,55],{"class":54},[44,652,653,655],{"class":46,"line":58},[44,654,160],{"class":50},[44,656,55],{"class":54},[44,658,659,662,664],{"class":46,"line":66},[44,660,661],{"class":50},"    condition",[44,663,72],{"class":54},[44,665,666],{"class":75},"service_healthy\n",[44,668,669,671],{"class":46,"line":79},[44,670,273],{"class":50},[44,672,55],{"class":54},[44,674,675,677,679],{"class":46,"line":87},[44,676,661],{"class":50},[44,678,72],{"class":54},[44,680,681],{"class":75},"service_started\n",[10,683,684,685,688],{},"Using ",[14,686,687],{},"condition: service_healthy"," waits for the dependency's health check to pass before starting.",[248,690,692],{"id":691},"restart-policy","Restart Policy",[35,694,696],{"className":37,"code":695,"language":39,"meta":40,"style":40},"restart: unless-stopped  # restart on failure and on daemon restart, but not if manually stopped\n# Other options: \"no\", \"always\", \"on-failure\"\n",[14,697,698,711],{"__ignoreMap":40},[44,699,700,703,705,708],{"class":46,"line":47},[44,701,702],{"class":50},"restart",[44,704,72],{"class":54},[44,706,707],{"class":75},"unless-stopped",[44,709,710],{"class":267},"  # restart on failure and on daemon restart, but not if manually stopped\n",[44,712,713],{"class":46,"line":58},[44,714,715],{"class":267},"# Other options: \"no\", \"always\", \"on-failure\"\n",[248,717,719],{"id":718},"resource-limits","Resource Limits",[35,721,723],{"className":37,"code":722,"language":39,"meta":40,"style":40},"deploy:\n  resources:\n    limits:\n      cpus: \"0.5\"\n      memory: 512M\n    reservations:\n      cpus: \"0.25\"\n      memory: 256M\n",[14,724,725,732,739,746,756,766,773,782],{"__ignoreMap":40},[44,726,727,730],{"class":46,"line":47},[44,728,729],{"class":50},"deploy",[44,731,55],{"class":54},[44,733,734,737],{"class":46,"line":58},[44,735,736],{"class":50},"  resources",[44,738,55],{"class":54},[44,740,741,744],{"class":46,"line":66},[44,742,743],{"class":50},"    limits",[44,745,55],{"class":54},[44,747,748,751,753],{"class":46,"line":79},[44,749,750],{"class":50},"      cpus",[44,752,72],{"class":54},[44,754,755],{"class":75},"\"0.5\"\n",[44,757,758,761,763],{"class":46,"line":87},[44,759,760],{"class":50},"      memory",[44,762,72],{"class":54},[44,764,765],{"class":75},"512M\n",[44,767,768,771],{"class":46,"line":96},[44,769,770],{"class":50},"    reservations",[44,772,55],{"class":54},[44,774,775,777,779],{"class":46,"line":102},[44,776,750],{"class":50},[44,778,72],{"class":54},[44,780,781],{"class":75},"\"0.25\"\n",[44,783,784,786,788],{"class":46,"line":110},[44,785,760],{"class":50},[44,787,72],{"class":54},[44,789,790],{"class":75},"256M\n",[30,792,793],{"id":242},"Networks",[35,795,797],{"className":37,"code":796,"language":39,"meta":40,"style":40},"services:\n  web:\n    networks:\n      - frontend\n  api:\n    networks:\n      - frontend\n      - backend\n  db:\n    networks:\n      - backend\n\nnetworks:\n  frontend:\n  backend:\n",[14,798,799,805,811,818,825,831,837,843,850,856,862,868,872,878,885],{"__ignoreMap":40},[44,800,801,803],{"class":46,"line":47},[44,802,51],{"class":50},[44,804,55],{"class":54},[44,806,807,809],{"class":46,"line":58},[44,808,61],{"class":50},[44,810,55],{"class":54},[44,812,813,816],{"class":46,"line":66},[44,814,815],{"class":50},"    networks",[44,817,55],{"class":54},[44,819,820,822],{"class":46,"line":79},[44,821,90],{"class":54},[44,823,824],{"class":75},"frontend\n",[44,826,827,829],{"class":46,"line":87},[44,828,105],{"class":50},[44,830,55],{"class":54},[44,832,833,835],{"class":46,"line":96},[44,834,815],{"class":50},[44,836,55],{"class":54},[44,838,839,841],{"class":46,"line":102},[44,840,90],{"class":54},[44,842,824],{"class":75},[44,844,845,847],{"class":46,"line":110},[44,846,90],{"class":54},[44,848,849],{"class":75},"backend\n",[44,851,852,854],{"class":46,"line":121},[44,853,160],{"class":50},[44,855,55],{"class":54},[44,857,858,860],{"class":46,"line":128},[44,859,815],{"class":50},[44,861,55],{"class":54},[44,863,864,866],{"class":46,"line":136},[44,865,90],{"class":54},[44,867,849],{"class":75},[44,869,870],{"class":46,"line":144},[44,871,214],{"emptyLinePlaceholder":213},[44,873,874,876],{"class":46,"line":152},[44,875,242],{"class":50},[44,877,55],{"class":54},[44,879,880,883],{"class":46,"line":157},[44,881,882],{"class":50},"  frontend",[44,884,55],{"class":54},[44,886,887,890],{"class":46,"line":165},[44,888,889],{"class":50},"  backend",[44,891,55],{"class":54},[10,893,894],{},"Services on the same network can reach each other by service name. Separate networks isolate traffic.",[30,896,898],{"id":897},"common-patterns","Common Patterns",[248,900,902],{"id":901},"web-app-database-cache","Web App + Database + Cache",[35,904,906],{"className":37,"code":905,"language":39,"meta":40,"style":40},"services:\n  app:\n    build: .\n    ports:\n      - \"3000:3000\"\n    environment:\n      DATABASE_URL: postgres:\u002F\u002Fuser:pass@db:5432\u002Fapp\n      REDIS_URL: redis:\u002F\u002Fcache:6379\n    depends_on:\n      db:\n        condition: service_healthy\n      cache:\n        condition: service_started\n\n  db:\n    image: postgres:16-alpine\n    environment:\n      POSTGRES_USER: user\n      POSTGRES_PASSWORD: pass\n      POSTGRES_DB: app\n    volumes:\n      - pgdata:\u002Fvar\u002Flib\u002Fpostgresql\u002Fdata\n    healthcheck:\n      test: [\"CMD-SHELL\", \"pg_isready -U user\"]\n      interval: 10s\n      timeout: 5s\n      retries: 5\n\n  cache:\n    image: redis:7-alpine\n\nvolumes:\n  pgdata:\n",[14,907,908,914,921,930,936,942,948,958,968,974,981,990,997,1005,1009,1015,1024,1030,1040,1049,1059,1065,1071,1079,1097,1107,1118,1129,1134,1142,1151,1156,1163],{"__ignoreMap":40},[44,909,910,912],{"class":46,"line":47},[44,911,51],{"class":50},[44,913,55],{"class":54},[44,915,916,919],{"class":46,"line":58},[44,917,918],{"class":50},"  app",[44,920,55],{"class":54},[44,922,923,925,927],{"class":46,"line":66},[44,924,113],{"class":50},[44,926,72],{"class":54},[44,928,929],{"class":623},".\n",[44,931,932,934],{"class":46,"line":79},[44,933,82],{"class":50},[44,935,55],{"class":54},[44,937,938,940],{"class":46,"line":87},[44,939,90],{"class":54},[44,941,133],{"class":75},[44,943,944,946],{"class":46,"line":96},[44,945,178],{"class":50},[44,947,55],{"class":54},[44,949,950,953,955],{"class":46,"line":102},[44,951,952],{"class":50},"      DATABASE_URL",[44,954,72],{"class":54},[44,956,957],{"class":75},"postgres:\u002F\u002Fuser:pass@db:5432\u002Fapp\n",[44,959,960,963,965],{"class":46,"line":110},[44,961,962],{"class":50},"      REDIS_URL",[44,964,72],{"class":54},[44,966,967],{"class":75},"redis:\u002F\u002Fcache:6379\n",[44,969,970,972],{"class":46,"line":121},[44,971,139],{"class":50},[44,973,55],{"class":54},[44,975,976,979],{"class":46,"line":128},[44,977,978],{"class":50},"      db",[44,980,55],{"class":54},[44,982,983,986,988],{"class":46,"line":136},[44,984,985],{"class":50},"        condition",[44,987,72],{"class":54},[44,989,666],{"class":75},[44,991,992,995],{"class":46,"line":144},[44,993,994],{"class":50},"      cache",[44,996,55],{"class":54},[44,998,999,1001,1003],{"class":46,"line":152},[44,1000,985],{"class":50},[44,1002,72],{"class":54},[44,1004,681],{"class":75},[44,1006,1007],{"class":46,"line":157},[44,1008,214],{"emptyLinePlaceholder":213},[44,1010,1011,1013],{"class":46,"line":165},[44,1012,160],{"class":50},[44,1014,55],{"class":54},[44,1016,1017,1019,1021],{"class":46,"line":175},[44,1018,69],{"class":50},[44,1020,72],{"class":54},[44,1022,1023],{"class":75},"postgres:16-alpine\n",[44,1025,1026,1028],{"class":46,"line":183},[44,1027,178],{"class":50},[44,1029,55],{"class":54},[44,1031,1032,1035,1037],{"class":46,"line":194},[44,1033,1034],{"class":50},"      POSTGRES_USER",[44,1036,72],{"class":54},[44,1038,1039],{"class":75},"user\n",[44,1041,1042,1044,1046],{"class":46,"line":202},[44,1043,186],{"class":50},[44,1045,72],{"class":54},[44,1047,1048],{"class":75},"pass\n",[44,1050,1051,1054,1056],{"class":46,"line":210},[44,1052,1053],{"class":50},"      POSTGRES_DB",[44,1055,72],{"class":54},[44,1057,1058],{"class":75},"app\n",[44,1060,1061,1063],{"class":46,"line":217},[44,1062,197],{"class":50},[44,1064,55],{"class":54},[44,1066,1067,1069],{"class":46,"line":225},[44,1068,90],{"class":54},[44,1070,207],{"class":75},[44,1072,1074,1077],{"class":46,"line":1073},23,[44,1075,1076],{"class":50},"    healthcheck",[44,1078,55],{"class":54},[44,1080,1082,1085,1087,1090,1092,1095],{"class":46,"line":1081},24,[44,1083,1084],{"class":50},"      test",[44,1086,571],{"class":54},[44,1088,1089],{"class":75},"\"CMD-SHELL\"",[44,1091,577],{"class":54},[44,1093,1094],{"class":75},"\"pg_isready -U user\"",[44,1096,593],{"class":54},[44,1098,1100,1103,1105],{"class":46,"line":1099},25,[44,1101,1102],{"class":50},"      interval",[44,1104,72],{"class":54},[44,1106,613],{"class":75},[44,1108,1110,1113,1115],{"class":46,"line":1109},26,[44,1111,1112],{"class":50},"      timeout",[44,1114,72],{"class":54},[44,1116,1117],{"class":75},"5s\n",[44,1119,1121,1124,1126],{"class":46,"line":1120},27,[44,1122,1123],{"class":50},"      retries",[44,1125,72],{"class":54},[44,1127,1128],{"class":623},"5\n",[44,1130,1132],{"class":46,"line":1131},28,[44,1133,214],{"emptyLinePlaceholder":213},[44,1135,1137,1140],{"class":46,"line":1136},29,[44,1138,1139],{"class":50},"  cache",[44,1141,55],{"class":54},[44,1143,1145,1147,1149],{"class":46,"line":1144},30,[44,1146,69],{"class":50},[44,1148,72],{"class":54},[44,1150,284],{"class":75},[44,1152,1154],{"class":46,"line":1153},31,[44,1155,214],{"emptyLinePlaceholder":213},[44,1157,1159,1161],{"class":46,"line":1158},32,[44,1160,220],{"class":50},[44,1162,55],{"class":54},[44,1164,1166,1168],{"class":46,"line":1165},33,[44,1167,228],{"class":50},[44,1169,55],{"class":54},[248,1171,1173],{"id":1172},"development-vs-production","Development vs Production",[10,1175,390,1176,1179],{},[14,1177,1178],{},"compose.override.yaml"," for development-specific settings (auto-loaded by Docker Compose):",[35,1181,1183],{"className":37,"code":1182,"language":39,"meta":40,"style":40},"# compose.yaml (base)\nservices:\n  api:\n    image: myapp:latest\n\n# compose.override.yaml (development)\nservices:\n  api:\n    build: .\n    volumes:\n      - .\u002Fsrc:\u002Fapp\u002Fsrc\n    environment:\n      DEBUG: \"true\"\n",[14,1184,1185,1190,1196,1202,1211,1215,1220,1226,1232,1240,1246,1253,1259],{"__ignoreMap":40},[44,1186,1187],{"class":46,"line":47},[44,1188,1189],{"class":267},"# compose.yaml (base)\n",[44,1191,1192,1194],{"class":46,"line":58},[44,1193,51],{"class":50},[44,1195,55],{"class":54},[44,1197,1198,1200],{"class":46,"line":66},[44,1199,105],{"class":50},[44,1201,55],{"class":54},[44,1203,1204,1206,1208],{"class":46,"line":79},[44,1205,69],{"class":50},[44,1207,72],{"class":54},[44,1209,1210],{"class":75},"myapp:latest\n",[44,1212,1213],{"class":46,"line":87},[44,1214,214],{"emptyLinePlaceholder":213},[44,1216,1217],{"class":46,"line":96},[44,1218,1219],{"class":267},"# compose.override.yaml (development)\n",[44,1221,1222,1224],{"class":46,"line":102},[44,1223,51],{"class":50},[44,1225,55],{"class":54},[44,1227,1228,1230],{"class":46,"line":110},[44,1229,105],{"class":50},[44,1231,55],{"class":54},[44,1233,1234,1236,1238],{"class":46,"line":121},[44,1235,113],{"class":50},[44,1237,72],{"class":54},[44,1239,929],{"class":623},[44,1241,1242,1244],{"class":46,"line":128},[44,1243,197],{"class":50},[44,1245,55],{"class":54},[44,1247,1248,1250],{"class":46,"line":136},[44,1249,90],{"class":54},[44,1251,1252],{"class":75},".\u002Fsrc:\u002Fapp\u002Fsrc\n",[44,1254,1255,1257],{"class":46,"line":144},[44,1256,178],{"class":50},[44,1258,55],{"class":54},[44,1260,1261,1264,1266],{"class":46,"line":152},[44,1262,1263],{"class":50},"      DEBUG",[44,1265,72],{"class":54},[44,1267,1268],{"class":75},"\"true\"\n",[10,1270,1271,1272],{},"For production, use a separate file: ",[14,1273,1274],{},"docker compose -f compose.yaml -f compose.prod.yaml up",[30,1276,1278],{"id":1277},"common-mistakes","Common Mistakes",[1280,1281,1282,1300,1306,1317,1333],"ol",{},[1283,1284,1285,1292,1293,1296,1297,25],"li",{},[1286,1287,684,1288,1291],"strong",{},[14,1289,1290],{},"latest"," tag in production"," — ",[14,1294,1295],{},"image: postgres:latest"," can change at any time. Pin specific versions: ",[14,1298,1299],{},"postgres:16.2-alpine",[1283,1301,1302,1305],{},[1286,1303,1304],{},"Storing secrets in compose.yaml"," — environment variables in the file are visible in version control. Use Docker secrets or external secret management.",[1283,1307,1308,1292,1311,1313,1314,1316],{},[1286,1309,1310],{},"Not using health checks with depends_on",[14,1312,648],{}," without ",[14,1315,687],{}," only waits for the container to start, not for the service to be ready.",[1283,1318,1319,1322,1323,1326,1327,1330,1331,25],{},[1286,1320,1321],{},"Bind mounts overwriting node_modules"," — mounting ",[14,1324,1325],{},".\u002F:\u002Fapp"," overwrites the container's ",[14,1328,1329],{},"node_modules",". Use a named volume for ",[14,1332,1329],{},[1283,1334,1335,1338],{},[1286,1336,1337],{},"Not declaring volumes"," — data in containers is ephemeral. If the container is recreated, any data not in a volume is lost.",[30,1340,1342],{"id":1341},"generate-templates","Generate Templates",[10,1344,1345,1350],{},[1346,1347,1349],"a",{"href":1348},"\u002Ftools\u002Finfrastructure-template","StackCache Docker & Kubernetes Templates"," generates validated Dockerfile, Compose, and Kubernetes YAML starting points for common stacks — all locally in your browser.",[1352,1353,1354],"style",{},"html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":40,"searchDepth":58,"depth":58,"links":1356},[1357,1358,1368,1369,1373,1374],{"id":32,"depth":58,"text":33},{"id":51,"depth":58,"text":246,"children":1359},[1360,1361,1362,1363,1364,1365,1366,1367],{"id":250,"depth":66,"text":251},{"id":344,"depth":66,"text":345},{"id":418,"depth":66,"text":419},{"id":220,"depth":66,"text":476},{"id":550,"depth":66,"text":551},{"id":637,"depth":66,"text":638},{"id":691,"depth":66,"text":692},{"id":718,"depth":66,"text":719},{"id":242,"depth":58,"text":793},{"id":897,"depth":58,"text":898,"children":1370},[1371,1372],{"id":901,"depth":66,"text":902},{"id":1172,"depth":66,"text":1173},{"id":1277,"depth":58,"text":1278},{"id":1341,"depth":58,"text":1342},"DevOps","2026-09-08","A practical guide to writing Docker Compose files. Covers services, networks, volumes, environment variables, health checks, and common patterns.","md",{},"\u002Fblog\u002Fdocker-compose-file-reference",{"title":5,"description":1377},"blog\u002Fdocker-compose-file-reference","infrastructure-template",null,"Jx86pjgHV7mZEFcEOHoDRaWlB_0EsGv9Y-PXkWh6nOM",1788868139417]