我们如何 运行 flyway/migrations 在 Cassandra Dockerfile 中编写脚本?
How can we run flyway/migrations script inside Cassandra Dockerfile?
我的docker文件
FROM cassandra:4.0
MAINTAINER me
EXPOSE 9042
我想 运行 像获取 cassandra 图像和在容器内创建超级用户那样的东西。
create keyspace IF NOT EXISTS XYZ WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 1 };
我也试过添加一个 shell 脚本,但它从未连接到 cassandra,我修改的 docker 文件是
FROM cassandra:4.0
MAINTAINER me
ADD entrypoint.sh /usr/local/bin/entrypoint.sh
RUN chmod 755 /usr/local/bin/entrypoint.sh
RUN mkdir scripts
COPY alter.cql scripts/
RUN chmod 755 scripts/alter.cql
EXPOSE 9042
CMD ["entrypoint.sh"]
我的入口点是这样的
#!/bin/bash
export CQLVERSION=${CQLVERSION:-"4.0"}
export CQLSH_HOST=${CQLSH_HOST:-"localhost"}
export CQLSH_PORT=${CQLSH_PORT:-"9042"}
cqlsh=( cqlsh --cqlversion ${CQLVERSION} )
# test connection to cassandra
echo "Checking connection to cassandra..."
for i in {1..30}; do
if "${cqlsh[@]}" -e "show host;" 2> /dev/null; then
break
fi
echo "Can't establish connection, will retry again in $i seconds"
sleep $i
done
if [ "$i" = 30 ]; then
echo >&2 "Failed to connect to cassandra at ${CQLSH_HOST}:${CQLSH_PORT}"
exit 1
fi
# iterate over the cql files in /scripts folder and execute each one
for file in /scripts/*.cql; do
[ -e "$file" ] || continue
echo "Executing $file..."
"${cqlsh[@]}" -f "$file"
done
echo "Done."
exit 0
这从来没有连接到我的卡桑德拉
任何想法请帮助。
谢谢.
您的问题是您没有调用原始入口点来启动 Cassandra - 您用自己的代码覆盖了它,但它只是 运行 cqlsh
,而没有启动 Cassandra。
您需要修改您的代码以使用安装为 /usr/local/bin/docker-entrypoint.sh
的原始入口点脚本 (source) 启动 Cassandra,然后执行您的脚本,然后等待终止信号(您不能直接退出脚本,因为它会终止图像。
我的docker文件
FROM cassandra:4.0
MAINTAINER me
EXPOSE 9042
我想 运行 像获取 cassandra 图像和在容器内创建超级用户那样的东西。
create keyspace IF NOT EXISTS XYZ WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 1 };
我也试过添加一个 shell 脚本,但它从未连接到 cassandra,我修改的 docker 文件是
FROM cassandra:4.0
MAINTAINER me
ADD entrypoint.sh /usr/local/bin/entrypoint.sh
RUN chmod 755 /usr/local/bin/entrypoint.sh
RUN mkdir scripts
COPY alter.cql scripts/
RUN chmod 755 scripts/alter.cql
EXPOSE 9042
CMD ["entrypoint.sh"]
我的入口点是这样的
#!/bin/bash
export CQLVERSION=${CQLVERSION:-"4.0"}
export CQLSH_HOST=${CQLSH_HOST:-"localhost"}
export CQLSH_PORT=${CQLSH_PORT:-"9042"}
cqlsh=( cqlsh --cqlversion ${CQLVERSION} )
# test connection to cassandra
echo "Checking connection to cassandra..."
for i in {1..30}; do
if "${cqlsh[@]}" -e "show host;" 2> /dev/null; then
break
fi
echo "Can't establish connection, will retry again in $i seconds"
sleep $i
done
if [ "$i" = 30 ]; then
echo >&2 "Failed to connect to cassandra at ${CQLSH_HOST}:${CQLSH_PORT}"
exit 1
fi
# iterate over the cql files in /scripts folder and execute each one
for file in /scripts/*.cql; do
[ -e "$file" ] || continue
echo "Executing $file..."
"${cqlsh[@]}" -f "$file"
done
echo "Done."
exit 0
这从来没有连接到我的卡桑德拉 任何想法请帮助。 谢谢.
您的问题是您没有调用原始入口点来启动 Cassandra - 您用自己的代码覆盖了它,但它只是 运行 cqlsh
,而没有启动 Cassandra。
您需要修改您的代码以使用安装为 /usr/local/bin/docker-entrypoint.sh
的原始入口点脚本 (source) 启动 Cassandra,然后执行您的脚本,然后等待终止信号(您不能直接退出脚本,因为它会终止图像。