首页 > 编程语言 >.NET Core|--调用C++库|--docker环境下让web api应用程序调用C++类库

.NET Core|--调用C++库|--docker环境下让web api应用程序调用C++类库

时间:2023-12-01 17:34:30浏览次数:42  
标签:容器 gcc 调用 -- C++ net7 dotnet 镜像 docker

前言

# 前提
安装docker环境~
启动docker~

# 多说一句, 为什么我要搞这个一个镜像, 既包含gcc开发环境, 又包含.NET开发环境
我的api应用程序是基于.NET写的, 
但是我的这个api程序, 又要调用c++的一些东西,特别是涉及一些画图之类的, 
所以就需要gcc的开发环境,
最终搞了这么一个镜像~~~

其中走过了不少弯路, 
比如我想着如何在.NET容器中安装gcc
或者解决一些C++的依赖问题,
最终还是以gcc镜像为基础, 
在基于gcc镜像中安装.NET开发环境,
成功解决这个问题~

1.镜像篇-gcc11

1.0::搜索gcc镜像


# 搜索gcc镜像
docker search gcc

NAME DESCRIPTION STARS OFFICIAL AUTOMATED
gcc The GNU Compiler Collection is a compiling s… 828 [OK]
rikorose/gcc-cmake Build on top off the official gcc image incl… 28 [OK]
eclipse/cpp_gcc Ubuntu, JRE 1.8, g++, gcc, make 4 [OK]
autopas/autopas-build-gcc provides Docker image to build the AutoPas l… 1 [OK]
bellsoft/alpaquita-linux-gcc Alpaquita based image for С/C++ development … 1

1.1::镜像篇::找到对应的gcc版本号镜像

# 1.找到对应的gcc版本号( 可以去dockerhub网站上搜索)

1.2::镜像篇::下载自己所需的gcc版本 (我这里下载的是gcc11)


docker pull gcc:11
# 输出...↓↓↓
11: Pulling from library/gcc...



# 确认下镜像是否下载至docker ( 特别是需要注意版本, 如果不写指定版本, 默认可能会下载最新的gcc:latest )

docker images

2.容器篇

2.1::容器篇::运行gcc11容器

# 运行容器
docker run -d --name gcc_for_net7 gcc:11

# 确认容器是否启动

docker ps -a
# 遇到问题
启动的容器, 总是启动完就关闭(Exited)了...

# 发现问题原因
# docker run [OPTIONS] 中有"-d"或者"-it"的时候会启动就关闭
docker run -d --name gcc_for_net7 gcc:11
docker run -it --name gcc_for_net7 gcc:11

# 解决问题
docker run -id --name gcc_for_net7 gcc:11
# 由于遇到了上面的那个问题, 重新看一下docker的[OPTION]说明
OPTIONS说明:
-d: 后台运行容器,并返回容器ID;
-i: 以交互模式运行容器,通常与 -t 同时使用;
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;

# 我原本以为只要增加了"-d", 然后gcc这个容器就可以运行了, 结果发现不行...

2.2::容器篇::在运行的gcc11容器中安装.NET运行时


# 去下载.NET运行时( 我下载是.NET7运行时 )
官网→https://dotnet.microsoft.com/zh-cn/download/dotnet/7.0

*******************************************************************

# 将该运行时复制到Linux服务器上
我将安装包"dotnet-sdk-7.0.100-linux-x64.tar.gz"直接放在了/opt/目录下
(这一步根据不同的连接Linux的客户端,可能不同)

*******************************************************************

# 进入gcc容器, 查看都有哪些目录
docker exec -it gcc_for_net7 /bin/bash
# 在容器内执行命令, 查看有哪些目录
ls
# 输出目录 : bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

*******************************************************************

# 将Linux服务器上的.NET7运行时拷贝到容器内的opt文件夹内 ( 通过上一步知道了有opt目录 )
docker cp /opt/dotnet-sdk-7.0.100-linux-x64.tar.gz gcc_for_net7:/opt/dotnet-sdk-7.0.100-linux-x64.tar.gz

