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

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

如果pip install无法联网,则可以更换源

FROM test:20.04# RUN mkdir ./app
WORKDIR /app  RUN pwd
RUN  ls
RUN touch hello.txt
# TAG test001:20.04
# 更新软件包列表并安装基本工具和库  
RUN apt update && apt install -y \  python3 \  python3-pip \  pkg-config \  cmake \  g++ \  build-essential \  libglib2.0-dev \  apt-utils \  default-jdk \  python3-all-dev \  liblua5.1-dev \  golang \  doxygen \  git \  python3.8-dev \  python3.8-tk \  tk-dev \  libfreetype6-dev \  vim \  net-tools \  iputils-ping \  libatlas-base-dev \  liblapack-dev \  gfortran  # 设置pip源  
ENV PIP_DEFAULT_TIMEOUT=100  
ENV PIP_DISABLE_PIP_VERSION_CHECK=1  
RUN mkdir /pip  # pip.conf 文件内容如下  
# [global]  
# index-url = https://pypi.tuna.tsinghua.edu.cn/simple  
COPY pip.conf /pip/
ENV PIP_CONFIG_FILE=/pip/pip.conf # 或者直接在RUN命令中设置  
RUN pip install --index-url https://pypi.tuna.tsinghua.edu.cn/simple some-package  # 使用pip安装Python库  RUN apt-get install -y python3-matplotlib
RUN pip3 install --upgrade pip   
RUN pip3 install matplotlib scipy pandas# 清理无用的apt缓存(可选,减少镜像大小)  
RUN apt clean && rm -rf /var/lib/apt/lists/*  # 设置工作目录(如果需要的话)  
WORKDIR /appCOPY ./start.sh /app/
RUN chmod 777 /app/start.sh
CMD ["python3", "test.py"]
# CMD [ "/bin/bash", "-c",  "./start.sh"]# TAG test001:20.04
# docker buildx build --file /home/gdp/test/dockertest/test001.dockerfile --tag test001: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.04RUN apt-get  updateRUN 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.pyCOPY ./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之后进行编译操作

# 将放在本地目录下整理好的库文件复制到docker本地./environment相当于/,
# 将./environment/usr文件复制到docker的/下,-ar保证同时不损害原来docker:/usr中的文件
current_dir=$(pwd)
environment_dir=$current_dir/environmentcp -ar $environment_dir/usr  /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/environmentcp -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显卡,都是可以实现的。涉及到如下一些指令参数,仅供参考。

首先,在主系统里运行,就是你host主机,需要注意的是,每次重新开机,需要在本机操作一次xhost +

$ sudo apt-get install x11-xserver-utils$ xhost +

docker run 添加如下两个参数0或1可以试下, -e DISPLAY=:1 -v /tmp/.X11-unix:/tmp/.X11-unix

docker_args="-v $root_dir:/app -e DISPLAY=:1 -v /tmp/.X11-unix:/tmp/.X11-unix"

如果在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.xdnf.cn/news/1550245.html

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

相关文章

系统架构设计师-知识产权与标准化

目录 一、保护范围与对象 二、保护期限 三、知识产权人确定 四、侵权判断 五、标准化 一、保护范围与对象 知识产权是权利人依法就下列课题享有的专有权利: (一)作品(著作) (二)发明、实用…

用实力说话!望繁信科技与创鑫激光达成战略合作

2023年 ,国内激光器龙头企业创鑫激光与望繁信科技正式签署战略合作协议。双方将在流程智能平台应用、流程梳理与数据分析等业务领域展开深度合作,携手共赴广阔未来! 此次战略合作协议的签订,不仅标志着双方合作关系的进一步巩固和…

PHP 异步编程:从入门到精通

异步编程简介 异步编程是一种允许程序在等待某些操作(如I/O操作或长时间运行的任务)完成时继续执行其他任务的编程模式。这种方式可以显著提高应用程序的效率,尤其是在处理高延迟操作时。 PHP异步编程的实现 在PHP中,实现异步编…

鸿蒙开发:民族之光的崛起

在科技飞速发展的今天,操作系统的选择直接影响到我们的生活和工作方式。鸿蒙操作系统的出现,不仅代表了技术的进步,更是中国科技实力的象征,承载着“民族之光”的使命。 一、鸿蒙操作系统的背景 鸿蒙操作系统(Harmony…

「接口自动化测试」高频面试题!

一、json和字典的区别? json就是一个文本、字符串;有固定的格式,格式长的像python字典和列表的组合;以key-value的键值对形式来保存数据,结构清晰,。可以说是目前互联网项目开发中最常用的一种数据交互格式…

C++进阶——红黑树

1.红黑树的概念及其介绍 红黑树是一种近似平衡的二叉搜索树,与AVL树极为相似,红黑树的主要特点在于它通过约束树中节点的颜色和其他规则,确保树的高度始终接近对数时间复杂度,从而使常见操作(如插入、删除、查找&…

wpa_cli支持EAP-TLS认证运行设计

wpa_cli支持EAP-TLS认证运行设计 1 输入 1.1启动wpa_supplicant 和 wpa_cli 在OpenHarmony开发板或华为开发机的命令行中输入 wpa_supplicant -Dnl80211 -c/data/service/el1/public/wifi/wpa_supplicant/wpa_supplicant.conf -gabstract:/data/service/el1/public/wifi/sock…

物联网行业中3D打印工艺——FDM(熔融沉积成型技术)工艺

01 3D打印工艺——FDM工艺简介 格融沉积快速成型(Fused Deposion Modeling, FDM)是继光固化快速成型和叠层实体快速成型工艺后的另一种应用比较广泛的快速成型工艺。该技术是当前应用较为广泛的一种3D打印技术,同时也是最早开源的3D打印技术之一。该工艺方法以美国…

农场小程序带你走进生态农产品的世界

在快节奏的现代生活中,人们对食品安全的关注日益增强,对环境、健康农产品的需求也愈发迫切。然而,传统农产品市场往往信息不透明,消费者难以直接了解农产品的生长环境和生产过程,导致信任缺失。而农场小程序的出现&…

制定六西格玛人才培养方案需要考虑哪些因素?

当下,六西格玛作为一种先进的质量管理方法,被越来越多的企业采纳并应用于日常管理和流程优化中。然而,要成功实施六西格玛,关键在于培养一支具备高度专业素养和实战能力的六西格玛人才队伍。那么,制定六西格玛人才培养…

什么情况?上交所服务器被你们给买崩了?

号主:老杨丨11年资深网络工程师,更多网工提升干货,请关注公众号:网络工程师俱乐部 上午好,我的网工朋友。 9月27日早上,A股市场迎来了一波前所未有的火爆行情,成交量激增,市场情绪高…

加固与脱壳03 - 加固技术讨论

在 02 中,贴了一张图,里面涵盖了加固的绝大部分知识。现在我们稍微展开说一下其中几个,也是后续会深入学习的,其中一些还需要单独成系列才行。 代码混淆 分为 Java 层与 Native 层混淆。 Java 层的混淆主要分为两种&#xff1a…

基于微信小程序的交友平台

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…

[ComfyUI]Flux:超美3D微观山水禅意,经典中文元素AI重现,佛陀楼阁山水画卷

在数字艺术和创意领域,[ComfyUI]Flux以其独特的虚实结合技术,已经成为艺术家和设计师们手中的利器。今天,我们激动地宣布,[ComfyUI]Flux带来了一款超美的3D微观山水禅意作品,经典中文元素通过AI技术重现,包…

结婚证识别-离婚证识别接口-结婚证识别API应用场景

在信息化与智能化高速发展的今天,证件的自动识别技术逐渐成为了各行各业数字化转型的关键工具,而结婚证识别接口、离婚证识别接口正在悄然改变着传统的民政工作方式。 结婚证识别与离婚证识别接口是基于光学字符识别(OCR)技术的智…

热门财务软件大盘点,哪款最适合你?

本文介绍了ZohoBooks、金蝶云、速达会计等10款财务记账软件,各具优点,适合不同需求企业。各软件特点包括实时财务跟踪、多币种管理、无缝银行账户同步等,助企业高效管理财务。建议企业根据自身需求试用后选择。 一、Zoho Books Zoho Books是…

FreeRTOS列表与列表项

1.什么是列表与列表项 列表与列表项实际上是FreeRTOS中一个大量使用的一种数据结构 1.列表 列表的概念有点像链表,在 FreeRTOS 中,列表主要用于以下几个方面: 任务的管理:FreeRTOS 使用列表来管理不同的任务,包括就…

计算机网络面试题——第二篇

1. TCP拆包和粘包 现象 粘包:指在TCP传输中,发送方的多个数据包在接收方被合并在一个包接收,导致多条消息数据粘在一起,接收方无法正确区分这些消息的边界。拆包:指的是发送方的一个数据包在接收方被分成了多个包接收…

springboot集成mybatis插入数据时返回刚插入数据的自增id,插入数据没有使用实体

直接上代码吧 需要改两个地方一个dao一个xml 实现类里的逻辑 dao中新增注解 Options(useGeneratedKeys true, keyProperty "id")xml中新增 useGeneratedKeys"true" keyProperty"id"

2024年【电工(高级)】考试题及电工(高级)考试内容

题库来源:安全生产模拟考试一点通公众号小程序 电工(高级)考试题根据新电工(高级)考试大纲要求,安全生产模拟考试一点通将电工(高级)模拟考试试题进行汇编,组成一套电工…