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

news2024/9/29 17:07:45

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 /app




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

# 将放在本地目录下整理好的库文件复制到docker本地./environment相当于/,
# 将./environment/usr文件复制到docker的/下,-ar保证同时不损害原来docker:/usr中的文件
current_dir=$(pwd)
environment_dir=$current_dir/environment

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

首先,在主系统里运行,就是你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.coloradmin.cn/o/2177384.html

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

相关文章

这几个高含金量证书,网工真的该拿

在这个技术日新月异的行业中,不断学习新技能和知识是保持竞争力的关键。 而证书,作为一种专业能力的认证,不仅能够证明你的技术实力,还能为你打开更多的职业发展大门。 在众多的IT认证中,有些证书因其高含金量而备受推…

四川财谷通信息技术有限公司抖音小店领域的强势力量

在数字化浪潮汹涌的今天,电商行业以其独特的魅力和无限潜力,成为了推动经济发展的重要力量。而在这片充满机遇与挑战的电商蓝海中,四川财谷通信息技术有限公司凭借其敏锐的市场洞察、创新的技术实力以及优质的服务品质,迅速崛起为…

win10如何禁止指定程序运行?教你5个方法!抓紧学!码住了!

在Windows 10系统中,有时我们需要禁止某些程序的运行,以保护系统安全、提高性能或遵循公司政策。 本文将详细介绍五种方法来禁止指定程序在Win10上运行,帮助用户更好地管理自己的系统。 方法一:使用第三方软件管理工具 市场上有…

AI变革营销全链路:从市场洞察到销售转化,AI将推动营销效率革命

大家好!今天,我要和大家聊聊AI如何助力营销行业,变革营销全链路的。 从市场洞察到销售转化,AI正一步步推动着营销效率的革命。 什么是营销全链路 什么是营销全链路?简单来说,就是从了解消费者需求开始&a…

一起搭WPF架构之按钮的进阶设计学习

一起搭WPF架构之按钮的进阶设计学习 1 前言2 进阶设计3 问题解决总结 1 前言 《一起搭WPF架构之浅写View界面按钮的进阶设计》中介绍了按钮的简单设计到进阶设计&#xff0c;这次接着上次进阶设计来做进一步的介绍。 2 进阶设计 代码介绍&#xff1a; <Window.Resources&…

2024年9月25日--- Spring-IOC 1

一 Spring的概要 1.1 简介 Spring&#xff0c;春天的意思&#xff0c;意指给软件行业带来春天。2002年&#xff0c;Rod Jahnson首次推出了Spring框架雏形interface21框架。2004年3月24日&#xff0c;Spring框架以interface21框架为基础&#xff0c;经过重新设计&#xff0c;发…

ABAP 记一次 ref_tabname/REF_TABNAME引起的问题

自开发alv报表 过滤器 过滤器存在问题&#xff1a; 分析&#xff1a; 过滤不出来&#xff0c;说明2个值不相等&#xff0c;刚好是物料&#xff0c;应该是前导0的问题&#xff0c;加入* 可以了&#xff0c;但是搜索过滤的长度又不够&#xff0c;那应该是参考的问题 于是果断在…

枫叶冒险岛网页版单机联网安装教程+GM后台

今天给大家带来一款单机游戏的架设&#xff1a;枫叶冒险岛。 另外&#xff1a;本人承接各种游戏架设&#xff08;单机联网&#xff09; 本人为了学习和研究软件内含的设计思想和原理&#xff0c;带了架设教程仅供娱乐。教程是本人亲自搭建成功的&#xff0c;绝对是完整可运行…

【docker】如何保存镜像以及分享社区

一、前言 在上篇博客中&#xff0c;我们已经下载了一个nginx的镜像&#xff0c;并且修改了它的内容为“111222”&#xff0c;命名为mynginx&#xff0c;现在我们就要把这个mynginx保存下来&#xff0c;并且分享但我们的docker_hub社区中&#xff01; 二、保存镜像 1、常用命名…

