跳转至

基于Docker的开发环境 V2


#
# 构建Docker开发环境
# 
# 1、构建镜像
# docker build -f dev.Dockerfile -t gfourdx/dev:latest . 
# 2、运行容器
# docker run -dit -h dev -p 2222:22 -p 80:80  -p 443:443 -p 3306:3306 -p 5432:5432 -p 6379:6379 --name dev --restart=unless-stopped gfourdx/dev:latest
# 3、快速进入容器
# echo 'alias dev="docker exec -it dev bash"' >> ~/.zprofile
# 
# 利用多段构建构建解决两个问题:
# 1、因缺少编译工具导致 pip 命令安装某些包时失败的问题
# 2、减少镜像的体积
#

# 第一阶段构建
FROM debian:bookworm-slim AS base

# 配置编译环境
# 每条命令之间使用 && 连接
# 表示只有上条命令执行成功后才会执行下条命令
RUN set -eux; \
    # 配置国内源
    echo "Types: deb" > /etc/apt/sources.list.d/debian.sources && \
    echo "URIs: http://mirrors.tuna.tsinghua.edu.cn/debian" >> /etc/apt/sources.list.d/debian.sources && \
    echo "Suites: bookworm bookworm-updates bookworm-backports" >> /etc/apt/sources.list.d/debian.sources && \
    echo "Components: main contrib non-free non-free-firmware" >> /etc/apt/sources.list.d/debian.sources && \
    echo "Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg" >> /etc/apt/sources.list.d/debian.sources && \
    echo "" >> /etc/apt/sources.list.d/debian.sources && \
    echo "Types: deb" >> /etc/apt/sources.list.d/debian.sources && \
    echo "URIs: http://mirrors.tuna.tsinghua.edu.cn/debian-security" >> /etc/apt/sources.list.d/debian.sources && \
    echo "Suites: bookworm-security" >> /etc/apt/sources.list.d/debian.sources && \
    echo "Components: main contrib non-free non-free-firmware" >> /etc/apt/sources.list.d/debian.sources && \
    echo "Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg" >> /etc/apt/sources.list.d/debian.sources && \
    # 更新源
    apt-get update

RUN set -eux; \
    # 安装包
    apt-get install --no-install-recommends --no-install-suggests -y \
        # python相关的包
        python3 \
        python3-pip \
        python3-venv \
        python3-dev \
        \
        # 编译需要的包
        pkg-config \
        gcc \
        \
        # mysqlclient和psycopg2依赖的包
        default-libmysqlclient-dev \
        libpq-dev && \
    # 清除缓存
    rm -rf /var/lib/apt/lists/*

# 配置虚拟环境并pip安装编译包
RUN set -eux; \
    # 配置国内源
    pip3 config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple && \
    # 创建虚拟环境
    python3 -m venv /root/venv && \
    # 激活虚拟环境
    # dockerfile中source语法无效
    # 使用 . 代替
    . /root/venv/bin/activate && \
    # 安装wheel
    pip install wheel && \
    # 安装需要编译的包
    pip install mysqlclient psycopg2

# 第二阶段构建
FROM debian:bookworm-slim

# 配置环境变量
ENV LANG=C.UTF-8

# 配置工作目录
WORKDIR /root/

RUN set -eux; \
    # 配置本地时间
    ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
    # 配置本地时区
    echo 'Asia/Shanghai' > /etc/timezone

RUN set -eux; \
    # 配置国内源
    echo "Types: deb" > /etc/apt/sources.list.d/debian.sources && \
    echo "URIs: http://mirrors.tuna.tsinghua.edu.cn/debian" >> /etc/apt/sources.list.d/debian.sources && \
    echo "Suites: bookworm bookworm-updates bookworm-backports" >> /etc/apt/sources.list.d/debian.sources && \
    echo "Components: main contrib non-free non-free-firmware" >> /etc/apt/sources.list.d/debian.sources && \
    echo "Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg" >> /etc/apt/sources.list.d/debian.sources && \
    echo "" >> /etc/apt/sources.list.d/debian.sources && \
    echo "Types: deb" >> /etc/apt/sources.list.d/debian.sources && \
    echo "URIs: http://mirrors.tuna.tsinghua.edu.cn/debian-security" >> /etc/apt/sources.list.d/debian.sources && \
    echo "Suites: bookworm-security" >> /etc/apt/sources.list.d/debian.sources && \
    echo "Components: main contrib non-free non-free-firmware" >> /etc/apt/sources.list.d/debian.sources && \
    echo "Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg" >> /etc/apt/sources.list.d/debian.sources && \
    # 更新源
    apt-get update

RUN set -eux; \
    # 安装包
    apt-get install --no-install-recommends --no-install-suggests -y \
        python3 \
        python3-pip \
        python3-venv \
        \
        mariadb-server \
        mariadb-client \
        postgresql \
        \
        redis \
        \
        nginx \
        \
        git \
        ssh \
        vim \
        \
        curl \
        wget \
        \
        # 提供ip xx和ss命令
        iproute2 \ 
        # 提供ping等命令
        iputils-ping \
        # 提供ps、top、free和sysctl等命令
        procps && \
    # 清理缓存
    rm -rf /var/lib/apt/lists/* && \
    # 创建虚拟环境
    python3 -m venv venvs/venv

RUN set -eux; \
    # 配置PIP国内源
    pip3 config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple && \
    # 配置mariaDB监听所有IP
    sed -i 's/127.0.0.1/0.0.0.0/' /etc/mysql/mariadb.conf.d/50-server.cnf && \
    # 配置PostgreSQL允许任何IP登录
    sed -i '0,/127.0.0.1\/32/s//0.0.0.0\/0/' /etc/postgresql/15/main/pg_hba.conf && \
    # 配置PostgreSQL监听所有IP
    sed -i "0,/#listen_addresses = 'localhost'/s//listen_addresses = '*'/" /etc/postgresql/15/main/postgresql.conf && \
    # 配置redis监听所有IP
    sed -i '0,/^bind 127.0.0.1/s//bind 0.0.0.0/' /etc/redis/redis.conf && \
    # 配置redis非保护模式(允许非回环地址访问)
    sed -i "s/protected-mode yes/protected-mode no/" /etc/redis/redis.conf&& \
    # 配置ssh允许root登录
    sed -i "s/#PermitRootLogin prohibit-password/PermitRootLogin yes/" /etc/ssh/sshd_config && \
    # 配置ssh允许空密码登录
    sed -i "s/#PermitEmptyPasswords no/PermitEmptyPasswords yes/" /etc/ssh/sshd_config && \
    # 删除root密码
    passwd -d root

# 从第一阶段拷贝虚拟环境中的包
COPY --from=base /root/venv/lib/python3.11/site-packages/ venvs/venv/lib/python3.11/site-packages/

# 22 ssh
# 80 443 nginx
# 3306 mariadb
# 5432 postgresql
# 7379 redis
EXPOSE 22 80 443 3306 5432 6379

# 通过 bash -c 参数的方式启动服务
# 最后使用 bash 或 tail -f /dev/null 挂起
# 保证容器运行后不会直接退出
# CMD ["bash", "-c", "service server1 start && service server2 start && xxx && tail -f /dev/null"]
CMD ["bash", "-c", "service ssh start && service nginx start && service mariadb start && service postgresql start && service redis-server start && bash"]