3种解决Docker容器中配置运行环境的方法

news2024/11/18 1:37:24

1. dockerfile用于通过脚本生成镜像

2.进入docker容器后,配置环境完,导出容器快照为镜像,拷贝到另一个主机,再进行加载;

3.在本地将依赖库等需要的文件按照目录整理好,映射到docker中。

1. dockerfile用于通过脚本生成镜像

用到的文件操作指令:

将当前的目录复制到/app中

COPY .  /app

设置进入后工作路径

WORKDIR  /app

本地存在一个start.sh文件,将脚本文件复制到目录中

COPY ./start.sh      /app/

RUN chmod 777 /app/start.sh

A. 在本地编写一个test.dockerfile文件,从网上拉取一个ubuntu:20.04镜像,并进行简单配置

# 使用Ubuntu 20.04作为基础镜像  
FROM ubuntu:20.04  
  
# 设置环境变量TZ为Asia/Shanghai  
ENV TZ=Asia/Shanghai  
# 设置时区  
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone  
  
# 将当前目录下的文件复制到容器的/app目录中  
# 注意:通常使用/app而不是~/,因为~/可能依赖于容器的shell和用户的HOME环境变量  
COPY . /app  
  

RUN sed -i 's/# \(deb .* universe\)$/\1/g' /etc/apt/sources.list && \  
    sed -i 's/# \(deb-src .* universe\)$/\1/g' /etc/apt/sources.list  
  
# 更新apt包列表  
# RUN apt-get update 

# RUN apt-get install -y python3  
    # apt-get install -y python3 && \  
    # rm -rf /var/lib/apt/lists/*  
  
# 创建一个简单的Python脚本  
RUN touch test.py  
RUN echo "print('hello')" >> test.py  

# 设置工作目录为/app  
WORKDIR /app  
# 使用CMD指令运行Python脚本  
# 注意:CMD中的路径应该是相对于WORKDIR或者绝对路径,这里使用相对路径  
# CMD ["python3", "./test.py"]

# TAG test:20.04

B. 运行指令,生成镜像,镜像的tag为test:20.04

docker buildx build --file /home/gdp/test/dockertest/test.doc
kerfile --tag test:20.04 .

C. 在本地编写一个test001.dockerfile文件,基于上一步生成test:20.04镜像,并进行简单配置。省的每次build需要花较长的时间。

start.sh文件内容如下,末尾添加bash,在程序运行结束后,会保持端口打开,不会自动关闭。

#!/bin/bash
python3 test.py 
bash
FROM test:20.04

# RUN mkdir ./app
WORKDIR /app  

RUN pwd
RUN  ls
RUN touch hello.txt
# TAG test001:20.04

RUN apt-get  update

RUN apt install -y  python3
RUN apt-get install -y pkg-config
RUN apt-get install -y cmake
RUN apt-get install -y g++


RUN mv /test.py /app/test.py

COPY ./start.sh /app/
RUN chmod 777 /app/start.sh
# CMD [ "/bin/bash", "-c",  "./start.sh"]

D. 运行指令,生成镜像,镜像的tag为test001:20.04

docker buildx build --file /home/gdp/test/dockertest/test001.dockerfile --tag test001:20.04 .

反复运行该指令,并修改test001.dockerfile,

该方式:适合配置一些简单的基础包。不合适 用于改动或调试工程代码或处理复杂的安装依赖文件等。

2.进入docker容器后,配置环境完,导出容器快照为镜像

在Docker容器中配置环境,并将其作为镜像供另一台机器使用,例如,上述方法中没有安装eigen库,下面在进入docker后安装库,并不丢失的保存为镜像。

a. 进入镜像

docker run --rm -it  test001:20.04

b. 安装eigen

查看是否已安装eigen3库

root@ac447a8ed1dc:/app#    pkg-config --modversion eigen3

没有安装的话,安装一下

root@ac447a8ed1dc:/app#    apt-get install libeigen3-dev

二、将配置好的容器保存为镜像

docker 查看container的名称

docker container ls

提交容器为镜像:

docker commit eager_bardeen eigentest:eigen3

docker commit 镜像名称  新的镜像名:新标签

可以查看到镜像

gdp@gdp:~$ docker images
REPOSITORY               TAG                       IMAGE ID       CREATED          SIZE
eigentest                eigen3                    bd3483f2d3ae   41 seconds ago   290MB
启动eigentest镜像的交互终端,再次运行,验证是否已安装eigen

pkg-config --modversion eigen3

已安装eigen,将镜像导出并传输到另一台机器

docker save -o myeigen.tar eigentest:eigen3

生成.tar文件,将导出的tar文件传输到另一台机器

进行镜像的加载

docker load -i myeigen.tar

运行容器

docker run --rm -it  eigentest:eigen3

--rm,一旦容器停止,它就会被自动删除

-it选项,你将能够在一个交互式shell中操作容器,就好像你直接在容器内部工作一样

成功进入!

通过以上步骤,你可以在Docker容器中配置环境,并将其作为镜像供另一台机器使用。

