一 背景
从国家层面来说,信息技术已经在国家安全中扮演着越来越重要的角色。通过实现自主可控,可以保护国家的核心技术和关键数据,避免被外部势力窃取或滥用。从我们个人层面来说,自主可控可以保护个人隐私,避免个人信息被滥用或泄露。这对社会稳定和个人权利保护都有重要意义。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。所有坑我都替大家踩过了,快去试试吧!