Dockerfile不能复制文件。 (“cp”命令)

我的Dockerfile包含一些cp linux命令。
由于项目中的某些文件被xxx.php.samplexxx.php.samplexxx.php.sample ,因此应将其replace为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未find

我认为path是错误的,所以我复制了上述命令并直接执行它。 (我可以通过docker exec -it xxx_php-apache_1 bashlogin容器。)
cp命令很好地工作,我可以在容器和我的本地源find复制的文件。

有没有人找出为什么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 

另外,我用另一台笔记本电脑进行testing,结果是一样的。 这些都是经过testing的PC

  • Mac mini(2011年中)OS X Yosemite
  • Mac专业版(2011年末)OS X Sierra

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

方法#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"] 

有关更多详情,请参阅文档 。

希望这是有帮助的。

出于某种原因,看起来运行你的Dockerfile的RUN指令的cp命令并不期望第二个参数是目标文件名。

考虑以下:

RUN cp config.php.sample config.php

找不到config.php

它不应该尝试find config.php ,但创build它。


我想你可能会更好使用:

RUN mv config.php.sample config.php

这也将删除您的(现在无用的) config.php.sample文件。 那么,它不会删除或创build任何东西,只需重命名你的文件 – 这正是你想要的:)