* 以下示例使用 docker-compose 命令,因此需要 Dockerfile 和 docker-compose.yml 文件搭配
* 以下示例假设 Dockerfile 在 go 为文件名的目录下,go目录和 docker-compose.yml 在同一个目录下
* 为了能在 go 容器中使用 git, 在go目录下添加tools目录,并增加 .netrc 和 git-env.sh 文件
* 因为需要通过ssh的方式去链接到go容器,所以在tools目录下,还增加了ssh目录存放自己的ssh公钥
* 因此文件目录结构如下:
- docker-compose.yml
- go
- Dockerfile
- tools
- .netrc
- git-env.sh
- ssh
- id_rsa.pub
* 以下内容仅做参考
* go 目录下的 Dockerfile 参考内容:
FROM golang:1.21.4
MAINTAINER demo "[email protected]"
# 设置时区<这个方法貌似设置不了,使用下面的 tzdata来设置时区>
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
COPY tools /var/tools/
# set go get use username and passwd
ENV GIT_TERMINAL_PROMPT 1
# 更新安装依赖包和核心扩展
RUN apt-get update && \
apt-get install -y --no-install-recommends \
curl wget cron vim git zip unzip procps telnet \
openssh-server net-tools \
&& cp -rf /var/tools/.netrc /root/ \
# 修改 dash 为 bash
&& ln -fs /bin/bash /bin/sh \
&& sh /var/tools/git-env.sh \
&& go install github.com/go-delve/delve/cmd/dlv@latest
# ssh
RUN mkdir -p /root/.ssh \
&& touch /root/.ssh/authorized_keys \
&& cat /var/tools/ssh/id_rsa.pub >> /root/.ssh/authorized_keys \
&& chmod 644 ~/.ssh/authorized_keys \
&& cp /var/tools/ssh/ssh-login.conf /etc/ssh/sshd_config.d/ \
&& mkdir -p /var/run/sshd \
# 需要将docker主进程的环境变量写入到root用户,否则会出现ssh方式连接后,环境变量失效的问题
&& echo "export $(cat /proc/1/environ |tr '\0' '\n' | xargs)" >> /root/.bashrc
#设置镜像的工作目录
WORKDIR /go
* docker-compose.yml 中 go 的内容段参考:
go-1.21:
build: ./go
links:
- redis-5.0:redis
- mysql-8.0:mysql
volumes:
- ../tools:/data/tools:rw
- ../data/www/go:/go:rw
- ../data/tools:/data/tools-data:rw
environment:
TZ: 'Asia/Shanghai'
#这里需要使用 expose 而不能使用 ports,因为不需要将端口暴露给宿主机,否则就可以直接通过ip:port访问了
#另外go程序需要监听所有8080端口,而不能使用 httpaddr = "127.0.0.1",否则nginx无法进行反向代理
# expose:
# # go 可以不需要 nginx 代理
# # 主要暴露出来给 nginx 使用
# - "8000"
# - "8080"
# - "8081"
# - "8082"
# - "8083"
# - "8084"
ports:
# 为了让本机可以直接访问到程序
- "8000-8100:8000-8100"
# ssh
- "1022:22"
restart: always
security_opt:
- apparmor:unconfined
# tty: true
# 启动调试监听
command: bash -c "/etc/init.d/ssh restart && tail -f /dev/null"
* tools/.netrc 文件内容如下:
machine www.xxx.com login <username> password <password>
* tools/git-env.sh 文件内容如下:
#!/bin/bash
git config --global user.email "[email protected]"
git config --global user.name "abc"