-
Notifications
You must be signed in to change notification settings - Fork 28
Description
Description:
This change ensures that EasyEngine can reliably handle /etc/hosts entries when deployed in Docker or containerized environments, without affecting functionality on host systems.
Context:
When EasyEngine is run inside a container, its attempt to update the host system's /etc/hosts file via a mounted volume may silently fail due to permission or compatibility issues in the Filesystem()->dumpFile() method.
/**
* Removes entry of the site from /etc/hosts
*
* @param string $site_url site name.
*
*/
function remove_etc_hosts_entry( $site_url ) {
$fs = new Filesystem();
$hosts_file = file_get_contents( '/etc/hosts' );
$site_url_escaped = preg_replace( '/\./', '\.', $site_url );
$hosts_file_new = preg_replace( "/127\.0\.0\.1\s+$site_url_escaped\n/", '', $hosts_file );
$fs->dumpFile( '/etc/hosts', $hosts_file_new );
}Objective:
Not to change existing behavior, but to ensure consistent and reliable operation of the remove_etc_hosts_entry function across environments, especially in container deployments.
Modifications:
Refactored remove_etc_hosts_entry in src/helper/site-utils.php to use PHP's native file I/O operations with added safety and compatibility:
- Replaced
Filesystem()->dumpFile()withfile_put_contents()andfile_get_contents(). - Added
LOCK_EXto ensure atomic writes. - Used
stream_context_createwith'file' => ['privileged' => true]to improve write permissions handling in volume-mounted/etc/hosts. - Implemented
preg_quote()to safely match hostnames. - Included explicit error handling for file read/write failures.
Benefits:
- Container Compatibility: Improves EasyEngine’s robustness when run in Docker or similar environments.
- Backward-Safe: Function continues to work without modification on traditional (host-level) deployments.
- Resilience: Adds clear error messages in case of failure, reducing silent breakages.
Testing:
-
Verified successful read/write operations to
/etc/hostsin:- Docker container with volume-mounted
/etc/hosts - Host-level execution without container
- Docker container with volume-mounted
Updated Function:
/**
* Removes entry of the site from /etc/hosts
*
* @param string $site_url site name.
*
*/
function remove_etc_hosts_entry($site_url) {
$hosts_file = @file_get_contents('/etc/hosts');
if ($hosts_file === false) {
throw new Exception("Failed to read /etc/hosts");
}
$site_url_escaped = preg_quote($site_url, '/');
$hosts_file_new = preg_replace("/127\.0\.0\.1\s+$site_url_escaped\n/", '', $hosts_file);
$context = stream_context_create([
'file' => ['privileged' => true]
]);
$result = file_put_contents('/etc/hosts', $hosts_file_new, LOCK_EX, $context);
if ($result === false) {
throw new Exception("Failed to update /etc/hosts");
}
}