编写用于Heroku的Dockerfile时的提示

介绍 ‘heroku docker:release’: 用 Docker 构建和部署 Heroku 应用程序

由于Heroku开始提供基于Docker的工具,我一直在研究它的内部内容(”Heroku的’docker:release’的操作”)。我尝试进行了一些实验,发现有很多有趣的操作。

tcnksm/gox-server,Heroku上にGo言語のクロスコンパイル環境を立てた.curl -A “uname -sp” https://gox-server.herokuapp.com/Soulou/curl-unix-socketみたいなリクエスト投げると環境にあったバイナリをビルドしてダウンロードできる

tcnksm/heroku-docker-registry,Heroku上でDocker Registryを立てた.普通にpushやpullできる.バックエンドドライバーを変えれば普通に使えるかも

虽然我还没有公开代码,但我试着运行了一些像Apache Kafka这样的JVM工具。此外,我在互联网上还看到了以下类似的东西。

    • DockerでHerokuでPerlが動いたぞ!!!

 

    DockerでHerokuでmrubyが動いたぞ!!1

建议

我会写下一些可能会发生卡顿的问题(由于它还只是刚刚发布,所以我认为它会有所改变)。关于功能和内部操作,请参考”Heroku的’docker:release’的操作方式”。如果有其他发现,我会附加在后面。

最低要求

首先必须满足以下条件。

heroku:cedar:14イメージを使う
変更は全て/app以下に入るようにする

由于发布的 Slug 必须是名为 /app 的 .tgz 文件,因此需要将其放置在 /app 文件夹中。

调试

使用Heroku Docker Release命令启动应用程序时,只是正常运行Docker容器,因此可以进入其中。容器的名称将为heroku-docker-${hash}-start。

$ docker run -it heroku-docker-${hash}-start /bin/bash

如果想进入正在运行的容器,可以使用docker exec命令。

蜗牛的尺寸 (Wō niú de chǐ

需要确保要发布的Slug大小不超过300MB(https://devcenter.heroku.com/articles/slug-compiler#slug-size)。要确认正在创建的Slug是否符合此要求,只需执行以下操作即可。

$ docker run -it heroku-docker-${hash}-start /bin/bash
$ tar cfvz /tmp/slug.tgz -C / --exclude=.git --exclude=.heroku ./app
$ ls -lh /tmp/slug.tgz

tar命令是Heroku内部执行的docker:release命令本身。

apt-get 可以重新封装为「适包」。

这没有意义。虽然在本地可以使用,但在上传到Heroku时无法使用。因此我们需要进行源代码编译,将所有依赖项都包含在/app目录下进行安装。

进程文件

如果在Procfile中写入启动命令,并在此处写入$PORT环境变量,则在Heroku上可以运行,但在本地环境可能无法正常工作。 Procfile仅在本地环境中作为docker run的参数进行展开,如果在此处写入环境变量,则会读取宿主机的环境变量。如果想在两种环境中同时运行,则需要从Procfile以外的地方读取环境变量。

所以在 Procfile 中只需写入 run.sh,然后在 run.sh 中读取 $PORT 环境变量并修改配置文件(如果有更好的方法,请告诉我)。

工作目录

在Heroku上,即使在本地运行正常,也需要正确设置procfile.d才能设置WORKDIR作为命令执行时的起点。例如,如果将WORKDIR设置为/app/bin,则需要在Dockerfile中添加以下内容。

ONBUILD RUN echo "cd /app/bin"  >> /app/.profile.d/init.sh

总结

只要努力,我觉得什么都可以动得了。

bannerAds