Dockerfile运行与运行图像和使用/ bin / bash提供不同的结果

我有一个简单的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 

如果我从build立命令做一切事情

 docker build --no-cache=true --rm=true . 

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

但是,如果我用最后一个命令创build图像,并启动它

 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回购是在这里: https : //github.com/spotify/docker-cassandra

UPD。 我想我明白了,这是因为在入口点脚本中修改了spotify cassandra的configuration文件,所以执行RUN命令时这些变化是不可用的。

如果您需要为数据库执行初始化,则应在容器启动时执行此操作。 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 。 如果一切顺利的话,你会看到你的数据库已经初始化。