Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用docker计算机部署时docker COPY不工作_Docker_Amazon Ec2_Docker Compose_Docker Machine - Fatal编程技术网

使用docker计算机部署时docker COPY不工作

使用docker计算机部署时docker COPY不工作,docker,amazon-ec2,docker-compose,docker-machine,Docker,Amazon Ec2,Docker Compose,Docker Machine,我正在使用docker compose,其中一个图像是用dockerfile构建的,其他的都是标准图像。dockerfile(“网站”)控制的图像已 抄袭/普通烧瓶 (该目录在前面创建)。 它可以正常工作时 docker-compose up --build 发生在我的Ubuntu机器上。它复制一个目录结构 但是,当我使用EC2 docker机器时,目录中没有内容(在docker中) 我补充说 在复制后立即显示,并正确显示所有内容。 接下来的命令只有EXPOSEports和CMD[“/usr

我正在使用docker compose,其中一个图像是用dockerfile构建的,其他的都是标准图像。dockerfile(“网站”)控制的图像已 抄袭/普通烧瓶 (该目录在前面创建)。 它可以正常工作时

docker-compose up --build 
发生在我的Ubuntu机器上。它复制一个目录结构

但是,当我使用EC2 docker机器时,目录中没有内容(在docker中) 我补充说

在复制后立即显示,并正确显示所有内容。 接下来的命令只有
EXPOSE
ports和
CMD[“/usr/bin/supervisord”]

复制命令以复制supervisord和nginx的配置文件,这样做很好

然而,在构建过程完成后,另一个容器失败,因为它在/gp_flask中找不到任何东西,如果我 docker compose exec网站/bin/bash 目录/gp\u 现在是空的

只有在docker机器环境中运行时才会发生这种情况。docker compose在我的本地机器上运行良好

另外,如果我使用docker machine并使用
eval“$(docker machine env gpflask)”
启动两个shell,然后在其中一个shell中执行以下操作:

 docker build -t gp_flask .
另一方面:

docker exec -it mad_fermat /bin/bash
然后我可以看到复制工作(在EC2 docker引擎实例上)

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

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"]
这里是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/

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

这将导致容器中的/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:

您应该确保首先启动包含此文件夹(已填充文件)的映像,或者在源容器启动之前,没有其他容器写入该文件夹。要做到这一点,请使用类似于我所展示的芹菜依赖网站的“依赖”按钮。

您是否能够验证刚才创建的图像是否正在运行?请列出构建、标记、推送和远程运行映像所采取的步骤,以及运行该文件夹时查看其是否为空的命令?使用compose,你能展示一下yml的内容吗,也许在/gp_烧瓶上安装了一个卷。当我这样做,然后简单地这样做,然后在另一个终端重复评估,然后在容器上启动一个外壳,副本显然起作用了。因此Dockerfile很好,即使在远程EC2实例上也是如此。我将把.yml添加到问题中,但是每次我在linux机器上本地运行docker compose时,它都会工作。我只是在涉及docker machine时才遇到这个问题。至于我如何看到在执行docker compose时/gp_flask是空的,我只需docker compose exec website/bin/bash如果您通过docker machine运行docker build,那么您复制的文件应该在ec2主机中,不是您的机器您可以使用docker machine scp-r local/path/to/file$docker\u machine\u NAME:/same/path将本地内容发送到aws谢谢。这是有道理的,它也可以工作:)文档说,在创建容器时,卷是初始化的。在这种情况下,目录包含将更改的代码。工作流应该是什么?Docker不初始化主机卷(绑定装载),只初始化命名卷。因此,如果从主机装载目录,它只包含docker主机上当前存在的文件(如果有VM,则可能与运行docker命令的位置不同)。如果您想更新命名卷,我已经知道会运行某种类型的同步例程(rsync、scp、git pull,最常见的是一个
tar-xf-
命令,其中输入从stdin传输到docker run命令)。同步例程可以是安装了相同卷的完全不同的映像/容器。谢谢。我从你的回答中学到了很多。我想我会用git。然后工作流如下所示:
[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/
  website:
    build: .
    command: >
      /usr/bin/supervisord
    env_file:
      - '.env'
    volumes:
      - '.:/gp_flask'
    ports:
      - '8000:8000'
      - '5000:5000'
      - '5001:5001'
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: