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

前言

# 前提
安装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

摘抄文档

posted @ 2023-12-01 17:29  zh89233  阅读(181)  评论(0编辑  收藏  举报