编写打包和启动文件

Dockerfile

./Dockerfile

  1. FROM node:10.22.0-jessie
  2. MAINTAINER starkwang <starkland@163.com>
  3. ENV VERSION 1.9.3
  4. ENV HOME "/home"
  5. ENV PORT 3000
  6. ENV ADMIN_EMAIL "me@jinfeijie.cn"
  7. ENV DB_SERVER "mongo"
  8. ENV DB_NAME "yapi"
  9. ENV DB_PORT 27017
  10. ENV VENDORS ${HOME}/vendors
  11. ENV GIT_URL https://github.com/YMFE/yapi.git
  12. ENV GIT_MIRROR_URL https://gitee.com/mirrors/YApi.git
  13. # 指定工作目录
  14. WORKDIR ${HOME}/
  15. COPY entrypoint.sh /bin
  16. COPY config.json ${HOME}
  17. COPY wait-for-it.sh /
  18. RUN rm -rf node && \
  19. ret=`curl -s https://api.ip.sb/geoip | grep China | wc -l` && \
  20. if [ $ret -ne 0 ]; then \
  21. GIT_URL=${GIT_MIRROR_URL} && npm config set registry https://registry.npm.taobao.org; \
  22. fi; \
  23. echo ${GIT_URL} && \
  24. git clone -b v${VERSION} --depth=1 ${GIT_URL} vendors && \
  25. cd vendors && \
  26. npm install -g node-gyp yapi-cli && \
  27. npm install --production && \
  28. cd .. && npm cache clean --force && \
  29. chmod +x /bin/entrypoint.sh && \
  30. chmod +x /wait-for-it.sh
  31. # 声明端口
  32. EXPOSE ${PORT}
  33. ENTRYPOINT ["entrypoint.sh"]

extrypoint.sh

  1. #! /bin/sh
  2. cd ${VENDORS}
  3. if [ ! -e "init.lock" ]
  4. then
  5. sed -i "s/DIY-PORT/"${PORT}"/g" ${HOME}/config.json
  6. sed -i "s/DIY-AC/"${ADMIN_EMAIL}"/g" ${HOME}/config.json
  7. sed -i "s/DIY-DB-SERVER/"${DB_SERVER}"/g" ${HOME}/config.json
  8. sed -i "s/DIY-DB-NAME/"${DB_NAME}"/g" ${HOME}/config.json
  9. sed -i "s/DIY-DB-PORT/"${DB_PORT}"/g" ${HOME}/config.json
  10. mv ${HOME}/config.json ${VENDORS}
  11. cp ${VENDORS}/config.json ${HOME}
  12. cp ${VENDORS}/config.json ${HOME}/../
  13. cd ${VENDORS}
  14. git fetch origin v${VERSION}:v${VERSION}
  15. git checkout v${VERSION}
  16. yapi install -v ${VERSION}
  17. touch init.lock
  18. fi
  19. cd ${VENDORS}
  20. # 先判断有没有CMD指定路径
  21. if [ $1 ]
  22. then
  23. node $i
  24. else
  25. node server/app.js
  26. fi

docker-compose 部署

./docker-compose.yml

  1. version: '2.1'
  2. services:
  3. yapi:
  4. image: mrjin/yapi:latest
  5. # build: ./
  6. container_name: yapi
  7. environment:
  8. - VERSION=1.9.3
  9. - LOG_PATH=/tmp/yapi.log
  10. - HOME=/home
  11. - PORT=3000
  12. - ADMIN_EMAIL=starkland@163.com
  13. - DB_SERVER=mongo
  14. - DB_NAME=yapi
  15. - DB_PORT=27017
  16. # restart: always
  17. ports:
  18. - 127.0.0.1:3000:3000
  19. volumes:
  20. - ~/data/yapi/log/yapi.log:/home/vendors/log # log dir
  21. depends_on:
  22. - mongo
  23. entrypoint: "bash /wait-for-it.sh mongo:27017 -- entrypoint.sh"
  24. networks:
  25. - back-net
  26. mongo:
  27. image: mongo
  28. container_name: mongo
  29. # restart: always
  30. ports:
  31. - 127.0.0.1:27017:27017
  32. volumes:
  33. - ~/data/yapi/mongodb:/data/db #db dir
  34. networks:
  35. - back-net
  36. networks:
  37. back-net:
  38. external: true

