甲方需求是在一个容器上启动mysql服务,另一个容器上搭gogs,且gogs可修改
一开始的想法是搭一个go容器,然后源码发上去直接改,然后发现不行,主要原因是我pull了golang的镜像,但是似乎应该用alpine,总之这块没弄清楚自己想要不就在centos上搭呗。
首先安装mysql
run mysql
# 用于存放mysql数据文件
mkdir /opt/docker/data/mysql/data
# 用于存放mysql配置文件
mkdir /opt/docker/data/mysql/conf
cd /opt/docker/data/mysql/conf
在/opt/docker/data/mysql/conf目录下建立3个mysql配置文件 docker.cnf, mysql.cnf,
mysqldump.cnf
docker.cnf 内容
[mysqld]
skip-host-cache
skip-name-resolve
mysql.cnf内容
[mysql]
default-character-set = utf8
[mysql_safe]
default-character-set = utf8
[client]
default-character-set = utf8
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
#log-error = /var/log/mysql/error.log
# By default we only accept connections from localhost
#bind-address = 127.0.0.1
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# 修改mysql默认字符集
init_connect = 'SET NAMES utf8'
character-set-server = utf8
collation-server = utf8_unicode_ci
mysqldump.cnf内容
[mysqldump]
quick
quote-names
max_allowed_packet = 16M
启动mysql服务
docker run -d --name mysql56 --net=backend -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -v
/opt/docker/data/mysql/data:/var/lib/mysql -v /opt/docker/data/mysql/conf:/etc/mysql/conf.d
mysql:5.6
在数据库中创建库gogs,utf-8
docker exec -it mysql56 bash进入到容器中,mysql -u root -p进入mysql然后create database什么的
然后就是艰苦的gogs尝试记录,我先把正确的方法写下来,后面的是踩坑记录脑子也挺乱的可能比较难看
1.直接运行gogs镜像:
docker run -d -p 10022:22 -p 10080:3000 --name=gogs1 --net=backend -v
/opt/docker/gogs/:/data gogs/gogs
问题:无法进行二次开发,基础镜像内文件无法更改。
2.源码gogs搭建
本地编译得到gogs文件
go build gogs.go
把整个项目压缩成tar包
tar -zxvf gogs gogs.tar
下载go
wget https://studygolang.com/dl/golang/go1.10.1.linux-amd64.tar.gz
打包go环境变量
vi go.sh
内容为
export GOROOT=/data/work/go
export GOPATH=/data/work/gopath
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
下拉centos镜像
docker pull centos
建立dockerfile
vi Dockerfile
FROM centos:latest
#维护者信息
MAINTAINER TEST@TEST.COM
#设置用户
RUN groupadd git && useradd -r -g git git
RUN mkdir /home/git
RUN mkdir /gogs
RUN mkdir /go
run chmod 777 /go
RUN chmod 777 /gogs
RUN mkdir /root/gogs
RUN mkdir /root/go
RUN chmod 777 /root/go
RUN chmod 777 /root/gogs
RUN mkdir /usr/local/git
RUN chmod 777 /usr/local/git
#将服务器的go工程代码加入到docker容器中
COPY ./gogs.tar /gogs
COPY ./go1.12.6.linux-amd64.tar.gz /root
#COPY ./git-2.9.5.tar.gz /usr/local/git/
#源码安装git太麻烦还是用yum了,但是这样会导致每次build都要下载git
COPY ./go.sh /etc/profile.d/
#COPY ./git.sh /etc/profile.d/
#RUN tar -C /usr/local/git -zxvf /usr/local/git/git-2.9.5.tar.gz
#RUN cd /usr/local/git/git-2.9.5 && ls -a && ./configure --prefix=/usr/local/git && make && make install
RUN yum install -y git
RUN git --version
RUN tar -C /usr/local/ -zxvf /root/go1.12.6.linux-amd64.tar.gz && ls -a /usr/local/go
RUN tar -zxvf /gogs/gogs.tar
RUN source /etc/profile.d/go.sh
#RUN source /etc/profile.d/git.sh
#RUN go env#这句话运行不了
RUN chmod -R 777 /root
RUN chmod -R 777 /home
RUN chmod -R 777 /usr
RUN chmod -R 777 /opt
RUN ls -a /root/gogs
RUN rm -f /root/go1.12.6.linux-amd64.tar.gz
RUN rm -f /gogs/gogs.tar
WORKDIR /root/gogs
USER root
RUN whoami
#暴露端口
EXPOSE 3000
EXPOSE 22
#最终运行docker的命令
CMD ["./gogs","web"]
这段里面给权限安全隐患较大但是因为在docker容器内也没那么危险了,主要是为了让git用户有权限
源码gogs搭建错误历史
本地编译得到gogs文件
go build gogs.go
上传到linux
//docker run -it -v /root/gogs:/gogs -v /root/test/:/test -p 10022:22 -p 10080:3000 --name=gogs
--privileged centos bash
docker run -it -v /root/test/:/test -p 10022:22 -p 10080:3000 --name=gogs --network=backend --
privileged golang bash
//cd src/github.com/gogs/gogs/
//go build
./gogs web
进入网页http://192.168.152.128:10080/
数据库mysql56:3306
报错:运行系统用户非当前用户:root ->
原因分析:gogs依赖于git服务,没有安装gitX
使用git用户运行
su - git -c "cd /go/src/github.com/gogs/gogs && ./gogs web &"
编译后转到linux上运行不了,报错:[FATAL] [...gogs/gogs/cmd/web.go:66 checkVersion()] Fail to read
'templates/.VERSION': open /test/templates/.VERSION: no such file or directory
找不到文件
目前问题:install后无法访问http://192.168.152.128:10080/ 配置文件尝试
[server]
DOMAIN = localhost
HTTP_PORT = 3000
ROOT_URL = http://localhost:10080/ ## 这个就是图形界面的应用URL的值
DISABLE_SSH = false
SSH_PORT = 10022
START_SSH_SERVER = false
OFFLINE_MODE = false
错误
如果配置文件没问题,是否设置端口号有问题?
docker建立镜像和导出到文件
docker commit 4977b34adaee mysql56
4977b34adaee为容器名 mysql56为镜像名
docker save -o mysql56 mysql56
储存镜像为文件,前一个mysql56为文件名,后一个为镜像名
测试:删除docker镜像后导入文件
docker stop 所有容器后
docker rmi mysql56
导入docker镜像
docker load --input mysql56
有疑问加站长微信联系(非本文作者)