docker 镜像制作
以制作openeuler:22.03为例
-
docker pull openeuler/openeuler:22.03拉取指定版本镜像,如果失败需要设置docker的源
-
现在openeuler:22.03中需要内置一些rpm,python3.10.9、以及whl
docker run -itd --name openeuler-22.03 -v /tmp:/tmp openeuler/openeuler:22.03
docker exec -it openeuler-22.03 bash
宿主机执行:
cd /tmp
yum -y install rpm_name
宿主机下载pthon3.10.9源码包,依赖rpm包
容器中执行cd /tmp;rpm -Uvh --nodeps $(ls *.rpm) ;源码编译python3.10.9
-
宿主机
生成新的镜像openeuler:22.03-mod
docker commit -a “user and email” -m “commit msg” openeuler-22.03 openeuler:22.03-mod
-
项目打包到openeuler:22.03-mod中
项目app中可能需要新的whl包,rpm包,需要事先下载到对应pip、rpm目录
# 启动容器 docker run --network host -itd --name app \ -v $(pwd)/pip:/pip \ -v $(pwd)/rpm:/rpm \ -w /app \ # 容器内部程序的工作目录 openeuler:22.03-mod \ /bin/bash || exit -1 # 进入容器并执行依赖安装 docker exec -it app /bin/bash -c 'cd /pip;python3 -m pip install --upgrade --no-deps $(ls);cd /rpm;rpm -Uvh --nodeps $(ls)' || exit -1 # 将项目app-master拷贝到容器/app目录 docker cp app-master app:/app || exit -1 # 导出容器为app.rootfs.tar docker container export -o app.rootfs.tar app || exit -1 # 生成镜像app:0.1 docker image import app.rootfs.tar app:0.1 || exit -1 # 删除文件 rm app.rootfs.tar || exit -1 # 停止删除app容器 docker stop app || exit -1 docker rm app || exit -1
-
一般app项目都需要有个监控程序,用于监控进程挂掉之后,重新启动
#!/usr/bin/python3
import subprocess
import time
def get_process_id(process_nm):
pid = subprocess.run(["ps -ef | grep -w '{}' | grep -v grep | awk '{}'".format(process_nm, '{print $2}')], shell=True)
while True:
pid = get_process_id("start_app")
print('pid:', pid)
if not pid:
subprocess.run(['python3 start_app.py'], shell=True)
time.sleep(5)
-
生成docker-compose.yaml文件,用于拉取容器
version: '3' services: app: container_name: app image: app:0.1 network_mode: host # 使用主机网络 privileged: true # 启用特权模式 working_dir: /app/app-master command: ["python3", "run_app.py"]