2016-12-09 131 views
1

我正在使用碼頭工具創建,其中一個圖像使用dockerfile構建,其他圖像是標準圖像。由dockerfile('網站')控制的圖像具有 COPY。/gp_flask (該目錄是早先創建的)。 它工作正常時碼頭工人使用碼頭機部署時不起作用

docker-compose up --build 

發生在我的Ubuntu機器上。它複製一個目錄結構。

然而,當我使用EC2泊塢窗機,有目錄中沒有的內容(在泊塢窗) 我的COPY後立即加入

RUN ls -la /gp_flask 

,並正確顯示的所有內容。 接下來的唯一命令是EXPOSE端口和CMD ["/usr/bin/supervisord"]

COPY複製supervisord和nginx配置文件的命令可以正常工作。

尚未構建過程完成後,其他容器的一個失敗,因爲它無法找到/ gp_flask的東西,果然如我 泊塢窗,構成EXEC網站/斌/慶典 目錄/ gp_flask 現在是空的。

這隻發生在我在碼頭機環境中運行時。 docker-compose在我的本地機器上工作正常。

另外,如果我使用泊塢窗機,並與eval "$(docker-machine env gpflask)"啓動兩發炮彈,然後在一個我做的:

docker build -t gp_flask . 

,並在其他:

docker exec -it mad_fermat /bin/bash 

然後我可以看到COPY (在EC2泊塢窗引擎實例上)。

所以這意味着docker-compose在遠程docker引擎上有所不同。 COPY之後的RUN ls的成功似乎表明該副本正在工作,但在構建過程中稍後的映像將其刪除,但基本上沒有以下命令。

FROM python:3.5 
MAINTAINER Tim Richardson <[email protected]> 

RUN apt-get update && apt-get install -qq -y \ 
    build-essential libpq-dev --no-install-recommends 
RUN apt-get install -qq -y vim --no-install-recommends 
RUN apt-get install -qq -y nginx --no-install-recommends 
RUN apt-get install -qq -y supervisor --no-install-recommends 
RUN apt-get install -qq -y python3-dev python3-pip python3-setuptools --no-insta 
ll-recommends 
# RUN apt-get install -qq -y openssh-server --no-install-recommends 
#RUN mkdir -p /var/run/sshd 

COPY requirements.txt requirements.txt 
COPY requirements requirements 
RUN pip3 install -r requirements.txt 

COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf 

ENV INSTALL_PATH /gp_flask 
RUN mkdir -p $INSTALL_PATH 
COPY nginx.conf /etc/nginx/nginx.conf 
RUN rm /etc/nginx/sites-enabled/default 

WORKDIR $INSTALL_PATH 

COPY . /gp_flask 
RUN ls -la /gp_flask 

EXPOSE 8000 
EXPOSE 5000 
EXPOSE 5001 
#note that if you change the name of the app, you have to change the command lin 
e to gunicorn 
#gunicorn is started in supervisord setup 
#CMD gunicorn -b 0.0.0.0:8001 --access-logfile - "dear_flask.app:create_app()" 

CMD ["/usr/bin/supervisord"] 

,這裏是泊塢窗,compose.yml

version: '2' 

services: 
    postgres: 
    image: 'postgres:9.5' 
    env_file: 
     - '.env' 
    volumes: 
     - 'postgres:/var/lib/postgresql/data' 
    ports: 
     - '5432:5432' 

    redis: 
    image: 'redis:3.0-alpine' 
    command: redis-server --requirepass devpassword 
    volumes: 
     - 'redis:/var/lib/redis/data' 
    ports: 
     - '6379:6379' 

    website: 
    build: . 
    command: > 
     /usr/bin/supervisord 
    env_file: 
     - '.env' 
    volumes: 
     - '.:/gp_flask' 
    ports: 
     - '8000:8000' 
     - '5000:5000' 
     - '5001:5001' 

    celery: 
    build: . 
    command: celery worker -l debug -A dear_flask.dear.tasks 
    env_file: 
     - '.env' 
    volumes: 
     - '.:/gp_flask' 

volumes: 
    postgres: 
    redis: 

,這裏是supervisord.conf

[supervisord] 
logfile_maxbytes=50MB 
logfile_backups=10 
logfile=/tmp/supervisord.log 
loglevel=info 
pidfile=/tmp/supervisord.pid 
nodaemon=true 
minfds=1024 
minprocs=200 
directory=/gp_flask/ 

