341 words
2 minutes
[Docker] Basic Dockerfile with Github action
Dockerfile
Normal dockerfile for a nodejs applications, and we assume a simple node.js express code can be build with the folllowing dockerfile.
Inside dockerfile
FROM node:lts WORKDIR /usr/src/app COPY . . EXPOSE 8080 CMD yarn install && \ node index.js
We have assume the express.js
open the port at 8080
, and run with node index.js
. Depends on your code, you may change this dockerfile
content to your elements.
Run file
In Terminal
, build with the following command.
docker build -t <your-image-tag> . # e.g. docker build -t nodeserver .
With postgresql images
Inside docker-compose.yml
version: '3' services: nodeserver: environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres POSTGRES_DB: dummy_db POSTGRES_HOST: db NODE_ENV: production PORT: 8080 depends_on: - db build: context: ./ dockerfile: ./Dockerfile image: 'nodeserver:latest' ports: - '8080:8080' db: image: postgres:15.1-alpine3.16 environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres POSTGRES_DB: dummy_db ports: - '25432:5432' volumes: - ./pgdata:/var/lib/postgresql/data
With Github Action and Docker Hub
The following section focus in how to build your own code in github action runtime, build the images in github VM and push to Docker hub
.
In your Github repo
, the struction should be like this:
. ├──.github │ └── workflows │ └── ci.yml ├── backend │ ├── Dockerfile │ └── Other stuff... ├── frontend │ └── Other stuff... └── docker-compose.yml
The {{ secrets.DOCKERHUB_USERNAME }}
and {{ secrets.DOCKERHUB_TOKEN }}
should be setup in the repo first.
Inside ci.yml
name: docker-build on: push: branches: - "main" workflow_dispatch: env: DOCKER_CONTAINER_NAME: <your-container-name> # server-mvc:latest DOCKER_REPO_NAME: <your_username>/<your-repo-name> # reemo/server-mvc:latest jobs: test-server: runs-on: ubuntu-latest container: node:lts-alpine steps: - uses: actions/checkout@v3 - name: Install npm deps working-directory: backend run: | yarn install yarn test rm -rf node_modules - name: archive built files uses: actions/upload-artifact@v3 with: name: server_code path: backend build-server: needs: test-server runs-on: ubuntu-latest container: docker:20.10.21-alpine3.16 steps: - uses: actions/checkout@v3 - name: restore built files server uses: actions/download-artifact@v3 with: name: server_code path: backend - name: Login to Docker Hub uses: docker/login-action@v2 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Do Docker tag and push working-directory: backend run: | docker build -t ${{ env.DOCKER_CONTAINER_NAME }} . docker tag ${{ env.DOCKER_CONTAINER_NAME }} ${{ env.DOCKER_REPO_NAME }} docker push ${{ env.DOCKER_REPO_NAME }}
TIPRemember to setup your
secrets
in Github repo.