Notion is all you need(文献管理利器)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;科研杂谈_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言 2. …

融云出海:电商、社交泛娱的破局之道

“出海不出局”融云出海系列城市沙龙进度条过半&#xff0c;已相继在上海、北京、深圳、杭州四地&#xff0c;与数百位出海人相聚。 系列活动邀请业内兼具理论研究和实操经验的专家&#xff0c;针对电商、社交泛娱乐出海、安全合规等话题为与会出海人提供了宝贵的第一手资料。…

低代码统一代办系统:提升工作效率的新利器

什么是低代码统一代办系统&#xff1f; 低代码统一代办系统是通过低代码开发平台构建的一种工具&#xff0c;用于集中管理和跟踪团队成员的任务和待办事项。该系统具有可视化设计、模块化组件和灵活性&#xff0c;能够快速适应不同团队和项目的需求&#xff0c;提高工作效率。…

水泵模块(5V STM32)

目录 一、介绍 二、传感器原理 1.尺寸介绍 2.继电器控制水泵电路原理图 三、程序设计 main.c文件 bump.h文件 bump.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 水泵模块(bump)通常是指用于液体输送系统的组件&#xff0c;它负责将水或其他流体从低处提…

SpringBoot中各种O的分层模型

文章目录 领域模型中的实体类概念&#xff1a;项目中的实体类rest api中的model&#xff0c; vo&#xff0c; dto之间的关系凤凰架构讲课笔记 设计模式的单一职责&#xff1a; 各种XXO Pojo: 普通Java类Dao&#xff1a;Database Access Object&#xff1a; 专门用来访问数据库…

游戏账号系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;卖家管理&#xff0c;游戏类别管理&#xff0c;游戏账号管理&#xff0c;站内联系管理&#xff0c;交易订单管理&#xff0c;帐号退货管理 微信端账号功能包括&#xff1a;系统首…

webshell-HTTP常见特征

一、总体特点 二、蚁剑 数据中可以看到一些明文字符串函数&#xff0c;响应中可以看到响应的明文数据。 ant特征以及对数据base64可以解码 chr类别的会出现大量的chr编码 大量的百分号字符 三、哥斯拉 第一个请求包很大 响应为0 密钥被拆分到数据前后 响应包cookie带&#xf…

长文本溢出,中间位置显示省略号

1.说明 Flutter支持在文本末尾显示溢出省略号。现在想要实现在文本中间位置显示省略号&#xff0c;这里使用的方法是通过TextPainter计算文本宽度。&#xff08;我目前没有找到更好的方法&#xff0c;欢迎大家指教。&#xff09; 2.效果 源码 1.MiddleEllipsisTextPainter …

【无人机设计与控制】基于MATLAB的四旋翼无人机PID控制动力学建模研究制

摘要 本文研究了基于MATLAB的四旋翼无人机动力学建模和PID控制器设计。通过在Simulink中搭建四旋翼无人机的动力学模型&#xff0c;并结合经典PID控制算法&#xff0c;设计了无人机的姿态控制系统。实验结果表明&#xff0c;所设计的PID控制器能够有效稳定无人机的姿态&#x…

Gitlab 配置自动化Pipeline

在GitLab中配置CI/CD流水线&#xff08;pipeline&#xff09;以实现自动化构建和测试&#xff0c;你需要遵循以下步骤&#xff1a; 1. 创建 .gitlab-ci.yml 文件&#xff1a;在项目的根目录或子目录中创建一个名为 .gitlab-ci.yml 的文件&#xff0c;这是定义GitLab CI/CD流水…

JavaWeb之过滤器

1. 过滤器的概念 过滤器是Java Servlet规范中定义的组件&#xff0c;用于在请求到达Servlet之前或响应返回客户端之前&#xff0c;对请求或响应进行拦截和处理。过滤器可以实现以下功能&#xff1a; 日志记录&#xff1a;记录请求的详细信息&#xff0c;如URI、参数、时间等。…