Shell脚本如何配置容器hosts文件

wen 实用脚本 2

本文目录导读:

Shell脚本如何配置容器hosts文件

  1. 使用 sed 命令直接修改
  2. 使用 Docker 容器的特殊方法
  3. 完整的脚本示例
  4. 配置文件示例
  5. 在Dockerfile中使用
  6. 注意事项

在Shell脚本中配置容器hosts文件有多种方法,这里介绍几种常见的方式:

使用 sed 命令直接修改

#!/bin/bash
# 容器内的hosts文件路径
HOSTS_FILE="/etc/hosts"
# 添加或更新hosts条目
add_host_entry() {
    local ip=$1
    local hostname=$2
    # 检查条目是否已存在
    if grep -q "$hostname" "$HOSTS_FILE"; then
        # 更新已存在的条目
        sed -i "s/.*$hostname/$ip $hostname/" "$HOSTS_FILE"
        echo "已更新: $ip $hostname"
    else
        # 添加新条目
        echo "$ip $hostname" >> "$HOSTS_FILE"
        echo "已添加: $ip $hostname"
    fi
}
# 使用示例
add_host_entry "192.168.1.100" "database.example.com"
add_host_entry "10.0.0.50" "redis-server"

使用 Docker 容器的特殊方法

启动容器时指定

#!/bin/bash
# 在创建容器时添加hosts条目
docker run -d \
  --name mycontainer \
  --add-host "database.example.com:192.168.1.100" \
  --add-host "redis-server:10.0.0.50" \
  nginx:latest

使用 docker exec 动态修改

#!/bin/bash
CONTAINER_NAME="mycontainer"
# 动态添加hosts条目到运行中的容器
docker exec "$CONTAINER_NAME" bash -c "echo '192.168.1.100 database.example.com' >> /etc/hosts"
# 使用配置文件批量添加
HOSTS_CONFIG=(
    "192.168.1.100 database.example.com"
    "10.0.0.50 redis-server"
    "172.17.0.1 host.docker.internal"
)
for entry in "${HOSTS_CONFIG[@]}"; do
    docker exec "$CONTAINER_NAME" bash -c "echo '$entry' >> /etc/hosts"
done

完整的脚本示例

#!/bin/bash
# 容器hosts管理脚本
HOSTS_FILE="/etc/hosts"
BACKUP_FILE="/etc/hosts.backup"
# 备份原始hosts文件
backup_hosts() {
    cp "$HOSTS_FILE" "$BACKUP_FILE"
    echo "已备份hosts文件到 $BACKUP_FILE"
}
# 批量添加hosts条目
batch_add_hosts() {
    local entries_file=$1
    if [ ! -f "$entries_file" ]; then
        echo "错误: 配置文件 $entries_file 不存在"
        exit 1
    fi
    while IFS= read -r line; do
        # 跳过空行和注释
        [[ -z "$line" || "$line" =~ ^# ]] && continue
        ip=$(echo "$line" | awk '{print $1}')
        hostname=$(echo "$line" | awk '{print $2}')
        if [ -n "$ip" ] && [ -n "$hostname" ]; then
            add_host_entry "$ip" "$hostname"
        fi
    done < "$entries_file"
}
# 删除hosts条目
remove_host_entry() {
    local hostname=$1
    if grep -q "$hostname" "$HOSTS_FILE"; then
        sed -i "/$hostname/d" "$HOSTS_FILE"
        echo "已删除: $hostname"
    else
        echo "未找到: $hostname"
    fi
}
# 显示当前hosts内容
show_hosts() {
    echo "当前hosts文件内容:"
    cat "$HOSTS_FILE"
}
# 主函数
main() {
    case "$1" in
        add)
            if [ $# -eq 3 ]; then
                add_host_entry "$2" "$3"
            else
                echo "用法: $0 add <IP> <hostname>"
            fi
            ;;
        add-batch)
            if [ $# -eq 2 ]; then
                batch_add_hosts "$2"
            else
                echo "用法: $0 add-batch <配置文件路径>"
            fi
            ;;
        remove)
            if [ $# -eq 2 ]; then
                remove_host_entry "$2"
            else
                echo "用法: $0 remove <hostname>"
            fi
            ;;
        show)
            show_hosts
            ;;
        backup)
            backup_hosts
            ;;
        *)
            echo "用法: $0 {add|add-batch|remove|show|backup}"
            echo "示例:"
            echo "  $0 add 192.168.1.100 myhost.example.com"
            echo "  $0 add-batch /path/to/hosts.config"
            echo "  $0 remove myhost.example.com"
            echo "  $0 show"
            echo "  $0 backup"
            ;;
    esac
}
# 如果直接执行脚本
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
    main "$@"
fi

配置文件示例

创建一个 hosts.config 文件:

# 自定义hosts配置
192.168.1.100 database.example.com
10.0.0.50 redis-server
172.17.0.1 host.docker.internal
# 可以添加更多条目
192.168.1.101 api-server.example.com

在Dockerfile中使用

FROM ubuntu:latest
# 在构建时修改hosts
RUN echo "192.168.1.100 database.example.com" >> /etc/hosts && \
    echo "10.0.0.50 redis-server" >> /etc/hosts
# 或者使用COPY命令复制配置
COPY hosts.config /tmp/hosts.config
RUN cat /tmp/hosts.config >> /etc/hosts && \
    rm /tmp/hosts.config
# 入口脚本
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]

注意事项

  1. 权限问题:修改 /etc/hosts 需要root权限
  2. 持久性:容器重启后hosts修改会丢失,除非使用Docker的 --add-host 参数
  3. 备份:在修改前建议备份原始hosts文件
  4. 格式验证:添加前验证IP格式是否正确

使用这些方法可以灵活地在Shell脚本中配置容器的hosts文件。

抱歉,评论功能暂时关闭!