Docker:构建依赖于另一个要运行的图像的图像

时间:2018-04-05 19:32:43

标签: mysql docker alembic

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

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

# 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吗?

1 个答案:

答案 0 :(得分:0)

这可能会让一些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迁移。