*******************************************************************↓↓↓确认容器中存在该运行时文件↓↓↓

# 进入容器内部
docker exec -it gcc_for_net7 /bin/bash
# 在容器内部执行命令 
ls /opt/
# 可以看到现在容器内确实有这个文件了
dotnet-sdk-7.0.100-linux-x64.tar.gz


*******************************************************************↓↓↓在容器中安装.NET运行时↓↓↓
# 进入容器内部
docker exec -it gcc_for_net7 /bin/bash

# 切换目录至存放了.NET7运行时的那个目录
cd /opt/

# 直接从官网上拷贝下来的安装SDK命令
mkdir -p $HOME/dotnet && tar zxf dotnet-sdk-7.0.100-linux-x64.tar.gz -C $HOME/dotnet

# 这么只是用来验证dotnet是否安装成功
export DOTNET_ROOT=$HOME/dotnet
export PATH=$PATH:$HOME/dotnet

# 验证$PATH是否添加成功
echo $PATH

dotnet
# 输出↓↓↓( 看到这些输出内容, 就知道安装成功了! )
Usage: dotnet [options]
Usage: dotnet [path-to-application]

Options:
  -h|--help         Display help.
  --info            Display .NET information.
  --list-sdks       Display the installed SDKs.
  --list-runtimes   Display the installed runtimes.

path-to-application:
  The path to an application .dll file to execute.

3.镜像篇-gcc11+.NET7

3.1::将这个{安装了.NET运行时}的{gcc11容器}, 打包为一个新的镜像


# 使用"gcc_fro_net7"这个容器为基础, 新建一个"gcc_for_net7_image:v0"这个镜像
docker commit -a "zf" -m "gcc and .net7 sdk " gcc_for_net7 gcc_for_net7_image:v1

# 确认下生成的镜像
docker images
# 输出↓↓↓
REPOSITORY                        TAG       IMAGE ID       CREATED         SIZE
gcc_for_net7_image                v0        0xxxxxxx9   7 minutes ago   1.94GB

命令详解 : docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

Option 功能
-a 指定新镜像作者
-c 使用 Dockerfile 指令来创建镜像
-m 提交生成镜像的说明信息
-p 在 commit 时,将容器暂停

4.程序Dockerfile篇

4.1::Dockerfile

FROM gcc_for_net7_image:v0

EXPOSE 80

#ENTRYPOINT ["ASPNETCORE_ENVIRONMENT","Productiont"]
WORKDIR /app
COPY . /app

ENTRYPOINT ["dotnet", "XXXXApi.dll"]

遇到错误

docker: Error response from daemon: failed to create shim: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "dotnet": executable file not found in $PATH: unknown.


# 错误原因
docker run的时候增加环境变量即可 -e 

遇到的坑::改容器内的PATH, 其实不用, 直接docker run 的时候修改-e参数即可...

关键就算这么修改了, 还是不行, , ,
这么修改了, 只有在使用bash执行命令的时候好用 "docker exec -it {容器id} bash"


*******************************************************************↓↓↓更改环境变量$PATH↓↓↓

# 容器内安装vim
# 更新软件包列表
$ sudo apt-get update
# 更新软件包
$ sudo apt-get upgrade
# 安装vim
$ sudo apt-get install vim

# 修改PATH变量
vim /etc/profile

# 在PATH赋值的地方增加上":/root/dotnet"

# 在容器实例"/root/.bashrc"配置文件末尾添加"source /etc/profile",保存退出即可, 这样能够实现重启后自动刷新配置文件.
# 增加的内容 : "source /etc/profile"
vim /root/.bashrc


# 为了修改容器内的$PATH, 我还在容器内安装了一个vim~

#更新软件包列表
$ sudo apt-get update
#更新软件包
$ sudo apt-get upgrade
#安装vim
$ sudo apt-get install vim

摘抄文档

