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

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之后进行编译操作

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显卡,都是可以实现的。涉及到如下一些指令参数,仅供参考。

需要在宿主机提前安装好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/1549489.html

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

相关文章

6.8方框滤波

基本概念 方框滤波(Box Filter)是一种基本的图像处理技术,用于对图像进行平滑处理或模糊效果。它通过在图像上应用一个固定大小的方框核(通常是矩形),计算该区域内像素值的平均值来替换中心像素的值。这种…

多模态大模型学习(一)

参考:https://www.bilibili.com/video/BV1kT411o7a6?p2&spm_id_frompageDriver&vd_source156234c72054035c149dcb072202e6be 余弦相似度,让正样本内积趋近于1,负样本趋近于-1。度量学习。N特别大时,负样本远大于正样本&…

HTML基础用法介绍二

目录: 列表 无序列表有序列表定义列表 表格 表格单元格合并 input标签 属性值text和password的使用 输入框中占位文本的使用 属性值radio的使用属性值checkbox的使用属性值file的使用 下拉菜单 文本域 label标签 字符实体 🚘正片开始 无序列表 …

vLLM (6) - Scheduler BlockSpaceManager

系列文章目录 vLLM (1) - Qwen2推理&部署 vLLM (2) - 架构总览 vLLM (3) - Sequence & SequenceGroup vLLM (4) - LLMEngine上篇 vLLM (5) - LLMEngine下篇 vLLM (6) - Scheduler & BlockSpaceManager 文章目录 系列文章目录前言一、Scheduler1.概述2.Scheduler._…

区块链可投会议CCF C--FC 2025 截止10.8 附录用率

Conference:Financial Cryptography and Data Security (FC) CCF level:CCF C Categories:network and information security Year:2025 Conference time:14–18 April 2025, Miyakojima, Japan 录用率&#xff1…

Elasticsearch学习笔记(1)

初识 Elasticsearch 认识和安装 Elasticsearch 是由 Elastic 公司开发的一套强大的搜索引擎技术,属于 Elastic 技术栈的一部分。完整的技术栈包括: Elasticsearch:用于数据存储、计算和搜索。Logstash/Beats:用于数据收集。Kib…

【教学类-18-04】20240508《蒙德里安“黑白格子画” 七款图案挑选》

背景需求 最近有2位客户买了蒙德里安黑白格子画的素材,其中一位问是否是1000张。 【教学类-18-03】20240508《蒙德里安“红黄蓝黑格子画”-A4横版》(大小格子)_processing简单图形画蒙德里安-CSDN博客文章浏览阅读1.1k次,点赞35次…

Python自动收发邮件的详细步骤与使用方法?

Python自动收发邮件教程?Python怎么实现收发邮件? Python作为一种强大的编程语言,提供了丰富的库和工具,使得自动收发邮件变得简单而高效。AokSend将详细介绍如何使用Python自动收发邮件,帮助读者掌握这一实用技能。 …

测试开发面试题大全(含答案+文档)

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 某基金管理公司线下测试开发面试题总结。 测开题目如下 可以尝试自己先写,写完之后再去看参考解法哦 ~ 1、编写一段代码,把 list 的数平…

安装 Nacos 启动报错 java.lang.IllegalArgumentException: db.num is null

java.io.IOException: java.lang.IllegalArgumentException: db.num is nullat com.alibaba.nacos.config.server.service.datasource.ExternalDataSourceServiceImpl.reload(ExternalDataSourceServiceImpl.java:130)解决办法: 编辑 startup.cmd 文件 找到 set MO…

【Python】Pythonic Data Structures and Algorithms:深入浅出数据结构与算法的 Python 实现

Pythonic Data Structures and Algorithms 是一个开源项目,汇集了各种经典数据结构和算法的 Python 实现。该项目旨在为开发者提供丰富的学习资源,帮助他们通过 Python 代码理解和掌握数据结构与算法的核心原理和应用。项目中的算法涵盖了排序、搜索、图…

添加vscode插件C/C++ snippets,快速生成LVGL .c/.h文件模版

文章目录 一、安装插件二、在安装目录下添加c.json和cpp.json文件①在 C:/Users/yourname/AppData/Roaming/Code/User/snippets/ 目录下创建 c.json 并填入如下内容:②在 C:/Users/yourname/AppData/Roaming/Code/User/snippets/ 目录下创建 cpp.json 并填入如下内容…

一文上手SpringSecurity【七】

之前我们在测试的时候,都是使用的字符串充当用户名称和密码,本篇将其换成MySQL数据库. 一、替换为真实的MySQL 1.1 引入依赖 <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</v…

QTday1代码的形式实现登录框

代码注释 main.cpp #include "widget.h"#include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);//调用应用程序类的有参构造的实例化对象Widget w;//调用自定义的有参构造实例化的对象w.show();//调用该类的父类里的成员函数…

windows系统中后台运行java程序

在windows系统中后台运行java程序&#xff0c;就是在启动java程序后&#xff0c;关闭命令行行窗口执行。 1、命令行方式 命令行方式运行java程序 启动脚本如下&#xff1a; echo off start java -jar app.jar exit启动后的结果如下 这种方式下&#xff0c;会马上启动一个命…

vue3 实现文本内容超过N行折叠并显示“...展开”组件

1. 实现效果 组件内文字样式取决与外侧定义 组件大小发生变化时,文本仍可以省略到指定行数 文本不超过时, 无展开,收起按钮 传入文本发生改变后, 组件展示新的文本 2. 代码 文件名TextEllipsis.vue <template><div ref"compRef" class"wq-text-ellip…

Android性能优化相关的10个经典面试题

本文首发于公众号“AntDream”&#xff0c;欢迎微信搜索“AntDream”或扫描文章底部二维码关注&#xff0c;和我一起每天进步一点点 以下是一些Android性能优化面试问题&#xff0c;包括问题和参考解答&#xff1a; 1. 如何优化Android应用的启动速度&#xff1f; 答案&#…

腾讯云SDK价格总览

计费组成 SDK 授权费用&#xff1a;购买 License 或者套餐包&#xff0c;以获得音视频终端 SDK 的使用授权所需费用。 其他相关云服务费用&#xff1a;配合腾讯云其他云产品使用 SDK 时&#xff0c;产生的对应云服务费用&#xff0c;未使用相关服务不会产生费用。 计费概述 计…

鸿蒙媒体开发系列12——音频输入设备管理(AudioRoutingManager)

如果你也对鸿蒙开发感兴趣&#xff0c;加入“Harmony自习室”吧&#xff01;扫描下方名片&#xff0c;关注公众号&#xff0c;公众号更新更快&#xff0c;同时也有更多学习资料和技术讨论群。 有时设备同时连接多个音频输入设备&#xff0c;需要指定音频输入设备进行音频录制&a…

LaTex符号不好记忆?

总结在Matlab中常用的LaTeX符号如下&#xff1a; 1. **希腊字母**&#xff1a; - \alpha 表示 α - \beta 表示 β - \gamma 表示 γ - \delta 表示 δ - \epsilon 表示 ε - \zeta 表示 ζ - \eta 表示 η - \theta 表示 θ - \iota 表示 ι -…