Mongodb docker compose:在不重写任何内容的情况下运行命令

Mongodb docker compose:在不重写任何内容的情况下运行命令,mongodb,docker,raspberry-pi,docker-compose,Mongodb,Docker,Raspberry Pi,Docker Compose,我有一个docker compose文件,看起来像: version: "3" services: mongoDB: restart: unless-stopped volumes: - "/data/db:/data/db" ports: - "27017:27017" - "28017:28017" image: "andresvidal/rpi3

我有一个docker compose文件,看起来像:

version: "3"

services:
    mongoDB:
        restart: unless-stopped
        volumes:
            - "/data/db:/data/db"
        ports:
            - "27017:27017"
            - "28017:28017"
        image: "andresvidal/rpi3-mongodb3:latest"
    mosquitto:
        restart: unless-stopped
        ports:
            - "1883:1883"
        image: "mjenz/rpi-mosquitto"
    FG:
        privileged: true
        network_mode: "host"
        depends_on:
            - "mosquitto"
            - "mongoDB"
        volumes:
            - "/home/pi:/home/pi"
            - "/boot:/boot"
        image: "arkfreestyle/fg:v1.8"
        entrypoint: /app/docker-entrypoint.sh
        restart: unless-stopped
我正在为其他人构建的raspberry pi使用一个mongoDB容器(我刚刚从docker hub中获取),问题是如果由于任何原因出现不正确的关闭,该容器无法处理/data/db目录中的mongod.lock文件

在这种情况下,在尝试重新启动所有容器时,mongodb容器将保持退出状态,状态代码为100,唯一的修复方法是通过在我的终端中运行sudo rm/data/db/mongod.lock手动删除锁文件。但是,我希望在mongodb容器启动之前或尝试重新启动时,自动执行此操作并在docker compose文件中运行此命令

我不想弄乱mongodb的docker文件,因为它是由其他人构建的(顺便说一句,在其他人的docker文件中进行更改是一种好做法吗?),所以我想使用我的docker compose文件。我不能使用entrypoint或command选项,因为我不想覆盖Dockerfile中的任何默认命令,我只想运行这个额外的命令,而不影响其他任何操作:

sudo rm /data/db/mongod.lock
我想在mongodb容器启动之前运行它(最坏的情况是它只会输出找不到文件),或者如果mongodb正在尝试重新启动


我愿意接受更多关于你如何建议解决这个问题的想法,所以任何帮助都是非常感谢的

您可以创建自己的Dockerfile,扩展原始的“andresvidal/rpi3-mongodb3:latest”。如果该脚本使用脚本作为入口点,则可以将命令附加到该文件的末尾(例如,运行echo xxx>>/docker ENTRYPOINT.sh)

然后,在docker compose中,您应该使用自己的图像,这些图像基于其他人开发的图像。是的,改变Dockerfile文件不是一个好主意,但如果你看到问题或改进,你应该尝试并提出修改建议


我的建议是,在导入原始Dockerfile时不要使用“最新”,而是导入特定版本。这样,您就可以更好地控制如何导入将来的更改。

Hi!我完全按照你说的做了,最终直接编辑了他的docker-entrypoint.sh脚本并构建了一个新的图像。我只是简单地添加了一个mongod.lock文件存在性检查,如果存在,就会将其删除。这个重启问题现在似乎没有发生,我将在github上向他发送一个pull请求:D谢谢。