[supervisorctl] 

#[program:sshd] 
#command=/usr/sbin/sshd -D 

[program:nginx] 
command=/usr/sbin/nginx -g "daemon off;" 
#command=ls # a dummy command convenient for disabling nginx 

[program:gunicorn] 
command=/usr/local/bin/gunicorn -b 127.0.0.1:8001 "dear_flask.app:create_app()" 
directory=/gp_flask/ 
+1

您是否能夠驗證您剛剛構建的相同圖像正在運行?您是否會列出遠程構建,標記,推送和運行映像的步驟,以及運行時查看該文件夾在運行時是否爲空的命令?用compose,你會顯示那個yml的內容,也許一個卷掛載在/ gp_flask。 – BMitch

+0

當我執行然後簡單地執行 ,然後在另一個終端重複eval,然後在容器上啓動一個shell COPY顯然有效。因此,即使在遠程EC2實例上,Dockerfile也不錯。我會將.yml添加到問題中,但是當我在我的linux機器上本地運行它時,docker-compose會發揮作用。當docker-machine參與時,我只遇到了這個問題。 –

+0

至於我在做docker-compose的時候看到/ gp_flask是空的,我只是簡單地執行docker-compose exec website/bin/bash –

回答

2

在你撰寫的文件,你用替換/ gp_flash的內容主機體積(bind mound):

website: 
    build: . 
    command: > 
     /usr/bin/supervisord 
    env_file: 
     - '.env' 
    volumes: 
     - '.:/gp_flask' 
    ports: 
     - '8000:8000' 
     - '5000:5000' 
     - '5001:5001' 

這會導致您的容器中的/ gp_flask文件夾中有任何在.目錄中的文件夾。在本地,這將起作用。但是在遠程服務器上,docker compose命令可能會引用您在AWS環境中看到的空的或不存在的文件夾。如果您刪除了卷引用,則會按預期看到圖像的內容。如果您需要一個卷用於持久存儲,請考慮使用一個命名卷,它會在您第一次使用它時初始化爲映像的內容。例如: -

version: '2' 

services: 
    postgres: 
    image: 'postgres:9.5' 
    env_file: 
     - '.env' 
    volumes: 
     - 'postgres:/var/lib/postgresql/data' 
    ports: 
     - '5432:5432' 

    redis: 
    image: 'redis:3.0-alpine' 
    command: redis-server --requirepass devpassword 
    volumes: 
     - 'redis:/var/lib/redis/data' 
    ports: 
     - '6379:6379' 

    website: 
    build: . 
    command: > 
     /usr/bin/supervisord 
    env_file: 
     - '.env' 
    volumes: 
     - 'gp_flask:/gp_flask' 
    ports: 
     - '8000:8000' 
     - '5000:5000' 
     - '5001:5001' 

    celery: 
    build: . 
    command: celery worker -l debug -A dear_flask.dear.tasks 
    env_file: 
     - '.env' 
    depends_on: 
     - website 
    volumes: 
     - 'gp_flask:/gp_flask' 

volumes: 
    postgres: 
    redis: 
    gp_flask: 

您應該確保包含此文件夾中填充了文件的圖像是首先啓動,或者沒有其他容器寫入到源容器開始之前的文件夾。要做到這一點,使用depends_on類似於我展示的芹菜取決於網站。

+0

謝謝。這是有道理的,它也可以工作:)文檔說,容器創建時卷已初始化。在這種情況下,該目錄包含將會改變的代碼。工作流程應該是什麼? –

+0

Docker不會初始化主機卷(綁定掛載),只能命名卷。因此,如果您從主機裝入目錄,則它只包含docker主機上的當前文件(如果有VM,可能與運行docker命令的位置不同)中的文件。如果你想更新一個命名卷,我知道運行某種同步例程(rsync,scp,git pull,通常是一個'tar -xf -'命令,輸入從stdin輸入到docker run命令中)。同步程序可以是一個完全不同的圖像/容器與相同的卷安裝。 – BMitch

+0

謝謝。我從你的回答中學到了很多東西。將使用我認爲的git。然後工作流程如下所示:http://blog.ionic.io/docker-hot-code-deploys/ –