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

Linux Dockerfile运行与运行映像和使用/bin/bash提供不同的结果,linux,bash,docker,dockerfile,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

我有一个简单的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 .
我收到异常“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位于:


UPD。我想原因是,因为Spotify CasdRRA配置文件在EngyPoin脚本中被修改,因此在执行Run命令时,这些更改是不可用的。

< P>如果您需要为数据库执行初始化,则在容器启动时应该执行它。DOCKFLASH不是合适的地方。考虑FOL。举个例子:

entrypoint.sh

#!/bin/bash

sed -e

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

exec "$@"
dockfile

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

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

谢谢您的建议,但是如果我想在容器启动之前执行脚本呢?我不想每次启动容器时都创建cassandra键空间/表。。此脚本只在正在创建容器。如果您再次执行
docker stop
docker start
,您将看到初始化不会重复。好的,这很好,但我仍然不明白有什么区别。spotify/cassandra在entrypoint中配置cassandra设置,我决定运行他们的entrypoint脚本并应用我的脚本。但是所以,当我运行cassandra singlenode&&sleep 10&&echo“应用CQL脚本…”&&cqlsh-u cassandra-p cassandra-f脚本时,我仍然看到cassandra以另一种方式启动,而不是运行ENTRYPOINT[“cassandra singlenode”]。我需要了解为什么会发生这种情况,并且在web上找不到任何信息。看起来没有区别,两种方法都是打印目录错误。运行方式失败的原因只是因为超时时间很短。Cassandra没有时间初始化身份验证机械。。。