sbt-native-packager docker: 如何在 /etc/hosts 中添加条目

sbt-native-packager docker: How to add entry in /etc/hosts

我正在使用 sbt-native-packager 的 docker 插件构建一个 Docker 图像。我希望我的图像在 /etc/hosts.

中有一个额外的条目

我试过以下方法:

dockerCommands in Docker := dockerCommands.value.flatMap {
  case cmd@Cmd("FROM", _) =>
    List(Cmd("FROM", "anapsix/alpine-java")) ++ List(
      Cmd("ENV", "JAVA_MIN_MEM", "1024m"),
      Cmd("RUN", "echo 8.8.8.8 foo >> /etc/hosts")
    )
}

很遗憾,它似乎不起作用。当我基于此图像启动容器时,/etc/hosts 没有额外的条目。

看起来它实际上正在写入文件,因为我尝试了以下操作:

....
Cmd("RUN", "echo 8.8.8.8 foo >> /etc/hosts; ping -c 4 foo")
....

我得到以下输出:

[info] Step 9/15 : RUN echo 8.8.8.8 foo >> /etc/hosts; ping -c 4 foo
[info]  ---> Running in b6d7ba25f96f
[info] PING foo (8.8.8.8): 56 data bytes
[info] 64 bytes from 8.8.8.8: seq=0 ttl=37 time=5.521 ms
[info] 64 bytes from 8.8.8.8: seq=1 ttl=37 time=3.188 ms
[info] 64 bytes from 8.8.8.8: seq=2 ttl=37 time=6.012 ms
[info] 64 bytes from 8.8.8.8: seq=3 ttl=37 time=4.192 ms

所以看起来修改后的 /etc/hosts 被覆盖了!

正确的做法是什么?

文件 /etc/hosts 由 Docker 管理,不能作为构建映像的一部分进行自定义。

如您所知,您可以使用 RUN echo 8.8.8.8 foo > /etc/hosts; <some_command_requiring_custom_hosts_file> 添加自定义条目。但此修改仅在执行此特定 RUN 命令期间可用。

当 运行 容器使用 docker run--add-host 参数时,如果您需要自定义条目(参见 docs)。

一般来说,最好不要在 Docker 图像中包含配置详细信息。仅在您 运行 容器时应用配置有助于保持图像的可移植性。

是的,Docker 会覆盖该文件(实际上,它是容器启动时安装在该位置的主机系统中存在的文件),因此您在那里所做的任何更改都将被覆盖。

一个选项是将 docker 入口点更改为指向执行该更改然后运行应用程序启动脚本的脚本,而不是指向您的应用程序启动脚本。

所以在普通的docker(抱歉我从未使用过sbt docker插件),而不是进入你的应用程序启动脚本(使用/usr/bin/myapp):

ENTRYPOINT /usr/bin/myapp

你会

RUN echo "echo 8.8.8.8 foo > /etc/hosts" >> /startup.sh
RUN echo "/usr/bin/myapp" >> /startup.sh
RUN chmod +x /startup.sh
ENTRYPOINT /startup.sh