iT邦幫忙

0

如何在docker容器中使用和主機相同版本的submodule,並能在容器的submodule中使用git?

  • 分享至 

  • xImage

各位好,本人在主機的 /root/test 目錄加入一個submodule:

cd /root/test
git submodule add https://github.com/CESNET/libyang-python.git sm/libyang-python

我寫了一個簡單的dockerfile (sub.Dockerfile)來建立docker image (test_sm),希望在該image中也可以使用和主機端一樣的submodule。

sub.Dockerfile:

FROM debian:buster

RUN apt install -qy git

RUN --mount=type=bind,source=sm/sysrepo-python,target=/home/sm/libyang-python,rw \
    cd /home && cp -r /home/sm/libyang-python /

建立image並進入docker container

docker build -t test_sm -f /root/test/sub.Dockerfile .
docker run -it test_sm

雖然在container的/home底下也找得到sm/libyang-python,但卻無法在/home/sm/libyang-python中使用git
fatal: not a git repository

請問要如何更改dockerfile,才能在容器的/home/sm/libyang-python中用git?
本人希望在容器中切換libyang-python之後,主機的libyang-python也會跟著變
(同樣地,在主機改變libyang-python的版本,容器中libyang-python的版也與主機同步)

感謝各位看完! 問得不夠清楚的地方我會再補充

看更多先前的討論...收起先前的討論...
froce iT邦大師 1 級 ‧ 2023-03-23 13:03:40 檢舉
1. docker有個東西叫volumn...
2. 通常不會在docker裡呼叫git,docker只是執行/測試環境,並不是開發環境,是host和container用volumn,把本機資料夾掛在container裡,由本機去做版控。

docker裡通常沒桌面,除非你用vim啦,我是不懂為啥要在container裡搞個git。
有需要的話就在dockerfile裡加 RUN apt install git

如果你有限定python版本的需求,又是在unix-like環境下開發,建議使用pyenv。(windows其實也有,但我不會用windows的)
另外vscode有個好用的功能叫 Visual Studio Code Dev Containers。
https://code.visualstudio.com/docs/devcontainers/containers
ffaanngg iT邦新手 5 級 ‧ 2023-03-23 13:52:50 檢舉
這邊是希望在docker的container中直接切換不同的版本測試
froce iT邦大師 1 級 ‧ 2023-03-23 14:11:03 檢舉
你要切的只有你自己寫的libyang-python而已吧?
那就是用volumn讓自己的host資料夾和container一樣,在本機切換就好啦...
去學著用 Visual Studio Code Dev Containers ,那應該會是你要的。
ffaanngg iT邦新手 5 級 ‧ 2023-03-23 16:39:38 檢舉
呃...開發上有點這樣要求啦...

froce大,我還發現另一個問題

我將dockerfile修改如下:
FROM debian:buster

RUN apt-get update && apt install -qy git

RUN --mount=type=bind,source=sm/sysrepo-python,target=/root/sm/sysrepo-python,rw

(這次不用 cp)

卻看到container中的/root/sm/sysrepo-python 是完全沒有東西的
froce iT邦大師 1 級 ‧ 2023-03-23 18:15:23 檢舉
啊你要的就是volumn,我跟你強調很多次了
ffaanngg iT邦新手 5 級 ‧ 2023-03-23 23:08:28 檢舉
但volume的話,沒有辦法在container的/root/sm/sysrepo-python下使用git欸。
docker run -it -v /root/test/sm/sysrepo-python:root/sm/sysrepo-python test_sm


我想我會被這樣要求,可能是還需要用patch來修改sysrepo-python
ffaanngg iT邦新手 5 級 ‧ 2023-03-24 00:26:26 檢舉
應該已解決了,設 -v `pwd`:/tester (或任何名稱) 就可以了

docker run -it -v `pwd`:/tester test_sm

如此容易....
froce iT邦大師 1 級 ‧ 2023-03-24 08:36:55 檢舉
啊這就是volume啊...早就跟你說過了。
host和container裡共用一個資料夾,所以你在container裡面和在host做版控都是一樣的事,上傳/下載都是一樣的內容,我是真的不懂你為啥到底這麼堅持要在裡面做版控...除非你是得要直接在container裡開發才會需要吧?

你一開始資料夾裡面有東西是因為cp,不是mount。
dockerfile是拿來build docker image的指令,所以他是有分在外部作用和內部作用的,你用RUN mount就是在container裡面做mount,container裡是看不到host的資源的﹐你要他怎麼mount?
你只是運氣好(其實要我來說是運氣差,報錯你連build也不會過)沒報錯,複製資料夾成功了,然後在外部開發,內外版本根本不同,內部可能是還沒git init前的版本。

另外你都看到 fatal: not a git repository,你怎麼不會去檢查.git有沒有在...
froce iT邦大師 1 級 ‧ 2023-03-24 09:41:05 檢舉
另外要搞CI/CD是還會有台做佈署的主機,定時或不定時去重新docker build環境,這裡面就會用git pull把最新的版本拉下來,做版本隔離,與開發版會是不同的。

你會有這需求,我在想你大概是把開發環境和佈署環境搞混了,你的前面是開發環境的要求
但 這邊是希望在docker的container中直接切換不同的版本測試
看起來是部署的要求。
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

0
EN
iT邦好手 1 級 ‧ 2023-03-23 18:46:35

參考 官方文件 建立一個 volume,這樣 host 跟 container 就會 share 同一份檔案。
但我個人不建議在 container 上開發,比較好的做法應該是開發完後在部署或是測試階段使用 container。

我要發表回答

立即登入回答