可以在Dockerfile中使用Docker的COPY
或RUN cp
来用特定于Docker的版本覆盖默认配置文件吗?
在Rails项目中,我们的config文件夹具有针对不同环境的多个版本的database.yml:
# projectname/config/
database.yml # an unused default placeholder
database_for_docker_2.yml
database_for_vagrant.yml
对于机器/容器初始化期间的不同开发环境(vagrant + virtualbox与docker),我们将.yml的适当版本复制到database.yml
在Dockerfile中,此部分之后:
WORKDIR /my_app
RUN bundle install
COPY . /my_app
我们尝试过:
运行cp ./config/database_docker_2.yml /my_app/config/database.yml
但是文件似乎没有被复制,当我们旋转容器时,将使用默认版本的database.yml。
然后我们尝试:
COPY ./config/database_docker_2.yml /my_app/config/database.yml
文件似乎仍然没有被复制,当我们旋转容器时,将使用文件的默认版本。
正常工作是在docker-compose.yml的volume部分中添加另一个条目,专门用于该文件:
volumes:
- .:/my_app
- ./config/database_docker_2.yml:/my_app/config/database.yml
但是我们更喜欢在Dockerfile中管理特定于环境的文件版本的放置(而不是将Docker-compose.yml随便包含这些特定于环境的文件)
答案 0 :(得分:0)
命令COPY ./config/database_docker_2.yml /my_app/config/database.yml
可能有效,没有理由不应该假设源存在。
我怀疑发生的事情是,当您对其进行测试时,您已经有了一个带有.:/my_app
的卷,然后该卷向您显示 local 文件夹,而不是容器内文件夹
在没有卷的情况下运行它,我相信您实际上会看到它已按预期将其复制到了容器中。
附带说明:
如果您尚未锁定处理该多数据库配置的方式,我将考虑重新评估您的情况,并尝试找到一种不需要您为每种环境更改database.yml
的解决方案。一种方法是,让database.yml
使用一个环境变量(通常为DATABASE_URL
),然后对所有人拥有一个docker-compose
,对所有人拥有一个database.yml
,然后您仅使用环境变量配置环境。