{"id":30508,"date":"2022-06-28T21:29:12","date_gmt":"2022-06-28T21:29:12","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=30508"},"modified":"2025-07-12T05:41:40","modified_gmt":"2025-07-12T05:41:40","slug":"github-actions-workflow-example-build-and-push-docker-images-to-docker-hub","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/github-actions-workflow-example-build-and-push-docker-images-to-docker-hub\/","title":{"rendered":"Github Actions: Workflow Example Build and push Docker images to Docker Hub"},"content":{"rendered":"\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">name: ci\n\n<span class=\"hljs-attr\">on<\/span>:\n  push:\n    branches:\n      - <span class=\"hljs-string\">'main'<\/span>\n\n<span class=\"hljs-attr\">jobs<\/span>:\n  docker:\n    runs-on: ubuntu-latest\n    <span class=\"hljs-attr\">steps<\/span>:\n      -\n        name: <span class=\"hljs-built_in\">Set<\/span> up QEMU\n        <span class=\"hljs-attr\">uses<\/span>: docker\/setup-qemu-action@v2\n      -\n        name: <span class=\"hljs-built_in\">Set<\/span> up Docker Buildx\n        <span class=\"hljs-attr\">uses<\/span>: docker\/setup-buildx-action@v2\n      -\n        name: Login to DockerHub\n        <span class=\"hljs-attr\">uses<\/span>: docker\/login-action@v2\n        <span class=\"hljs-attr\">with<\/span>:\n          username: ${{ secrets.DOCKERHUB_USERNAME }}\n          <span class=\"hljs-attr\">password<\/span>: ${{ secrets.DOCKERHUB_TOKEN }}\n      -\n        name: Build and push\n        <span class=\"hljs-attr\">uses<\/span>: docker\/build-push-action@v3\n        <span class=\"hljs-attr\">with<\/span>:\n          push: <span class=\"hljs-literal\">true<\/span>\n          <span class=\"hljs-attr\">tags<\/span>: user\/app:latest<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">name: ci\n\n<span class=\"hljs-attr\">on<\/span>:\n  push:\n    branches:\n      - <span class=\"hljs-string\">'main'<\/span>\n\n<span class=\"hljs-attr\">jobs<\/span>:\n  docker:\n    runs-on: ubuntu-latest\n    <span class=\"hljs-attr\">steps<\/span>:\n      -\n        name: Checkout\n        <span class=\"hljs-attr\">uses<\/span>: actions\/checkout@v3\n      -\n        name: <span class=\"hljs-built_in\">Set<\/span> up QEMU\n        <span class=\"hljs-attr\">uses<\/span>: docker\/setup-qemu-action@v2\n      -\n        name: <span class=\"hljs-built_in\">Set<\/span> up Docker Buildx\n        <span class=\"hljs-attr\">uses<\/span>: docker\/setup-buildx-action@v2\n      -\n        name: Login to DockerHub\n        <span class=\"hljs-attr\">uses<\/span>: docker\/login-action@v2\n        <span class=\"hljs-attr\">with<\/span>:\n          username: ${{ secrets.DOCKERHUB_USERNAME }}\n          <span class=\"hljs-attr\">password<\/span>: ${{ secrets.DOCKERHUB_TOKEN }}\n      -\n        name: Build and push\n        <span class=\"hljs-attr\">uses<\/span>: docker\/build-push-action@v3\n        <span class=\"hljs-attr\">with<\/span>:\n          context: .\n          push: <span class=\"hljs-literal\">true<\/span>\n          <span class=\"hljs-attr\">tags<\/span>: user\/app:latest<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">steps:\n  - uses: actions\/checkout@v2\n    name: Check out code\n\n  - uses: mr-smithers-excellent\/docker-build-push@v5\n    name: Build &amp; push Docker image\n    with:\n      image: repo\/image\n      tags: v1, latest\n      registry: registry-url.io\n      dockerfile: Dockerfile.ci\n      username: ${{ secrets.DOCKER_USERNAME }}\n      password: ${{ secrets.DOCKER_PASSWORD }}<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">name: Java CI\n\non: &#91;push]\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n\n    steps:\n      - uses: actions\/checkout@v3\n      - name: Set up JDK <span class=\"hljs-number\">17<\/span>\n        uses: actions\/setup-java@v3\n        with:\n          java-version: <span class=\"hljs-string\">'17'<\/span>\n          distribution: <span class=\"hljs-string\">'adopt'<\/span>\n      - name: Build with Maven\n        run: mvn --batch-mode --update-snapshots package\n\n      <span class=\"hljs-comment\"># Build and push Docker image<\/span>\n      <span class=\"hljs-comment\"># https:\/\/github.com\/marketplace\/actions\/docker-build-push-action<\/span>\n      <span class=\"hljs-comment\"># echo $PAT | docker login ghcr.io --username phanatic --password-stdin<\/span>\n      <span class=\"hljs-comment\"># docker tag app ghcr.io\/phanatic\/app:1.0.0<\/span>\n      <span class=\"hljs-comment\"># docker push ghcr.io\/phanatic\/app:1.0.0<\/span>\n\n     - uses: mr-smithers-excellent\/docker-build-push@v5\n       name: Build &amp; push Docker image\n       with:\n        image: repo\/image\n        tags: v1, latest\n        registry: ghcr.io\n        githubOrg: org\n        dockerfile: Dockerfile\n        username: ${{ secrets.DOCKER_USERNAME }}\n        password: ${{ secrets.DOCKER_PASSWORD }}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\"># This workflow uses actions that are not certified by GitHub.\r\n# They are provided by a third-party and are governed by\r\n# separate terms of service, privacy policy, and support\r\n# documentation.hh\r\n\r\nname: Publish Docker image\r\n\r\non:\r\n  push:\r\n    branches: &#91;'main']\r\n\r\njobs:\r\n  push_to_registry:\r\n    name: Push Docker image to Docker Hub\r\n    runs-on: ubuntu-latest\r\n    steps:\r\n      - name: Check out the repo\r\n        uses: actions\/checkout@v3\r\n      \r\n      - name: Log in to Docker Hub\r\n        uses: docker\/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9\r\n        with:\r\n          username: ${{ secrets.DOCKER_USERNAME }}\r\n          password: ${{ secrets.DOCKER_PASSWORD }}\r\n      \r\n      - name: Extract metadata (tags, labels) for Docker\r\n        id: meta\r\n        uses: docker\/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38\r\n        with:\r\n          images: my-docker-hub-namespace\/my-docker-hub-repository\r\n      \r\n      - name: Build and push Docker image\r\n        uses: docker\/build-push-action@ad44023a93711e3deb337508980b4b5e9bcdc5dc\r\n        with:\r\n          context: .\r\n          push: true\r\n          tags: ${{ steps.meta.outputs.tags }}\r\n          labels: ${{ steps.meta.outputs.labels }}<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\"># This workflow uses actions that are not certified by GitHub.\r\n# They are provided by a third-party and are governed by\r\n# separate terms of service, privacy policy, and support\r\n# documentation.\r\n\r\nname: Publish Docker image\r\n\r\non:\r\n  release:\r\n    types: &#91;published]\r\n\r\njobs:\r\n  push_to_registry:\r\n    name: Push Docker image to Docker Hub\r\n    runs-on: ubuntu-latest\r\n    steps:\r\n      - name: Check out the repo\r\n        uses: actions\/checkout@v3\r\n      \r\n      - name: Log in to Docker Hub\r\n        uses: docker\/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9\r\n        with:\r\n          username: ${{ secrets.DOCKER_USERNAME }}\r\n          password: ${{ secrets.DOCKER_PASSWORD }}\r\n      \r\n      - name: Extract metadata (tags, labels) for Docker\r\n        id: meta\r\n        uses: docker\/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38\r\n        with:\r\n          images: my-docker-hub-namespace\/my-docker-hub-repository\r\n      \r\n      - name: Build and push Docker image\r\n        uses: docker\/build-push-action@ad44023a93711e3deb337508980b4b5e9bcdc5dc\r\n        with:\r\n          context: .\r\n          push: true\r\n          tags: ${{ steps.meta.outputs.tags }}\r\n          labels: ${{ steps.meta.outputs.labels }}<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[4862],"tags":[],"class_list":["post-30508","post","type-post","status-publish","format-standard","hentry","category-docker"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/30508","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=30508"}],"version-history":[{"count":4,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/30508\/revisions"}],"predecessor-version":[{"id":30538,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/30508\/revisions\/30538"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=30508"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=30508"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=30508"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}