我有一个OpenSuse 42.3 docker镜像,我已配置为运行代码.该图像有一个名为"myuser"的用户(除了root用户),我是在通过Dockerfile生成初始图像时创建的.我有三个脚本文件,根据用户所使用的操作系统从映像生成容器.
问题:容器中的用户名"myuser"是否可以设置为执行容器生成脚本的用户的用户名?
我的目标是让用户以交互方式弹出容器,并能够从容器中运行代码.代码只是一个执行并具有一些IO的二进制文件,因此我希望可以从容器中访问用户的目录,以便它们可以导航到其计算机上的文件夹并运行代码以在其文件系统中生成输出.
以下是我到目前为止构建的内容.我尝试在linux脚本调用期间设置USER环境变量docker run,但这并未将用户从"myuser"更改为"bob"(启动容器的主机上的用户名).安装目录似乎工作正常.我不确定是否有可能实现我的目标.
Linux容器脚本:
username="$USER"
userID="$(id -u)"
groupID="$(id -g)"
home="${1:-$HOME}"
imageName="myImage:ImageTag"
containerName="version1Image"
docker run -it -d --name ${containerName} -u $userID:$groupID \
-e USER=${username} --workdir="/home/myuser" \
--volume="${home}:/home/myuser" ${imageName} /bin/bash \
Run Code Online (Sandbox Code Playgroud)
Mac容器脚本:
username="$USER"
userID="$(id -u)"
groupID="$(id -g)"
home="${1:-$HOME}"
imageName="myImage:ImageTag"
containerName="version1Image"
docker run -it -d --name ${containerName} \
--workdir="/home/myuser" \
--v="${home}:/home/myuser" ${imageName} /bin/bash \
Run Code Online (Sandbox Code Playgroud)
Windows容器脚本:
ECHO OFF
SET imageName="myImage:ImageTag"
SET containerName="version1Image"
docker run -it -d --name %containerName% --workdir="/home/myuser" -v="%USERPROFILE%:/home/myuser" %imageName% /bin/bash
echo "Container %containerName% was created." …Run Code Online (Sandbox Code Playgroud) 是否可以像使用RUN命令那样将COPY命令链接在一起?
链接运行命令示例:
RUN echo "root:user_2017" | chpasswd && \
groupadd -g 1000 user && \
useradd -u 1000 -m -s /bin/bash user && \
passwd -d user
Run Code Online (Sandbox Code Playgroud)
如果必须执行从主机到映像的许多副本,是否可以像下面显示的那样阻止引入多个中间映像?我知道下面显示的内容行不通,因为当&&使用来将多行绑定在一起时,每一行都需要是一个单独的命令。
COPY ./folder1A/* /home/user/folder1B/ && \
./folder2A/* /home/user/folder2B/ && \
./folder3A/* /home/user/folder3B/ && \
./folder4A/* /home/user/folder4B/ && \
Run Code Online (Sandbox Code Playgroud) 我基于 Opensuse 42.3 映像创建了一个 Docker 容器。我遇到了 vim 未在 Opensuse 42.3 容器中执行任何语法突出显示的问题。我正在 Opensuse 42.3 主机上运行我的 Docker 映像。如果我从容器内打开 bash 文件并使用:syntax on,则不会发生任何情况。我在调用时使用 -it 标志docker run,并且当我使用 时我可以看到文件/文件夹上的颜色ls。获取 .vimrc 文件似乎也没有做任何事情。我的 XTERM 环境变量设置为“xterm”,我使用 vim 查看的文件是 bash shell 脚本文件。
我已将我的 linux 主目录挂载到容器上的主目录。有哪些方法可以验证或运行测试以查看问题的根源可能在哪里?
我目前在GitLab.com上使用其中一个共享的跑步者.是否可以设置.gitlab-ci.yaml文件,以便构建SCP文件从远程服务器到转轮?我的目标是SCP文件是我构建的必要依赖项,但它们不会在任何Git存储库中被跟踪.
我已经标记了我希望能够执行转移的行,但我不知道如何正确表达它.
注意:CodeA在CodeB和CodeC中有依赖关系,必须在CodeA编译之前构建,因此我需要访问CodeB和CodeC才能首先在ubuntu映像上构建它们.
image: ubuntu:12.04
before_script:
build_CodeC:
stage: build
allow_failure: true
script:
-->- scp user@remoteServer:/home/user/file.tar . <---
- sh ./continuous_integration/build_CodeC_dependency.sh
build_CodeB:
stage: build
script:
- sh ./continuous_integration/build_CodeB_dependency.sh
build_CodeA:
stage: build
script:
- sh ./continuous_integration/build_CodeA.sh
Run Code Online (Sandbox Code Playgroud) 我在Docker创建一个没有设置环境变量的容器时遇到了麻烦,我知道我在图像定义中设置了该容器.
我创建了一个生成OpenSuse 42.3图像的Dockerfile.我需要在图像中设置一些环境变量,以便从图像中启动容器的任何人都可以使用我编译并放置在图像中的代码.
我创建了一个名为"image_env_setup.sh"的shell文件,其中包含必要的环境变量定义.我还手动将这些环境变量定义添加到Dockerfile中.
USER codeUser
COPY ./docker/image_env_setup.sh /opt/MyCode
ENV PATH="$PATH":"/opt/MyCode/bin:/usr/lib64/mpi/gcc/openmpi/bin"
ENV LD_LIBRARY_PATH="/usr/lib64:/opt/MyCode/lib:"
ENV PS1="[\u@docker: \w]\$ "
ENV TERM="xterm-256color"
ENV GREP_OPTIONS="--color=auto"
ENV EDITOR=/usr/bin/vim
USER root
RUN chmod +x /opt/MyCode/image_env_setup.sh
USER codeUser
RUN /opt/MyCode/image_env_setup.sh
RUN /bin/bash -c "source /opt/MyCode/image_env_setup.sh"
Run Code Online (Sandbox Code Playgroud)
我用来创建容器的命令是:
docker run -it -d --name ${containerName} -u $userID:$groupID \
-e USER=$USER --workdir="/home/codeUser" \
--volume="${home}:/home/codeUser" ${imageName} /bin/bash \
Run Code Online (Sandbox Code Playgroud)
唯一有效的方法是在容器启动时传递shell文件以便再次运行.
docker start $MyImageTag
docker exec -it $MyImageTag /bin/bash --rcfile /opt/MyCode/image_env_setup.sh
Run Code Online (Sandbox Code Playgroud)
我认为在容器中设置shell变量并不困难,因此任何进入它的条目都会为用户提供已定义的shell变量.
我创建了一个 OpenSuse 42.3 docker 容器映像,它有一个用户,我们将其称为“streamuser”。我希望这个用户在任何人从我的图像创建容器时都处于活动状态。我已将主机的主目录挂载到streamuser的主目录中。我遇到的问题是,如果我在 Linux 主机上运行 Docker 容器,streamuser 无法向主机目录写入任何内容。这是因为 Streamuser 不与主机共享相同的 UID 和 GID。有没有一种干净的方法来解决此问题,避免我将映像中的默认用户帐户设置为 root 帐户?如果我在容器中以 root 身份登录,那么我可以写入 Linux 主机,但这是不可取的。
我的码头工人电话是:
docker run -it -d --name ${containerName} --user="streamuser" \
--workdir="/home/streamuser" --volume="${home}:/home/streamuser" \
${imageName} /bin/bash -rcfile /opt/Codebase/image_env_setup_v206.sh
Run Code Online (Sandbox Code Playgroud)
我见过一个解决方案,有人使用 --volume 选项将主机 passwd、sudoers 等文件传递到容器。我不喜欢这个选项,因为它会覆盖我在容器内精心设计的环境,而且它看起来像是一个笨拙的解决方案。
我的docker文件是:
FROM opensuse:42.3
RUN zypper update -y && \
zypper install -y \
sudo \
vim \
gcc-fortran \
infinipath-psm-devel \
openmpi \
openmpi-devel \
openmpi-libs \
hdf5-openmpi \
blas-devel \
blas-devel-static \
lapack-devel \
which
RUN echo …Run Code Online (Sandbox Code Playgroud) 我希望能够将输入解析为如下所示的bash shell脚本。
myscript.sh --casename obstacle1 --output en --variables v P pResidualTT
Run Code Online (Sandbox Code Playgroud)
到目前为止,我拥有的最好的失败了,因为最后一个参数具有多个值。第一个参数只能有1个值,但是第三个参数可以有大于1的值。是否有办法指定应抓住第三个参数之后直到下一个“-”的所有值?我将假定用户不受约束按照我显示的顺序给出参数。
casename=notset
variables=notset
output_format=notset
while [[ $# -gt 1 ]]
do
key="$1"
case $key in
--casename)
casename=$2
shift
;;
--output)
output_format=$2
shift
;;
--variables)
variables="$2"
shift
;;
*)
echo configure option \'$1\' not understood!
echo use ./configure --help to see correct usage!
exit -1
break
;;
esac
shift
done
echo $casename
echo $output_format
echo $variables
Run Code Online (Sandbox Code Playgroud)