# 如何 Docker 化一个 Cli 工具

- Link: https://www.ixiqin.com/2019/11/30/how-the-docker-a-cli-tool/
- Published: 2019-11-30T00:14:23+08:00
- Author: 白宦成

文章目录

 [Toggle](https://www.ixiqin.com/2019/11/30/how-the-docker-a-cli-tool/#)

 * [需求](https://www.ixiqin.com/2019/11/30/how-the-docker-a-cli-tool/#%e9%9c%80%e6%b1%82)
 * [核心实现](https://www.ixiqin.com/2019/11/30/how-the-docker-a-cli-tool/#%e6%a0%b8%e5%bf%83%e5%ae%9e%e7%8e%b0)
 * [代码](https://www.ixiqin.com/2019/11/30/how-the-docker-a-cli-tool/#%e4%bb%a3%e7%a0%81)
    - [Docker File](https://www.ixiqin.com/2019/11/30/how-the-docker-a-cli-tool/#docker_file)
    - [Bash Script](https://www.ixiqin.com/2019/11/30/how-the-docker-a-cli-tool/#bash_script)
 * [总结](https://www.ixiqin.com/2019/11/30/how-the-docker-a-cli-tool/#%e6%80%bb%e7%bb%93)
 * [其他](https://www.ixiqin.com/2019/11/30/how-the-docker-a-cli-tool/#%e5%85%b6%e4%bb%96)

## 需求

我在看 Hexo 的 issue 时，看到了一个需求

    ```shcb-line-numbers
    Docker image to avoid the environment setting issue.
    ```

刚好，我自己有 Docker 的基础，就决定提交一个 PR ，解决这个问题。

## 核心实现

在开发这一部分的时候，一个最核心的问题是，你需要准备 2 个文件，一个是 DockerFile，
另一个是对应的 Bash Script。

原因在于

 * Docker File 用于打包基础环境，比如全局安装 Hexo
 * Bash Script 则是为了方便挂载本地的文件系统，开辟端口等（端口可以放在 Docker file
   中，文件系统必须要现场挂载，因为你的目的是使用 Cli 管理本地文件，就一定要把文件
   挂载过去)

具体实现的思路是，Docker 镜像本身提供的是基础环境，将 CMD 设置为 Bash ，方便执行
具体的命令。

而 Bash Script 则将需要执行的命令整体传递过去。

## 代码

### Docker File

    ```shcb-line-numbers
    FROM node:10
    RUN npm install -g hexo-cli
    CMD ["/bin/bash"]
    Code language: CSS (css)
    ```

### Bash Script

    ```javascript
    #!/bin/sh
    docker run \
      --interactive --tty --rm \
      --volume "$PWD":/hexosite \
      --workdir /hexosite \
      -p 4000:4000 \
      bestony/hexojs:latest "$@"

    Code language: JavaScript (javascript)
    ```

## 总结

Docker 化 Cli 命令其实并不复杂，核心在于 CMD 与你的 Bash Script 的配合。

## 其他

你可以查看 [https://github.com/hexojs/hexo/pull/3891](https://github.com/hexojs/hexo/pull/3891)
来学习到更多的内容。
