【问题标题】:Two docker images into a single docker image [duplicate]将两个 docker 映像合并为一个 docker 映像 [重复]
【发布时间】:2020-04-24 13:56:16
【问题描述】:

我需要通过合并“RabbitMQ-management”和“MongoDB”图像来创建单个 docker 图像。有可能做到吗?

我已经尝试使用下面的 Dockerfile 并且可以访问 RabbitMQ,但是 mongodb 无法正常工作。请你帮助我好吗。

# cat Dockerfile 
FROM rabbitmq:3.7.17

RUN rabbitmq-plugins enable --offline rabbitmq_management

# extract "rabbitmqadmin" from inside the "rabbitmq_management-X.Y.Z.ez" plugin zipfile
# see https://github.com/docker-library/rabbitmq/issues/207
RUN apt-get update && apt-get install -y gnupg2
RUN gpg --keyserver ha.pool.sks-keyservers.net --recv-keys 0C49F3730359A14518585931BC711F9BA15703C6 && \
gpg --export $GPG_KEYS > /etc/apt/trusted.gpg.d/mongodb.gpg
ARG MONGO_PACKAGE=mongodb-org
ARG MONGO_REPO=repo.mongodb.org
ENV MONGO_PACKAGE=${MONGO_PACKAGE} MONGO_REPO=${MONGO_REPO}
ENV MONGO_MAJOR 3.4
ENV MONGO_VERSION 3.4.18
RUN echo "deb http://$MONGO_REPO/apt/debian jessie/${MONGO_PACKAGE%-unstable}/$MONGO_MAJOR main" | tee "/etc/apt/sources.list.d/${MONGO_PACKAGE%-unstable}.list"
RUN echo "/etc/apt/sources.list.d/${MONGO_PACKAGE%-unstable}.list"
RUN apt-get update
RUN apt-get install -y ${MONGO_PACKAGE}=$MONGO_VERSION
RUN set -eux; \
        erl -noinput -eval ' \
                { ok, AdminBin } = zip:foldl(fun(FileInArchive, GetInfo, GetBin, Acc) -> \
                        case Acc of \
                                "" -> \
                                        case lists:suffix("/rabbitmqadmin", FileInArchive) of \
                                                true -> GetBin(); \
                                                false -> Acc \
                                        end; \
                                _ -> Acc \
                        end \
                end, "", init:get_plain_arguments()), \
                io:format("~s", [ AdminBin ]), \
                init:stop(). \
        ' -- /plugins/rabbitmq_management-*.ez > /usr/local/bin/rabbitmqadmin; \
        [ -s /usr/local/bin/rabbitmqadmin ]; \
        chmod +x /usr/local/bin/rabbitmqadmin; \
        apt-get update; apt-get install -y --no-install-recommends python ca-certificates; rm -rf /var/lib/apt/lists/*; \
        rabbitmqadmin --version

EXPOSE 15671 15672 27017

我正在使用以下命令运行 RabbitMQ(它正在运行)

# docker run -it -p 15672:15672 -p 5672:5672  --hostname my-rabbitmq image

启动 Mongodb 容器的命令(它不工作)

docker run -d -v /tmp/mongodb:/data/db -p 27017:27017 image mongod

【问题讨论】:

  • 这是一种不好的做法。为什么要这么做?为什么不运行这两个容器?如果您需要将它们作为“堆栈”运行,请使用 docker-compose
  • 我同意你的看法。一旦开发人员推送代码,就需要在 DB 和 RabbitMQ 上运行单元测试。
  • 一个更好的方法是声明 compose 文件,并为测试提供一个“堆栈”。在一个容器中组合两个单独的图像不仅是不好的做法,而且在出现问题时调试会非常痛苦。

标签: mongodb docker rabbitmq


【解决方案1】:

实现您的要求并非不可能,但我会说这不是正确的方法。 Docker 提供隔离,并声明它应该是每个容器一个进程。 (应该,不是必须)。

如果您遵循此概念,则可以轻松使用其他工具将多个容器放在一起。例如,您可以指定一个不错的 docker-compose.yml,而不是合并两个图像的复杂 Dockerfile:

 version: '3'

  services:
    mongo:
      image: mongod
      volumes:
        - /tmp/mongodb:/data/db
      ports:
        - "27017:27017"
    rabbitmq:
      image: rabbitmq
      ports:
        - "15672:15672"
        - "5672:5672"
      depends_on:
        - mongo

IMO 更具可读性,并且可能达到相同的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多