从零做CI


typora-copy-images-to: pics


基础环境

docker

安装docker-18.06.3-ce

#!/usr/bin/env bash
# 清理
sudo echo "清理当前宿主机内存"
sudo echo 1 > /proc/sys/vm/drop_caches
sudo echo 2 > /proc/sys/vm/drop_caches
sudo echo 3 > /proc/sys/vm/drop_caches


# 检测
sudo echo "查看系统版本"
sudo cat /etc/redhat-release

sudo echo "查看内核"
sudo uname -sr


# 配置环境变量实现适配
sudo echo "确定环境变量"
export dns_server=192.168.200.10
export network_name=ens160
export docker_version=18.06.3


# 修改主机配置
sudo echo "修改dns"
sudo nmcli con mod ${network_name} ipv4.dns "${dns_server}"
sudo nmcli con up ${network_name}

echo "修改主机名称为ip名称"
sudo hostnamectl set-hostname `ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6 | awk '{print $2}' | tr -d "addr:"`

echo "关闭selinux"
sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

echo "修改时区为上海"
sudo ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

echo "修改系统语言环境"
sudo echo 'LANG="en_US.UTF-8"' >> /etc/profile;source /etc/profile

echo "同步时间"
sudo yum install -y ntp
sudo ntpdate pool.ntp.org

echo "kernel性能调优:"
echo "1、修复可能出现的网络问题"
echo "2、修改最大进程数"
sudo cat >> /etc/sysctl.conf<

docker-compose

安装docker-compose1.24.0

curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

chmod +x /usr/local/bin/docker-compose

ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

docker-compose --version

wget

yum install -y wget

源码管理

git

安装gitlab

#!/usr/bin/env bash
echo "检查docker是否安装"
docker version

echo "检查磁盘是否够用"
df -h /data

echo "创建数据挂载点"
rm -rf /data/tristan/gitlab/config /data/tristan/gitlab/logs /data/tristan/gitlab/data
mkdir -p  /data/tristan/gitlab/config /data/tristan/gitlab/logs /data/tristan/gitlab/data

echo "拉取gitlab镜像"
docker pull gitlab/gitlab-ce:latest

echo "运行镜像"
docker run --detach \
  --hostname gitlab.xxx.com \
  --publish 80:80 --publish 2289:22 \
  --name gitlab \
  --restart always \
  --volume /data/tristan/gitlab/config:/etc/gitlab \
  --volume /data/tristan/gitlab/logs:/var/log/gitlab \
  --volume /data/tristan/gitlab/data:/var/opt/gitlab \
  gitlab/gitlab-ce:latest

echo "查看镜像运行情况"
docker logs -f gitlab

语言依赖

java

nexus

安装nexus3

# 创建本地文件夹
rm -rf /data/tristan/nexus
mkdir -p /data/tristan/nexus && chmod 777 /data/tristan/nexus

# 启动容器
docker stop nexus
docker rm nexus
docker run -d --restart always -p 8081:8081 --name nexus -v /data/tristan/nexus:/nexus-data sonatype/nexus3:3.15.2

# 查看镜像启动情况
docker logs -f nexus

访问

http://xxx.xxx.xxx.xxx:8081 admin/admin123

配置

私有库创建

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jSNSCZ9C-1571736592106)(pics\1553439067920.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2bPbRj3a-1571736592108)(pics\1553439082851.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4R6A83PW-1571736592116)(pics\1553439102317.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Dl5Tg3RO-1571736592118)(pics\1553439195346.png)]

代理地址为:

http://maven.aliyun.com/nexus/content/groups/public

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-57so4Lbm-1571736592120)(pics\1553439274088.png)]


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WnC9gBhD-1571736592122)(pics\1553440231368.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BOrfqwAz-1571736592124)(pics\1553439304007.png)]

