Linux Dockerfile运行与运行映像和使用/bin/bash提供不同的结果
我有一个简单的dockerfile,比如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
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没有时间初始化身份验证机械。。。