从父目录构建Dockerfile

时间:2019-01-09 13:01:16

标签: python docker celery dockerfile

我有一个python应用程序,该应用程序使用我想码头化的芹菜工人。不幸的是,python和Celery都使用相同的代码库。尽管它们必须是单独的容器才能更容易地缩放。如果我分别构建它们并运行容器,则可以正常工作。当我引入docker-compose时,问题就开始了,因此我无法将dockerfile换出到代码文件夹中,并且容器需要从文件夹外部构建。文件夹结构如下:

/application
    /application-build
       Dockerfile
    /celery-build
       Dockerfile
    /code
       application.py
       otherfiles.py

不幸的是,我一直在挖掘一些,据我所知,父目录中的文件无法复制到dockerfile中。尽管我想将相同的代码复制到两个容器中。 (请注意,以下dockerfile并非我使用的确切文件。)

Dockerfile1:

FROM python:3.6
ADD /code .
COPY requirements.txt requirements.txt
RUN python3.6 -m pip install -r requirements.txt
CMD ["python3.6", "application.py"]

Dockerfile2:

FROM python:3.6
ADD /code .
COPY /code/requirements.txt .
RUN python3.6 -m pip install -r requirements.txt
CMD ["celery","-A application.celery", "worker","work1@host"]

我看到的一种解决方案是重新组织文件夹,使代码目录始终是dockerfile目录的子目录,如下所示:

/application
   /application-build
      Dockerfile
      /celery-build
         Dockerfile
         /code
            application.py
            otherfiles.py

尽管看起来一点也不聪明。

2 个答案:

答案 0 :(得分:3)

没有问题。在Dockerfile中,您无法获得(访问父文件夹)构建上下文,而不是Dockerfile's文件夹。

让您保持原样的结构,并明确指定Dockerfile的路径:

docker build -t app -f application-build/Dockerfile . 
docker build -t celery -f celery-build/Dockerfile . 

在您的Dockerfiles中,请记住该路径为/application。这样您就可以轻松复制:

Dockerfile

...
COPY code /code
...

答案 1 :(得分:1)

通过与docker build命令等效的Docker Compose补充葡萄的答案:

# docker-compose.yml
version: '3.7'

services:
  application:
    build:
      context: .
      dockerfile: application-build/Dockerfile

  celery:
    build:
      context: .
      dockerfile: celery-build/Dockerfile
# Run this command in the directory of your `docker-compose.yml` file
# (Which is this question's case would be /application/docker-compose.yml)
docker-compose build

每个Dockerfile生成时,它将使用/application作为其生成上下文。