2017-05-27 94 views
1

我嘗試(使用標準的泊塢窗教程),然後運行命令巨蟒創建一個簡單的Dockerfile,它安裝的MongoDB:Dockerized蒙戈需要年齡加載然後不運行蒙戈

FROM ubuntu:latest 

RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv EA312927 
RUN echo "deb http://repo.mongodb.org/apt/ubuntu $(cat /etc/lsb-release | grep DISTRIB_CODENAME | cut -d= -f2)/mongodb-org/3.2 multiverse" | tee /etc/apt/sources.list.d/mongodb-org-3.2.list 

RUN apt-get update && apt-get install -y mongodb-org python python-pip 

RUN mkdir -p /data/db 

COPY ./requirements.txt /tmp/requirements.txt 
RUN pip install -r /tmp/requirements.txt 

WORKDIR /app 
COPY . /app 

EXPOSE 27017 

ENTRYPOINT ["/usr/bin/mongod"] 

CMD python -c "print 'hello world'" 

然後我跑docker build .

不幸的是,這是一次徹底的失敗。

1)每次在進行更改後運行docker build .,都需要AGES生成和輸出瘋狂的日誌記錄,緩慢地重新下載並慢慢重新安裝每個軟件包 - 這完全令人難以忍受。

2)docker ps顯示沒有蒙戈運行

3)python -c "print 'hello world'命令在端說,它運行,但不輸出實際的字符串。

爲什麼這麼複雜?

我的輸出:https://pastebin.com/igyYY8v1(警告,長)

回答

0

泊塢窗的做法是分成2個容器,1個爲應用程序,1個爲mongo。

嘗試將容器視爲獨立進程而不是小型虛擬機。並認爲有很多軟件作爲準備運行的docker映像,如下面的mongo和python。 你會注意到我沒有自己安裝任何東西。

docker-compose試試這個:

Dockerfile

FROM python 

COPY ./requirements.txt /tmp/requirements.txt 
RUN pip install -r /tmp/requirements.txt 

WORKDIR /app 
COPY app.py /app 

EXPOSE 27017 

CMD python app.py 

泊塢窗,compose.yml

version: "3" 

services: 
    app: 
    build: . 
    links: 
     - mongo 
    mongo: 
    image: mongo:3.2 

應用。PY

print("hello world") 
print("bye") 

運行它

docker-compose up --build 

與運行碼頭工人,組成爲的話,你可以點在你的Python應用程序蒙戈就象這樣:mongo:27017


PS:關於你的timout,你需要了解ENTRYPOINT和CMD是如何工作的:

ENTRYPOINT ["/usr/bin/mongod"] 

CMD python -c "print 'hello world'" 

這告訴搬運工來運行這個命令來啓動你的容器:

`/usr/bin/mongod python -c "print 'hello world'"`. 

正如你可以看到它是沒有意義的。入口點和CMD是一種串聯。

0

當您更改Dockerfile中正在進行的操作時,取決於這些更改的位置,它不能再使用先前緩存的圖層進行構建。因此,如果您更改RUN步驟,則在重建時必須重做所有後面的RUN步驟。

此外,當使用ENTRYPOINTCMD時,CMD字符串將被附加到ENTRYPOINT,生成容器的命令字符串。

所以基本上,你的配置將試圖執行一樣的東西:

/usr/bin/mongod python -c "print 'hello world'

,而不是拆分爲獨立的命令。

你真的想把它分成兩個不同的容器,一個容納你的python應用程序,另一個容納你的數據庫。然後你可以爲他們組成一個網絡進行交流。