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
我正在使用 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