【问题标题】:How to translate docker-compose.yml to Dockerfile如何将 docker-compose.yml 翻译成 Dockerfile
【发布时间】:2018-05-16 07:48:20
【问题描述】:

我有一个用 Django 编写的应用程序,我正在尝试在 Digital Ocean droplet 上的 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

docker-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. 在运行docker build -t "django:v1" . 命令构建我的图像时创建每个&lt;none&gt; 列出的图像是否正确...所以这意味着它消耗像[(691 x 4) + (693 x 1) + (948) + (949)]MB磁盘空间 ??
  2. 在生产环境中使用 gunicornwsgi 程序来运行 django 更好吗?

以及来自@vmonteco 的回复:

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

【问题讨论】:

    标签: django docker-compose dockerfile digital-ocean


    【解决方案1】:

    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

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-01-20
      • 1970-01-01
      • 2017-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-02
      • 2018-05-28
      • 1970-01-01
      相关资源
      最近更新 更多