如何将数据导入mongodb容器并创建映像

如何将数据导入mongodb容器并创建映像,mongodb,docker,dockerfile,Mongodb,Docker,Dockerfile,我花了很多时间在一项看似简单的任务上。我想运行monogodb容器。然后将csv文件复制到容器中,或从docker文件执行命令,将csv文件导入mongodb数据库。我尝试使用RUN,script.sh,但没有任何效果。请帮忙。 我想自动化任务,当我复制数据时,我将为我的自动化任务创建一个新映像 这是我的文件 FROM mongo RUN mkdir -p /app/data WORKDIR /app/data COPY gene.csv /app/data COPY script.sh /ap

我花了很多时间在一项看似简单的任务上。我想运行monogodb容器。然后将csv文件复制到容器中,或从docker文件执行命令,将csv文件导入mongodb数据库。我尝试使用RUN,script.sh,但没有任何效果。请帮忙。 我想自动化任务,当我复制数据时,我将为我的自动化任务创建一个新映像

这是我的文件

FROM mongo
RUN mkdir -p /app/data
WORKDIR /app/data
COPY gene.csv /app/data
COPY script.sh /app/data
EXPOSE 27017
# CMD ["/app/data/script.sh"]
脚本文件是

#! /bin/sh 
mongoimport -d Gene -c genes --type csv --file gene.csv --headerline
编辑:这个答案解决了一个问题,但并没有解决问题,因为显然mongo必须运行任何一个才能工作。在这种情况下,一个自定义入口点可能是最好的选择

使用
RUN
是正确的方法,因为当您使用
CMD
时,实际上可以运行Mongo进程。但是,您的问题在于
复制
说明

COPY gene.csv /app/data
COPY script.sh /app/data
这些行的末尾需要一个
/
,因为现在它们说“从我的主机复制这个文件,将这个文件放在我的容器中”。而您试图说‘将此文件从我的主机复制到我容器中的此文件夹’。它们应如下所示(但可以进一步简化,请参见结尾处的最终
Dockerfile
):

如果您将脚本放入
run
指令中,并且该层将提交到映像中,那么您的脚本将运行,然后您可以在末尾使用
CMD
来运行mongo(或者将其留空,并从父级(
mongo
)继承默认的
入口点因此完整的
Dockerfile
变为:

FROM mongo
WORKDIR /app/data        # This will be created if it doesn't exist
COPY gene.csv .
COPY script.sh .
RUN chmod +x script.sh && sync && ./script.sh

我能够做到这一点,但通过另一个容器。该容器的工作是将数据插入mongodb数据库容器并退出。有关更多详细信息,请查看接受的答案。我使用csv文件和导入该文件的命令更改了JSON文件,尽管我发现mongodb使用JSON效果更好。

太晚了,可能对其他人有所帮助

    FROM mongo
    RUN mkdir -p /app/data
    WORKDIR /app/data
    COPY gene.csv /app/data
    COPY script.sh /app/data
    CMD ["mongod", "&&", "mongoimport", "-d", "Gene", "-c", "Genes", "--file", "gene.csv", "--headerline"]

为什么要使用bash脚本,为什么不使用node?为什么要使用@DanGreen Leipciger?我看不出任何可能的理由来选择node来完成如此轻量级的任务,但我在这方面没有专业知识,所以这是一个真正的问题。如果您已经使用过它,它只是简单快捷。默认情况下在cli中运行,
$node myscript.js
。它也不需要配置并且可以在任何机器上运行。此外,MongoDB有一个惊人的节点界面,所有上述命令都可用。此外,如果需求变得更加复杂,OP将可以访问NPM上可用的所有节点工具。这是一件非常常见的事,我想知道为什么它还没有出现在网上。实际上我正在做的是:我正在创建一个web应用程序,并且我已经编写了一个docker-compose.yml文件。如果我能够输入数据并制作图像,用户所要做的就是docker compose并浏览到localhost:3000/genes以查看数据。感谢帮助。对于上面的docker文件,我得到了以下错误步骤5/5:运行。/script.sh--->在1d385c7df879/bin/sh中运行:./script.sh:权限拒绝命令“/bin/sh-c./script.sh”返回一个非零代码:126I现在收到此错误步骤5/5:运行chmod+x script.sh&&sync&&./script.sh-->在6de14ed40581 2017-04-23T19:45:30.083+0000[#……]Gene.genes 4.00KB/57.6KB(6.9%)2017-04-23T19:45:30.598+0000[#……]基因。基因4.00KB/57.6KB(6.9%)2017-04-23T19:45:30.598+0000失败:连接到db服务器时出错:无法访问服务器2017-04-23T19:45:30.598+0000导入了0个文档命令“/bin/sh-c chmod+x script.sh&&sync&&&./script.sh”返回了一个非零代码:1我在一小时前的某个地方读到,您必须重新启动db或类似的东西。不知道他们为什么让它如此复杂复杂。我对mongo不太熟悉。mongo是否需要运行才能正常工作?如果需要,那么我们将需要一个不同的解决方案。如果我们在执行脚本之前从mongo CMD[“usr/bin/mongod”,“--smallfiles”]给出答案。同样的错误,我将检查它。感谢您的回复
    FROM mongo
    RUN mkdir -p /app/data
    WORKDIR /app/data
    COPY gene.csv /app/data
    COPY script.sh /app/data
    CMD ["mongod", "&&", "mongoimport", "-d", "Gene", "-c", "Genes", "--file", "gene.csv", "--headerline"]