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

标签 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

然后重复所有命令,我没有异常(exception)。

有什么区别?怎么会是第二种方法有效而第一种方法无效呢?

我注意到在第一种情况下,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

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

最佳答案

如果你需要对你的数据库进行初始化,你应该在容器启动的时候进行。 Dockerfile 不是一个合适的地方。考虑以下示例:

入口点.sh

#!/bin/bash

sed -e

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

exec "$@"

docker 文件

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

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

关于linux - Dockerfile RUN 与运行图像和使用/bin/bash 提供不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29662277/

相关文章:

linux - 远程检查 linux 中是否存在所有文件?

ruby - 使用 ruby​​ 自动执行任务

docker - 什么是最简单的合理Kubernetes设置?

c# - 尝试发布到Azure容器注册表时获取 “Running the docker.exe login command failed.”

php - 为什么从 cron 作业调用 PHP_SAPI 不等于 'cli'?

linux - 为什么 grep 返回不匹配的行

bash 进程数据

docker - 语法规范文件和Docker?

c - UNIX 套接字的缓冲写入?

c - 避免过于具体的依赖关系