linux - Dockerfile 中的 sed 命令不会被执行或被覆盖
问题描述
我希望它以与我在主机系统上使用的用户相同的用户在 docker 容器中运行 apache。因此,我拥有主机上的文件来编辑它们,而 apache (PHP) 可以创建文件夹等。
编辑:我通过稍微改变它来使用 sed 命令:
RUN sed -rie 's|export APACHE_RUN_USER=.*|export APACHE_RUN_USER=wipster|g' /etc/apache2/envvars
RUN sed -rie 's|export APACHE_RUN_GROUP=.*|export APACHE_RUN_GROUP=wipster|g' /etc/apache2/envvars
但是当使用 top 检查时,apache 仍然作为 www-data 运行。
我的 Dockerfile:
FROM php:7.2-apache
RUN adduser wipster --disabled-password --disabled-login --gecos ""
ENV APACHE_RUN_USER wipster
ENV APACHE_RUN_GROUP wipster
RUN sed -i "s#APACHE_RUN_USER:=.*#APACHE_RUN_USER:=wipster}#" /etc/apache2/envvars \
&& sed -i "s#APACHE_RUN_GROUP:=.*#APACHE_RUN_GROUP:=wipster}#" /etc/apache2/envvars
RUN apt-get -qqy update \
&& apt-get install -y libjpeg-dev libpng-dev re2c libmcrypt-dev zlib1g-dev libssl-dev libc-client2007e-dev libkrb5-dev libcurl4-gnutls-dev libxml2-dev libxslt-dev libldap2-dev libssl-dev vim strace unzip g++
RUN touch /var/www/html/php-error.log
RUN chown wipster:wipster /var/www/html/php-error.log
RUN docker-php-ext-install bcmath mbstring mysqli pdo_mysql zip curl pcntl \
&& docker-php-ext-configure gd --with-jpeg-dir=/usr/lib \
&& docker-php-ext-install gd \
&& docker-php-ext-configure imap --with-imap-ssl --with-kerberos \
&& docker-php-ext-install imap \
&& docker-php-ext-configure ldap --with-libdir=lib/x86_64-linux-gnu/ \
&& docker-php-ext-install ldap
# Install xhprof from tideways.
RUN curl -L https://github.com/tideways/php-xhprof-extension/archive/v5.0-beta2.tar.gz | tar xz && \
cd php-xhprof-extension-5.0-beta2/ && \
phpize && \
./configure && \
make && \
make install
RUN yes | pecl install xdebug-2.7.2 \
&& pecl install redis \
&& docker-php-ext-enable redis xdebug opcache tideways_xhprof
# /usr/local/etc/php
ADD config/crm.php.ini /usr/local/etc/php/conf.d/
ADD config/xdebug.ini /usr/local/etc/php/conf.d/
ADD config/opcache.ini /usr/local/etc/php/conf.d/
ADD config/opcache-blacklist /usr/local/etc/php/
ADD config/xhprof.ini /usr/local/etc/php/conf.d/
RUN a2enmod headers expires deflate rewrite
# xdebug cli debugging
RUN export XDEBUG_CONFIG="remote_enable=1 remote_mode=req remote_port=9000 remote_host=192.168.1.144 remote_connect_back=0"
RUN export PHP_IDE_CONFIG="serverName=wipster-dckr"
EXPOSE 80
VOLUME ["/var/www"]
问题是当我通过 ssh 连接到容器并检查 /etc/apache2/envvars 它仍然有 www-data 作为运行用户。我在带有 php:7.1-apache 的 Alpine Linux 上使用了相同的 Dockerfile,它工作得很好。当我手动执行 sed 命令时,它也可以工作。现在我在一个基本的 os Juno 上,图像略有不同,docker 版本是 18.09.7。
我的 docker-compose.yml:
version: "3"
networks:
webnet:
services:
web:
image: wipster/relaunch:1
depends_on:
- db
deploy:
replicas: 1
resources:
limits:
cpus: '3.0'
memory: 2000M
reservations:
cpus: '1.0'
memory: 1000M
volumes:
- ../relaunch:/var/www/html:delegated
ports:
- 8000:80
networks:
- webnet
db:
image: mysql:5.7
deploy:
replicas: 1
resources:
limits:
cpus: '2.0'
memory: 1000M
reservations:
cpus: '1.0'
memory: 500M
volumes:
- db_data_wipster:/var/lib/mysql:delegated
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: wipster
MYSQL_USER: root
MYSQL_PASSWORD: root
ports:
- 3306:3306
networks:
- webnet
command: mysqld --sql_mode="NO_ENGINE_SUBSTITUTION" --innodb-buffer-pool-size=536870912 --innodb-flush-method=O_DIRECT --innodb-flush-log-at-trx-commit=0
volumes:
db_data_wipster:
我错过了什么吗?我需要稍后运行 sed 命令吗?那也行不通。
解决方案
您可以通过执行 grep 来验证文件是否已正确修改:
FROM php:7.2-apache
RUN adduser wipster --disabled-password --disabled-login --gecos ""
ENV APACHE_RUN_USER wipster
ENV APACHE_RUN_GROUP wipster
RUN cat /etc/apache2/envvars | grep -B 2 -A 2 APACHE_RUN_USER
RUN sed -i "s#APACHE_RUN_USER:=.*#APACHE_RUN_USER:=wipster}#" /etc/apache2/envvars \
&& sed -i "s#APACHE_RUN_GROUP:=.*#APACHE_RUN_GROUP:=wipster}#" /etc/apache2/envvars
RUN cat /etc/apache2/envvars | grep -B 2 -A 2 APACHE_RUN_USER
它确实似乎做出了你想要的改变:
Step 5/7 : RUN cat /etc/apache2/envvars | grep -B 2 -A 2 APACHE_RUN_USER
---> Running in 76aad84738a1
# settings are defined via environment variables and then used in apache2ctl,
# /etc/init.d/apache2, /etc/logrotate.d/apache2, etc.
: ${APACHE_RUN_USER:=www-data}
export APACHE_RUN_USER
: ${APACHE_RUN_GROUP:=www-data}
export APACHE_RUN_GROUP
Removing intermediate container 76aad84738a1
---> 1be6e6068d73
Step 6/7 : RUN sed -i "s#APACHE_RUN_USER:=.*#APACHE_RUN_USER:=wipster}#" /etc/apache2/envvars && sed -i "s#APACHE_RUN_GROUP:=.*#APACHE_RUN_GROUP:=wipster}#" /etc/apache2/envvars
---> Running in 75a741dadb34
Removing intermediate container 75a741dadb34
---> 6b2d9b0dfdac
Step 7/7 : RUN cat /etc/apache2/envvars | grep -B 2 -A 2 APACHE_RUN_USER
---> Running in 2555c019ab43
# settings are defined via environment variables and then used in apache2ctl,
# /etc/init.d/apache2, /etc/logrotate.d/apache2, etc.
: ${APACHE_RUN_USER:=wipster}
export APACHE_RUN_USER
: ${APACHE_RUN_GROUP:=wipster}
推荐阅读
- xml - XML UTF-8 输出中的 jdom2 编码问题
- android - App安装后如何只执行一次后台任务
- android - 从 SQLite DB 填充 ListView 不起作用
- r - 在 data_frame 中将列从 char 转换为 date 时获取 NA
- perforce - Perforce 是否存在任何 API,允许我注册回调以获取有关特定库路径更改的通知?
- mysql - 在 Mysql DB 列中的当前值前面插入数字 0
- android - 即使在应用程序关闭后如何保持警报管理器运行?
- php - 如何将现有数据库迁移到 Doctrine?
- apache-spark - 如何查看数据框所有列的类型
- sql - 尝试在 SQL Server 2016 中传递逗号分隔值时出错