自主可控:基于OpenEuler基础镜像的Go语言容器开发环境搭建

2023-06-10 14:28:22 浏览数 (2)

一 背景

从国家层面来说,信息技术已经在国家安全中扮演着越来越重要的角色。通过实现自主可控,可以保护国家的核心技术和关键数据,避免被外部势力窃取或滥用。从我们个人层面来说,自主可控可以保护个人隐私,避免个人信息被滥用或泄露。这对社会稳定和个人权利保护都有重要意义。OpenEuler 是一个开源项目,由华为发起成立于 2019 年。它是一个基于 Linux 操作系统的企业级操作系统,旨在提供高性能、高可靠性、高安全性和易于使用的用户体验。OpenEuler 的出现积极响应了国家自主可控、国产替代等政策需求,同时也是中国开源社区发展进程中具有里程碑式意义的事件。为了响应国家自主可控的号召,我们使用基于OpenEuler操作系统来搭建Go语言开发环境。

二 操作步骤

2.1 准备基础软件包

最新的Go语言SDK可在https://go.dev/dl/进行下载,下载命令可参考:

代码语言:javascript复制
curl -L -C - -O https://go.dev/dl/go1.20.4.linux-amd64.tar.gz

2.2 编写Dockerfile

本次镜像构建基于OpenEuler 20.03-sp3-lts,开发环境安装了SSH服务、rsync、make、gdb等工具,Dockerfile如下:

代码语言:javascript复制
FROM openeuler:20.03-lts-sp3

COPY [ "docker-entrypoint.sh", "/usr/local/bin" ]
ADD ["go1.20.4.linux-amd64.tar.gz", "/usr/local/"]

RUN set -eu; 
    yum -y install openssh-server 
    rsync 
    make 
    gdb; 
    ssh-keygen -A; 
    yum clean all;  
    chmod  x /usr/local/bin/*; 
    mkdir /var/run/sshd /root/workspace

FROM scratch

COPY --from=0 / /

# 区时设置
ENV TZ="Asia/Shanghai" 
    LANG="zh_CN.UTF-8"

# SSH默认设置,用户名、组默认均为dev,密码为:dev12345,GID为1000
ENV SSH_USERNAME="dev" 
    SSH_PASSWD="dev12345" 
    SSH_UID="1000" 
    SSH_GROUP="dev" 
    SSH_GID="1000"

# GO语言相关环境变量设置
ENV GOPATH="/workspace" 
    GOROOT="/usr/local/go" 
    GOPROXY="https://goproxy.cn,direct" 
    GO111MODULE="auto" 
    GOBIN="/workspace/bin"

# 设置系统环境变量
ENV PATH="$GOROOT/bin:$GOBIN:$PATH"

WORKDIR /workspace

ENTRYPOINT [ "docker-entrypoint.sh" ]

EXPOSE 22

CMD [ "/usr/sbin/sshd", "-D" ]

2.3 编写docker-entrypoint.sh

在容器主进程运行前,完成环境配置。具体内容如下:

代码语言:javascript复制
#!/bin/bash
go version
gdb -v
make -v
groupadd -g ${SSH_GID} ${SSH_GROUP}
useradd -d /home/${SSH_USERNAME} -m -c "Golang development environment." -u ${SSH_UID} -g ${SSH_GID} -s /bin/bash ${SSH_USERNAME}
echo "${SSH_USERNAME}:${SSH_PASSWD}" | chpasswd
[ ! -d /workspace ] && mkdir /workspace
mkdir "${GOPATH}/src" "${GOPATH}/bin" "${GOPATH}/pkg"
chown -R ${SSH_USERNAME}:${SSH_GROUP} /workspace
exec "$@"

脚本中根据环境变量传入的值完成用户添加、权限配置,确保在容器运行后主机用户与容器内用户权限一致。配合容器启动命令,在主机和容器内均有相同的权限。

2.4 镜像构建

镜像构建前需确认构建目录内Dockerfile、docker-entrypoint.sh、go1.20.4.linux-amd64.tar.gz等三个文件已存在,执行构建命令:

代码语言:javascript复制
docker build -t go:1.20.4 .

构建完成后,在镜像仓库能够看到go:1.20.4的镜像。

2.5 启动容器

在容器启动时,需按要求完成相关的环境变量传入,如不传入相关环境变量,则会默认使用默认值,可能导致容器内部与主机上的权限不一致的情况。默认主机用户不直接使用root权限执行docker命令,启动命令如下:

代码语言:javascript复制
docker run -d --restart always 
    --hostname develop -e SSH_UID=`id -u` 
    -e SSH_GID=`id -g` -e SSH_USERNAME=`whoami` 
    -e SSH_PASSWD="D*r#1a2b" -e SSH_GROUP=`id -g -n` 
    --name golang-development-environment 
    -v ${HOME}/workspace/go:/workspace 
    -p 2024:22 go:1.20.4

2.6 登录环境

本例中暴露的端口为2024,在登录ssh服务时需将端口指定为2024。

代码语言:javascript复制
ssh ivan@192.168.1.1 -p 2024

按提示输入密码即可登录,192.168.1.1为本机IP。所有坑我都替大家踩过了,快去试试吧!

0 人点赞