【问题标题】:Dockerfile RUN vs run image and use /bin/bash provides different resultDockerfile RUN vs run image 并使用 /bin/bash 提供不同的结果
【发布时间】:2015-04-15 22:48:17
【问题描述】:

我有一个简单的 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 命令时这些更改不可用。

【问题讨论】:

    标签: linux bash docker dockerfile


    【解决方案1】:

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

    【讨论】:

    • 感谢您的建议,但是如果我想在容器启动之前执行脚本怎么办?我不想每次启动容器时都创建 cassandra 键空间/表。
    • 这个脚本只会在容器创建时执行一次。如果您再次执行docker stopdocker start,您将看到初始化不会重复。
    • 好的,很好,但我还是不明白有什么区别。 spotify/cassandra 在入口点配置 cassandra 设置,我决定运行他们的入口点脚本并应用我的脚本。但什么都没有改变。所以,当我这样做时: RUN cassandra-singlenode && sleep 10 && echo "Applying CQL scripts..." && cqlsh -u cassandra -p cassandra -f script 我仍然看到 cassandra 以不同于运行 ENTRYPOINT ["cassandra-单节点”]。我需要了解为什么会发生这种情况,并且在网络上找不到任何信息。
    • 貌似没有区别,两种方式都是打印目录错误。 RUN方式失败的原因只是因为超时时间很小。 Cassandra 没有时间初始化 AUTH 机器...
    猜你喜欢
    • 2017-05-27
    • 1970-01-01
    • 2020-12-13
    • 2020-12-07
    • 2012-10-07
    • 1970-01-01
    • 2016-06-06
    • 2022-08-11
    • 2017-03-03
    相关资源
    最近更新 更多