【问题标题】:Docker: Building an image that depends on another image to be runningDocker:构建一个依赖于另一个正在运行的镜像的镜像
【发布时间】:2018-04-05 19:32:43
【问题描述】:

我的目标是构建一个 Docker 映像,其中包含预先填充了 Alembic 迁移生成的表和数据的 MySQL。 不幸的是,如果没有活动的 MySQL 实例,Alembic 无法生成必要的数据,也它可以独立创建一个SQL转储为loaded by MySQL on first run

我尝试使用multi-stage builds 来同时使用mysqlpython 容器,但是一旦Python 阶段开始,MySQL 守护程序就会再次关闭。

# start MySQL daemon
FROM mysql:5.6
RUN docker-entrypoint.sh

# install and run Alembic
FROM python:2.7-alpine
# [install Alembic]
COPY ./alembic-migrations /alembic-migrations
# [run migrations]

我不喜欢这个特定的解决方案,但它似乎是最简单的选择。有没有办法做我正在尝试的事情?我应该辞职在 MySQL 容器中安装 Python 和 Alembic 吗?

【问题讨论】:

  • 你研究过 docker-compose 吗?
  • 为此目的,我们有一个使用docker-compose 的功能管道,但它很慢,因为它需要在每个开发人员的机器上、在每个环境中、每次有人切换分支时不断地重新运行 Alembic。我们希望构建一个可以通过注册表分发的映像,其中所有开发/测试数据库都已经内置。如果有办法使用 docker-compose 做到这一点,我很想听听。

标签: mysql docker alembic


【解决方案1】:

这可能会让一些 Docker 布道者的眼睛流血,但这就是我能够完成我正在寻找的行为的方式。它实际上比我预期的更简单,运行速度更快。

FROM python:2.7-alpine as python
FROM mysql:5.6

# set up a functional chroot of the Python image at /python
COPY --from=python / /python
RUN set -ex; \
    cp /etc/resolv.conf /python/etc/resolv.conf; \
    mknod -m 0644 /python/dev/random c 1 8; \
    mknod -m 0644 /python/dev/urandom c 1 9;

# install software depedencies in chroot jail
RUN set -ex; \
    chroot /python apk --no-cache --virtual add [some dependencies]

# install Python libraries
COPY ./requirements.txt /python/tmp/requirements.txt
RUN chroot /python pip install -r /tmp/requirements.txt;

# apply Alembic migrations and remove the Python chroot jail
COPY ./usr/local/bin/build.sh /usr/local/bin/
COPY ./alembic /python/alembic

RUN build.sh && rm -rf /python;

ENTRYPOINT ["docker-entrypoint.sh", "--datadir=/var/lib/mysql-persist"]

EXPOSE 3306
CMD ["mysqld"]

build.sh 脚本只是从 MySQL 容器中派生出docker-entrypoint.sh 脚本,然后在 Python chroot 中调用 Alembic 特定的代码。

#!/bin/sh
docker-entrypoint.sh --datadir=/var/lib/mysql-persist 2>/dev/null &

chroot /python build.sh

请注意,我正在设置自定义数据目录 (/var/lib/mysql-persist),因为上游 mysql 容器定义了 VOLUME /var/lib/mysql,我无法覆盖。

结果是一个包含 MySQL、完整数据库的构建映像,但不包含 Python 容器或 Alembic 脚本的任何痕迹。它现在可以通过注册表分发并由docker-compose 获取,从而避免了所有用户独立执行 Alembic 迁移的需要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-25
    • 2020-10-06
    • 2014-05-07
    • 2010-12-15
    • 2017-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多