docker 使用 docker-machine 部署时 COPY 不起作用
docker COPY not working when deploying with docker-machine
我正在使用 docker-compose,其中一个图像是用 docker 文件构建的,其他是标准图像。 docker文件('website')控制的图像有
复制 。 /gp_flask
(该目录是较早创建的)。
时工作正常
docker-compose up --build
发生在我的 Ubuntu 机器上。它复制一个目录结构。
但是,当我使用 EC2 docker-machine 时,目录中没有内容(在 docker 中)
我添加了
RUN ls -la /gp_flask
COPY 后立即显示正确的所有内容。
接下来的唯一命令是 EXPOSE
ports 和 CMD ["/usr/bin/supervisord"]
用于复制 supervisord 和 nginx 配置文件的 COPY 命令工作正常。
然而在构建过程完成后,其他容器之一失败了,因为它无法在 /gp_flask 中找到任何东西,而且如果我
docker-撰写执行网站/bin/bash
目录 /gp_flask
现在是空的。
只有当我在 docker 机器环境中 运行 时才会发生这种情况。 docker-在我的本地机器上撰写工作正常。
此外,如果我使用 docker-machine 并使用 eval "$(docker-machine env gpflask)"
启动两个 shell,然后在一个中执行:
docker build -t gp_flask .
另一个:
docker exec -it mad_fermat /bin/bash
然后我可以看到 COPY 有效(在 EC2 docker 引擎实例上)。
所以这意味着 docker-compose 在远程 docker 引擎上有所不同。 COPY
之后 RUN 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"]
这里是 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/
在您的撰写文件中,您将 /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 环境中看到的空文件夹或不存在的文件夹。如果删除体积参考,您将按预期看到图像的内容。如果您需要一个用于持久存储的卷,请考虑使用一个命名卷,它会在您第一次使用图像时初始化为图像的内容。例如:
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:
您应该确保包含此文件夹的映像最先启动,或者在源容器启动之前没有其他容器写入该文件夹。为此,请使用类似于我展示 celery 取决于网站的方式的 depends_on。
我正在使用 docker-compose,其中一个图像是用 docker 文件构建的,其他是标准图像。 docker文件('website')控制的图像有 复制 。 /gp_flask (该目录是较早创建的)。
时工作正常docker-compose up --build
发生在我的 Ubuntu 机器上。它复制一个目录结构。
但是,当我使用 EC2 docker-machine 时,目录中没有内容(在 docker 中) 我添加了
RUN ls -la /gp_flask
COPY 后立即显示正确的所有内容。
接下来的唯一命令是 EXPOSE
ports 和 CMD ["/usr/bin/supervisord"]
用于复制 supervisord 和 nginx 配置文件的 COPY 命令工作正常。
然而在构建过程完成后,其他容器之一失败了,因为它无法在 /gp_flask 中找到任何东西,而且如果我 docker-撰写执行网站/bin/bash 目录 /gp_flask 现在是空的。
只有当我在 docker 机器环境中 运行 时才会发生这种情况。 docker-在我的本地机器上撰写工作正常。
此外,如果我使用 docker-machine 并使用 eval "$(docker-machine env gpflask)"
启动两个 shell,然后在一个中执行:
docker build -t gp_flask .
另一个:
docker exec -it mad_fermat /bin/bash
然后我可以看到 COPY 有效(在 EC2 docker 引擎实例上)。
所以这意味着 docker-compose 在远程 docker 引擎上有所不同。 COPY
之后 RUN 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"]
这里是 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/
在您的撰写文件中,您将 /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 环境中看到的空文件夹或不存在的文件夹。如果删除体积参考,您将按预期看到图像的内容。如果您需要一个用于持久存储的卷,请考虑使用一个命名卷,它会在您第一次使用图像时初始化为图像的内容。例如:
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:
您应该确保包含此文件夹的映像最先启动,或者在源容器启动之前没有其他容器写入该文件夹。为此,请使用类似于我展示 celery 取决于网站的方式的 depends_on。