我写了一个看起来像这样的Dockerfile
FROM ubuntu:12.04
RUN apt-get update
RUN apt-get install -y wget
Run Code Online (Sandbox Code Playgroud)
现在我abc.txt在主机上调用了一个文件.如何将其复制到此容器中.我是否可以在Dockerfile中添加从Host复制到Container的任何步骤.
我正在开展一项任务,涉及使用Dockerfile构建一个以centOs为基础的docker镜像.dockerfile中的一个步骤需要设置http_proxy和https_proxy ENV变量才能在代理后面工作.
由于这个Dockerfile将由具有不同代理的多个团队使用,我想避免为每个团队编辑Dockerfile.相反,我正在寻找一个允许我在构建时传递ENV变量的解决方案,例如,
sudo docker build -e http_proxy = somevalue.
我不确定是否已有提供此功能的选项.我错过了什么吗?
是否可以ENV根据构建的值有条件地在Dockerfile中设置变量ARG?
例如:像
ARG BUILDVAR=sad
ENV SOMEVAR=if $BUILDVAR -eq "SO"; then echo "hello"; else echo "world"; fi
Run Code Online (Sandbox Code Playgroud)
更新:基于Mario答案的当前使用情况:
ARG BUILD_ENV=prod
ENV NODE_ENV=production
RUN if [ "${BUILD_ENV}" = "test" ]; then export NODE_ENV=development; fi
Run Code Online (Sandbox Code Playgroud)
然而,运行,--build-arg BUILD_ENV=test然后进入主机,我仍然得到
docker run -it mycontainer bin/bash
[root@brbqw1231 /]# echo $NODE_ENV
production
Run Code Online (Sandbox Code Playgroud) 我试图确保我的应用程序容器在db容器启动和READY TO接受连接之前不运行迁移/启动.
所以我决定使用healthcheck并依赖于docker compose file v2中的选项.
在应用程序中,我有以下内容
app:
...
depends_on:
db:
condition: service_healthy
Run Code Online (Sandbox Code Playgroud)
另一方面,db具有以下健康检查
db:
...
healthcheck:
test: TEST_GOES_HERE
timeout: 20s
retries: 10
Run Code Online (Sandbox Code Playgroud)
我尝试了几种方法,如:
test: ["CMD", "test -f var/lib/mysql/db"]
test: ["CMD", "echo 'SELECT version();'| mysql"]
test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"]
有人有解决方案吗?
另一个Docker符号链接问题.我有一堆文件要复制到我的所有Docker构建中.我的目标结构是:
parent_dir
- common_files
- file.txt
- dir1
- Dockerfile
- symlink -> ../common_files
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,我想在我在dir1中构建docker时复制file.txt.但我不想保留file.txt的多个副本.根据这个链接,从docker版本0.10开始,docker build必须
按照容器根目录中的符号链接获取ADD构建说明.
但是当我在Dockerfile中使用这些行中的任何一行构建时,我都没有这样的文件或目录:
ADD symlink /path/dirname 要么
ADD symlink/file.txt /path/file.txt
mount选项不会为我解决(跨平台......).我尝试tar -czh . | docker build -t没有成功.
有没有办法让Docker遵循符号链接并将common_files/file.txt复制到构建的容器中?
我现在有几个Dockerfiles.
一个是Cassandra 3.5,它是 FROM cassandra:3.5
我也有一个用于Kafka的Dockerfile,但是t要复杂得多.它FROM java:openjdk-8-fre运行了很长的命令来安装Kafka和Zookeeper.
最后,我有一个用Scala编写的应用程序,它使用SBT.
对于那个Dockerfile,它是FROM broadinstitute/scala-baseimage我的Java 8,Scala 2.11.7和STB 0.13.9,这是我需要的.
也许,我不明白Docker是如何工作的,但是我的Scala程序将Cassandra和Kafka作为依赖项并用于开发目的,我希望其他人能够简单地克隆我的repo Dockerfile然后能够用Cassandra,Kafka构建它,Scala,Java和SBT都融入其中,以便他们可以编译源代码.我虽然遇到了很多问题.
如何组合这些Dockerfiles?我如何简单地制作出烘焙过的环境?
我有一个Dockerfile应该建立一个Ubuntu图像.但是当我跑步的时候
docker build -t ubuntu-test:latest ./Dockerfile
Run Code Online (Sandbox Code Playgroud)
它在控制台上显示以下错误
无法准备上下文:context必须是一个目录:/ Users/tempUser/git/docker/Dockerfile
我在Mac OsX上.我也试过了sudo.什么都行不通.
给出以下Dockerfile
FROM ubuntu
RUN groupadd mygroup
RUN useradd -ms /bin/bash -G mygroup john
MKDIR /data
COPY test/ /data/test data
RUN chown -R john:mygroup /data
CMD /bin/bash
Run Code Online (Sandbox Code Playgroud)
在我复制的测试目录中,我已将文件权限设置为770.
如果我su john在容器内部进行操作,则无法访问测试目录中的任何文件或子目录.看来这个问题与aufs文件系统中的所有权有关,其中复制的目录仍由root拥有,权限设置为770.
是否有解决此问题的方法来正确设置权限?可以在复制之前将原始目录的权限设置为容器用户的uid.但这似乎更像是一个黑客.
我在Windows 10机器上试过这个:
Dockerfile:
From microsoft/nanoserver
CMD ["echo", "Hello World"]
Run Code Online (Sandbox Code Playgroud)
PS
C:\FSD\Docker\Trial1> docker build -t lea/leatest .
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM microsoft/nanoserver
latest: Pulling from microsoft/nanoserver
bce2fbc256ea: Pulling fs layer
58f68fa0ceda: Pulling fs layer
image operating system "windows" cannot be used on this platform
Run Code Online (Sandbox Code Playgroud) 是否可以将docker ENV变量设置为命令的结果?喜欢:
ENV MY_VAR whoami
Run Code Online (Sandbox Code Playgroud)
我希望MY_VAR获得值"root"或者任何whoami返回的值