如何将 docker-compose.yml 翻译成 Dockerfile

use*_*115 9 django digital-ocean dockerfile docker-compose

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

任何人都可以建议如何摆脱docker-compose.yml文件并将所有命令集成到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
Run Code Online (Sandbox Code Playgroud)

docker-compose.yml

version: '3'
services:
  web:
    build: .
    command: python jk/manage.py runserver 0.0.0.0:8081
    volumes:
      - .:/code
    ports:
      - "8081:8081"
Run Code Online (Sandbox Code Playgroud)

我运行我的应用程序和 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.
...
Run Code Online (Sandbox Code Playgroud)

好的,所以我采取了以下方法: 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
Run Code Online (Sandbox Code Playgroud)

然后我跑了:

 docker build -t "django:v1" .
Run Code Online (Sandbox Code Playgroud)

所以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
Run Code Online (Sandbox Code Playgroud)

最后我跑了:

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
Run Code Online (Sandbox Code Playgroud)

两个简单的问题:

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

来自@vmonteco 的回复:

  1. 我认为是这样,但是减少图像大小的一种方法是通过对 Dockerfile 中的多个链接命令使用单个 RUN 指令来减少它们的数量。(RUN cmd1 && cmd2 而不是 RUN cmd1 然后 RUN cmd
  2. 由你来发表你自己的意见。我个人使用 uWSGI,但甚至还有其他选择,而不是 gunicorn/uwsgi(不仅仅是“wsgi”,这是接口规范的名称,而不是程序)。找到你最喜欢的一个,玩得开心!:)

vmo*_*eco 10

TL; 博士

您可以将一些信息传递给您的Dockefile(要运行的命令),但这并不等效,并且您无法对所有docker-compose.yml文件内容执行此操作。

你可以docker-compose.yml用命令行替换你的文件(就像docker-compose替换它一样)。


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

CMD ["python", "jk/manage.py", "runserver", "0.0.0.0:8081"]
Run Code Online (Sandbox Code Playgroud)

或者直接在命令行中传递这个命令,比如音量和端口,它应该给出类似的东西:

docker run -d -v .:/code -p 8081:8080 yourimage python jk/manage.py runserver 0.0.0.0:8081
Run Code Online (Sandbox Code Playgroud)

但

请记住这一点,Dockerfiles并docker-compose 服务于两个完全不同的目的。

  • Dockerfile用于图像构建,定义构建图像的步骤。

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

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

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

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

还 :

从manage.py 文档:

请勿在生产环境中使用此服务器。它没有经过安全审计或性能测试。(这就是它会留下来的方式。

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

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