My Dockerfile contains some cp linux commands.
Because some files in project are decalred as sample such as xxx.php.sample, and it should be replaced as xxx.php.
I thought this process should be executed on Dockerfile. So i wrote like this.
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/docker-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-dbAfter docker-compose build and docker-compose up (No error happened), here is the cp results.
RUN cp config.php.sample config.php -> config.php is not found
RUN cp shared_config.php.sample shared_config.php -> shared_config.php is not found
RUN cp vendor/propel/propel1/build.properties.sample vendor/propel/propel1/build.properties -> build.properties is not found
I thought the path was wrong, so i copied the above commands and executed it directly. (I could login the container by docker exec -it xxx_php-apache_1 bash.)
The cp command finely worked and i could find the copied file in the container and my local source.
Does anyone figure out why cp command on Dockerfile doesn't work?
Here is the corresponds build log.
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 4e3e92aa0f97Just in case, I executed find command on container.
root@d98556ed051a:/var/www# find / -iname '*shared_config.php*'
/var/www/shared_config.php.sampleIn addition, I tested with another laptop, but the result was same. These are tested PCs.
- Mac mini (Mid 2011) OS X Yosemite
- Mac book pro (Late 2011) OS X Sierra
Each PC is using Docker for Mac Version 1.12.1 (build: 12133)
2 Answers
Approach #1
I believe that the below statements of the Dockerfile can be changed
From:
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.propertiesTo:
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 Of course, you also use COPY instead of ADD as well in the above.
Approach #2
Change below statements from:
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.propertiesTo:
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"]For more details, refer documentation.
Hope this is helpful.
5For some reason, it appears that the cp command run through your Dockerfile's RUN instruction doesn't expect the second argument to be the destination file name.
Consider the following:
RUN cp config.php.sample config.php
config.phpis not found
It should not try to find config.php, but create it.
I reckon you'd probably be better off using:
RUN mv config.php.sample config.php
That will also delete your (now useless) config.php.sample file. Well, it won't delete nor create anything, simply rename your file -- which is exactly what you want :)