So I am building a new project involving PHP and S3 object storage, and as part of the solution I am looking at adjusting some of the defaults in the PHP configuration. This is not too hard to do with interactive commands, but a bit more complex when scripting the solution in a Dockerfile for automated install.
First hurdle: The docker image doesn't have a text editor. No nano, no vi, no nothing. This is actually a security measure. The general rule with containers is to make them as small as possible to keep the images small, but also improve security - the less on the server, the less can go wrong or get used the wrong way.
Second hurdle: Replacing a couple of lines of text in the php.ini file.
Here is where 'sed' comes in.
When learning how to pipe or append data to a file I've often used | tee, or > or >> to send data to a file.
Example:
$echo "some random text" > test.txt
That would create a file called test.txt with the 'some random text' as the content of the file.
To append you can use the >> flag. Building on the previous example:
$echo "some more random text" >> test.txt
This adds to the file like below.
some random text
some more random text
That is all fine, and works in the PHP containers from Docker Hub. However, if one uses the example php.ini files - php.ini-development or php.ini-production some of the values are written already.
Here is where the 'sed' command can be employed.
We have a very long config file with a bunch of comments and several settings that PHP can use to overwrite or adjust the defaults. In my case I want to change the default upload file size from 2M to something larger. With a text editor it is pretty easy to just search for that line and change it. To do this automatically, 'sed' is perfect.
The syntax for substituting a line of text with sed is as below:
sed 's/<original text>/<replacement text>/' <file to change>
An example, if a file has the phrase 'some random text' we can change the sed output to 'some more text' with the below command.
sed 's/random/more/' filename
The output would be 'some more text'.
IMPORTANT: 'sed' just changes the output, but it does not change the information in the file. To insert the changes to the file use the '-i' flag.
For example, if I wish to permanently replace the word 'random' with the word 'more', I would change the previous command to something like the following:
sed -i 's/random/more/' filename
This is a super useful command that honestly doesn't get a lot of attention, at least not in my decade plus of putzing around with Linux. Again really useful for scripting and I should have an example build in another couple of weeks.