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