Docker 下搭建 Spug,容器里面的执行 docker 命令 作者: Chuwen 时间: 2021-10-28 分类: Docker ## 序言 由于前端打包?环境多变,可能有以下情况: - 有的项目需要 `node:12.0` 才能 `build` 成功 - 有的项目需要 `node:16.0` 才能 `build` 成功 - ... 这些环境多变,在使用 Docker 部署的 `Spug` 时,我们希望的是在容器里还想再使用 Docker,需要什么环境拉**对应的镜像**就可以 ## 过程 ### Docker 部署 Spug > Docker 的安装过程不再过多赘述,主要的 `Docker` 映射就是在第 5、6 行 > > 这样就实现了“套娃”:`Docker` 容器里,使用 `Docker`。 > > 需要⚠️:容器里使用的 `Docker` 是宿主机的 `Docker`,所以容器里使用 Docker 的路径映射映射的是宿主机里的,**这个下面会讲到** ```shell docker run -d \ --restart=always --name=spug \ -p 80:80 \ -v /data/spug/:/data \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /usr/bin/docker:/usr/bin/docker \ openspug/spug ``` ### Spug 部署前端(Node.js)项目(如 Vue.js、React) #### 2. 构建配置 | `Spug 环境变量` | 容器 | 宿主机 | | ---------------- | ----------------- | ------------ | | `SPUG_REPOS_DIR` | /data/spug/repos/ | /data/repos/ | **文件过滤规则(包含模式):** ```tex dist/* ``` **代码检出前执行:** ```shell echo "代码检出前执行" echo $SPUG_REPOS_DIR/$SPUG_DEPLOY_ID/node_modules mkdir -p $SPUG_REPOS_DIR/$SPUG_DEPLOY_ID/node_modules ``` **代码检出后执行:** > 注意 Docker 映射的路径,Docker 容器里调用 Docker(这个 Docker 是在宿主机里面的,所以路径映射一定要正确) ```shell # 软链接 node_modules,因为这个不会怎么改变的 ln -s $SPUG_REPOS_DIR/$SPUG_DEPLOY_ID/node_modules . WORK_DIR=$(pwd) # 宿主机里面的 repos 路径 HOST_REPOS_DIR=/data/spug/repos # 这个操作就是替换为在宿主机真实工作路径 TARGET_WORK_DIR=${WORK_DIR/${SPUG_REPOS_DIR}/${HOST_REPOS_DIR}} echo "当前工作目录:$WORK_DIR" echo "宿主机目录:$HOST_REPOS_DIR" echo "目标路径:$TARGET_WORK_DIR" # 安装依赖包 docker run --rm \ -v $HOST_REPOS_DIR/$SPUG_DEPLOY_ID:/usr/src/app \ -w /usr/src/app \ node:16.0.0 \ yarn # 执行 build # 注意下映射路径 docker run --rm \ -v $HOST_REPOS_DIR/$SPUG_DEPLOY_ID/node_modules:$SPUG_REPOS_DIR/$SPUG_DEPLOY_ID/node_modules \ -v $TARGET_WORK_DIR:/usr/src/app \ -w /usr/src/app \ node:16.0.0 \ yarn build ``` #### 3. 发布配置: **部署路径:** > 这个指的是部署到**目标服务器**的路径,而不是 `Spug` 的路径哦 > > 这个路径一定不能有文件夹,因为 Spug 会自动创建(软链接) **存储路径:** > 用以存储历史版本的数量的路径 **应用发布前执行:** ```shell mv dist/* . rm -rf dist ``` **应用发布后执行:** ```shell # 例如执行一些重启、清理缓存操作 ``` 标签: Docker, Spug