.bash_profile不适用于docker php image

时间:2017-04-19 13:42:38

标签: docker dockerfile

我的Dockerfile

# https://hub.docker.com/_/php/
FROM php:5.5.23-fpm

USER www-data

ADD .bash_profile /var/www/.bash_profile

SHELL ["/bin/bash", "-c"]

RUN source /var/www/.bash_profile

然后在容器构建之后运行docker exec -it CONTAINER_NAME bash我没有看到我的别名定义到/var/www/.bash_profile。但如果我手动执行source /var/www/.bash_profile - 一切正常。

此处描述的问题相同:https://github.com/docker/kitematic/issues/896但没有答案。

3 个答案:

答案 0 :(得分:4)

那是因为那些(即' RUN'' SHELL')是构建指令。当您执行docker run时,ENTRYPOINTCOMMAND正在执行。

然而,

docker exec只需进入现有容器的命名空间并执行命令。所以在你的情况下它只运行bash。这就是您必须再次提供个人资料的原因。

更新:

此代码段来自man bash

  

当启动不是登录shell的交互式shell时,bash会从中读取并执行命令          /etc/bash.bashrc和〜/ .bashrc,如果存在这些文件。

所以在您的情况下,如果您将文件名更改为~/.bashrc可能有效

答案 1 :(得分:0)

有一个类似的问题,最简单的解决方案是使用-l选项进行bash使bash像被作为登录shell一样被调用。

docker run --rm -it $IMAGE /bin/bash -l

bash随后将读取〜/ .bash_profile

答案 2 :(得分:0)

我遇到了类似的问题。 Dockerfile 相关片段:

RUN scripts/script1.sh
RUN scripts/script2.sh

来自scripts/script1.sh的片段

echo "TEST_ENV=Hello" >> ~/.bashrc
source ~/.bashrc

来自scripts/script2.sh的片段

echo $TEST_ENV

echo 中的 script2 语句没有打印任何内容,即 script2 根本看不到 TEST_ENV 变量。

所以,事实证明每条 RUN 指令都是在自己的 shell 中执行的。因此,环境变量只会在执行 source ~/.bashrc 的 shell 中可见,也就是运行 script1 的 shell。要使其在 script2 的 shell 中可见,必须从 source ~/.bashrc 执行独占 script2

如果运行容器中需要存在环境变量,则作为 Docker 的 ENTRYPOINTCOMMAND 的一部分运行的代码应源自 .bashrc 文件。使用 docker exec -it <container name> /bin/bash 登录正在运行的容器,将证明确实设置了环境变量。