zoukankan      html  css  js  c++  java
  • 使用distillery&&docker 部署phoenix 应用

    distillery 发布了2.0 了,有好多的新的功能

    • config prodiver 进行环境变量的配置
    • appup tansforms 插件系统,方便在release 构建的时候进行修改
    • mix release.gen.appup 新的mix task
    • pid 文件

    demo 是一个简单的phoenix 同时使用docker 进行构建

    项目准备

    • 项目结构
    ├── Dockerfile
    ├── README.md
    ├── _build
    ├── assets
    ├── config
    ├── deps
    ├── docker-compose.yaml
    ├── lib
    ├── mix.exs
    ├── mix.lock
    ├── priv
    ├── rel
    └── test
    • 项目创建
    mix phx.new --no-ecto phoenix_distillery
    • 添加distillery 支持
    mix.exs
    defp deps do
        [ ...,
          {:plug_cowboy, "~> 1.0"}, // 需要添加,不然构建会有问题
          {:distillery, "~> 2.0"}
           ]
    end
    • 配置phoenix endpoint 信息
    config/prod.exs
    config :phoenix_distillery, PhoenixDistilleryWeb.Endpoint,
      http: [port: {:system, "PORT"}],
      url: [host: "localhost", port: {:system, "PORT"}], # This is critical for ensuring web-sockets properly authorize.
      cache_static_manifest: "priv/static/cache_manifest.json",
      server: true,
      root: ".",
      version: Application.spec(:phoenix_distillery, :vsn)
    • 构建
    mix deps.get --only prod
    MIX_ENV=prod mix compile
    cd assets
    yarn build build --production
    cd ..
    mix phx.digest
    • distillery release
    进行release 初始化配置
    mix release.init
    MIX_ENV=prod mix release
    • 运行
    PORT=4001 _build/prod/rel/phoenix_distillery/bin/phoenix_distillery foreground

    docker 构建支持

    • dockerfile

      使用mutil stage 构建

    # The version of Alpine to use for the final image
    # This should match the version of Alpine that the `elixir:1.7.2-alpine` image uses
    ARG ALPINE_VERSION=3.8
    
    FROM elixir:1.7.2-alpine AS builder
    
    # The following are build arguments used to change variable parts of the image.
    # The name of your application/release (required)
    ARG APP_NAME=phoenix_distillery
    # The version of the application we are building (required)
    ARG APP_VSN=0.0.1
    # The environment to build with
    ARG MIX_ENV=prod
    # Set this to true if this release is not a Phoenix app
    ARG SKIP_PHOENIX=false
    # If you are using an umbrella project, you can change this
    # argument to the directory the Phoenix app is in so that the assets
    # can be built
    ARG PHOENIX_SUBDIR=.
    
    ENV SKIP_PHOENIX=${SKIP_PHOENIX} 
        APP_NAME=${APP_NAME} 
        APP_VSN=${APP_VSN} 
        MIX_ENV=${MIX_ENV}
    
    # By convention, /opt is typically used for applications
    WORKDIR /opt/app
    
    # This step installs all the build tools we'll need
    RUN apk update && 
      apk upgrade --no-cache && 
      apk add --no-cache 
        nodejs 
        yarn 
        git 
        build-base && 
      mix local.rebar --force && 
      mix local.hex --force
    
    # This copies our app source code into the build container
    COPY . .
    
    RUN mix do deps.get, deps.compile, compile
    
    # This step builds assets for the Phoenix app (if there is one)
    # If you aren't building a Phoenix app, pass `--build-arg SKIP_PHOENIX=true`
    # This is mostly here for demonstration purposes
    RUN if [ ! "$SKIP_PHOENIX" = "true" ]; then 
      cd ${PHOENIX_SUBDIR}/assets && 
      yarn install && 
      yarn deploy && 
      cd .. && 
      mix phx.digest; 
    fi
    
    RUN 
      mkdir -p /opt/built && 
      mix release --verbose && 
      cp _build/${MIX_ENV}/rel/${APP_NAME}/releases/${APP_VSN}/${APP_NAME}.tar.gz /opt/built && 
      cd /opt/built && 
      tar -xzf ${APP_NAME}.tar.gz && 
      rm ${APP_NAME}.tar.gz
    
    # From this line onwards, we're in a new image, which will be the image used in production
    FROM alpine:${ALPINE_VERSION}
    
    # The name of your application/release (required)
    ARG APP_NAME=phoenix_distillery
    
    RUN apk update && 
        apk add --no-cache 
          bash 
          openssl-dev
    
    ENV REPLACE_OS_VARS=true 
        APP_NAME=${APP_NAME}
    
    WORKDIR /opt/app
    
    COPY --from=builder /opt/built .
    
    CMD trap 'exit' INT; /opt/app/bin/${APP_NAME} foreground
    • docker-compose
    version: '3.5'
    services:
      web:
        build: ./
        ports:
          - "4000:4000"
        env_file:
          - config/docker.env
    • docker 运行环境变量配置
    config/docker.env
    
    SECRET_KEY_BASE="u1QXlca4XEZKb1o3HL/aUlznI1qstCNAQ6yme/lFbFIs0Iqiq/annZ+Ty8JyUCDc"
    PORT=4000
    LANG=en_US.UTF-8
    REPLACE_OS_VARS=true
    ERLANG_COOKIE=myapp
    • 构建&&运行
    docker-compose build && docker-compose up -d
    • 效果

    说明

    2.0 有好多新特性的添加,后边会有简单的使用demo,功能很强大

    参考资料

    https://hexdocs.pm/distillery/guides/phoenix_walkthrough.html
    https://github.com/rongfengliang/phoenix_distillery-docker-demo

  • 相关阅读:
    【vim使用】光标的 段落切换、括号切换
    【vim使用】行数跳转 和 屏幕移动
    【vim使用】vim的三种工作模式
    【vim使用】vim的异常处理,删除交换文件
    【vim使用】打开文件,并且定位行
    【vim使用】vim新建文件、打开文件
    【vim使用】vim简介
    【终端使用】SSH免密码登录——02
    【终端使用】SSH免密码登录——01
    【终端使用】"apt"命令 安装/卸载软件
  • 原文地址:https://www.cnblogs.com/rongfengliang/p/9959775.html
Copyright © 2011-2022 走看看