如何将docker-compose.yml转换为Dockerfile

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将docker-compose.yml转换为Dockerfile相关的知识,希望对你有一定的参考价值。

我有一个用Django编写的应用程序,我试图在数字海洋液滴的docker中运行它。目前我有两个文件。

任何人都可以建议如何摆脱docker-compose.yml文件并集成Dockerfile中的所有命令???

Dockerfile

FROM python:3
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
COPY . /code/
RUN pip install -r reqirements.txt
RUN python /code/jk/manage.py collectstatic --noinput

泊坞窗,compose.yml

version: '3'
services:
  web:
    build: .
    command: python jk/manage.py runserver 0.0.0.0:8081
    volumes:
      - .:/code
    ports:
      - "8081:8081"

我运行我的应用程序和docker镜像如下:

  • docker-compose run web python jk/manage.py migrate
  • docker-compose up

输出:

Starting workspace_web_1 ...
Starting workspace_web_1 ... done
Attaching to workspace_web_1
web_1  | Performing system checks...
web_1  |
web_1  | System check identified no issues (0 silenced).
web_1  | December 02, 2017 - 09:20:51
web_1  | Django version 1.11.3, using settings 'jk.settings'
web_1  | Starting development server at http://0.0.0.0:8081/
web_1  | Quit the server with CONTROL-C.
...

好的,我采取了以下方法:Dockerfile

FROM python:3
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
COPY . /code/
RUN pip install -r reqirements.txt
RUN python /code/jk/manage.py collectstatic --noinput

然后我跑了:

 docker build -t "django:v1" .

所以docker images -a抛出:

docker images -a
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
django              v1                  b3dec6aaf9b9        5 minutes ago       949MB
<none>              <none>              55370397f7f2        5 minutes ago       948MB
<none>              <none>              e7eba7113203        7 minutes ago       693MB
<none>              <none>              dc3d7705c45a        7 minutes ago       691MB
<none>              <none>              12825382746d        7 minutes ago       691MB
<none>              <none>              2304087e8b82        7 minutes ago       691MB
python              3                   79e1dc9af1c1        3 weeks ago         691MB

最后我跑了:

cd /opt/workspace
docker run -d -v /opt/workspace:/code -p 8081:8081 django:v1 python jk/manage.py runserver 0.0.0.0:8081

两个简单的问题:

  1. 我是否正确运行<none>命令以建立我的图像时创建每个docker build -t "django:v1" .列出的图像...所以这意味着它消耗像[(691 x 4) + (693 x 1) + (948) + (949)]MB的磁盘空间?
  2. 使用gunicorn或wsgi程序在生产中运行django更好吗?

来自@vmonteco的回复:

  1. 我是这么认为的,但是减少图像大小的一种方法是通过在Dockerfile中使用单个RUN指令来减少它们的数量。 (运行cmd1 && cmd2而不是RUN cmd1然后运行cmd
  2. 由你自己发表意见。我个人使用uWSGI但是除了gunicorn / uwsgi之外还有其他选择(不仅仅是“wsgi”,这是接口规范的名称,而不是程序)。找到你喜欢的一个好玩! :)
答案

TL; DR

你可以将一些信息传递给你的Dockefile(要运行的命令),但这不是等价的,你不能用所有的docker-compose.yml文件内容做到这一点。

你可以用命令行替换你的docker-compose.yml文件(因为docker-compose正是要替换它)。


在您的情况下,您可以添加命令以作为默认命令运行到Dockerfile(这与将其传递给您在运行时启动的容器大致相同):

CMD ["python", "jk/manage.py", "runserver", "0.0.0.0:8081"]

或直接在命令行中传递此命令,如卷和端口,它应该给出类似的东西:

docker run -d -v .:/code -p 8081:8080 yourimage python jk/manage.py runserver 0.0.0.0:8081

请记住,Dockerfilesdocker-compose serve two whole different purposes.

  • Dockerfile用于图像构建,用于定义构建图像的步骤。
  • docker-compose是一个启动和编排容器来构建应用程序的工具(您可以添加一些信息,如构建上下文路径或您需要的图像的名称,但不能添加Dockerfile内容本身)。

因此要求“将docker-compose.yml file转换为Dockerfile”并不是真正相关的。

这更多的是将docker-compose.yml文件转换为一个(或几个)命令行以手动启动容器。

docker-compose的目的正是为了摆脱这些命令行,使事情变得更简单(它使它自动化)。

还:

来自manage.py documentation

请勿在生产设置中使用此服务器。它没有经过安全审核或性能测试。 (而这就是它将如何存在。

包含在runserver工具中的Django的manage.py不适合生产。

您可能需要考虑在代理后面使用WSGI服务器。

以上是关于如何将docker-compose.yml转换为Dockerfile的主要内容,如果未能解决你的问题,请参考以下文章

如何正确组合这个 docker-compose.yml?

如何使用 docker-compose.yml 和 ecs-cli 将 EBS 卷附加到我的容器

在docker-compose.yml中为自己的mantained docker注册表写什么

如何从 docker-compose.yml 更改 docker-compose.yml 中已安装卷的权限?

docker-compose.yml说明和编写

向 docker-compose.yml 公开随机端口