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

sbt native packager docker:如何在/etc/hosts中添加条目,docker,hosts,sbt-native-packager,Docker,Hosts,Sbt Native Packager,我正在使用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_M

我正在使用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")
    )
}
[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没有额外的条目

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

....
Cmd("RUN", "echo 8.8.8.8 foo >> /etc/hosts; ping -c 4 foo")
....
我得到的输出如下:

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")
    )
}
[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管理,不能作为构建映像的一部分进行自定义

正如您已经了解的,您可以使用
runecho8.8.8.8foo>/etc/hosts添加自定义条目。但此修改仅在执行此特定的
RUN
命令期间可用

如果在运行容器时需要自定义条目,请使用
docker run
--add host
参数(请参阅)


通常,最佳做法是在Docker映像中不包含配置详细信息。仅在运行容器时应用配置有助于保持图像的可移植性。

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

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

因此,在普通docker中(很抱歉,我从未使用过sbt docker插件),而不是在应用程序启动脚本中添加条目(使用
/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