使用docker-machine

时间:2016-12-09 00:00:01

标签: docker amazon-ec2 docker-compose docker-machine

我正在使用docker-compose,其中一个图像使用dockerfile构建,其他图像是标准图像。由dockerfile('website')控制的图像具有 复制。 / gp_flask (该目录是先前创建的)。

时效果很好
docker-compose up --build 

发生在我的Ubuntu机器上。它复制目录结构。

但是,当我使用EC2 docker-machine时,目录中没有内容(在docker中) 我添加了

RUN ls -la  /gp_flask
COPY后立即

,它正确显示所有内容。 以下唯一的命令是EXPOSE端口和CMD ["/usr/bin/supervisord"]

复制用于supervisord和nginx的配置文件的COPY命令可以正常工作。

但是在构建过程完成之后,其他一个容器失败了,因为它在/ gp_flask中找不到任何东西,果然如果我 docker-compose exec website / bin / bash 目录/ gp_flask 现在是空的。

这只发生在我在docker-machine环境中运行时。我的本地机器上的docker-compose工作正常。

另外,如果我使用docker-machine并使用eval "$(docker-machine env gpflask)"启动两个shell,然后在一个shell中执行:

 docker build -t gp_flask .

和另一个:

docker exec -it mad_fermat /bin/bash

然后我可以看到COPY工作(在EC2 docker引擎实例上)。

所以这意味着有关docker-compose的东西在远程docker引擎上有所不同。 RUN ls之后COPY的成功似乎表明副本正在运行,但构建过程中的后续图像会将其删除,尽管基本上没有以下命令。

FROM python:3.5
MAINTAINER Tim Richardson <tim@growthpath.com.au>

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"]

这里是docker-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 个答案:

答案 0 :(得分:2)

在您的撰写文件中,将/ gp_flash的内容替换为主机卷(绑定堆):

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

这会导致容器中的/ gp_flask文件夹包含.目录中的任何内容。在本地,这将有效。但是在远程服务器上,docker compose命令可能会引用您在AWS环境中看到的空文件夹或不存在的文件夹。如果删除卷参考,您将按预期看到图像的内容。如果您需要一个用于持久存储的卷,请考虑使用一个命名的卷,它将在您第一次使用它时初始化为图像的内容。 E.g:

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,类似于我所显示的芹菜取决于网站的方式。