2017-04-14 185 views
2

我的Dockerfile運行一個python腳本,需要從本地機器讀取文本文件。當容器運行時,Docker從本地系統讀取文件

Dockerfile

FROM fedeg/python-vim:2 
ADD . /code 
WORKDIR /code 
RUN pip install -r requirements.txt 
COPY file.txt /data/file.txt 
CMD ["python", "run.py"] 

在run.py存在,在文本文件閱讀功能:

def read_file(filename): 
    lines = [line.rstrip('\n') for line in open(filename)] 
    return lines 

我在想,如果我是這一形象傳遞給別人,他們運行它,file.txt是否已經被保存在圖像中,或者docker能夠在圖像啓動時在該人的本地機器上查找該file.txt文件?

我想要的是碼頭在任何運行圖像的機器上尋找名稱file.txt,因此它可以處理另一個file.txt的內容而不是我從本地機器提供的file.txt的內容。

回答

1

是的,它保存在圖像內。

圖像包含您在dockerfile中描述的所有更改。這裏發生的任何事情都是圖像的一部分,並且可以被你給圖像的人使用。

任何發生在您使用碼頭運行或碼頭服務創建的容器上的事件都不會影響您的圖像。如果你想讓Docker提交一個容器來將它變成一個新的圖像。

+0

因此,如果其他人擁有圖像,並且他們有不同的file.txt他們想運行,他們如何用他們的圖像替換已經在我的圖像file.txt? – jxn

+0

如果這個想法是任何人都可以添加他們的文件,你應該使用一個安裝的卷,而不是在圖像中的數據。您仍然可以將卷裝載到容器卷,並且將使用您安裝的數據。 – herm

+0

我只記得你還可以使用[docker cp](https://docs.docker.com/engine/reference/commandline/cp/)在容器和主機之間複製文件 – herm

1

正如@herm通過構建容器所指出的那樣,file.txt存儲在容器中。

達到你想要的東西,從Dockerfile刪除複製,而是安裝包含file.txt的主機上運行時-v選項的文件夾:

docker run -v /folder/with/file:/data image_name 

其中/文件夾/帶/ file是包含file.txt的文件夾的路徑,image_name是您的docker容器的名稱。

正在運行的容器中的/ data的內容現在將成爲/ folder/with/file文件夾的內容。

編輯:

你也可以安裝,而不只是文件:

docker run -v /folder/with/file/file.txt:/data/file.txt image_name 

但是請注意,如果你需要編輯的文件,這可能產生問題。見Docker Docs「安裝主機文件的數據量」

注:用於編輯文件,包括VI和sed --in到位可能導致inode更改的工具。由於Docker v1.1.0,這將產生一個錯誤,如「sed:無法重命名./sedKdJ9Dy:設備或資源繁忙」。在你想編輯掛載文件的情況下,通常最容易掛載父目錄。

+0

如果我的當前文件夾是「〜/ Desktop/docker_test/work」,並且文本文件在'〜/ Desktop/docker_test'中,語法如下:'docker run -v〜/ Desktop/docker_test/work:/ data image_name' – jxn

+0

不太...你想用file.txt安裝這個文件夾:'docker run -v〜/ Desktop/docker_test:/ data image_name' – saxitoxin

+0

那麼文件名呢? 'docker run -v〜/ Desktop/docker_test/file.txt:/ data image_name'我掛載了這個文件夾,但是python的錯誤在於它找不到文件 – jxn

相關問題