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

一 背景

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

二 操作步骤

2.1 准备基础软件包

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

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如下:

FROM openeuler/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; \
    bc; \
    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默认设置,用户名、组默认均为cxwn,密码为:C*x#1a2b,GID为1000
ENV SSH_USERNAME="cxwn" \
    SSH_PASSWD="C*x#1a2b" \
    SSH_UID="1000" \
    SSH_GROUP="cxwn" \
    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

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

#!/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

cat>/home/${SSH_USERNAME}/.bashrc<<-EOF
# GO语言相关环境变量设置
export GOPATH="/workspace"
export GOROOT="/usr/local/go"
export GOPROXY="https://goproxy.cn,direct"
export GO111MODULE="auto"
export GOBIN="/workspace/bin"
export PATH="\${PATH}:\${GOROOT}/bin:\${GOPATH}/bin"
EOF

exec "$@"

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

2.4 镜像构建

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

docker build -t go:1.20.4 .

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

2.5 启动容器

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

docker run -d --restart always \
    --hostname develop -e SSH_UID=`id -u` \
    -e SSH_GID=`id -g` -e SSH_USERNAME=`whoami` \
    -e SSH_PASSWD="C*x#1a2b" -e SSH_GROUP=`id -g -n` \
    --name golang-development-environment \
    -v ${HOME}/workspace/go:/workspace \
    -p 1022:22 go:1.20.4

2.6 登录环境

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

ssh ivan@192.168.1.1 -p 1022

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值