.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

摘抄文檔

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章