我的目标是构建一个Docker镜像,其中包含预先填充了Alembic迁移所产生的表格和数据的MySQL。不幸的是,如果没有活动的MySQL实例,Alembic就无法生成必要的数据。它可以独立创建一个SQL转储为loaded by MySQL on first run。
我尝试使用multi-stage builds同时使用mysql
和python
容器,但是一旦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吗?
答案 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迁移。