Dockerfile RUN vs run image和use / bin / bash提供不同的结果

时间:2015-04-15 22:48:18

标签: linux bash docker dockerfile

我有一个简单的dockerfile,比如

FROM spotify/cassandra

RUN sed -i -e "s/^authenticator:.*/authenticator: PasswordAuthenticator/" $CASSANDRA_CONFIG/cassandra.yaml \
&& sed -i -e "s/^authorizer:.*/authorizer: org.apache.cassandra.auth.CassandraAuthorizer/" $CASSANDRA_CONFIG/cassandra.yaml

RUN cassandra \
&& sleep 10 && echo "Applying CQL scripts..." \
&& cqlsh -u cassandra -p cassandra -f someScript
&& pkill -f cassandra

如果我从构建命令

执行所有操作
docker build --no-cache=true --rm=true .

我得到异常" AuthenticationException(为什么='用户名和/或密码不正确"

但是如果我用最后一个命令创建图像并用

启动它
docker run --rm -i -t --entrypoint=/bin/bash my-image

然后重复所有命令,我没有例外。

有什么区别?怎么可能,第二种方式起作用,首先不是?

我注意到在第一种情况下,cassandra开始时没有打印:

ERROR 22:39:03,081 Directory /var/lib/cassandra/data doesn't exist
ERROR 22:39:03,084 Directory /var/lib/cassandra/commitlog doesn't exist
ERROR 22:39:03,085 Directory /var/lib/cassandra/saved_caches doesn't exist

我可能只是猜测,因为RUN在一个单独的容器中运行命令,它在某种程度上看不到一些在spotify / cassandra中被更改的文件...

spotify / cassandra repo在这里:https://github.com/spotify/docker-cassandra

UPD。我想我得到了原因,因为spotify cassandra配置文件在入口点脚本中被修改,因此当我执行RUN命令时这些更改不可用。

1 个答案:

答案 0 :(得分:2)

如果需要对数据库执行初始化,则应在容器启动时执行此操作。 Dockerfile不适合它。请考虑以下示例:

<强> entrypoint.sh

#!/bin/bash

sed -e

cassandra \
&& sleep 10 && echo "Applying CQL scripts..." \
&& cqlsh -u cassandra -p cassandra -f someScript
&& pkill -f cassandra

exec "$@"

<强> Dockefile

FROM spotify/cassandra
(...)
ADD ./entrypoint.sh /usr/local/bin/entrypoint.sh
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"] 

现在尝试docker run --rm -it your-image。如果一切顺利,您将看到您的数据库已初始化。