Dockerfile无法复制文件。 (" cp"命令)

时间:2016-10-31 04:10:03

标签: docker dockerfile

我的Dockerfile包含一些cp linux命令 因为项目中的某些文件被标记为xxx.php.sample等样本,因此应将其替换为xxx.php

我认为这个过程应该在Dockerfile上执行。所以我这样写了。

Dockerfile-PHP-apache的

FROM php:5.5-apache
RUN apt-get update && \
  docker-php-ext-install pdo_mysql mysqli mbstring
RUN a2enmod rewrite
RUN a2enmod substitute
ADD . /var/www
WORKDIR /var/www
RUN cp config.php.sample config.php
RUN cp shared_config.php.sample shared_config.php
RUN cp vendor/propel/propel1/build.properties.sample vendor/propel/propel1/build.properties
RUN sed -i -E "s/host=(.*);/host=mysql-db;/" ./vendor/propel/propel1/build.properties
COPY docker-php-apache/php.ini /usr/local/etc/php/

搬运工-compose.yml

version: '2'
services:
  mysql-db:
    build:
      context: .
      dockerfile: Dockerfile-mysql-server
    ports:
      - "3306:3306"
  php-apache:
    build:
      context: .
      dockerfile: Dockerfile-php-apache
    volumes:
      - .:/var/www
    ports:
      - "80:80"
    depends_on:
      - mysql-db

docker-compose builddocker-compose up之后(没有发生错误),这是cp结果。

  

RUN cp config.php.sample config.php - >找不到 config.php
  RUN cp shared_config.php.sample shared_config.php - > 找不到shared_config.php
  RUN cp vendor / propel / propel1 / build.properties.sample vendor / propel / propel1 / build.properties - >找不到 build.properties

我认为路径错了,所以我复制了上面的命令并直接执行了。 (我可以通过docker exec -it xxx_php-apache_1 bash登录容器。)
cp命令很好用,我可以在容器和本地源中找到复制的文件。

有没有人弄清楚为什么Dockerfile上的cp命令不起作用?

这是对应的构建日志。

Step 5 : COPY config.php.sample /var/www/config.php
 ---> afa7e6139049
Removing intermediate container 38b9968ac061
Step 6 : COPY shared_config.php.sample /var/www/shared_config.php
 ---> 78ea51045d4e
Removing intermediate container fe0b382914bd
Step 7 : COPY vendor/propel/propel1/build.properties.sample /var/www/vendor/propel/propel1/build.properties
 ---> 34c186a193c0
Removing intermediate container c55bb9565035
Step 8 : COPY docker-php-apache/php.ini /usr/local/etc/php/
 ---> 4e3e92aa0f97
Removing intermediate container f2c424eb6c38
Successfully built 4e3e92aa0f97

以防万一,我在容器上执行了find命令。

root@d98556ed051a:/var/www# find / -iname '*shared_config.php*' 
/var/www/shared_config.php.sample

另外,我测试了另一台笔记本电脑,但结果是一样的。 这些是经过测试的PC。

  • Mac mini(2011年中)OS X Yosemite
  • Mac book pro(2011年末)OS X Sierra

每台PC都使用Docker for Mac 版本1.12.1(版本:12133)

2 个答案:

答案 0 :(得分:2)

方法#1
我相信Dockerfile的以下陈述可以更改 发件人:

ADD . /var/www
WORKDIR /var/www
RUN cp config.php.sample config.php
RUN cp shared_config.php.sample shared_config.php
RUN cp vendor/propel/propel1/build.properties.sample vendor/propel/propel1/build.properties

ADD config.php.sample /var/www/config.php
ADD shared_config.php.sample /var/www/shared_config.php
ADD vendor/propel/propel1/build.properties.sample /var/www/vendor/propel/propel1/build.properties 

当然,您也可以使用COPY代替ADD

方法#2
更改以下声明:

RUN cp config.php.sample config.php
RUN cp shared_config.php.sample shared_config.php
RUN cp vendor/propel/propel1/build.properties.sample vendor/propel/propel1/build.properties

致:

RUN ["cp",  "config.php.sample", "config.php"]
RUN ["cp", "shared_config.php.sample", "shared_config.php"]
RUN ["cp", "vendor/propel/propel1/build.properties.sample", "vendor/propel/propel1/build.properties"]

有关详细信息,请参阅documentation

希望这有用。

答案 1 :(得分:0)

出于某种原因,似乎cp命令通过您的Dockerfile的RUN指令运行,并不希望第二个参数成为目标文件名。

请考虑以下事项:

RUN cp config.php.sample config.php

  找不到

config.php

不应该尝试查找 config.php,而是创建它。

我认为你可能会更好地使用:

RUN mv config.php.sample config.php

这也会删除你的(现在没用的)config.php.sample文件。好吧,它不会删除也不会创建任何内容,只需重命名您的文件 - 这正是您想要的:)