Tag: Docker

  • How to Use Docker with Vapor Server-Side Swift on Local Development

    How to Use Docker with Vapor Server-Side Swift on Local Development

    I wrote about How to deploy Vapor App(Server-Side-Swift) to the AWS

    This post is about setting on a local server using Docker. (Before you read this post, I highly recommend Server Side Swift – Vapor book.)

     

    Step 1. Create local.Dockerfile

    Look at the last command.

    CMD [“serve”, “–env”, “local”, “–hostname”, “0.0.0.0”, “–port”, “8080”]

    <- I set β€”env local.

    # Build image
    FROM --platform=linux/x86-64 swift:5.5-focal as build
    
    RUN apt-get update -y \
        && apt-get install -y libsqlite3-dev
    
    WORKDIR /build
    
    COPY . .
    
    RUN swift build \
        --enable-test-discovery \
        -c release \
        -Xswiftc -g
    
    
    # Run image
    FROM --platform=linux/x86-64 swift:5.5-focal-slim
    
    RUN useradd --user-group --create-home --home-dir /app vapor
    
    WORKDIR /app
    
    COPY --from=build --chown=vapor:vapor /build/.build/release /app
    COPY --from=build --chown=vapor:vapor /build/Public /app/Public
    
    # ARS RDS Environment ARG
    ARG AWS_RDS_HOST
    ARG AWS_RDS_PORT
    ARG AWS_RDS_USER
    ARG AWS_RDS_PASS
    ARG AWS_RDS_DB
    
    # SignInWithApple Environment ARG
    ARG SIWA_ID
    ARG SIWA_REDIRECT_URL
    ARG SIWA_JWK_ID
    ARG SIWA_PRIVATE_KEY
    ARG SIWA_TEAM_ID
    ARG SIWA_APP_BUNDLE_ID
    
    # Set Environment
    RUN echo "SIWA_ID=${SIWA_ID}" > .env.development
    RUN echo "SIWA_REDIRECT_URL=${SIWA_REDIRECT_URL}" >> .env.development
    RUN echo "SIWA_JWK_ID=${SIWA_JWK_ID}" >> .env.development
    RUN echo "SIWA_PRIVATE_KEY=${SIWA_PRIVATE_KEY}" >> .env.development
    RUN echo "SIWA_TEAM_ID=${SIWA_TEAM_ID}" >> .env.development
    RUN echo "SIWA_APP_BUNDLE_ID=${SIWA_APP_BUNDLE_ID}" >> .env.development
    
    RUN echo "DB_HOST=${AWS_RDS_HOST}" >> .env.development
    RUN echo "DB_PORT=${AWS_RDS_PORT}" >> .env.development
    RUN echo "DB_USER=${AWS_RDS_USER}" >> .env.development
    RUN echo "DB_PASS=${AWS_RDS_PASS}" >> .env.development
    RUN echo "DB_NAME=${AWS_RDS_DB}" >> .env.development
    
    USER vapor
    
    EXPOSE 8080
    
    ENTRYPOINT ["./Run"]
    CMD ["serve", "--env", "local", "--hostname", "0.0.0.0", "--port", "8080"]

     

    Step 2. local-docker-compose.yml

    version: '3.7'
    services:
      travelcrumb-beta:
        depends_on:
          - postgres
        build:
          context: .
          args:
            AWS_RDS_HOST: postgres
            AWS_RDS_PORT: 5432
            AWS_RDS_USER: shawn
            AWS_RDS_PASS: 1234
            AWS_RDS_DB: test_db
            SIWA_ID: xxxx.xxx.xxx
            SIWA_REDIRECT_URL: localhost:8080
            SIWA_JWK_ID: xxxxx
            SIWA_PRIVATE_KEY: xxxx
            SIWA_TEAM_ID: xxxx
            SIWA_APP_BUNDLE_ID: xxxxx
          dockerfile: local.Dockerfile
        ports:
          - '8080:8080'
    
      postgres:
        image: postgres
        environment:
          POSTGRES_USER: shawn
          POSTGRES_PASSWORD: 1234
          POSTGRES_DB: test_db
    
      start_dependencies:
        image: dadarek/wait-for-dependencies
        depends_on:
          - postgres
        command: postgres:5432

     

    Step 3. local.sh

    #!/bin/bash
    echo "πŸ• Build Docker"
    docker-compose -f local-docker-compose.yml build
    echo "πŸ• Start dependencies"
    docker-compose -f local-docker-compose.yml run --rm
    echo "πŸ• Start Vapor App"
    docker-compose -f local-docker-compose.yml up travelcrumb-beta

     

    Step 4. sh local.sh

    Now you can set up all you need to install for running the Vapor server on your local machine. Without Docker, You have to run and stop DB every time when you run a server on your local machine.

    Thanks for reading my post