【问题标题】:How to load shell aliases in an alpine docker container with start如何使用 start 在 alpine docker 容器中加载 shell 别名
【发布时间】:2021-02-23 12:34:35
【问题描述】:

我已经编写了一个 DOCKER 文件,它使用一个私有改编的 alpine 图像作为图像,其中包含一个 nginx 服务器。 注意:alpine 使用 zsh,而不是 bash。

我喜欢有一些可用的 shell 别名,当在容器中工作时,当它们丢失时它让我发疯。所以我将一个准备好的小文件复制到 /root/.profile,它可以工作。我可以查看文件及其内容。但是只有当我手动加载文件时才会加载。 ~/.profile 在容器中然后我有可用的别名。

我必须做什么,我的配置文件在我启动容器并连接到它的外壳后会自动加载?

FROM myprivatealpineimage/base-image-php:7.4.13

ARG TIMEZONE

COPY ./docker/shared/bashrc /root/.profile

COPY ./docker/shared/ /tmp/scripts/
RUN chmod +x -R /tmp/scripts/ \
    && /tmp/scripts/set_timezone.sh ${TIMEZONE}\
    && apk update\
    && apk add --no-cache git

RUN install-ext pecl/apcu pecl/imagick pecl/zip pecl/redis
RUN apk add --no-cache --repository http://dl-3.alpinelinux.org/alpine/edge/testing gnu-libiconv
ENV LD_PRELOAD /usr/lib/preloadable_libiconv.so php

WORKDIR /var/www

【问题讨论】:

  • 发现不是zsh,而是这里使用的sh。
  • 你最后能解决这个问题吗?
  • 在下面查看我的答案。您能否确认这是否适合您?
  • 我最终在 Dockerfile 中添加到 PATH 并按名称调用该路径中的脚本。
  • 你能发布你的解决方案吗?

标签: docker alpine


【解决方案1】:

对我来说,这很有效:

  1. 为每个别名创建一个 shell 脚本。例如,backup.shcompile.shdblogin.sh

  2. 将所有这些脚本放在一个目录中。例如scripts

  3. 将该目录添加到Dockerfile 内的PATH 环境变量。示例:

    ENV PATH="${PATH}:/temp/scripts"

  4. 将此目录挂载到您的docker-compose.yml 文件中。示例:

        volumes: 
            - /path/to/scripts/on/local/machine:/temp/scripts
  1. 确保您添加到PATH 的路径与您安装在docker-compose.yml 中的路径相匹配。例如两者都应该是/temp/scripts

  2. 现在在您的 docker 交互式 shell 中,您可以简单地使用它们的名称调用脚本文件,例如 compiledblogin

【讨论】:

    【解决方案2】:

    默认情况下,docker 启动一个非登录 shell。 要读取 .profile 文件,您需要登录 shell docker exec -it <container> ash -l

    要每次读取 /etc/profile(或其他启动文件),您必须设置 ENV 变量。

    示例 Dockerfile

    ARG PHPVERSION=7.4
    FROM php:$PHPVERSION-fpm-alpine
    
    ARG PHPVERSION=7.4
    ENV PHPVERSION_ENV=$PHPVERSION
    
    # copy composer from official image
    COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
    
    #set $ENV
    ENV ENV=/etc/profile
    #copy aliases definition
    COPY /assets/alias.sh /etc/profile.d/alias.sh
    
    
    

    【讨论】:

      【解决方案3】:

      将您的文件保存为用户目录下的 .bashrc:

      COPY docker/shared/bashrc /home/{YOUR_USER}/.bashrc

      【讨论】:

      • 这就是我正在做的。在 docker 容器中,我是 root。 Alpine 使用 zsh,而不是 bash,因此我不复制到 .bashrc 而是复制到 .profile
      • 你确定 zsh 吗?我确实有一个高山容器,并且 .bashrc 工作正常。 bash-5.0$ cat /etc/alpine-release 3.12.3
      • @CalamityJane,如果您使用 zsh,那么像 .bashrc.profile 这样的 bash 配置文件将无济于事。您需要切换到使用 bash,或者更简单,在 .zshrc 中定义别名。
      • 顺便说一句,官方plain vanilla Alpine 镜像使用ash 作为其默认shell。
      • 肯定不是 bash,因为我和同事讨论过。虽然不太确定它是 ash 还是 zsh。我会检查一下。
      【解决方案4】:

      您可以像这样在 docker 构建期间添加别名:

      # Making our command line life a little easier...
      RUN echo 'alias ll="ls -l"' >> ~/.bashrc
      RUN echo 'alias la="ls -la"' >> ~/.bashrc
      

      【讨论】:

      • 这与在构建过程中复制整个文件有何不同?
      • 恕我直言,它更像是“所见即所得”。并且.bashrc 对所有shell 执行,而不仅仅是像.profile 这样的登录shell。所以不同之处在于,您最终会在家中使用 .bashrc 文件,而不是 .profile 文件。使用~ 也独立于运行用户。当然,复制文件时也可以这样做。
      【解决方案5】:

      这似乎有效:

      FROM myprivatealpineimage/base-image-php:8.0.3
      
      ARG TIMEZONE
      ARG WITH_XDEBUG=false
      
      COPY ./docker/shared/bashrc /root/.profile
      COPY ./docker/shared/bashrc /root/.ashrc
      
      COPY ./docker/shared/ /tmp/scripts/
      RUN chmod +x -R /tmp/scripts/ \
          && /tmp/scripts/set_timezone.sh ${TIMEZONE} \
          && apk add --no-cache git  
      
      WORKDIR /var/www
      

      我刚刚重新构建了我的容器,当我登录时,我有了我的别名。如果有人可以确认此设置有效,我会将其标记为正确答案。不知道为什么它有效而另一个无效。

      【讨论】:

        猜你喜欢
        • 2023-03-14
        • 1970-01-01
        • 2020-01-17
        • 1970-01-01
        • 2018-01-20
        • 2018-04-09
        • 1970-01-01
        • 1970-01-01
        • 2016-12-19
        相关资源
        最近更新 更多