权限角色创建

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Fd6pS388-1571736592126)(pics/1553500896316.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gSvCOpws-1571736592129)(pics/1553500991740.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hzQaeWo9-1571736592131)(pics/1553501030700.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HBfS74ZV-1571736592132)(pics/1553501080059.png)]

对外使用文件

settings.xml

  
  
  
    
    
  
    
      	
      nexus-snapshots
      ebuy-cloud-test
      ebuy-cloud-test
    
	
    
  
     
       
      nexus-releases   
      *   
      http://192.168.71.220:8081/repository/maven-public/   
        
       
      nexus-snapshots   
      *   
      http://192.168.71.220:8081/repository/maven-snapshots/   
    
  
   
  
	 
	
		nexus-snapshots
		
			nexus-snapshots
			nexus-snapshots
			http://192.168.71.220:8081/repository/maven-snapshots/

		
	
    
  
    
      nexus-snapshots  
    
   
  

CI

docker-registry

搭建harbor

mkdir -p /data/harbor-install /data/harbor /data/harbor-install/ssl && cd /data/harbor-install

wget https://storage.googleapis.com/harbor-releases/release-1.8.0/harbor-online-installer-v1.8.0.tgz

tar xvf harbor-online-installer-v1.8.0.tgz

cd harbor

# 修改配置文件
vi harbor.yml
hostname: dockerregistry.local.yibainetwork.com

https.ssl_cert = /data/harbor-install/ssl/dockerregistry.local.yibainetwork.com.pem
https.ssl_cert_key = /data/harbor-install/ssl/dockerregistry.local.yibainetwork.com.key

harbor_admin_password: Tristan4001
database.password: Tristan4001
data_volume: /data/harbor

./install.sh

验证使用

docker login xxx.com
username
password

docker pull hello-world
docker tag  hello-word xxx.com/test/test:0.0.1
docker push xxx.com/test/test:0.0.1
docker pull xxx.com/test/test:0.0.1

aliyun docker registry

https://ram.console.aliyun.com/groups

创建用户组

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7ULFN8b6-1571736592134)(C:\Users\tristan\Desktop\从零做CI\pics\1571313567727.png)]

为用户组添加权限

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MYU6JWBZ-1571736592135)(C:\Users\tristan\Desktop\从零做CI\pics\1571313687842.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r4SzGHb9-1571736592137)(C:\Users\tristan\Desktop\从零做CI\pics\1571313707839.png)]

创建用户(子账号)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RsJmJMgl-1571736592138)(C:\Users\tristan\Desktop\从零做CI\pics\1571313738659.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Hy6tYWpp-1571736592140)(C:\Users\tristan\Desktop\从零做CI\pics\1571313787443.png)]

添加用户到用户组

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vfu8sBfr-1571736592142)(C:\Users\tristan\Desktop\从零做CI\pics\1571313800517.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6KShA6Vy-1571736592144)(C:\Users\tristan\Desktop\从零做CI\pics\1571313816963.png)]

创建命名空间

https://cr.console.aliyun.com/cn-shenzhen/instances/repositories

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nLmWrz2U-1571736592145)(C:\Users\tristan\Desktop\从零做CI\pics\1571313873094.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HobFLp06-1571736592146)(C:\Users\tristan\Desktop\从零做CI\pics\1571313889027.png)]

测试:

docker login xxx.com
username
password

docker pull hello-world
docker tag  hello-word xxx.com/test/test:0.0.1
docker push xxx.com/test/test:0.0.1
docker pull xxx.com/test/test:0.0.1

gitlab-ci

安装

#!/usr/bin/env bash
echo "拉取镜像"
docker pull gitlab/gitlab-runner:latest

echo "清理原来目录"
rm -rf /data/tristan/gitlab-runner/config

echo "创建挂载目录"
mkdir -p  /data/tristan/gitlab-runner/config

echo "检查磁盘可用"
df -h /data/tristan/gitlab-runner/config

echo "清理原来的gitlab-runner"
docker stop gitlab-runner
docker rm   gitlab-runner

