在Docker容器里运行日常开发环境

发布于 2020-02-25 18:34:12

在这个容器化盛行的时代,作为一个开发者,当然也想利用这个解决自己工作上的一些痛点。 比如,在docker里跑个开发环境,这样就不用每一台机器都花很多时间配置开发环境。

但是呢,docker毕竟是个容器,没有完全模拟操作系统,会出现一些奇怪的问题。 比如在容器里跑个docker服务,理想很丰满,现实会出现一些问题

既然不能在 docker 里跑 docker 服务,那么可以通过映射宿主机上的 sock 文件到容器内, 容器内再安装一个 docker-cli 就可以操作docker了。 这时候又产生了一个问题,怎么把当前开发环境的容器和其它容器连起来。这个问题就留到后面解决吧。

接下来看看我的 Dockerfile

FROM alpine:edge
COPY setup.sh /tmp/setup-alpine-dev-env.sh
RUN apk add bash
RUN bash /tmp/setup-alpine-dev-env.sh
WORKDIR /app
CMD ["fish"]

以及它调用的初始化脚本 setup.sh

#!/bin/bash
# NOTE: run `apt add bash` first
# https://wiki.alpinelinux.org/wiki/Alpine_Linux_package_management
# APK_ADD='apk add --update --no-cache --force-overwrite'
APK_ADD='apk add --update --force-overwrite'

$APK_ADD zsh fish
$APK_ADD git tmux neovim
$APK_ADD curl wget sudo
$APK_ADD the_silver_searcher

# libs
$APK_ADD \
    openssl openssl-dev g++ gc-dev \
    libc-dev libevent-dev libxml2-dev \
    llvm-static make pcre-dev readline-dev \
    yaml-dev zlib-dev zlib \
    python2-dev python3-dev \
    libc6-compat

# build tools
$APK_ADD make cmake
# cargo install watchexec

# python
$APK_ADD python python3
ln -s /usr/bin/python3 /usr/local/bin/python3
# pip
$APK_ADD py2-pip
alias pip3='python3 -m pip'
pip install -U pip virtualenv
pip3 install -U pip virtualenv

# golang
$APK_ADD go
# tag (works with ag)
export GOPATH=$HOME/go
go get -u github.com/aykamko/tag/... && go install github.com/aykamko/tag

# rust
$APK_ADD cargo # (included cargo and rustc)
# cargo install fd-find ripgrep

# nodejs
$APK_ADD nodejs npm
npm install -g yarn n

# ruby
$APK_ADD ruby

# crystal
$APK_ADD crystal shards

# admin
$APK_ADD htop ncdu tree

# containerization
$APK_ADD docker-cli docker-compose

# then do some setups
# fish ...
# neovim ...
# tmux ...

最后通过fish命令方便地启动容器:

function docker-run-alpine-dev
    docker run -it --rm \
        -v "$HOME/.dotfiles:/root/.dotfiles" \
        -v "$HOME/Downloads:/root/Downloads" \
        -v "$HOME/src:/root/src" \
        -v /var/run/docker.sock:/var/run/docker.sock \
        -v /data:/data \
        -p 22:22 -p 80:80 -p 443:443 \
        weaming/alpine-dev-env fish
end

其中映射的卷, .dotfiles 是我日常开发小工具库,Downloads 是为了和宿主机共享文件,~/src 是宿主机上原来的源代码, /var/run/docker.sock 是宿主机和容器通信的sock文件,/data 是我自己设置的全局数据存储路径。

comments powered by Disqus