Dockerfile不能复制文件。 (“cp”命令)
我的Dockerfile包含一些cp
linux命令。
由于项目中的某些文件被xxx.php.sample
为xxx.php.sample
等xxx.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 build
和docker-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 bash
login容器。)
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任何东西,只需重命名你的文件 – 这正是你想要的:)