Docker,如何将Docker特定版本的文件复制到WORKDIR

时间:2019-02-27 18:01:16

标签: docker docker-compose

可以在Dockerfile中使用Docker的COPYRUN 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随便包含这些特定于环境的文件)

1 个答案:

答案 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,然后您仅使用环境变量配置环境。