3.文件按照目录整理好,映射到docker中,将所需文件复制到目录中

新建一个shell文件docker_load.sh,用于docker加载时的一些操作

#生成docker镜像
# docker buildx build --file /home/gdp/test/dockertest/test001.dockerfile --tag test001:20.04 .
# 获取当前脚本所在的绝对路径目录
current_pwd=$(cd $(dirname $0); pwd)
current_pwd_short=$(basename $(pwd))
# echo $current_pwd
# echo $current_pwd_short
root_dir=$current_pwd/../
root_dir="/home/gdp/test/dockertest"
# # 配置容器参数

docker_args="\
        -v $root_dir:/app"
docker run --rm -it   $docker_args  test001:20.04

最后两句-v $root_dir:/app将宿主机工程目录映射到docker中

再在根目录新建一个docker_build.sh的shell脚本,用于在进入docker之后进行编译操作

cd build
cmake ..
make

编译一个eigen的工程,参考如下链接一次成功流水账-Cmake组织工程并调用Eigen库_cmakelist eigen-CSDN博客

由于docker中没有安装eigen库,也没有映射进去,所以报错。

将eigen库运行需要的文件按照目录放置在environment的目录下usr文件夹中,

包括可执行文件,库文件,.cmake文件和头文件等。

通过如下cp -ar的 指令将文件复制到docker的本地/usr目录中,同时不破坏docker原有的/usr目录下的文件。

  • -a:以归档模式复制,这意味着它会尽可能保留源文件的属性(如权限、时间戳、链接等),并递归地复制目录。
  • -r:递归复制,但因为 -a 已经包含了这一行为,所以在这里是可选的。

再次修改docker_build.sh脚本

将映射后目录的内容复制到docker本地目录中

current_dir=$(pwd)
environment_dir=$current_dir/environment

cp -ar $environment_dir/usr  /

cd build
cmake ..
make

./Eigentest

生成可执行文件./Eigentest

能够正常运行。

在配置好运行环境之后,正常的流程如下

1.  修改代码和cpp文件

2. 执行./scripts/docker_load.sh脚本,启动docker,映射目录

3. 执行./docker_build.sh脚本,将库文件等复制到docker容器环境中,并进行编译并运行。

docker中如何显示仿真界面,以及在docker中如何使用nvidia显卡,都是可以实现的。涉及到如下一些指令参数,仅供参考。

需要在宿主机提前安装好nvidia-docker这个软件,安装教程可以参考Ubuntu 20.04 系统安装Docker及nvidia-docker2 - 文章 - 开发者社区 - 火山引擎

echo "# working in WITH NVIDIA Card"
docker run -it -d --device=/dev/dri \
                --env="DISPLAY" --env="QT_X11_NO_MITSHM=1" -e DISPLAY=$DISPLAY -e NVIDIA_VISIBLE_DEVICES=all -e NVIDIA_DRIVER_CAPABILITIES=compute,utility,graphics --runtime=nvidia \
$docker_args > /dev/null 2>&1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2175604.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

衡石分析平台系统管理手册-功能配置之资源管理

资源管理​ 系统管理员可以对系统中的所有资源进行查看、转移所有权、删除操作; 可以查看特定用户持有的资源,从而可用在资源转移/删除后,删除用户、释放系统资源; 在组织用户变动较大时,可以实现资源的整理和回收。…

力扣 最小覆盖子串

最小覆盖子串 https://leetcode.cn/problems/minimum-window-substring/ 题目描述 题目分析f 覆盖子串:首先根据题意,要求目标字符串的元素必须都在子串中出现过,这表明可以是乱序出现。所以在解决问题是我们需要对子串和目标字符串做匹配&a…

408数据结构解析模版

第一题: 解析: 答案选A。 第二题: 解析: 答案选A。 第三题: 解析: 答案选A。 第四题: 解析: 答案选A。 第五题: 解析: 答案选A。 第六题: 解析…

数据结构与算法——Java实现 22.有效的括号

目录 22. 有效的括号 思路 接口 数组实现类 有效的括号 力扣 直到有一天,我不会再问离开的人为什么 —— 24.9.28 22. 有效的括号 给定一个只包括 (,),{,},[,] 的字符串 s ,判断字符串是否有效。…

鸿蒙开发(NEXT/API 12)【硬件(传感器开发)】传感器服务

使用场景 Sensor Service Kit(传感器服务)使应用程序能够从传感器获取原始数据,并提供振感控制能力。 Sensor(传感器)模块是应用访问底层硬件传感器的一种设备抽象概念。开发者可根据传感器提供的相关接口订阅传感器…

新电脑需要安装杀毒软件吗?

以下是关于新电脑是否需要安装杀毒软件的建议: 如果您经常访问各类网站,下载未知来源的文件,或者使用外部存储设备交换数据,那么安装杀毒软件是有必要的。 操作步骤:选择一款知名的杀毒软件,如 360 杀毒、腾…

KaiOS statusbar 更新代码逻辑

