将文件作为参数发送到容器以进行编译会导致问题

Sending a file as a parameter to a container in order to be compiled causes problems

我在将文件发送到 docker 容器以便编译和执行时遇到了一些问题。

在我正在 运行 命令的文件夹中,我有一个 "compiler" 文件夹和一个 file.cpp(一个基本的 hello world")。我正在使用这个命令:

sudo docker run --rm -it -v /compiler/ dockcompiler file.cpp

这是输出:

useradd: warning: the home directory already exists. Not copying any file from skel directory into it. chgrp: cannot access '/code': No such file or directory chmod: cannot access '/code': No such file or directory file does not exist

我的 Dockerfile:

FROM ubuntu

RUN apt-get update
RUN apt-get install -y gcc g++

ADD entrypoint.sh entrypoint.sh
ADD run-code.sh run-code.sh

ENTRYPOINT ["/bin/bash", "entrypoint.sh"] 

entrypoint.sh

prog=
uid=

if [ -z  ]; then
  echo "you must provide a file"
  exit 1
fi

if [ -z $uid ]; then
  uid=10000
fi

echo "127.0.0.1 $(hostname)" >> /etc/hosts

groupadd code
useradd -u "$uid" -G code -d "/compiler" -m codecube 
chgrp code /code
chmod 0775 /code
cd /compiler
sudo -u codecube /bin/bash /run-code.sh $prog

和 运行-code.sh 文件(如果我在终端中 运行 它就可以工作):

 prog=

if [ -z  ]; then
  echo "you must provide a file"
  exit 1
fi

if [ ! -f  ]; then
  echo "file does not exist"
  exit 1
fi

extension="${prog##*.}"
case "$extension" in
  "cpp")
    g++ $prog && ./a.out
    ;;
  "c")
    gcc $prog && ./a.out
    ;;
  "go")
    go run $prog
    ;;
  "pl")
    perl $prog
    ;;
  "py")
    python $prog
    ;;
  "rb")
    ruby $prog
    ;;
  *)
    echo "invalid language"
    exit 1
    ;;
esac

更新:

问题是 -m codecube,它说 codecube 目录已经存在。此外,/code 目录不存在。

如果用户目录已经在您的 docker 图像上(假设此处使用的是经过修改的图像)。然后只需复制 skel 文件就可以解决问题,您无需执行 useradd 即可逃脱。 post here 提供了更多相关信息。

#copy skel files 
cp -r /etc/skel/. /codecube