Docker笔记(一)

Docker笔记(一)

标签: 持续集成 docker 运维 jenkins

背景描述:

最近在研究利用jenkins进行持续集成,主要根据jenkins的官方文档进行学习。在我本地部署的过程中,遇到了一个关于docker设置环境变量的问题,花了我6、7个小时去解决它。

我的想达到的目的是:使用jenkins的Pipeline根据自定义的脚本语法实现编译部署,编译过程中需要用到maven。按照官方的文档,我直接在jenkins上安装推荐的插件,但是没有解决问题,编译过程中总是报错误:

Pipeline代码:

pipeline {
    environment {
        remoteIp = "127.0.0.1"
    }
    agent any
	tools {
        maven 'maven-3.6.1'
    }
    stages {
         stage('pullcode'){
            steps{
                git credentialsId: 'xx', url: 'https://xx'
            }
        }

        stage('Build') {
            steps {
                sh '''
                    echo "开始编译打包过程"
                    echo "PATH = ${PATH}"
                    mvn clean && mvn package -DskipTests=true
                '''
            }
        }
          stage('Test'){
            steps {
                sh 'echo "Test stage"'
            }
        }
    }
}

错误:

image

我查了一些网上的方法,都不好使。最终心一横,Pipeline构建中的命令直接在docker中执行,我自己在docker中安装一个不就完事了。

新的Pipeline脚本不定义maven工具:

pipeline {
    environment {
        remoteIp = "127.0.0.1"
    }
    agent any
    stages {
         stage('pullcode'){
            steps{
                git credentialsId: 'xx', url: 'https://xx'
            }
        }

        stage('Build') {
            steps {
                sh '''
                    echo "开始编译打包过程"
                    echo "PATH = ${PATH}"
                    mvn clean && mvn package -DskipTests=true
                '''
            }
        }
          stage('Test'){
            steps {
                sh 'echo "Test stage"'
            }
        }
    }
}

1.安装maven

1.1启动容器

以下这个命令是启动jenkins容器,如果没有会自动下载安装。

docker run -u root -d -p 8080:8080 -v jenkins-data:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock jenkinsci/blueocean 

1.2 查看id并进入容器

docker ps
docker exec -it d46a525cc4f4(改成当前的id) /bin/bash

image

image

1.3 下载解压

cd /home
wget https://mirrors.aliyun.com/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
tar -zxvf apache-maven-3.6.3-bin.tar.gz

1.4配置环境变量

这个我在网上搜到大量的博客都在说:

  • 修改/etc/profile
  • source /etc/profile 使配置生效
  • mvn -version测试

是的,以上操作是可以生效,但是当你退出本次交互再进入时,mvn -version就无效了,意味着这样配置环境变量是没有效果的。我就奇怪了,这些博客是咋写出来的呢?这么明显的错误都看不见?

先暂时跳过这个配置,反正也没用

2.保存镜像

我们在容器进行操作后,需要保存镜像:

  • 在运行的容器内使用 apt-get update 命令进行更新。

  • 在完成操作之后,输入 exit 命令来退出这个容器。

  • 此时 ID 为 e218edb10161 的容器,是按我们的需求更改的容器。我们可以通过命令 docker commit 来提交容器副本。

$ docker commit -m="has update" e218edb10161 jenkinsci/blueocean
  • 通过docker images查看保存的镜像

image

  • 以后我们再启动容器时,要根据我们最新提交的镜像启动,否则之前所做的操作都无法生效:
docker run -u root -d -p 8080:8080 -v jenkins-data:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock modest_lamarr:v1.0

3设置mvn环境变量

查了好久资料才找到1.4配置环境变量不生效的原因:

/etc/profile中的变量不是自动就export的,完整的os在启动过程会有启动程序依次读取系统和用户的配置文件,但在容器里就没有这一步了,所以要自己导出才可以。

知道了原因,就好解决。我目前知道以下几个解决办法:

  • run启动时指定环境变量
  • run启动携带cmd,执行添加环境变量的命令
  • 重新定制docker,在dockerfile中的entrypoint定义己启动执行

其实我觉得上述方法中最好的应该是第三个,这样可以不使用冗长的命令,便于迁移部署,交接的时候也不用写一堆文档。但是考虑到我目前容器还没完全配置好,先暂时使用第一个方法,当所有需求都确定后,再采用第三个方法重建一个镜像。

3.1启动命令

先进入容器,查看/etc/profile中的PATH变量,将其复制出来并在末尾加上你安装的mavenbin路径,讲这个新环境变量再启动容器时指定即可:

新的启动容器命令:

docker run -u root -d -p 8080:8080 -v jenkins-data:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock -e "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/maven/bin" modest_lamarr:v1.1

参考:

使用docker exec进入容器,无法读取环境变量问题

官方文档

解决docker容器不能自动加载环境变量问题

保存镜像修改

posted @   海森堡不如我侧的准  阅读(145)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示