echo "运行"
docker run -d --name gitlab-runner --restart always \
   -v /data/tristan/gitlab-runner/config:/etc/gitlab-runner \
   -v /var/run/docker.sock:/var/run/docker.sock \
   -e TZ=Asia/Shanghai \
   gitlab/gitlab-runner:latest

echo "查看日志: docker logs -f gitlab-runner"
sleep 1
docker logs gitlab-runner

echo "注册到gitlab: docker exec -it gitlab-runner gitlab-ci-multi-runner register"

echo "设置默认配置 /data/tristan/gitlab-runner/config/config.toml"
# 修改并发数
echo 'concurrent = 100'
# 修改磁盘挂载
echo '    volumes = ["/cache", "/root/.m2:/root/.m2","/var/run/docker.sock:/var/run/docker.sock","/etc/localtime:/etc/localtime:ro"]'
# 修改拉取镜像策略
echo '    pull_policy = "if-not-present"'

镜像仓库配置

创建dockerregistry认证文件

~/.m2/dockerregistry-auth

密码

~/.m2/dockerregistry

DOCKER_REGISTRY_URL=docker.xxx.com/命名空间
DOCKER_REGISTRY_USERNAME=账号

语言适配

java

依赖型项目

.gitlab-ci.yml

build:code:
  image: maven:3-alpine
  variables:
    MAVEN_CLI_OPTS: "-s .m2/settings.xml --batch-mode"
  cache:
    paths:
      - .m2/repository/
      - target/
  script:
    - echo "Asia/Shanghai" > /etc/timezone
    - mvn deploy

pom.xml

    
        
            ${repository.id}
            ${repository.name}
            ${repository.url}
            default
        
    
    
        
            
                true
            
            ${repository.id}
            ${repository.name}
            ${repository.url}
        
    
部署型项目

.gitlab-ci.yml

build:code:
  stage: build
  image: maven:3-alpine
  variables:
    MAVEN_CLI_OPTS: "-s .m2/settings.xml --batch-mode"
  cache:
    paths:
      - target/
  script:
    - mvn clean package -DskipTests
test:image:
  stage: test
  image: docker
  cache:
    paths:
      - target/
  dependencies:
    - :build:code
  script:
    - chmod 777 build-docker.sh && dos2unix build-docker.sh && source build-docker.sh

build-docker.sh

#!/bin/bash
echo '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>开始构建服务:'${JOB_NAME}
dos2unix /root/.m2/${CI_COMMIT_REF_NAME}/dockerregistry && source /root/.m2/${CI_COMMIT_REF_NAME}/dockerregistry
CUR_DATETIME_STR=$(date "+%Y%m%d%H%M")
IMAGE_PROJECT_TAG=${CI_PROJECT_NAME}"-"${CI_COMMIT_REF_NAME}
IMAGE_ID=${DOCKER_REGISTRY_URL}"/"${IMAGE_PROJECT_TAG}":"${CI_BUILD_ID}"_"${CUR_DATETIME_STR}
echo '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>正在登录镜像仓库'
cat /root/.m2/${CI_COMMIT_REF_NAME}/dockerregistry-auth |  docker login ${DOCKER_REGISTRY_URL} --username ${DOCKER_REGISTRY_USERNAME} --password-stdin
echo '<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<登录镜像仓库成功'
echo '<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<正在构建镜像'
docker build --build-arg IMAGE_PROJECT_TAG=${IMAGE_PROJECT_TAG} -t ${IMAGE_ID}  .
echo '<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<构建镜像成功'
echo '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>正在推送镜像到镜像仓库'
docker push ${IMAGE_ID}
echo '<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<推送镜像到镜像仓库成功'
echo '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>正在清理本地镜像'
docker rmi ${IMAGE_ID}
echo '<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<清理本地镜像成功'
echo '<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<完成构建服务:'${JOB_NAME}
echo '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>'
echo '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>'
echo '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>'
echo '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>'
echo '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>'
echo '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>'
echo '请拷贝镜像id到下一环节,镜像id为:'
echo ${IMAGE_ID}
echo '<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<'
echo '<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<'
echo '<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<'
echo '<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<'
echo '<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<'
echo '<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<'

