.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