Docker中向鏡像修改配置文件的方式

常常須要對鏡像內部的文件進行修改,例如在構建鏡像時候修改配置文件。在使用一些開源鏡像的過程當中發現了一些對鏡像文件進行的方式,這裏以hadoop集羣搭建和storm集羣搭建爲例介紹兩種修改鏡像內配置文件的方式。python

1、經過context把配置文件傳入鏡像git

step1. 在DockerFile同級目錄下,建立conf文件夾,在文件夾中放置修改好的配置文件github

step2. 在DockerFile中把conf中的配置文件放置到環境變量中docker

例:一個docker搭建hadoop集羣的案例apache

文件夾結構centos

Dockerfile內容:bash

# # # # # # # # # # # # # # # # # # # # # # # # 
# Dockerfile to build hadoop container images #
# Based on Centos                             #
# # # # # # # # # # # # # # # # # # # # # # # #

#base image
FROM centos7-hadoop

# MainTainer
MAINTAINER neu_wj@163.com
#WORKDIR /root

# ssh without key
RUN ssh-keygen -t rsa -f ~/.ssh/id_rsa -P '' && \
    cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys


#RUN ssh-keygen -q -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key -N '' && \
#    ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N '' && \
#    ssh-keygen -t dsa -f /etc/ssh/ssh_host_ed25519_key  -N '' 
#RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config
#RUN sed -i "s/#UsePrivilegeSeparation.*/UsePrivilegeSeparation no/g" /etc/ssh/sshd_config

COPY config/* /tmp/
RUN cat /tmp/ssh_config >> /etc/ssh/ssh_config && \
    mv /tmp/core-site.xml $HADOOP_HOME/etc/hadoop/core-site.xml && \
    mv /tmp/hdfs-site.xml $HADOOP_HOME/etc/hadoop/hdfs-site.xml && \
    mv /tmp/yarn-site.xml $HADOOP_HOME/etc/hadoop/yarn-site.xml && \
    mv /tmp/mapred-site.xml $HADOOP_HOME/etc/hadoop/mapred-site.xml && \
    mv /tmp/slaves $HADOOP_HOME/etc/hadoop/slaves


# SSH and SERF ports
EXPOSE 22 7373 7946

# HDFS ports
EXPOSE 50090 50475 50010

# YARN ports
#
#CMD ["/usr/sbin/sshd", "-D"]
#CMD ["sh", "-c", "service ssh start; bash"]
#CMD ["sh", "-c", "/usr/sbin/sshd -D ; bash"]
CMD ["/usr/sbin/init"]

2、經過鏡像啓動後的運行程序修改配置ssh

step1. 編寫鏡像啓動時的運行程序docker-entrypoint.shoop

在程序中,爲要修改的配置項配置環境變量,並修改配置文件,將配置項的值配置爲設置的環境變量ui

step2. 在DockerFile中指定鏡像啓動時的entrypoint爲docker-entrypoint.sh

例:storm官方Docker鏡像中對於storm.yaml配置 https://github.com/31z4/storm-docker/tree/4e9cdba376be0143ba0f041a1099bb7912b145ef/1.2.2 

docker-entrypoint.sh內容以下

#!/bin/bash

set -e

# Allow the container to be started with `--user`
if [ "$1" = 'storm' -a "$(id -u)" = '0' ]; then
    chown -R "$STORM_USER" "$STORM_CONF_DIR" "$STORM_DATA_DIR" "$STORM_LOG_DIR"
    exec su-exec "$STORM_USER" "$0" "$@"
fi

# Generate the config only if it doesn't exist
CONFIG="$STORM_CONF_DIR/storm.yaml"
if [ ! -f "$CONFIG" ]; then
    cat << EOF > "$CONFIG"
storm.zookeeper.servers: [zookeeper]
nimbus.seeds: [nimbus]
storm.log.dir: "$STORM_LOG_DIR"
storm.local.dir: "$STORM_DATA_DIR"
EOF
fi

exec "$@"

Dockerfile內容以下:

FROM openjdk:8-jre-alpine

# Install required packages
RUN apk add --no-cache \
    bash \
    python \
    su-exec

ENV STORM_USER=storm \
    STORM_CONF_DIR=/conf \
    STORM_DATA_DIR=/data \
    STORM_LOG_DIR=/logs

# Add a user and make dirs
RUN set -ex; \
    adduser -D "$STORM_USER"; \
    mkdir -p "$STORM_CONF_DIR" "$STORM_DATA_DIR" "$STORM_LOG_DIR"; \
    chown -R "$STORM_USER:$STORM_USER" "$STORM_CONF_DIR" "$STORM_DATA_DIR" "$STORM_LOG_DIR"``

ARG GPG_KEY=ACEFE18DD2322E1E84587A148DE03962E80B8FFD
ARG DISTRO_NAME=apache-storm-1.2.2

# Download Apache Storm, verify its PGP signature, untar and clean up
RUN set -ex; \
    apk add --no-cache --virtual .build-deps \
      gnupg; \
    wget -q "http://www.apache.org/dist/storm/$DISTRO_NAME/$DISTRO_NAME.tar.gz"; \
    wget -q "http://www.apache.org/dist/storm/$DISTRO_NAME/$DISTRO_NAME.tar.gz.asc"; \
    export GNUPGHOME="$(mktemp -d)"; \
    gpg --keyserver ha.pool.sks-keyservers.net --recv-key "$GPG_KEY" || \
    gpg --keyserver pgp.mit.edu --recv-keys "$GPG_KEY" || \
    gpg --keyserver keyserver.pgp.com --recv-keys "$GPG_KEY"; \
    gpg --batch --verify "$DISTRO_NAME.tar.gz.asc" "$DISTRO_NAME.tar.gz"; \
    tar -xzf "$DISTRO_NAME.tar.gz"; \
    chown -R "$STORM_USER:$STORM_USER" "$DISTRO_NAME"; \
    rm -rf "$GNUPGHOME" "$DISTRO_NAME.tar.gz" "$DISTRO_NAME.tar.gz.asc"; \
    apk del .build-deps

WORKDIR $DISTRO_NAME

ENV PATH $PATH:/$DISTRO_NAME/bin

COPY docker-entrypoint.sh /
ENTRYPOINT ["/docker-entrypoint.sh"]
相關文章
相關標籤/搜索