标签:容器,gcc,调用,--,C++,net7,dotnet,镜像,docker
From: https://www.cnblogs.com/love-zf/p/17870572.html

相关文章

  • 垃圾收集器
    G1垃圾收集器遵循分代收集理论设计的,但其堆内存的布局与其他收集器有非常明显的差异:G1不再坚持固定大小以及固定数量的分代区域划分,而是把连续的Java堆划分为多个大小相等的独立区域(Region),每一个Region都可以根据需要,扮演新生代的Eden空间、Survivor空间,或者老年代空间。收集器能......
  • 处理XML--xml.etree.ElementTree
    XML文档的根元素根元素是XML文档中所有其他元素的父元素。它是文档的起点,必须是唯一的<root><!--其他元素和内容--></root>介绍xml信息属性类型意义调用tagstrElement名Element.tagattribdic元素有哪些属性Element.attribtextstr第一个子......
  • css3 变量使用和修改变量
    <!DOCTYPEhtml><html><head><style>:root{--blue:#1e90ff;--white:#ffffff;--aa:1212121;}body{background-color:var(--blue);}h2{border-bottom:2pxsolidvar(--blue);}.container{color:var(--blue);......
  • 关键字 开发-08 extract提取返回的结果
    1.extract提取请求返回结果的返回值在进行接口自动化的时候,往往需要提取上一个接口返回的值,传递给下一个接口使用。创建utils/extract.pyimportjsonimportreimportjsonpathimportjmespathfromutilsimportexceptionsfromrequestsimportResponsedefextract_b......
  • Docker|--镜像中既有gcc和.NET运行时, 但是容器启动的时候报错 exec: "dotnet": exec
    基本信息#镜像gcc_for_net7_image是如何产生的,分为3步1.基于gcc的镜像运行起来的一个包含了gcc环境的容器,2.在这个容器里安装了.NET7运行时,3.再将这个包含了gcc环境和.NET7的容器打包为一个镜像"gcc_for_net7_image"总之,这个镜像"gcc_for_net7_image"既包含了gcc......
  • 进程,线程,协程
    1、进程进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。每个进程都有自己的独立内存空间,不同进程通过进程间通信来通信。由于进程比较重量,占据独立的内存,所以上下文进程间的切换开销(栈、寄存器、虚拟内存、文件句柄等......
  • python开发之个微机器人开发
    简要描述:取消消息接收请求URL:http://域名地址/cancelHttpCallbackUrl请求方式:POST请求头Headers:Authorization:login接口返回Content-Type:application/json无参数返回数据:参数名类型说明codestring1000成功,1001失败msgstring反馈信息成功返回示例{"message":"成功","code......
  • AI人人必修-提示词工程+大模型多场景实战(丰富资料)
    AI人人必修-提示词工程+大模型多场景实战(丰富资料)51xuebc+尾缀大模型多场景实战:完成AI应用的普遍应用与深度探究随着人工智能技术的不时开展,大模型多场景实战成为了AI应用范畴的一种重要趋向。大模型是指巨型范围的深度学习模型,具有参数量宏大、数据吞吐量高等特性,可以完成更复杂......
  • 汽车托运如何完美避坑
    在现代社会中,汽车托运已经成为了一种常见的服务。无论是因为搬家、旅游还是其他原因,许多人都会选择将汽车托运到目的地。然而,由于市场上的服务质量参差不齐,很多人在托运过程中遇到了各种问题,甚至有些人因此遭受了损失。那么,如何在汽车托运过程中避免掉入这些“坑”呢?以下是一些实......
  • 2023版SpringBoot2 仿B站高性能前端+后端项目开发全流程
    2023版SpringBoot2仿B站高性能前端+后端项目51xuebc+尾缀SpringBoot2仿B站高性能前端+后端项目:打造高效、稳定、可扩展的应用在当今的互联网时期,网站的性能、稳定性和可扩展性成为了权衡一个项目胜利与否的关键要素。本文将引见如何运用SpringBoot2构建一个仿B站的高性能前......