如何将多个django-cookiecutter制作的Docker镜像推送到Heroku?

时间:2018-03-21 07:06:12

标签: django docker heroku cookiecutter-django

我使用Docker和cookiecutter-django在本地开发。

Cookiecutter-django在"撰写"中创建了几个Dockerfiles。目录。

我现在正试图将项目推向Heroku 但是,heroku container:push web将返回No images to push

如果我在compose目录的子目录中尝试相同的命令,它最终会中断 - 可能是因为尝试仅推送部分dockerfiles。

如何利用Heroku容器在Heroku上运行并运行?

This article from Heroku说我可以通过重命名Dockerfiles来推送多个图像,但我不知道如何弄清楚这些cookiecutter生成的Dockerfiles是哪种进程类型。

docker images将返回:

REPOSITORY                                    TAG                 IMAGE ID            CREATED             SIZE
<none>                                        <none>              16e570f295a7        10 minutes ago      318MB
luup_celeryworker                           latest              bd7ff7e5eb10        2 hours ago         531MB
luup_django                                 latest              bd7ff7e5eb10        2 hours ago         531MB
luup_celerybeat                             latest              bd7ff7e5eb10        2 hours ago         531MB
luup_postgres                               latest              e50eb7b8a704        2 hours ago         287MB
registry.heroku.com/fierce-forest-57627/web   latest              27690b3e49d4        16 hours ago        766MB
python                                        3.6-alpine          c3a4a35c9244        22 hours ago        90MB

这是cookiecutter制作的Dockerfile。它是compose / production / django下的DF。还有其他DF--用于球童,postgres,以及本地的DF。

FROM python:3.6-alpine

ENV PYTHONUNBUFFERED 1

RUN apk update \
  # psycopg2 dependencies
  && apk add --virtual build-deps gcc python3-dev musl-dev \
  && apk add postgresql-dev \
  # Pillow dependencies
  && apk add jpeg-dev zlib-dev freetype-dev lcms2-dev openjpeg-dev tiff-dev tk-dev tcl-dev \
  # CFFI dependencies
  && apk add libffi-dev openssl-dev py-cffi

RUN addgroup -S django \
    && adduser -S -G django django

# Requirements have to be pulled and installed here, otherwise caching won't work
COPY ./requirements /requirements
RUN pip install --no-cache-dir -r /requirements/production.txt \
    && rm -rf /requirements

COPY ./compose/production/django/gunicorn.sh /gunicorn.sh
RUN sed -i 's/\r//' /gunicorn.sh
RUN chmod +x /gunicorn.sh
RUN chown django /gunicorn.sh

COPY ./compose/production/django/entrypoint.sh /entrypoint.sh
RUN sed -i 's/\r//' /entrypoint.sh
RUN chmod +x /entrypoint.sh
RUN chown django /entrypoint.sh

COPY ./compose/production/django/celery/worker/start.sh /start-celeryworker.sh
RUN sed -i 's/\r//' /start-celeryworker.sh
RUN chmod +x /start-celeryworker.sh

COPY ./compose/production/django/celery/beat/start.sh /start-celerybeat.sh
RUN sed -i 's/\r//' /start-celerybeat.sh
RUN chmod +x /start-celerybeat.sh

COPY . /app

RUN chown -R django /app

USER django

WORKDIR /app

ENTRYPOINT ["/entrypoint.sh"]

如果您需要更多信息,请与我们联系

编辑 - 添加树:

注意:我已按照Heroku here的指示将Dockerfiles重命名为Dockerfile.processtype - 虽然我不再推送多个图像..正如您在树中所知,我和#39; ve还将Dockerfile.django和Dockerfile.local的副本移动到项目的根目录,就像Heroku container:push processtype --recursive所需要的那样。

