我刚刚尝试了一个有关创建自定义图片的docker教程,该教程是 THIS 之一。
基本上我所做的只是执行了以下命令:
$ docker pull training/sinatra
有两种构建Dockerfile的方法,我选择使用自定义Dockerfile,因此,我创建了一个新目录并在其中导航并创建了一个文本文件,就像这样。
$ mkdir sinatra
$ cd sinatra
$ touch Dockerfile
我编辑了docker文件,如下所示:
# This is a comment
FROM ubuntu:14.04
MAINTAINER Kate Smith <ksmith@example.com>
RUN apt-get update && apt-get install -y ruby ruby-dev
RUN gem install sinatra
现在我执行了构建命令
$ docker build -t ouruser/sinatra:v2 .
现在,如果我跑,
$ docker images
我会在结果中获得自定义图像。那么现在我有一个新的挑战,我需要创建post postgresql的图像,我有一个名为map.osm的文件,我现在需要执行以下操作:
向图像添加参数(在Dockerfile中),因此当用户运行时 使用&#39; docker run ... map.osm&#39;地图被导入到 PostGIS数据库内部的图像。
我真的很困惑,如何对dockerfile进行编码,以便在运行命令时将某个文件导入数据库?
答案 0 :(得分:0)
首先,这不是使用docker的正确的方式。 Docker本身就是运行一个应用程序,这样你就可以更好地控制哪些应用程序得到更新,以及更好地管理它们正在使用的软件(例如,这个代码使用python 3,它使用python 2,等等)。
如果你想要完成这个,你需要了解Docker的工作原理。
每次从图像初始化容器时,它都会创建一个新版本的容器。因此,它将初始化您的数据库或程序,而不应用设置或数据。
如果您希望数据库启动,请登录并导入数据,那么您将需要创建一个dockerentrypoint.sh文件并编写所有脚本。
当docker容器启动时,它们在前台而不是后台运行进程。因此,一旦您的数据库启动,它将在您的容器的前台运行,除非您将其发送到后台,否则您将无法执行其他任务。如果执行此操作,则需要确保在运行任何子任务时将该任务拉回到前台。这是因为一旦进程完成,容器就会关闭。如果您希望容器保持守护程序,则需要在退出脚本之前将数据库进程恢复到前台。
解决方案:构建自定义bash脚本以初始化数据库并导入数据库。将此脚本设置为Dockerfile中的ENTRYPOINT。