Dockerfile

FROM registry-vpc.cn-shenzhen.aliyuncs.com/jlyx/base_image-master:48_201910181447
ADD target/*.jar app.jar
ADD startup.sh startup.sh
RUN bash -c 'touch app.jar'
RUN chmod 777 startup.sh
ARG IMAGE_PROJECT_TAG
ENV SW_AGENT_NAME ${IMAGE_PROJECT_TAG}
ENTRYPOINT ["./startup.sh"]

pom.xml

    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
                
                    true
                
            
        
    
    
        
            ${repository.id}
            ${repository.name}
            ${repository.url}
            default
        
    
    
        
            
                true
            
            ${repository.id}
            ${repository.name}
            ${repository.url}
        
    

startup.sh

#!/usr/bin/env bash
echo "启动服务"
java -javaagent:/agent/skywalking-agent.jar -jar /app.jar ${CLOUD_EUREKA_DEFAULTZONE} ${JASYPT_ENCRYPTOR_PASSWORD}

php

python

nodejs

.gitlab-ci.yml

build:code:
  stage: build
  image: node
  cache:
    paths:
      - dist/
  script:
    - rm -rf dist
    - npm config set registry https://registry.npm.taobao.org --global
    - npm config set disturl https://npm.taobao.org/dist --global
    - npm install
    - npm run build:prod
test:image:
  stage: test
  image: docker
  cache:
    paths:
      - dist/
  dependencies:
    - :build:code
  script:
    - chmod 777 build-docker.sh && dos2unix build-docker.sh && source build-docker.sh

build-docker.sh

#!/bin/bash
echo '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>开始构建服务:'${JOB_NAME}
dos2unix /root/.m2/${CI_COMMIT_REF_NAME}/dockerregistry && source /root/.m2/${CI_COMMIT_REF_NAME}/dockerregistry
CUR_DATETIME_STR=$(date "+%Y%m%d%H%M")
IMAGE_PROJECT_TAG=${CI_PROJECT_NAME}"-"${CI_COMMIT_REF_NAME}
IMAGE_ID=${DOCKER_REGISTRY_URL}"/"${IMAGE_PROJECT_TAG}":"${CI_BUILD_ID}"_"${CUR_DATETIME_STR}
echo '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>正在登录镜像仓库'
cat /root/.m2/${CI_COMMIT_REF_NAME}/dockerregistry-auth |  docker login ${DOCKER_REGISTRY_URL} --username ${DOCKER_REGISTRY_USERNAME} --password-stdin
echo '<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<登录镜像仓库成功'
echo '<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<正在构建镜像'
docker build --build-arg IMAGE_PROJECT_TAG=${IMAGE_PROJECT_TAG} -t ${IMAGE_ID}  .
echo '<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<构建镜像成功'
echo '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>正在推送镜像到镜像仓库'
docker push ${IMAGE_ID}
echo '<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<推送镜像到镜像仓库成功'
echo '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>正在清理本地镜像'
docker rmi ${IMAGE_ID}
echo '<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<清理本地镜像成功'
echo '<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<完成构建服务:'${JOB_NAME}
echo '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>'
echo '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>'
echo '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>'
echo '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>'
echo '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>'
echo '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>'
echo '请拷贝镜像id到下一环节,镜像id为:'
echo ${IMAGE_ID}
echo '<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<'
echo '<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<'
echo '<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<'
echo '<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<'
echo '<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<'
echo '<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<'

Dockerfile

FROM nginx
WORKDIR /usr/share/nginx/html
COPY dist .

你可能感兴趣的:(架构师成长之路)