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

标签 mysql docker alembic

我的目标是构建一个包含 MySQL 的 Docker 镜像,其中预填充了由 Alembic 迁移生成的表和数据。不幸的是,如果没有事件的 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 布道者的眼睛流血,但这就是我能够实现我正在寻找的行为的方式。它实际上比我预期的更简单并且运行速度更快。

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 迁移的需要。

关于mysql - Docker:构建依赖于另一个要运行的图像的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49680148/

相关文章:

mysql - 异常的 ActiveRecord 行为

java - 在 GWT 应用程序中使用 jdbc 连接到 mysql (xampp) 时遇到问题 - 即使 jar 在构建路径中也找不到类

Docker:清理所有停止的容器,除了数据容器

python - Alembic:包括约束以拒绝带有字符的字符串

python - 字段默认时间戳设置为表创建时间而不是行创建时间

java - 在 gradle 多项目 [spring 数据] 中将主题存储库注入(inject) DataService 失败

mysql - SQL 查询从两个表中选择匹配和缺失的值

jenkins - 在 docker 中使用 gradle 和 jenkins 构建应用程序

docker - 如何确定我已经登录过的注册表?

python - 对 alembic.ini 使用不同的 .ini 文件