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

14

我有一个用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"

Great! How can I assist you?
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. 在生产环境中运行 Django 最好使用gunicorn 还是 uWSGI 程序?

@vmonteco 的回答:

  1. 我认为是这样,但减少映像所占用的空间的一种方法是在 Dockerfile 中使用单个 RUN 指令为多个链接的命令进行设置(使用 RUN cmd1 && cmd2 而不是 RUN cmd1 然后 RUN cmd2)。
  2. 选择哪个程序由您自己决定。我个人使用 uWSGI,但除了 gunicorn/uwsgi 之外,还有其他选择(不只是“wsgi”,那是接口规范的名称,而不是一个程序)。祝你找到你最喜欢的!:)
1个回答

18

简而言之:

你可以在 Dockerfile 中传递一些信息(要运行的命令),但这不能代替使用 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 分别用于两个不同的目的。

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

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

因此,询问“将docker-compose.yml文件转换为Dockerfile”并不是真正相关的。

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

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

另外:

manage.py文档中:

请勿在生产环境中使用此服务器。它没有经过安全审计或性能测试。(而且就是这样的。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接