[{"data":1,"prerenderedAt":364},["ShallowReactive",2],{"navigation_docs":3,"-docs-deploy-docker-images":130,"-docs-deploy-docker-images-surround":359},[4,25,70,90,115],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":6},"Getting started",false,"\u002Fdocs\u002Fgetting-started","docs\u002F1.getting-started",[10,15,20],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fdocs\u002Fgetting-started\u002Fintroduction","docs\u002F1.getting-started\u002F1.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":19},"Installation","\u002Fdocs\u002Fgetting-started\u002Finstallation","docs\u002F1.getting-started\u002F2.installation","i-lucide-terminal",{"title":21,"path":22,"stem":23,"icon":24},"Quickstart","\u002Fdocs\u002Fgetting-started\u002Fquickstart","docs\u002F1.getting-started\u002F3.quickstart","i-lucide-rocket",{"title":26,"icon":6,"path":27,"stem":28,"children":29,"page":6},"Deploy","\u002Fdocs\u002Fdeploy","docs\u002F2.deploy",[30,35,40,45,50,55,60,65],{"title":31,"path":32,"stem":33,"icon":34},"Projects and services","\u002Fdocs\u002Fdeploy\u002Fprojects-and-services","docs\u002F2.deploy\u002F1.projects-and-services","i-lucide-folder-kanban",{"title":36,"path":37,"stem":38,"icon":39},"Docker images","\u002Fdocs\u002Fdeploy\u002Fdocker-images","docs\u002F2.deploy\u002F2.docker-images","i-lucide-container",{"title":41,"path":42,"stem":43,"icon":44},"Git repositories","\u002Fdocs\u002Fdeploy\u002Fgit-repositories","docs\u002F2.deploy\u002F3.git-repositories","i-lucide-git-branch",{"title":46,"path":47,"stem":48,"icon":49},"Databases","\u002Fdocs\u002Fdeploy\u002Fdatabases","docs\u002F2.deploy\u002F4.databases","i-lucide-database",{"title":51,"path":52,"stem":53,"icon":54},"Environment variables","\u002Fdocs\u002Fdeploy\u002Fenvironment-variables","docs\u002F2.deploy\u002F5.environment-variables","i-lucide-key-round",{"title":56,"path":57,"stem":58,"icon":59},"Deployments and logs","\u002Fdocs\u002Fdeploy\u002Fdeployments","docs\u002F2.deploy\u002F6.deployments","i-lucide-scroll-text",{"title":61,"path":62,"stem":63,"icon":64},"Deploy hooks","\u002Fdocs\u002Fdeploy\u002Fdeploy-hooks","docs\u002F2.deploy\u002F7.deploy-hooks","i-lucide-webhook",{"title":66,"path":67,"stem":68,"icon":69},"Domains and HTTPS","\u002Fdocs\u002Fdeploy\u002Fdomains","docs\u002F2.deploy\u002F8.domains","i-lucide-lock",{"title":71,"icon":6,"path":72,"stem":73,"children":74,"page":6},"Backups","\u002Fdocs\u002Fbackups","docs\u002F3.backups",[75,80,85],{"title":76,"path":77,"stem":78,"icon":79},"Backup destinations","\u002Fdocs\u002Fbackups\u002Fbackup-destinations","docs\u002F3.backups\u002F1.backup-destinations","i-lucide-hard-drive-upload",{"title":81,"path":82,"stem":83,"icon":84},"Database backups","\u002Fdocs\u002Fbackups\u002Fdatabase-backups","docs\u002F3.backups\u002F2.database-backups","i-lucide-archive-restore",{"title":86,"path":87,"stem":88,"icon":89},"Backing up Harblet","\u002Fdocs\u002Fbackups\u002Fharblet-backups","docs\u002F3.backups\u002F3.harblet-backups","i-lucide-shield-check",{"title":91,"icon":6,"path":92,"stem":93,"children":94,"page":6},"Administration","\u002Fdocs\u002Fadministration","docs\u002F4.administration",[95,100,105,110],{"title":96,"path":97,"stem":98,"icon":99},"Harblet's domain","\u002Fdocs\u002Fadministration\u002Fharblet-domain","docs\u002F4.administration\u002F1.harblet-domain","i-lucide-globe",{"title":101,"path":102,"stem":103,"icon":104},"Servers","\u002Fdocs\u002Fadministration\u002Fservers","docs\u002F4.administration\u002F2.servers","i-lucide-server",{"title":106,"path":107,"stem":108,"icon":109},"Team and account","\u002Fdocs\u002Fadministration\u002Fteam","docs\u002F4.administration\u002F3.team","i-lucide-users",{"title":111,"path":112,"stem":113,"icon":114},"Updates","\u002Fdocs\u002Fadministration\u002Fupdates","docs\u002F4.administration\u002F4.updates","i-lucide-refresh-cw",{"title":116,"icon":6,"path":117,"stem":118,"children":119,"page":6},"Reference","\u002Fdocs\u002Freference","docs\u002F5.reference",[120,125],{"title":121,"path":122,"stem":123,"icon":124},"Troubleshooting","\u002Fdocs\u002Freference\u002Ftroubleshooting","docs\u002F5.reference\u002F1.troubleshooting","i-lucide-life-buoy",{"title":126,"path":127,"stem":128,"icon":129},"License","\u002Fdocs\u002Freference\u002Flicense","docs\u002F5.reference\u002F2.license","i-lucide-scale",{"id":131,"title":36,"body":132,"description":352,"extension":353,"links":354,"meta":355,"navigation":356,"path":37,"seo":357,"stem":38,"__hash__":358},"docs\u002Fdocs\u002F2.deploy\u002F2.docker-images.md",{"type":133,"value":134,"toc":339},"minimark",[135,139,144,208,218,226,230,233,273,277,280,304,311,315],[136,137,138],"p",{},"An image service runs a Docker image from a registry such as Docker Hub or GitHub Container Registry.",[140,141,143],"h2",{"id":142},"create-an-image-service","Create an image service",[145,146,148,153,165,169,197,201],"steps",{"level":147},"3",[149,150,152],"h3",{"id":151},"open-the-project","Open the project",[136,154,155,156,160,161,164],{},"Open a project and click ",[157,158,159],"strong",{},"New service"," → ",[157,162,163],{},"Docker image",".",[149,166,168],{"id":167},"fill-in-the-form","Fill in the form",[170,171,172,182,193],"field-group",{},[173,174,177,178,164],"field",{"name":175,":required":176},"Name","true","Up to 64 characters, for example ",[179,180,181],"code",{},"Web",[173,183,185,186,189,190,164],{"name":184,":required":176},"Image","The image with its tag, for example ",[179,187,188],{},"nginx:latest"," or ",[179,191,192],{},"ghcr.io\u002Facme\u002Fweb:1.4",[173,194,196],{"name":195},"Port","The port your app listens on, from 1 to 65535. Leave it empty if the service doesn't take requests, such as a worker.",[149,198,200],{"id":199},"create-it","Create it",[136,202,203,204,207],{},"Click ",[157,205,206],{},"Create service",". Harblet deploys the image right away.",[136,209,210,211,214,215,164],{},"Follow the deployment on the service's ",[157,212,213],{},"Deployments"," tab. See ",[216,217,56],"a",{"href":57},[219,220,221,222,225],"warning",{},"Harblet pulls images without credentials, so the image must be public. To deploy private code, use a ",[216,223,224],{"href":42},"Git repository"," instead.",[140,227,229],{"id":228},"deploy-a-new-version","Deploy a new version",[136,231,232],{},"Every deploy pulls the image's tag again. To ship a new version:",[234,235,236,254],"ul",{},[237,238,239,242,243,246,247,249,250,253],"li",{},[157,240,241],{},"Under the same tag,"," for example ",[179,244,245],{},"latest",": push the new image, then click ",[157,248,26],{},", or call the service's ",[216,251,252],{"href":62},"deploy hook"," from your pipeline.",[237,255,256,259,260,262,263,266,267,270,271,164],{},[157,257,258],{},"Under a new tag:"," change ",[157,261,184],{}," under ",[157,264,265],{},"Settings",", click ",[157,268,269],{},"Save",", then click ",[157,272,26],{},[140,274,276],{"id":275},"the-port","The port",[136,278,279],{},"The port tells Harblet where your app takes requests. Harblet uses it for:",[234,281,282,290,298],{},[237,283,284,285,289],{},"the service's ",[216,286,288],{"href":287},"\u002Fdocs\u002Fdeploy\u002Fprojects-and-services#connect-services-to-each-other","internal address",", which other services in the project connect to,",[237,291,292,293,297],{},"the ",[216,294,296],{"href":295},"\u002Fdocs\u002Fdeploy\u002Fdeployments#health-checks","health check"," of every new deployment,",[237,299,300,301,164],{},"traffic from the service's ",[216,302,303],{"href":67},"domains",[136,305,306,307,310],{},"Harblet doesn't pass the port to an image service. Configure the image to listen on it, usually with an ",[216,308,309],{"href":52},"environment variable"," the image documents.",[140,312,314],{"id":313},"things-to-know","Things to know",[234,316,317,323,333],{},[237,318,319,322],{},[157,320,321],{},"The container must keep running."," A container that exits, such as a one-off task, counts as crashed and fails the deployment.",[237,324,325,328,329,332],{},[157,326,327],{},"Files on the container's disk don't last."," They are lost on every deploy and restart. Keep data in a ",[216,330,331],{"href":47},"database"," or in external storage.",[237,334,335,338],{},[157,336,337],{},"Restarts pull again."," A service that runs a tag asks its registry for the image every time it starts, also after a server reboot. If the registry can't be reached, the service stays down until it can.",{"title":340,"searchDepth":341,"depth":341,"links":342},"",2,[343,349,350,351],{"id":142,"depth":341,"text":143,"children":344},[345,347,348],{"id":151,"depth":346,"text":152},3,{"id":167,"depth":346,"text":168},{"id":199,"depth":346,"text":200},{"id":228,"depth":341,"text":229},{"id":275,"depth":341,"text":276},{"id":313,"depth":341,"text":314},"Run a public Docker image as a service.","md",null,{},{"icon":39},{"title":36,"description":352},"woByiK-iLkGql-AiEWnlf_ArcjjXj66_mjV_OqRFTiI",[360,362],{"title":31,"path":32,"stem":33,"description":361,"icon":34,"children":-1},"Group the services of one app in a project, and connect them over the project's private network.",{"title":41,"path":42,"stem":43,"description":363,"icon":44,"children":-1},"Build a Git repository with its Dockerfile or with Railpack, from public URLs or private GitHub and GitLab repositories.",1794744118022]