【问题标题】:Unable to connect interactively to container when using entrypoint script in Dockerfile在 Dockerfile 中使用入口点脚本时无法交互连接到容器
【发布时间】:2020-08-25 17:00:14
【问题描述】:

script运行容器时需要初始化环境变量。

所以编写一个 shell 脚本在运行容器时通过将其分配给入口点来对其进行初始化。

入口点.sh

#!/bin/bash
# Load the script of environment variables
. /home/foo/setupvars.sh
echo "INITIALIZZEE"
printenv
exec "$@"

Dockerfile

FROM ubuntu:18.04

WORKDIR /home/foo

COPY entrypoint.sh /home/foo/entrypoint.sh
RUN ["chmod", "+x", "/home/foo/entrypoint.sh"]
COPY setupvars.sh /home/foo/setupvars.sh
RUN ["chmod", "+x", "/home/foo/setupvars.sh"]


ENTRYPOINT ["/home/foo/entrypoint.sh"]

setupvars.sh

我构建图像, docker build -t foo . 并运行一个容器,如: docker run --rm -it foo bash

运行容器时,环境变量脚本运行,echo 运行,printenv 运行。但我无法获得任何交互式 bash。 exec "$@" 命令无法获取我的 bash 命令。当我手动在那里写 bash 就像 exec "bash" 时,它可以工作。另一方面,它不能。

我的步骤和best practices of docker一样。

我的错误是什么?

【问题讨论】:

  • entrypoint.sh 脚本更改为使用#!/bin/bash?您不应该尝试在非 bash 脚本中获取 bash 脚本。此外,您可以在本地文件夹中的入口点脚本上设置执行位,并放弃 RUN 指令。
  • @wmorrell 是的,我改变了,正如我所说的那样。我将#!/bin/sh 替换为#!/bin/bash
  • 那么你应该用你正在运行的实际代码来更新问题,而不是你在进行更改之前尝试运行的代码。您是否在尝试再次运行之前重建图像?仅更改 Dockerfile 不足以更新映像。
  • @wmrorrell 我编辑。我为每次更改构建并运行。
  • 我不认为这是您正在运行的代码,因为当我运行它时,我会在容器内收到一个 bash 提示。发布您的实际代码。

标签: docker shell dockerfile


【解决方案1】:

如我所见,在entrypoint.sh 中运行另一个脚本时,参数会丢失

所以在运行它之前,将参数分配给一个变量。

#!/bin/bash

# to save arguments assign them a variable before running script below
COM=$@
# Load the script of environment variables
. /opt/intel/openvino/bin/setupvars.sh
# export LD_LIBRARY_PATH=/usr/local/lib/:$LD_LIBRARY_PATH
# export PYTHONPATH=/usr/local/lib/python3.6/dist-packages/:$PYTHONPATH
echo "INITIALIZZEE"
printenv

# Run the main container command
exec $COM

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-12
    • 1970-01-01
    相关资源
    最近更新 更多