├── Dockerfile.django
├── Dockerfile.local
├── LICENSE
├── Procfile
├── README.rst
├── compose
│   ├── local
│   │   └── django
│   │       ├── celery
│   │       │   ├── beat
│   │       │   │   └── start.sh
│   │       │   └── worker
│   │       │       └── start.sh
│   │       └── start.sh
│   └── production
│       ├── caddy
│       │   ├── Caddyfile
│       │   └── Dockerfile.caddy
│       ├── django
│       │   ├── Dockerfile.django
│       │   ├── celery
│       │   │   ├── beat
│       │   │   │   └── start.sh
│       │   │   └── worker
│       │   │       └── start.sh
│       │   ├── entrypoint.sh
│       │   └── gunicorn.sh
│       └── postgres
│           ├── Dockerfile.postgres
│           └── maintenance
│               ├── _sourced
│               │   ├── constants.sh
│               │   ├── countdown.sh
│               │   ├── messages.sh
│               │   └── yes_no.sh
│               ├── backup
│               ├── backups
│               └── restore
├── config
│   ├── __init__.py
│   ├── __pycache__
│   │   ├── __init__.cpython-35.pyc
│   │   ├── __init__.cpython-36.pyc
│   │   ├── urls.cpython-36.pyc
│   │   └── wsgi.cpython-36.pyc
│   ├── settings
│   │   ├── __init__.py
│   │   ├── __pycache__
│   │   │   ├── __init__.cpython-35.pyc
│   │   │   ├── __init__.cpython-36.pyc
│   │   │   ├── base.cpython-35.pyc
│   │   │   ├── base.cpython-36.pyc
│   │   │   ├── local.cpython-35.pyc
│   │   │   ├── local.cpython-36.pyc
│   │   │   └── production.cpython-36.pyc
│   │   ├── base.py
│   │   ├── local.py
│   │   ├── production.py
│   │   └── test.py
│   ├── urls.py
│   └── wsgi.py
├── docs
│   ├── Makefile
│   ├── __init__.py
│   ├── conf.py
│   ├── deploy.rst
│   ├── docker_ec2.rst
│   ├── index.rst
│   ├── install.rst
│   └── make.bat
├── heroku.yml
├── local.yml
├── locale
│   └── README.rst
├── lurnup
│   ├── __init__.py
│   ├── __pycache__
│   │   └── __init__.cpython-36.pyc
│   ├── contrib
│   │   ├── __init__.py
│   │   ├── __pycache__
│   │   │   └── __init__.cpython-36.pyc
│   │   └── sites
│   │       ├── __init__.py
│   │       ├── __pycache__
│   │       │   └── __init__.cpython-36.pyc
│   │       └── migrations
│   │           ├── 0001_initial.py
│   │           ├── 0002_alter_domain_unique.py
│   │           ├── 0003_set_site_domain_and_name.py
│   │           ├── __init__.py
│   │           └── __pycache__
│   │               ├── 0001_initial.cpython-36.pyc
│   │               ├── 0002_alter_domain_unique.cpython-36.pyc
│   │               ├── 0003_set_site_domain_and_name.cpython-36.pyc
│   │               └── __init__.cpython-36.pyc
│   ├── static
│   │   ├── css
│   │   │   └── project.css
│   │   ├── fonts
│   │   ├── images
│   │   │   └── favicon.ico
│   │   ├── js
│   │   │   └── project.js
│   │   └── sass
│   │       ├── custom_bootstrap_vars.scss
│   │       └── project.scss
│   ├── taskapp
│   │   ├── __init__.py
│   │   ├── __pycache__
│   │   │   ├── __init__.cpython-36.pyc
│   │   │   └── celery.cpython-36.pyc
│   │   └── celery.py
│   ├── templates
│   │   ├── 403_csrf.html
│   │   ├── 404.html
│   │   ├── 500.html
│   │   ├── account
│   │   │   ├── account_inactive.html
│   │   │   ├── base.html
│   │   │   ├── email.html
│   │   │   ├── email_confirm.html
│   │   │   ├── login.html
│   │   │   ├── logout.html
│   │   │   ├── password_change.html
│   │   │   ├── password_reset.html
│   │   │   ├── password_reset_done.html
│   │   │   ├── password_reset_from_key.html
│   │   │   ├── password_reset_from_key_done.html
│   │   │   ├── password_set.html
│   │   │   ├── signup.html
│   │   │   ├── signup_closed.html
│   │   │   ├── verification_sent.html
│   │   │   └── verified_email_required.html
│   │   ├── base.html
│   │   ├── pages
│   │   │   ├── about.html
│   │   │   └── home.html
│   │   └── users
│   │       ├── user_detail.html
│   │       ├── user_form.html
│   │       └── user_list.html
│   └── users
│       ├── __init__.py
│       ├── __pycache__
│       │   ├── __init__.cpython-36.pyc
│       │   ├── adapters.cpython-36.pyc
│       │   ├── admin.cpython-36.pyc
│       │   ├── apps.cpython-36.pyc
│       │   ├── models.cpython-36.pyc
│       │   ├── urls.cpython-36.pyc
│       │   └── views.cpython-36.pyc
│       ├── adapters.py
│       ├── admin.py
│       ├── apps.py
│       ├── migrations
│       │   ├── 0001_initial.py
│       │   ├── __init__.py
│       │   └── __pycache__
│       │       ├── 0001_initial.cpython-36.pyc
│       │       └── __init__.cpython-36.pyc
│       ├── models.py
│       ├── tests
│       │   ├── __init__.py
│       │   ├── factories.py
│       │   ├── test_admin.py
│       │   ├── test_models.py
│       │   ├── test_urls.py
│       │   └── test_views.py
│       ├── urls.py
│       └── views.py
├── manage.py
├── merge_production_dotenvs_in_dotenv.py
├── production.yml
├── pytest.ini
├── requirements
│   ├── base.txt
│   ├── local.txt
│   └── production.txt

1 个答案:

答案 0 :(得分:0)

Cookiecutter-django提供了一个标准的docker compose配置,您可以使用完整的Docker支持推送多个托管服务。

但是,Heroku支持Docker with a few restrictions。例如,WSGI服务器is hardcoded to 5000的端口,其中Heroku要求使用环境变量$PORT

这些不在cookiecutter-django中考虑,所以你必须改变一些事情:

  • 我从compose / production / django中的图片开始,忽略数据库(通过add-on提供)和Caddy(请参阅here)。
  • Gunicorn port5000更改为$PORT
  • 可能不需要获取DATABASE_URL in entrypoint.sh的代码。
  • 最后但并非最不重要:创建一个heroku.yml文件到point at the DF您想要使用。
  • 使用docker-compose,您可以重复使用相同的Dockerfile并更改入口点,但我认为Heroku不可行。您可能需要创建Web Docker文件的副本并为Celery dynos更改它。

我在Heroku上尝试过Docker,但没有使用cookiecutter-django&#39;建立。 Heroku的方式不够标准IMO,它在纯Heroku和裸Docker之间有点中间地带。

希望有所帮助!