wait-for-it.sh

  1. #!/usr/bin/env bash
  2. # Use this script to test if a given TCP host/port are available
  3. WAITFORIT_cmdname=${0##*/}
  4. echoerr() { if [[ $WAITFORIT_QUIET -ne 1 ]]; then echo "$@" 1>&2; fi }
  5. usage()
  6. {
  7. cat << USAGE >&2
  8. Usage:
  9. $WAITFORIT_cmdname host:port [-s] [-t timeout] [-- command args]
  10. -h HOST | --host=HOST Host or IP under test
  11. -p PORT | --port=PORT TCP port under test
  12. Alternatively, you specify the host and port as host:port
  13. -s | --strict Only execute subcommand if the test succeeds
  14. -q | --quiet Don't output any status messages
  15. -t TIMEOUT | --timeout=TIMEOUT
  16. Timeout in seconds, zero for no timeout
  17. -- COMMAND ARGS Execute command with args after the test finishes
  18. USAGE
  19. exit 1
  20. }
  21. wait_for()
  22. {
  23. if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then
  24. echoerr "$WAITFORIT_cmdname: waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT"
  25. else
  26. echoerr "$WAITFORIT_cmdname: waiting for $WAITFORIT_HOST:$WAITFORIT_PORT without a timeout"
  27. fi
  28. WAITFORIT_start_ts=$(date +%s)
  29. while :
  30. do
  31. if [[ $WAITFORIT_ISBUSY -eq 1 ]]; then
  32. nc -z $WAITFORIT_HOST $WAITFORIT_PORT
  33. WAITFORIT_result=$?
  34. else
  35. (echo > /dev/tcp/$WAITFORIT_HOST/$WAITFORIT_PORT) >/dev/null 2>&1
  36. WAITFORIT_result=$?
  37. fi
  38. if [[ $WAITFORIT_result -eq 0 ]]; then
  39. WAITFORIT_end_ts=$(date +%s)
  40. echoerr "$WAITFORIT_cmdname: $WAITFORIT_HOST:$WAITFORIT_PORT is available after $((WAITFORIT_end_ts - WAITFORIT_start_ts)) seconds"
  41. break
  42. fi
  43. sleep 1
  44. done
  45. return $WAITFORIT_result
  46. }
  47. wait_for_wrapper()
  48. {
  49. # In order to support SIGINT during timeout: http://unix.stackexchange.com/a/57692
  50. if [[ $WAITFORIT_QUIET -eq 1 ]]; then
  51. timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --quiet --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT &
  52. else
  53. timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT &
  54. fi
  55. WAITFORIT_PID=$!
  56. trap "kill -INT -$WAITFORIT_PID" INT
  57. wait $WAITFORIT_PID
  58. WAITFORIT_RESULT=$?
  59. if [[ $WAITFORIT_RESULT -ne 0 ]]; then
  60. echoerr "$WAITFORIT_cmdname: timeout occurred after waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT"
  61. fi
  62. return $WAITFORIT_RESULT
  63. }
  64. # process arguments
  65. while [[ $# -gt 0 ]]
  66. do
  67. case "$1" in
  68. *:* )
  69. WAITFORIT_hostport=(${1//:/ })
  70. WAITFORIT_HOST=${WAITFORIT_hostport[0]}
  71. WAITFORIT_PORT=${WAITFORIT_hostport[1]}
  72. shift 1
  73. ;;
  74. --child)
  75. WAITFORIT_CHILD=1
  76. shift 1
  77. ;;
  78. -q | --quiet)
  79. WAITFORIT_QUIET=1
  80. shift 1
  81. ;;
  82. -s | --strict)
  83. WAITFORIT_STRICT=1
  84. shift 1
  85. ;;
  86. -h)
  87. WAITFORIT_HOST="$2"
  88. if [[ $WAITFORIT_HOST == "" ]]; then break; fi
  89. shift 2
  90. ;;
  91. --host=*)
  92. WAITFORIT_HOST="${1#*=}"
  93. shift 1
  94. ;;
  95. -p)
  96. WAITFORIT_PORT="$2"
  97. if [[ $WAITFORIT_PORT == "" ]]; then break; fi
  98. shift 2
  99. ;;
  100. --port=*)
  101. WAITFORIT_PORT="${1#*=}"
  102. shift 1
  103. ;;
  104. -t)
  105. WAITFORIT_TIMEOUT="$2"
  106. if [[ $WAITFORIT_TIMEOUT == "" ]]; then break; fi
  107. shift 2
  108. ;;
  109. --timeout=*)
  110. WAITFORIT_TIMEOUT="${1#*=}"
  111. shift 1
  112. ;;
  113. --)
  114. shift
  115. WAITFORIT_CLI=("$@")
  116. break
  117. ;;
  118. --help)
  119. usage
  120. ;;
  121. *)
  122. echoerr "Unknown argument: $1"
  123. usage
  124. ;;
  125. esac
  126. done
  127. if [[ "$WAITFORIT_HOST" == "" || "$WAITFORIT_PORT" == "" ]]; then
  128. echoerr "Error: you need to provide a host and port to test."
  129. usage
  130. fi
  131. WAITFORIT_TIMEOUT=${WAITFORIT_TIMEOUT:-120}
  132. WAITFORIT_STRICT=${WAITFORIT_STRICT:-0}
  133. WAITFORIT_CHILD=${WAITFORIT_CHILD:-0}
  134. WAITFORIT_QUIET=${WAITFORIT_QUIET:-0}
  135. # check to see if timeout is from busybox?
  136. WAITFORIT_TIMEOUT_PATH=$(type -p timeout)
  137. WAITFORIT_TIMEOUT_PATH=$(realpath $WAITFORIT_TIMEOUT_PATH 2>/dev/null || readlink -f $WAITFORIT_TIMEOUT_PATH)
  138. if [[ $WAITFORIT_TIMEOUT_PATH =~ "busybox" ]]; then
  139. WAITFORIT_ISBUSY=1
  140. WAITFORIT_BUSYTIMEFLAG="-t"
  141. else
  142. WAITFORIT_ISBUSY=0
  143. WAITFORIT_BUSYTIMEFLAG=""
  144. fi
  145. if [[ $WAITFORIT_CHILD -gt 0 ]]; then
  146. wait_for
  147. WAITFORIT_RESULT=$?
  148. exit $WAITFORIT_RESULT
  149. else
  150. if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then
  151. wait_for_wrapper
  152. WAITFORIT_RESULT=$?
  153. else
  154. wait_for
  155. WAITFORIT_RESULT=$?
  156. fi
  157. fi
  158. if [[ $WAITFORIT_CLI != "" ]]; then
  159. if [[ $WAITFORIT_RESULT -ne 0 && $WAITFORIT_STRICT -eq 1 ]]; then
  160. echoerr "$WAITFORIT_cmdname: strict mode, refusing to execute subprocess"
  161. exit $WAITFORIT_RESULT
  162. fi
  163. exec "${WAITFORIT_CLI[@]}"
  164. else
  165. exit $WAITFORIT_RESULT
  166. fi

启动方法

  1. 修改docker-compose.yml文件里面相关参数
  2. 创建network:docker network create back-net
  3. 启动服务:docker-compose up -d