docker-compose:运行命令而不覆盖任何内容

时间:2019-04-04 07:03:50

标签: 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-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

我正在使用mongoDB容器用于其他人构建的树莓派(我只是从docker-hub中将其拉出),问题是如果由于某种原因关闭不当,该容器无法处理mongod / data / db目录中的.lock文件。

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

我不想弄乱mongodb的Dockerfile,因为它是由其他人构建的(顺便说一句,是对其他人的Dockerfiles进行更改吗?),所以我想使用docker-compose文件。我不能使用入口点或命令选项,因为我不想覆盖Dockerfile中的任何默认命令,我只想运行此额外的命令而不弄乱其他任何东西:

sudo rm /data/db/mongod.lock

我想在mongodb容器启动之前运行此程序(最坏的情况是它只会输出未找到的文件),或者如果mongodb正在尝试重新启动。

我也欢迎您提出更多有关如何解决此问题的建议,因此我们将不胜感激!

1 个答案:

答案 0 :(得分:1)

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

然后在docker-compose中,您应该使用自己的图像,该图像基于其他人开发的图像。是的,从其他人更改Dockerfile并不是一个好主意,但是如果您发现问题或改进,则应尝试提出对它们的更改。

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