简介 状态栏在system APP,KaiOS上面的代码路径是 gaia/apps/system。 statusbar.js 代码结构 gaia\apps\system\js\statusbar.js 状态栏逻辑 statusbar.js代码结构-1-变量 statusbar.js代码结构-2-detail StatuBar 对象 var StatusBar = {serviceState: function sb_updat…

[spring]SpringBoot拦截器 统一数据返回格式 统一异常处理

文章目录 一. 拦截器1. 什么是拦截器2. 拦截器的使用自定义拦截器注册配置器拦截路径 3. 适配器模式 二. 统一数据返回格式异常处理 三. 统一异常处理 一. 拦截器 1. 什么是拦截器 例如, 图书管理系统, 在访问图书list页面之前, 需要先进行登录, 如果没登录, 就需要进行强制跳…

SpringCloud入门(九)Feign实战应用和性能优化

一、Feign实战应用 Feign的客户端与服务提供者的controller代码非常相似: 有没有一种办法简化这种重复的代码编写呢? 方式一:继承 优点: 简单。实现了代码共享。 缺点:服务提供方、服务消费方紧耦合。参数列表中的注解…

【Docker】如何让docker容器正常使用nvidia显卡

首先确保宿主机正常安装了显卡驱动 nvidia-smi打印显卡信息如下: 安装nvidia-container-toolkit工具 sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit sudo systemctl restart docker运行如下命令测试显卡是否在容器内可用 …

conda安装包离线安装环境

最近使用dokcerfile去创建镜像的时候,使用conda安装nvidia-cuda 总是失败,网络问题很大 可以通过离线的方式下载conda的安装包,然后放入文件中离线安装 通过以下命令得到安装包地址 conda search cudatoolkit --info 复制安装包地址到浏览器…

YOLOv5改进:Unified-loU,用于高品质目标检测的统一loU ,2024年8月最新IoU

💡💡💡现有IoU问题点:IoU (Intersection over Union)作为模型训练的关键,极大地显示了当前预测框与Ground Truth框之间的差异。后续研究者不断在IoU中加入更多的考虑因素,如中心距离、纵横比等。然而,仅仅提炼几何差异是有上限的;而且新的对价指数与借据本身存在潜在…

JMeter 实现 MQTT 协议压力测试 !

1. 下载jmeter,解压 https://jmeter.apache.org/download_jmeter.cgi 以 5.4.3 为例,下载地址: https://dlcdn.apache.org//jmeter/binaries/apache-jmeter-5.4.3.zip linux下解压: unzip apache-jmeter-5.4.3.zip 2. 下载…

最新最全的阿里大模型面试真题!看到就是赚到

前言 随着人工智能技术的飞速发展,计算机视觉(CV)、自然语言处理(NLP)、搜索、推荐、广告推送和风险控制等领域的岗位越来越受到追捧,掌握大型模型技术已成为这些岗位的必备技能。然而,目前公开…

19.3 打镜像部署到k8s中,prometheus配置采集并在grafana看图

本节重点介绍 : 打镜像,导出镜像,传输到各个节点并导入运行该项目配置prometheus和grafana 打镜像 本地build docker build -t ink8s-pod-metrics:v1 .build过程 导出镜像 docker save ink8s-pod-metrics > ink8s-pod-metrics.tar 传输到各个node…

PCB基础

一、简介 PCB:printed circuit board,印刷电路板 主要作用:传输信号、物理支撑、提供电源、散热 二、分类 2.1 按基材分类 陶瓷基板:包括氧化铝、氮化铝、碳化硅基板等,具有优异的导热性,适用于高温和高…

论文复现:考虑电网交互的风电、光伏与电池互补调度运行(MATLAB-Yalmip-Cplex全代码)

论文复现:考虑电网交互的风电、光伏与电池储能互补调度运行(MATLAB-Yalmip-Cplex全代码) 针对风电、光伏与电化学储能电站互补运行的问题,已有大量通过启发式算法寻优的案例,但工程上更注重实用性和普适性。Yalmip工具箱则是一种基于MATLAB平台的优化软件工具箱,被广泛应用…

车辆零部件检测和分割数据集-车体数据集-yolo格式-yolov5-yolov10可用

这些标签是用于实例分割任务中的类别,通常在汽车图像识别或自动驾驶技术中使用。以下是这些类别: back_bumper - 后保险杠back_glass - 后挡风玻璃back_left_door - 后左车门back_left_light - 后左灯back_right_door - 后右车门back_right_light - 后右…

Linux进程-2

一:进程优先级 基本概念 cpu资源分配的先后顺序,就是指进程的优先权(priority)。 优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可以改善系统性能。 还可以把进程运行到指定的CPU上&#…

9_28代码实现登录框 注释

注释&#xff1a; .h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> // 防止头文件重复包含QT_BEGIN_NAMESPACE namespace Ui { class Widget; } //Ui表示命名空间的名称 //{ class Widget; } &#xff1a;表示在Ui命名空间中声明一个其他文件midget的类 QT_…